11 from pygame.locals import *
12 from OpenGL.GL import *
17 CURRENT_DIR = os.path.dirname(__file__)
22 KEY_MAP = os.path.join(CURRENT_DIR,"key.txt")
28 #number_of_notes = max_note - min_note + 1
29 #theta2r = math.pi / 180
31 new_key = [48,50,52,53,54,55,57,59,60,62,64,65,67,69,71,72,74,76]
32 number_of_notes = len(new_key)
33 space = WIDTH / number_of_notes
36 def __init__(self,writer,output=0):
38 self.midiout = pygame.midi.Output(MIDI_PORT)
39 self.INSTRUMENT = 0 #0:Piano#19:Organ,56:Trympet
40 self.set_instrument(self.INSTRUMENT)
42 self.default_volume = 128
47 #for i in xrange(number_of_notes + 1):
48 # self.keys[i] = min_note + i
49 self.key_map = self.load_key_map(KEY_MAP)
51 def set_instrument(self,instrument):
52 self.INSTRUMENT = instrument
53 self.midiout.set_instrument(instrument)
55 def rebus_sustain(self):
61 def note_on(self,no,vol=100):
62 if not no in self.on_notes:
63 self.midiout.note_on(no,vol)
64 self.on_notes.append(no)
66 def note_off(self,no):
67 if no in self.on_notes:
68 self.midiout.note_off(no,0)
69 self.on_notes.remove(no)
71 def load_key_map(self,filename):
73 for line in open(filename,"r"):
77 [key,no,x,y] = [l.strip() for l in line.split(",")]
78 dic[eval(key)] = (int(no),(int(x),int(y)))
81 def on_event(self,events):
83 if event.type == KEYDOWN:
84 if event.key in self.key_map:
85 self.note_on(self.key_map[event.key][0])
86 self.writer.start(self.key_map[event.key][1])
87 if event.key == K_ESCAPE:
89 elif event.type == KEYUP:
90 if event.key in self.key_map:
91 self.note_off(self.key_map[event.key][0])
92 elif event.type == MOUSEBUTTONDOWN:
94 (x,y) = pygame.mouse.get_pos()
96 #key = self.keys[x // space]
97 key = new_key[x // space]
100 self.writer.start((x,y))
104 self.writer.start((x,y))
106 elif event.button == 2:
108 elif event.type == MOUSEBUTTONUP:
109 if event.button == 1:
110 (x,y) = pygame.mouse.get_pos()
113 self.note_off(self.mouse_key)
114 elif event.type == QUIT:
118 def __init__(self,tex_lis):
120 self.tex_lis = tex_lis
122 self.x,self.y = (-100,-100)
129 glTranslatef(self.x - self.rate * 500,self.y - self.rate * 500,0)
130 glScale(self.rate,self.rate,0)
131 glCallList(self.tex_lis)
133 def start(self,(x,y)):
140 self.rate = self.rate + self.ratep
141 if self.rate > self.maxrate:
143 self.x,self.y = (-100,-100)
146 def __init__(self,tex_lis):
148 self.tex_lis = tex_lis
158 glTranslatef(self.x - 750,self.y - 750,0)
159 glTranslatef(750,750,0)
160 glRotatef(self.theta,0,0,1)
161 glTranslatef(-750,-750,0)
162 glCallList(self.tex_lis)
164 def start(self,(x,y)):
168 self.theta = random.randint(0,360)
172 self.rate = self.rate + self.ratep
173 if self.rate > self.maxrate:
178 def __init__(self,tex_lis):
180 self.tex_lis = tex_lis
182 self.x,self.y = (-100,-100)
191 glTranslatef(self.x - self.rate * 500,self.y - self.rate * 500,0)
192 glScale(self.rate,self.rate,0)
193 glTranslatef(500,500,0)
194 glRotatef(self.angle,0,0,1)
195 glTranslatef(-500,-500,0)
196 glCallList(self.tex_lis)
198 def start(self,(x,y)):
202 self.anglep = random.choice((-1,1))
203 self.angle = random.randint(0,360)
207 self.rate = self.rate + self.ratep
208 self.angle = self.angle + self.anglep
209 if self.rate > self.maxrate:
211 self.x,self.y = (-100,-100)
214 def __init__(self,tex_lis):
216 self.tex_lis = tex_lis
218 self.x,self.y = (-100,-100)
227 glTranslatef(self.x - self.rate * 500,self.y - self.rate * 500,0)
228 glScale(self.rate,self.rate,0)
229 glTranslatef(500,500,0)
230 glRotatef(self.angle,0,0,1)
231 glTranslatef(-500,-500,0)
232 glCallList(self.tex_lis)
234 def start(self,(x,y)):
238 self.anglep = random.choice((-1,1))
239 self.angle = random.randint(0,360)
243 self.rate = self.rate + self.ratep
244 self.angle = self.angle + self.anglep
245 if self.rate > self.maxrate:
247 self.x,self.y = (-100,-100)
252 circle_tex = gu.create_texture(os.path.join(CURRENT_DIR,"circlet.png"))
253 square_tex = gu.create_texture(os.path.join(CURRENT_DIR,"squaret.png"))
254 line_tex = gu.create_texture(os.path.join(CURRENT_DIR,"line2t.png"))
255 triangle_tex = gu.create_texture(os.path.join(CURRENT_DIR,"trianglet.png"))
256 self.circles = [Circle(circle_tex) for i in xrange(8)]
257 self.squares = [Square(square_tex) for i in xrange(8)]
258 self.lines = [Line(line_tex) for i in xrange(8)]
259 self.triangles = [Triangle(triangle_tex) for i in xrange(8)]
262 for c in self.circles:
264 for s in self.squares:
268 for t in self.triangles:
271 def start(self,(x,y)):
272 r = random.choice((0,1,2,3))
274 for c in self.circles:
279 for s in self.squares:
289 for t in self.triangles:
295 for c in self.circles:
297 for s in self.squares:
301 for t in self.triangles:
306 screen = gu.init(WIDTH,HEIGHT)
307 pygame.mouse.set_visible(True)
309 ano = AnoEngine(writer,MIDI_PORT)
310 clock = pygame.time.Clock()
314 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
316 ano.on_event(pygame.event.get())
319 pygame.display.flip()
321 if __name__ == "__main__":