File: shapes.py

package info (click to toggle)
csound 1%3A6.08.0~dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 46,084 kB
  • sloc: ansic: 179,873; cpp: 58,415; python: 11,289; lisp: 4,046; xml: 1,302; objc: 1,198; yacc: 1,197; perl: 635; java: 618; sh: 608; tcl: 341; lex: 209; makefile: 168
file content (106 lines) | stat: -rw-r--r-- 3,497 bytes parent folder | download
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())