Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TamTamEdit.activity/common/Util/ControlStream.py
diff options
context:
space:
mode:
Diffstat (limited to 'TamTamEdit.activity/common/Util/ControlStream.py')
-rw-r--r--TamTamEdit.activity/common/Util/ControlStream.py254
1 files changed, 254 insertions, 0 deletions
diff --git a/TamTamEdit.activity/common/Util/ControlStream.py b/TamTamEdit.activity/common/Util/ControlStream.py
new file mode 100644
index 0000000..eea3150
--- /dev/null
+++ b/TamTamEdit.activity/common/Util/ControlStream.py
@@ -0,0 +1,254 @@
+import sys
+import types
+import time
+
+import common.Config as Config
+
+import os
+
+from common.Util import NoteDB
+from common.Util.CSoundNote import CSoundNote
+from common.Util.CSoundClient import new_csound_client
+
+import common.Util.InstrumentDB as InstrumentDB
+
+try:
+ from Jam import Block
+except:
+ pass # we're not in Jam mode
+
+class TamTamOStream:
+ def __init__(self, file):
+ self.file = file
+ self.instrumentDB = InstrumentDB.getRef()
+
+ def note_add(self, note):
+ l = ['note_add', note.id, note.page, note.track,
+ note.cs.onset,
+ note.cs.pitch,
+ note.cs.amplitude,
+ note.cs.pan,
+ note.cs.duration,
+ note.cs.trackId,
+ note.cs.instrumentId,
+ note.cs.attack,
+ note.cs.decay,
+ note.cs.reverbSend,
+ note.cs.filterType,
+ note.cs.filterCutoff,
+ int(note.cs.tied),
+ note.cs.mode]
+
+ self.file.write( " ".join([str(i) for i in l]))
+ self.file.write('\n')
+
+ def page_add(self, pid, page):
+ l = [ 'page_add', str(pid), str(page.beats), str(page.color), str( [ self.instrumentDB.getInstrument(i).name for i in page.instruments ] ) ]
+ self.file.write( " ".join([str(i) for i in l]))
+ self.file.write('\n')
+
+ def track_vol(self, vols):
+ self.file.write('track_vol ')
+ self.file.write(" ".join([str(t) for t in vols]))
+ self.file.write('\n')
+
+ def master_vol(self, volume):
+ self.file.write('master_vol ')
+ self.file.write(str(volume))
+ self.file.write('\n')
+
+ def tempo(self, tempo):
+ self.file.write('tempo ')
+ self.file.write(str(tempo))
+ self.file.write('\n')
+
+ def block_add( self, typeStr, active, centerX, centerY, child, data ):
+ if typeStr == "Drum" or typeStr == "Instrument":
+ realId = data["id"] # don't overwrite the block's data
+ data["id"] = self.instrumentDB.getInstrument( data["id"] ).name
+ l = [ "block_add", typeStr, str(active), str(centerX), str(centerY), str(child), str(data) ]
+ self.file.write( " ".join([str(i) for i in l]))
+ self.file.write('\n')
+ if typeStr == "Drum" or typeStr == "Instrument":
+ data["id"] = realId
+
+ def desktop_store( self, filename, id ):
+ self.file.write( "desktop_store %d\n" % id )
+ try:
+ file = open( filename, "r" )
+ for line in file:
+ self.file.write( line )
+ file.close()
+ except:
+ if Config.DEBUG > 3: print "ERROR:: desktop_store could not open file: " + filename
+ self.file.write( "desktop_store END\n" )
+
+ def desktop_set( self, id ):
+ self.file.write( "desktop_set %d\n" % id )
+
+ def sync_beats( self, beats ):
+ self.file.write( "sync_beats %d\n" % beats )
+
+class TamTamTable:
+
+ def __init__(self, noteDB = None, jam = None ):
+ self.noteDB = noteDB
+ self.jam = jam
+ self.csnd = new_csound_client()
+ self.pid = {} #stream_pid : local_pid
+ self.instrumentDB = InstrumentDB.getRef()
+
+ def parseTable(self):
+ return {
+ 'note_set':self.note_set,
+ 'note_add':self.note_add,
+ 'page_add':self.page_add,
+ 'page_set':self.page_set,
+ 'track_vol':self.track_vol,
+ 'master_vol':self.master_vol,
+ 'tempo':self.tempo,
+ 'block_add':self.block_add,
+ 'desktop_store':self.desktop_store,
+ 'desktop_set':self.desktop_set,
+ 'sync_beats':self.sync_beats,
+ 'sleep':self.sleep,
+ 'quit':self.quit}
+
+ def parseFile(self, ifile):
+ table = self.parseTable()
+ self.file = ifile
+ for l in self.file:
+ #print "---", l
+ cmdlist = l.split()
+ if len(cmdlist) > 0:
+ if cmdlist[0] not in table:
+ print 'ERROR: skipping command %s not found in parse table' % cmdlist[0]
+ else:
+ table[cmdlist[0]](cmdlist[1:])
+
+ def note_add(self, argv):
+ if Config.DEBUG > 3: print 'note_add', argv
+
+ nid = int(argv[0])
+ page = self.pid[int(argv[1])]
+ track = int(argv[2])
+ instId = self.noteDB.getPage( page ).instruments[ track ]
+ cs = CSoundNote(
+ int(argv[3]),
+ int(argv[4]),
+ float(argv[5]),
+ float(argv[6]),
+ float(argv[7]),
+ int(argv[8]),
+ instId,
+ float(argv[10]),
+ float(argv[11]),
+ float(argv[12]),
+ float(argv[13]),
+ float(argv[14]),
+ bool(argv[15]),
+ argv[16])
+
+ self.noteDB.addNote( -1, page, track, cs )
+
+ def note_set(self, argv):
+ print 'note_set', argv
+
+ def page_add(self, argv):
+ if Config.DEBUG > 3: print 'page_add', argv
+ pid = int (argv[0])
+ beats = int (argv[1])
+ color = int( argv[2] )
+ insts = ""
+ for str in argv[3:]:
+ insts += str
+ #print pid, insts
+ instrumentNames = eval( insts )
+ instruments = [ self.instrumentDB.getInstrumentByName( i ).instrumentId for i in instrumentNames ]
+ for id in instruments:
+ i = self.instrumentDB.getInstrument( id )
+ if i.kit == None:
+ self.csnd.load_instrument(i.name)
+ else:
+ self.csnd.load_drumkit(i.name)
+ if len( self.noteDB.tune ):
+ after = self.noteDB.tune[-1]
+ else:
+ after = False
+ self.pid[pid] = self.noteDB.addPage(-1, NoteDB.Page(beats,color,instruments), after)
+
+ def page_set(self, argv):
+ print 'page_set', argv
+
+ def track_vol(self, argv):
+ self.tracks_volume = []
+ for i in range(len(argv)):
+ self.tracks_volume.append(float(argv[i]))
+
+ def master_vol(self, argv):
+ self.masterVolume = eval( argv[0] )
+
+ def tempo(self, argv):
+ self.tempo = eval( argv[0] )
+
+ def block_add( self, argv ):
+ blockClass = Block.StrToClass[argv[0]]
+ active = eval( argv[1] )
+ x = int( argv[2] )
+ y = int( argv[3] )
+ child = eval( argv[4] )
+ data = ""
+ for str in argv[5:]:
+ data += str
+ data = eval( data )
+
+ if blockClass == Block.Drum:
+ data["page"] = self.pid[ data["page"] ]
+ data["id"] = self.instrumentDB.getInstrumentByName( data["id"] ).instrumentId
+ elif blockClass == Block.Instrument:
+ data["id"] = self.instrumentDB.getInstrumentByName( data["id"] ).instrumentId
+ elif blockClass == Block.Loop:
+ data["id"] = self.pid[ data["id"] ]
+ self.jam.updateLoopImage( data["id"] )
+
+ if child:
+ block = blockClass( self.jam.getDesktop(), data )
+ self.lastBlock.addChild( block )
+ else:
+ block = self.jam.getDesktop().addBlock( blockClass, data, ( x, y ) )
+
+ block.setPlaced( True )
+
+ if blockClass == Block.Instrument and active:
+ self.jam.getDesktop().activateInstrument( block )
+
+ self.lastBlock = block
+
+ def desktop_store( self, argv ):
+ filename = self.jam.getDesktopScratchFile( int( argv[0] ) )
+ #try:
+ if os.path.isfile( filename ):
+ os.remove( filename )
+
+ file = open( filename, "w" )
+ for line in self.file:
+ if line == "desktop_store END\n":
+ break
+ file.write( line )
+ file.close
+ #except:
+ # if Config.DEBUG > 3: print "ERROR:: desktop_store could not open file: " + filename
+
+ def desktop_set( self, argv ):
+ self.jam.setDesktop( int( argv[0] ), True )
+
+ def sync_beats( self, argv ):
+ self.jam.setSyncBeats( int( argv[0] ) )
+
+ def sleep(self, argv):
+ t = float(argv[0])
+ print 'sleeping for %i seconds' % t
+ time.sleep(t)
+ def quit(self, argv):
+ print 'quitting...'
+ sys.exit(0)