Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.02 KB | None | 0 0
  1. from __future__ import division
  2. from math import sin,cos,tan,atan2,hypot,pi
  3. import pygame
  4. from time import time
  5. black=(0,0,0)
  6. bgcol=(220,200,160)
  7. size = width, height = 900,640
  8. cl=pygame.time.Clock()
  9. screen = pygame.display.set_mode(size)
  10.  
  11. example={(0,0):["F",[],None,None,"1/44100",1],
  12. (0,1):["F",[],None,None,"2/44100",None],
  13. (1,0):["C",[1,1,100],None,None,100,None],
  14. (2,0):["C",[50,0,2],None,None,1,None],
  15. (1,1):["C",[1,1,100],None,None,100,None],
  16. (2,1):["C",[50,0,2],None,None,-1,None],
  17. (3,0):["F",[],None,None,None,1],
  18. (3,1):["T",["wave"],None,None,None,None]
  19. }
  20. glyphs=example
  21. activeglyph=None
  22. selected=False
  23. modifying=False
  24. pos=(0,0)
  25. subpos=(0,0)#centre
  26. scale=64
  27. glyphcols={
  28. "F":((100,0,100),(255,255,255)),
  29. "A":((200,200,0),(0,0,128)),
  30. "M":((255,0,0),(0,96,96)),
  31. "C":((196,196,196),(0,0,0)),
  32. "O":((196,196,196),(0,0,0)),
  33. "L":((128,196,255),(64,0,0)),
  34. "T":((0,0,0),(255,255,255))}
  35. pygame.init()
  36. fontLarge1 = pygame.font.Font(None, 32)
  37. glyphtypes={"F":"flowglyph","A":"amplifierglyph","M":"multiplierglyph","C":"capacitorglyph","O":"circleglyph","T":"traceglyph","L":"logglyph"}
  38. fontSmall1 = pygame.font.Font(None, 16)
  39. fontLarge2 = pygame.font.Font(None, 64)
  40. fontSmall2 = pygame.font.Font(None, 32)
  41. def makeprogram():
  42. global glyphs
  43. g={}
  44. for i in glyphs:
  45. if glyphs[i][0]!="T":
  46. g[i]=glyphtypes[glyphs[i][0]]+"("+",".join(map(str,glyphs[i][1]))+("" if len(glyphs[i][1])==0 else ",")+",".join(map(str,glyphs[i][2:6]))+")"
  47. else:
  48. g[i]=glyphtypes[glyphs[i][0]]+"(\""+glyphs[i][1][0]+"\")"
  49. s="grid({},\n{"
  50. for i in g:
  51. s+=str(i)+":"+g[i]+",\n"
  52. s+="})"
  53. return s
  54.  
  55.  
  56. def drawgrid(scale=64):
  57. for i in range(int(640/scale)+1):
  58. pygame.draw.line(screen, (255,255,255), (i*scale,0), (i*scale,640), 3)
  59. pygame.draw.line(screen, (255,255,255), (0,i*scale), (640,i*scale), 3)
  60.  
  61. def drawselection():
  62. global selected,inpos
  63. if selected:
  64. pygame.draw.rect(screen,(255,255,255),(pos[0]*scale,pos[1]*scale,scale,scale))
  65. else:
  66. pygame.draw.rect(screen,(255,0,0),(pos[0]*scale,pos[1]*scale,scale,scale))
  67. if inpos!=None:
  68. pygame.draw.rect(screen,(0,200,255),(inpos[0]*scale,inpos[1]*scale,scale,scale))
  69.  
  70. def drawsubpos():
  71. global selected,subpos
  72. if selected:
  73. h=[10,100,160,246][subpos[0]+1]
  74. v=[10,128,246][subpos[1]+1]
  75. pygame.draw.line(screen,(0,0,0), (760,v+40) if subpos[0]==1 else (640+h,v) ,(764,v+40) if subpos[0]==1 else (644+h,v),9)
  76. def drawsidebar():
  77. global glyphs,pos
  78. pygame.draw.rect(screen,(160,140,90),(640,0,900,640))
  79. if activeglyph==None:
  80. pygame.draw.rect(screen,(100,100,100),(642,2,256,256))
  81. else:
  82. pygame.draw.rect(screen,(255,255,255),(642,2,256,256))
  83. #Drawpos
  84. if pos in glyphs:
  85. global modifying,subpos,inp
  86. if modifying:
  87. Type,vals,left,up,right,down=glyphs[pos]
  88. left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
  89. if subpos==(0,0):
  90. text = fontLarge2.render(inp+"_", True, (0, 0 ,0))
  91.  
  92. screen.blit(text,(734, 96))
  93. else:
  94. text = fontLarge2.render(Type, True, (0, 0 ,0))
  95. screen.blit(text,(734, 96))
  96. if subpos==(1,0):
  97. text = fontSmall2.render(inp+"_" , True, (0, 0 ,0))
  98. screen.blit(text,(760, 140))
  99. else:
  100. text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
  101. screen.blit(text,(760, 140))
  102. if subpos==(-1,0):
  103. text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  104. screen.blit(text,(650, 112))
  105. else:
  106. text = fontSmall2.render(str(left), True, (0, 0 ,0))
  107. screen.blit(text,(650, 112))
  108. if subpos==(0,-1):
  109. text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  110. screen.blit(text,(760, 10))
  111. else:
  112. text = fontSmall2.render(str(up), True, (0, 0 ,0))
  113. screen.blit(text,(760, 10))
  114. if subpos==(2,0):
  115. text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  116. screen.blit(text,(860-len(str(right))*8, 112))
  117. else:
  118. text = fontSmall2.render(str(right), True, (0, 0 ,0))
  119. screen.blit(text,(860-len(str(right))*8, 112))
  120. if subpos==(0,1):
  121. text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  122. screen.blit(text,(760, 234))
  123. else:
  124. text = fontSmall2.render(str(down), True, (0, 0 ,0))
  125. screen.blit(text,(760, 234))
  126. else:
  127. Type,vals,left,up,right,down=glyphs[pos]
  128. left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
  129. text = fontLarge2.render(Type, True, (0, 0 ,0))
  130. screen.blit(text,(734, 96))
  131. text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
  132. screen.blit(text,(760, 140))
  133. text = fontSmall2.render(str(left), True, (0, 0 ,0))
  134. screen.blit(text,(650, 112))
  135. text = fontSmall2.render(str(up), True, (0, 0 ,0))
  136. screen.blit(text,(760, 10))
  137. text = fontSmall2.render(str(right), True, (0, 0 ,0))
  138. screen.blit(text,(860-len(str(right))*8, 112))
  139. text = fontSmall2.render(str(down), True, (0, 0 ,0))
  140. screen.blit(text,(760, 234))
  141.  
  142. def drawglyphs():
  143. global glyphs,glyphcols
  144. for i in glyphs:
  145. if glyphs[i][0]!="_":
  146. if glyphs[i][0] in glyphcols:
  147. bgcol,fgcol=glyphcols[glyphs[i][0]]
  148. else:
  149. bgcol,fgcol=(200,200,200),(0,0,0)
  150. try:
  151. pygame.draw.rect(screen,bgcol,(i[0]*scale+scale/16,i[1]*scale+scale/16,scale*7/8,scale*7/8))
  152. except:
  153. print bgcol,fgcol
  154. for i in glyphs:
  155. if glyphs[i][0]!="_":
  156. if glyphs[i][0] in glyphcols:
  157. bgcol,fgcol=glyphcols[glyphs[i][0]]
  158. else:
  159. bgcol,fgcol=(200,200,200),(0,0,0)
  160. Type=glyphs[i][0]
  161. #DROPSHADOW GLYPHTYPE
  162. text = fontLarge1.render(Type, True, (32, 32 ,32))
  163. screen.blit(text,((i[0]+.37)*scale, (i[1]+.25)*scale))
  164. text = fontLarge1.render(Type, True, (220, 220, 220))
  165. screen.blit(text,((i[0]+.40)*scale, (i[1]+.28)*scale))
  166. ######END DROPSHADOW
  167. vals=glyphs[i][1]
  168. #vals
  169. text = fontSmall1.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, fgcol)
  170. screen.blit(text,((i[0]+.15)*scale, (i[1]+.52)*scale))
  171. left,up,right,down=[a if a!=None else "" for a in glyphs[i][2:6]]
  172. #LEFT
  173. text = fontSmall1.render(str(left), True, fgcol)
  174. screen.blit(text,((i[0]+.05)*scale, (i[1]+.42)*scale))
  175. #UP
  176. text = fontSmall1.render(str(up), True, fgcol)
  177. screen.blit(text,((i[0]+.37)*scale, (i[1]+.05)*scale))
  178. #RIGHT
  179. text = fontSmall1.render(str(right), True, fgcol)
  180. screen.blit(text,((i[0]+.8)*scale-4*len(str(right)), (i[1]+.42)*scale))
  181. #DOWN
  182. text = fontSmall1.render(str(down), True, fgcol)
  183. screen.blit(text,((i[0]+.37)*scale, (i[1]+.8)*scale))
  184.  
  185. def movecursor(keys):
  186. global pos
  187. if keys[pygame.K_LEFT]:
  188. pos=(max(0,pos[0]-1),pos[1])
  189. if keys[pygame.K_RIGHT]:
  190. pos=(pos[0]+1,pos[1])
  191. if keys[pygame.K_UP]:
  192. pos=(pos[0],max(0,pos[1]-1))
  193. if keys[pygame.K_DOWN]:
  194. pos=(pos[0],pos[1]+1)
  195.  
  196. def movesubselection(keys):
  197. global subpos
  198. if subpos==(-1,0):
  199. if keys[pygame.K_UP]:subpos=(0,-1)
  200. if keys[pygame.K_DOWN]:subpos=(0,1)
  201. if keys[pygame.K_RIGHT]:subpos=(0,0)
  202. elif subpos==(0,0):
  203. if keys[pygame.K_UP]:subpos=(0,-1)
  204. if keys[pygame.K_DOWN]:subpos=(0,1)
  205. if keys[pygame.K_LEFT]:subpos=(-1,0)
  206. if keys[pygame.K_RIGHT]:subpos=(1,0)
  207. elif subpos==(0,1):
  208. if keys[pygame.K_UP]:subpos=(0,0)
  209. if keys[pygame.K_LEFT]:subpos=(-1,0)
  210. if keys[pygame.K_RIGHT]:subpos=(1,0)
  211. elif subpos==(0,-1):
  212. if keys[pygame.K_DOWN]:subpos=(0,0)
  213. if keys[pygame.K_LEFT]:subpos=(-1,0)
  214. if keys[pygame.K_RIGHT]:subpos=(1,0)
  215. elif subpos==(1,0):
  216. if keys[pygame.K_UP]:subpos=(0,-1)
  217. if keys[pygame.K_DOWN]:subpos=(0,1)
  218. if keys[pygame.K_LEFT]:subpos=(0,0)
  219. if keys[pygame.K_RIGHT]:subpos=(2,0)
  220. elif subpos==(2,0):
  221. if keys[pygame.K_UP]:subpos=(0,-1)
  222. if keys[pygame.K_DOWN]:subpos=(0,1)
  223. if keys[pygame.K_LEFT]:subpos=(1,0)
  224. def modify(keys):
  225. global inp,subpos
  226. if keys[pygame.K_LSHIFT] or subpos==(0,0):
  227. d={
  228. pygame.K_1:"1",pygame.K_2:"2",pygame.K_3:"3",pygame.K_4:"4",pygame.K_5:"5",pygame.K_6:"6",pygame.K_7:"7",pygame.K_8:"8",pygame.K_9:"9",pygame.K_0:"0",
  229. pygame.K_a:"A",pygame.K_b:"B",pygame.K_c:"C",pygame.K_d:"D",pygame.K_e:"E",pygame.K_f:"F",pygame.K_g:"G",pygame.K_h:"H",pygame.K_i:"I",pygame.K_j:"J",
  230. pygame.K_k:"K",pygame.K_l:"L",pygame.K_m:"M",pygame.K_n:"N",pygame.K_o:"O",pygame.K_p:"P",pygame.K_q:"Q",pygame.K_r:"R",pygame.K_s:"S",pygame.K_t:"T",
  231. pygame.K_u:"U",pygame.K_v:"V",pygame.K_w:"W",pygame.K_x:"X",pygame.K_y:"Y",pygame.K_z:"Z",pygame.K_LEFTBRACKET:"{",pygame.K_RIGHTBRACKET:"}",pygame.K_COMMA:"<"
  232. ,pygame.K_PERIOD:">",pygame.K_SLASH:"?"}
  233. else:
  234. d={
  235. pygame.K_1:"1",pygame.K_2:"2",pygame.K_3:"3",pygame.K_4:"4",pygame.K_5:"5",pygame.K_6:"6",pygame.K_7:"7",pygame.K_8:"8",pygame.K_9:"9",pygame.K_0:"0",
  236. pygame.K_a:"a",pygame.K_b:"b",pygame.K_c:"c",pygame.K_d:"d",pygame.K_e:"e",pygame.K_f:"f",pygame.K_g:"g",pygame.K_h:"h",pygame.K_i:"i",pygame.K_j:"j",
  237. pygame.K_k:"k",pygame.K_l:"l",pygame.K_m:"m",pygame.K_n:"n",pygame.K_o:"o",pygame.K_p:"p",pygame.K_q:"q",pygame.K_r:"r",pygame.K_s:"s",pygame.K_t:"t",
  238. pygame.K_u:"k",pygame.K_v:"v",pygame.K_w:"w",pygame.K_x:"x",pygame.K_y:"y",pygame.K_z:"z",pygame.K_LEFTBRACKET:"[",pygame.K_RIGHTBRACKET:"]",pygame.K_COMMA:","
  239. ,pygame.K_PERIOD:".",pygame.K_SLASH:"/"}
  240. if keys[pygame.K_SPACE]:
  241. inp=inp+" "
  242. if keys[pygame.K_BACKSPACE]:
  243. inp=inp[:-1]
  244. for i in d:
  245. if keys[i]:inp+=d[i]
  246.  
  247. def openglyph(pos):
  248. global activeglyph,glyphs,selected,subpos
  249. if not pos in glyphs:
  250. glyphs[pos]=["_",[],None,None,None,None]
  251. subpos=(0,0)
  252. activeglyph=glyphs[pos]
  253. selected=True
  254.  
  255.  
  256. def closeglyph(pos):
  257. global activeglyph,selected
  258. activeglyph=None
  259. selected=False
  260.  
  261. def menu(keys):
  262. global modifying,inp,glyphs
  263. if modifying:
  264. modify(keys)
  265. if keys[pygame.K_RETURN]:
  266. if subpos==(0,0):glyphs[pos][0]="_" if inp=="_" or inp=="" else inp
  267. if subpos==(1,0):glyphs[pos][1]=eval("["+inp[1:-1]+"]")
  268. if subpos==(-1,0):glyphs[pos][2]=None if inp=="_" or inp=="" else inp
  269. if subpos==(0,-1):glyphs[pos][3]=None if inp=="_" or inp=="" else inp
  270. if subpos==(2,0):glyphs[pos][4]=None if inp=="_" or inp=="" else inp
  271. if subpos==(0,1):glyphs[pos][5]=None if inp=="_" or inp=="" else inp
  272.  
  273. modifying=False
  274. else:
  275. if keys[pygame.K_RETURN]:
  276. closeglyph(pos)
  277. movesubselection(keys)
  278. if keys[pygame.K_SPACE]:
  279. modifying=True
  280. d={(0,0):glyphs[pos][0],
  281. (1,0):glyphs[pos][1],
  282. (-1,0):glyphs[pos][2],
  283. (0,-1):glyphs[pos][3],
  284. (2,0):glyphs[pos][4],
  285. (0,1):glyphs[pos][5]
  286. }
  287. inp=str("" if d[subpos]==None else d[subpos])
  288. inpos=None
  289. lastrefresh=0
  290. keys=pygame.key.get_pressed()
  291. offkeys=map(lambda x:0,keys)
  292. name="PROGNAME"
  293. while 1:
  294. keys=tuple(map(lambda a,b,c:max(a,b) if c==0 else 0,keys,pygame.key.get_pressed(),offkeys))
  295. t=time()
  296. if lastrefresh+1/10<t:
  297. if selected:
  298. menu(keys)
  299. else:
  300. movecursor(keys)
  301. if keys[pygame.K_SPACE]:
  302. openglyph(pos)
  303. if (keys[pygame.K_LCTRL] or keys[pygame.K_RCTRL]) and keys[pygame.K_n]:
  304. glyphs={}
  305. if keys[pygame.K_F5]:
  306. prog= makeprogram()
  307. from gridlang import *
  308. open(name,"w").write(prog)
  309. p=eval(prog)
  310. if inpos!=None and glyphs[pos][0]=="T":
  311.  
  312. w=p.makewave(inpos,[1 for i in range(44100)],glyphs[pos][1][0])
  313. p.exportsound(w)
  314.  
  315. if keys[pygame.K_i]:
  316. inpos=pos
  317. screen.fill(bgcol)
  318. drawgrid()
  319. drawselection()
  320. drawglyphs()
  321. drawsidebar()
  322. drawsubpos()
  323. pygame.display.flip()
  324. lastrefresh=t
  325. offkeys=map(lambda x:x,keys)
  326. offkeys[pygame.K_LSHIFT]=0
  327. offkeys[pygame.K_RCTRL]=0
  328. offkeys[pygame.K_LCTRL]=0
  329. keys=map(lambda a,b:a if b==0 else 0,pygame.key.get_pressed(),offkeys)
  330. pygame.event.pump()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement