Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/mini.py
blob: ae18a0195097a1efc9dc945714836744ac14bdc8 (plain)
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
107
108
109
110
111
112
113
114
115
116

from Util.CSoundClient import new_csound_client
from Util.NoteDB import PARAMETER, NoteDB
from Util.ControlStream import *


class MiniPlayer:
    def __init__(self, ndb):
        self.csnd = new_csound_client()
        self.csnd.connect(True)
        self.csnd.loopSetNumTicks(50)
        self.csnd.loopStart()
        self.csnd.setMasterVolume(1.0)
        self.csnd.setTrackVolume(1.0, 1)

        self.noteDB = ndb
        ndb.addListener( self, page=True, note=True )

    def recompose( self, algo, params, genOrVar):

        newtracks = set(range(Config.NUMBER_OF_TRACKS))
        newpages = self.tuneInterface.getSelectedIds()

        if genOrVar == 0:
            dict = {}
            for t in newtracks:
                dict[t] = {}
                for p in newpages:
                    dict[t][p] = self.noteDB.getCSNotesByTrack( p, t )
        else:
            dict = {}
            for t in newtracks:
                dict[t] = {}
                dict[t][1] = self.noteDB.getCSNotesByTrack( 1, t )

        beatsOfPages = {}        
        for pageId in newpages:
            beatsOfPages[pageId] = self.noteDB.pages[pageId].beats

        algo(
                params,
                self._data['track_volume'][:],
                [ i.name for i in self.trackInstrument ],
                self._data['tempo'],
                beatsOfPages,
                newtracks,
                newpages,
                dict)

        # filter & fix input ...WTF!?
        for track in dict:
            for page in dict[track]:
                for note in dict[track][page]:
                    intdur = int(note.duration)
                    note.duration = intdur
                    note.pageId = page
                    note.trackId = track

        # prepare the new notes
        newnotes = []
        for tid in dict:
            for pid in dict[tid]:
                newnotes += dict[tid][pid]

        # delete the notes and add the new
        self.noteDB.deleteNotesByTrack( newpages, newtracks )

        stream = []
        for page in newpages:
            for track in newtracks:
                stream += [ page, track, len(dict[track][page]) ]
                stream += dict[track][page]
        stream += [-1]
        self.noteDB.addNotes( stream )
    def notifyPageAdd( self, id, at ):
        return

    def notifyPageDelete( self, which, safe ):
        pass

    def notifyPageDuplicate( self, new, at ):
        return

    def notifyPageMove( self, which, low, high ):
        return

    def notifyNoteAdd( self, page, track, id ):
        print 'INFO: adding note to loop', page, track, id
        n = self.noteDB.getNote(page, track, id)
        self.csnd.loopPlay(n,0)
        onset = n.cs.onset + 0 #self.page_onset[n.page]
        self.csnd.loopUpdate(n, PARAMETER.ONSET, onset, 1) #set onset + activate

    def notifyNoteDelete( self, page, track, id ):
        print 'INFO: deleting note from loop', page, track, id
        self.csnd.loopDelete1(page,id)
    def notifyNoteUpdate( self, page, track, id, parameter, value ):
        print 'INFO: updating note ', page, id, parameter, value
        note = self.noteDB.getNote(page, track, id)
        self.csnd.loopUpdate(note, parameter, value, -1)

if __name__ == '__main__':
    ndb = NoteDB()
    mplayer = MiniPlayer(ndb)

    ttt = TamTamTable(ndb)
    table = ttt.parseTable()
    while True:
        l = sys.stdin.readline()
        if l == '\n': break
        cmdlist = l.split()
        if cmdlist[0] not in table:
            print 'ERROR: command %s not defined by parse table' % cmdlist[0]
        else:
            table[cmdlist[0]](cmdlist[1:])