1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
import Tkinter
import csnd6
class Application(Tkinter.Frame):
def move(self,event):
canvas = event.widget
x = canvas.canvasx(event.x)
y = canvas.canvasy(event.y)
item = canvas.find_withtag("current")[0]
canvas.coords(item, x+10, y+10, x-10, y-10)
self.cs.SetChannel("pitch", 2.0*x/self.size)
self.cs.SetChannel("volume", 2.0*(self.size-y)/self.size)
def play(self,event):
note = event.widget.find_withtag("current")[0]
self.canvas.itemconfigure(note, fill="red")
self.perf.InputMessage("i1 0 -1 5000 440")
def stop(self,event):
note = event.widget.find_withtag("current")[0]
self.canvas.itemconfigure(note, fill="black")
self.perf.InputMessage("i-1 0 5000 440")
def createCanvas(self):
self.size = 600
self.canvas = Tkinter.Canvas(self,height=self.size,
width=self.size,
bg="violet")
self.canvas.pack()
def createCircle(self):
circle = self.canvas.create_oval(self.size/2-10,
self.size/2-10,
self.size/2+10,
self.size/2+10,
fill="black")
self.canvas.tag_bind(circle,"<ButtonPress>",
self.play)
self.canvas.tag_bind(circle,"<B1-Motion>",
self.move)
self.canvas.tag_bind(circle,"<ButtonRelease>",
self.stop)
def createMeter(self):
iw = 10
self.vu = []
for i in range(0, self.size, iw):
self.vu.append(self.canvas.create_rectangle(i,
self.size-40,i+iw,self.size,fill="grey"))
def drawMeter(self):
level = self.cs.GetChannel("meter")
cnt = 0
red = (self.size/10)*0.8
yellow = (self.size/10)*0.6
for i in self.vu:
if level > cnt*100:
if cnt > red:
self.canvas.itemconfigure(i, fill="red")
elif cnt > yellow:
self.canvas.itemconfigure(i, fill="yellow")
else:
self.canvas.itemconfigure(i, fill="blue")
else:
self.canvas.itemconfigure(i, fill="grey")
cnt = cnt + 1
self.master.after(50,self.drawMeter)
def quit(self):
self.perf.Stop()
self.perf.Join()
self.master.destroy()
def createEngine(self):
self.cs = csnd6.Csound()
res = self.cs.Compile('shapes.csd')
if res == 0:
self.cs.SetChannel('pitch', 1.0)
self.cs.SetChannel('volume', 1.0)
self.perf = csnd6.CsoundPerformanceThread(self.cs)
self.perf.Play()
return True
else:
return False
def __init__(self,master=None):
Tkinter.Frame.__init__(self,master)
self.master.title('Csound + Tkinter: '
'just click and play')
self.master = master
self.pack()
self.createCanvas()
self.createCircle()
self.createMeter()
if self.createEngine() is True:
self.drawMeter()
self.master.protocol('WM_DELETE_WINDOW',
self.quit)
self.master.mainloop()
else: self.master.quit()
Application(Tkinter.Tk())
|