Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > 5fcfcb7517038d1f44ab4e478e6e61fa > files > 2784

csound-doc-6.10.0-1.mga7.noarch.rpm

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())