File: 03-synchronization.rst.txt

package info (click to toggle)
python-pyo 1.0.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,332 kB
  • sloc: python: 135,133; ansic: 127,822; javascript: 16,116; sh: 395; makefile: 388; cpp: 242
file content (91 lines) | stat: -rw-r--r-- 3,154 bytes parent folder | download | duplicates (2)
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
03-synchronization.py - Synchronizing multiple processes.
============================================================================================================================================


Usage:
    python3 -i 03-synchronization.py

.. code-block:: python

    import sys, time, random, multiprocessing
    from pyo import *
    
    RECORD = False
    
    if sys.platform.startswith("linux"):
        audio = "jack"
    elif sys.platform.startswith("darwin"):
        audio = "portaudio"
        print("SharedTable does not behave correctly under MacOS... This example doesn't work.")
    else:
        print("Multicore examples don't run under Windows... Sorry!")
        exit()
    
    
    class Main(multiprocessing.Process):
        def __init__(self):
            super(Main, self).__init__()
            self.daemon = True
    
        def run(self):
            self.server = Server(audio=audio)
            self.server.deactivateMidi()
            self.server.boot().start()
            bufsize = self.server.getBufferSize()
            if RECORD:
                self.server.recstart("synchronization.wav")
    
            self.tab1 = SharedTable("/audio-1", create=False, size=bufsize)
            self.tab2 = SharedTable("/audio-2", create=False, size=bufsize)
            self.out1 = TableScan(self.tab1).out()
            self.out2 = TableScan(self.tab2).out(1)
    
            time.sleep(30)
            self.server.stop()
    
    
    class Proc(multiprocessing.Process):
        def __init__(self, voice, conn):
            super(Proc, self).__init__()
            self.voice = voice
            self.connection = conn
            self.daemon = True
    
        def run(self):
            self.server = Server(audio=audio)
            self.server.deactivateMidi()
            self.server.boot()
            bufsize = self.server.getBufferSize()
    
            name = "/audio-%d" % self.voice
            self.audiotable = SharedTable(name, create=True, size=bufsize)
    
            onsets = random.sample([5, 6, 7, 8, 9], 2)
            self.tab = CosTable([(0, 0), (32, 1), (512, 0.5), (4096, 0.5), (8191, 0)])
            self.ryt = Euclide(time=0.125, taps=16, onsets=onsets, poly=1).play()
            self.mid = TrigXnoiseMidi(self.ryt, dist=12, mrange=(60, 96))
            self.frq = Snap(self.mid, choice=[0, 2, 3, 5, 7, 8, 10], scale=1)
            self.amp = TrigEnv(self.ryt, table=self.tab, dur=self.ryt["dur"], mul=self.ryt["amp"])
            self.sig = SineLoop(freq=self.frq, feedback=0.08, mul=self.amp * 0.3)
            self.fil = TableFill(self.sig, self.audiotable)
    
            # Wait for an incoming signal before starting the server.
            while not self.connection.poll():
                pass
            self.server.start()
    
            time.sleep(30)
            self.server.stop()
    
    
    if __name__ == "__main__":
        signal, child = multiprocessing.Pipe()
        p1, p2 = Proc(1, child), Proc(2, child)
        main = Main()
        p1.start()
        p2.start()
        time.sleep(0.1)
        main.start()
        time.sleep(0.1)
        signal.send(1)