Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import division
- from math import sin,cos,tan,atan2,hypot,pi
- import pygame
- from time import time
- black=(0,0,0)
- bgcol=(220,200,160)
- size = width, height = 900,640
- cl=pygame.time.Clock()
- screen = pygame.display.set_mode(size)
- example={(0,0):["F",[],None,None,"1/44100",1],
- (0,1):["F",[],None,None,"2/44100",None],
- (1,0):["C",[1,1,100],None,None,100,None],
- (2,0):["C",[50,0,2],None,None,1,None],
- (1,1):["C",[1,1,100],None,None,100,None],
- (2,1):["C",[50,0,2],None,None,-1,None],
- (3,0):["F",[],None,None,None,1],
- (3,1):["T",["wave"],None,None,None,None]
- }
- glyphs=example
- activeglyph=None
- selected=False
- modifying=False
- pos=(0,0)
- subpos=(0,0)#centre
- scale=64
- glyphcols={
- "F":((100,0,100),(255,255,255)),
- "A":((200,200,0),(0,0,128)),
- "M":((255,0,0),(0,96,96)),
- "C":((196,196,196),(0,0,0)),
- "O":((196,196,196),(0,0,0)),
- "L":((128,196,255),(64,0,0)),
- "T":((0,0,0),(255,255,255))}
- pygame.init()
- fontLarge1 = pygame.font.Font(None, 32)
- glyphtypes={"F":"flowglyph","A":"amplifierglyph","M":"multiplierglyph","C":"capacitorglyph","O":"circleglyph","T":"traceglyph","L":"logglyph"}
- fontSmall1 = pygame.font.Font(None, 16)
- fontLarge2 = pygame.font.Font(None, 64)
- fontSmall2 = pygame.font.Font(None, 32)
- def makeprogram():
- global glyphs
- g={}
- for i in glyphs:
- if glyphs[i][0]!="T":
- 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]))+")"
- else:
- g[i]=glyphtypes[glyphs[i][0]]+"(\""+glyphs[i][1][0]+"\")"
- s="grid({},\n{"
- for i in g:
- s+=str(i)+":"+g[i]+",\n"
- s+="})"
- return s
- def drawgrid(scale=64):
- for i in range(int(640/scale)+1):
- pygame.draw.line(screen, (255,255,255), (i*scale,0), (i*scale,640), 3)
- pygame.draw.line(screen, (255,255,255), (0,i*scale), (640,i*scale), 3)
- def drawselection():
- global selected,inpos
- if selected:
- pygame.draw.rect(screen,(255,255,255),(pos[0]*scale,pos[1]*scale,scale,scale))
- else:
- pygame.draw.rect(screen,(255,0,0),(pos[0]*scale,pos[1]*scale,scale,scale))
- if inpos!=None:
- pygame.draw.rect(screen,(0,200,255),(inpos[0]*scale,inpos[1]*scale,scale,scale))
- def drawsubpos():
- global selected,subpos
- if selected:
- h=[10,100,160,246][subpos[0]+1]
- v=[10,128,246][subpos[1]+1]
- 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)
- def drawsidebar():
- global glyphs,pos
- pygame.draw.rect(screen,(160,140,90),(640,0,900,640))
- if activeglyph==None:
- pygame.draw.rect(screen,(100,100,100),(642,2,256,256))
- else:
- pygame.draw.rect(screen,(255,255,255),(642,2,256,256))
- #Drawpos
- if pos in glyphs:
- global modifying,subpos,inp
- if modifying:
- Type,vals,left,up,right,down=glyphs[pos]
- left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
- if subpos==(0,0):
- text = fontLarge2.render(inp+"_", True, (0, 0 ,0))
- screen.blit(text,(734, 96))
- else:
- text = fontLarge2.render(Type, True, (0, 0 ,0))
- screen.blit(text,(734, 96))
- if subpos==(1,0):
- text = fontSmall2.render(inp+"_" , True, (0, 0 ,0))
- screen.blit(text,(760, 140))
- else:
- text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
- screen.blit(text,(760, 140))
- if subpos==(-1,0):
- text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
- screen.blit(text,(650, 112))
- else:
- text = fontSmall2.render(str(left), True, (0, 0 ,0))
- screen.blit(text,(650, 112))
- if subpos==(0,-1):
- text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
- screen.blit(text,(760, 10))
- else:
- text = fontSmall2.render(str(up), True, (0, 0 ,0))
- screen.blit(text,(760, 10))
- if subpos==(2,0):
- text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
- screen.blit(text,(860-len(str(right))*8, 112))
- else:
- text = fontSmall2.render(str(right), True, (0, 0 ,0))
- screen.blit(text,(860-len(str(right))*8, 112))
- if subpos==(0,1):
- text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
- screen.blit(text,(760, 234))
- else:
- text = fontSmall2.render(str(down), True, (0, 0 ,0))
- screen.blit(text,(760, 234))
- else:
- Type,vals,left,up,right,down=glyphs[pos]
- left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
- text = fontLarge2.render(Type, True, (0, 0 ,0))
- screen.blit(text,(734, 96))
- text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
- screen.blit(text,(760, 140))
- text = fontSmall2.render(str(left), True, (0, 0 ,0))
- screen.blit(text,(650, 112))
- text = fontSmall2.render(str(up), True, (0, 0 ,0))
- screen.blit(text,(760, 10))
- text = fontSmall2.render(str(right), True, (0, 0 ,0))
- screen.blit(text,(860-len(str(right))*8, 112))
- text = fontSmall2.render(str(down), True, (0, 0 ,0))
- screen.blit(text,(760, 234))
- def drawglyphs():
- global glyphs,glyphcols
- for i in glyphs:
- if glyphs[i][0]!="_":
- if glyphs[i][0] in glyphcols:
- bgcol,fgcol=glyphcols[glyphs[i][0]]
- else:
- bgcol,fgcol=(200,200,200),(0,0,0)
- try:
- pygame.draw.rect(screen,bgcol,(i[0]*scale+scale/16,i[1]*scale+scale/16,scale*7/8,scale*7/8))
- except:
- print bgcol,fgcol
- for i in glyphs:
- if glyphs[i][0]!="_":
- if glyphs[i][0] in glyphcols:
- bgcol,fgcol=glyphcols[glyphs[i][0]]
- else:
- bgcol,fgcol=(200,200,200),(0,0,0)
- Type=glyphs[i][0]
- #DROPSHADOW GLYPHTYPE
- text = fontLarge1.render(Type, True, (32, 32 ,32))
- screen.blit(text,((i[0]+.37)*scale, (i[1]+.25)*scale))
- text = fontLarge1.render(Type, True, (220, 220, 220))
- screen.blit(text,((i[0]+.40)*scale, (i[1]+.28)*scale))
- ######END DROPSHADOW
- vals=glyphs[i][1]
- #vals
- text = fontSmall1.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, fgcol)
- screen.blit(text,((i[0]+.15)*scale, (i[1]+.52)*scale))
- left,up,right,down=[a if a!=None else "" for a in glyphs[i][2:6]]
- #LEFT
- text = fontSmall1.render(str(left), True, fgcol)
- screen.blit(text,((i[0]+.05)*scale, (i[1]+.42)*scale))
- #UP
- text = fontSmall1.render(str(up), True, fgcol)
- screen.blit(text,((i[0]+.37)*scale, (i[1]+.05)*scale))
- #RIGHT
- text = fontSmall1.render(str(right), True, fgcol)
- screen.blit(text,((i[0]+.8)*scale-4*len(str(right)), (i[1]+.42)*scale))
- #DOWN
- text = fontSmall1.render(str(down), True, fgcol)
- screen.blit(text,((i[0]+.37)*scale, (i[1]+.8)*scale))
- def movecursor(keys):
- global pos
- if keys[pygame.K_LEFT]:
- pos=(max(0,pos[0]-1),pos[1])
- if keys[pygame.K_RIGHT]:
- pos=(pos[0]+1,pos[1])
- if keys[pygame.K_UP]:
- pos=(pos[0],max(0,pos[1]-1))
- if keys[pygame.K_DOWN]:
- pos=(pos[0],pos[1]+1)
- def movesubselection(keys):
- global subpos
- if subpos==(-1,0):
- if keys[pygame.K_UP]:subpos=(0,-1)
- if keys[pygame.K_DOWN]:subpos=(0,1)
- if keys[pygame.K_RIGHT]:subpos=(0,0)
- elif subpos==(0,0):
- if keys[pygame.K_UP]:subpos=(0,-1)
- if keys[pygame.K_DOWN]:subpos=(0,1)
- if keys[pygame.K_LEFT]:subpos=(-1,0)
- if keys[pygame.K_RIGHT]:subpos=(1,0)
- elif subpos==(0,1):
- if keys[pygame.K_UP]:subpos=(0,0)
- if keys[pygame.K_LEFT]:subpos=(-1,0)
- if keys[pygame.K_RIGHT]:subpos=(1,0)
- elif subpos==(0,-1):
- if keys[pygame.K_DOWN]:subpos=(0,0)
- if keys[pygame.K_LEFT]:subpos=(-1,0)
- if keys[pygame.K_RIGHT]:subpos=(1,0)
- elif subpos==(1,0):
- if keys[pygame.K_UP]:subpos=(0,-1)
- if keys[pygame.K_DOWN]:subpos=(0,1)
- if keys[pygame.K_LEFT]:subpos=(0,0)
- if keys[pygame.K_RIGHT]:subpos=(2,0)
- elif subpos==(2,0):
- if keys[pygame.K_UP]:subpos=(0,-1)
- if keys[pygame.K_DOWN]:subpos=(0,1)
- if keys[pygame.K_LEFT]:subpos=(1,0)
- def modify(keys):
- global inp,subpos
- if keys[pygame.K_LSHIFT] or subpos==(0,0):
- d={
- 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",
- 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",
- 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",
- 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:"<"
- ,pygame.K_PERIOD:">",pygame.K_SLASH:"?"}
- else:
- d={
- 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",
- 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",
- 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",
- 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:","
- ,pygame.K_PERIOD:".",pygame.K_SLASH:"/"}
- if keys[pygame.K_SPACE]:
- inp=inp+" "
- if keys[pygame.K_BACKSPACE]:
- inp=inp[:-1]
- for i in d:
- if keys[i]:inp+=d[i]
- def openglyph(pos):
- global activeglyph,glyphs,selected,subpos
- if not pos in glyphs:
- glyphs[pos]=["_",[],None,None,None,None]
- subpos=(0,0)
- activeglyph=glyphs[pos]
- selected=True
- def closeglyph(pos):
- global activeglyph,selected
- activeglyph=None
- selected=False
- def menu(keys):
- global modifying,inp,glyphs
- if modifying:
- modify(keys)
- if keys[pygame.K_RETURN]:
- if subpos==(0,0):glyphs[pos][0]="_" if inp=="_" or inp=="" else inp
- if subpos==(1,0):glyphs[pos][1]=eval("["+inp[1:-1]+"]")
- if subpos==(-1,0):glyphs[pos][2]=None if inp=="_" or inp=="" else inp
- if subpos==(0,-1):glyphs[pos][3]=None if inp=="_" or inp=="" else inp
- if subpos==(2,0):glyphs[pos][4]=None if inp=="_" or inp=="" else inp
- if subpos==(0,1):glyphs[pos][5]=None if inp=="_" or inp=="" else inp
- modifying=False
- else:
- if keys[pygame.K_RETURN]:
- closeglyph(pos)
- movesubselection(keys)
- if keys[pygame.K_SPACE]:
- modifying=True
- d={(0,0):glyphs[pos][0],
- (1,0):glyphs[pos][1],
- (-1,0):glyphs[pos][2],
- (0,-1):glyphs[pos][3],
- (2,0):glyphs[pos][4],
- (0,1):glyphs[pos][5]
- }
- inp=str("" if d[subpos]==None else d[subpos])
- inpos=None
- lastrefresh=0
- keys=pygame.key.get_pressed()
- offkeys=map(lambda x:0,keys)
- name="PROGNAME"
- while 1:
- keys=tuple(map(lambda a,b,c:max(a,b) if c==0 else 0,keys,pygame.key.get_pressed(),offkeys))
- t=time()
- if lastrefresh+1/10<t:
- if selected:
- menu(keys)
- else:
- movecursor(keys)
- if keys[pygame.K_SPACE]:
- openglyph(pos)
- if (keys[pygame.K_LCTRL] or keys[pygame.K_RCTRL]) and keys[pygame.K_n]:
- glyphs={}
- if keys[pygame.K_F5]:
- prog= makeprogram()
- from gridlang import *
- open(name,"w").write(prog)
- p=eval(prog)
- if inpos!=None and glyphs[pos][0]=="T":
- w=p.makewave(inpos,[1 for i in range(44100)],glyphs[pos][1][0])
- p.exportsound(w)
- if keys[pygame.K_i]:
- inpos=pos
- screen.fill(bgcol)
- drawgrid()
- drawselection()
- drawglyphs()
- drawsidebar()
- drawsubpos()
- pygame.display.flip()
- lastrefresh=t
- offkeys=map(lambda x:x,keys)
- offkeys[pygame.K_LSHIFT]=0
- offkeys[pygame.K_RCTRL]=0
- offkeys[pygame.K_LCTRL]=0
- keys=map(lambda a,b:a if b==0 else 0,pygame.key.get_pressed(),offkeys)
- pygame.event.pump()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement