Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Edit/MainWindow.py72
-rw-r--r--Util/ControlStream.py135
-rw-r--r--Util/NoteDB.py2
3 files changed, 182 insertions, 27 deletions
diff --git a/Edit/MainWindow.py b/Edit/MainWindow.py
index e4e0ad1..ad658b5 100644
--- a/Edit/MainWindow.py
+++ b/Edit/MainWindow.py
@@ -1234,41 +1234,61 @@ class MainWindow( SubActivity ):
# load and save functions
#-----------------------------------
def handleSave(self, widget):
+ def saveFile(filter):
+ chooser = gtk.FileChooserDialog(
+ title='Save TamTam Tune',
+ action=gtk.FILE_CHOOSER_ACTION_SAVE,
+ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK))
+ chooser.set_filter(filter)
+ for f in chooser.list_shortcut_folder_uris():
+ chooser.remove_shortcut_folder_uri(f)
+ if chooser.run() == gtk.RESPONSE_OK:
+ try:
+ print 'INFO: serialize to file %s' % chooser.get_filename()
+ ofile = open(chooser.get_filename(), 'w')
+ ofilestream = ControlStream.TamTamOStream (ofile)
+ self.noteDB.dumpToStream(ofilestream)
+ ofile.close()
+ except IOError:
+ print 'ERROR: failed to serialize to file %s' % chooser.get_filename()
+ chooser.destroy()
+ def loadFile(filter):
+ chooser = gtk.FileChooserDialog(
+ title='Load TamTam Tune',
+ action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
+ chooser.set_filter(filter)
+ if chooser.run() == gtk.RESPONSE_OK:
+ try:
+ print 'DEBUG: clearing noteDB'
+ self.noteDB.deletePages( self.noteDB.pages.keys() )
+ # still leaves an empty page at start... grrr
+ print 'DEBUG: loading file: ', chooser.get_filename()
+ ifile = open(chooser.get_filename(), 'r')
+ ttt = ControlStream.TamTamTable ( self.noteDB )
+ ttt.parseFile(ifile)
+ ifile.close()
+ self.noteDB.deletePages( self.noteDB.tune[0:1] )
+ except IOError:
+ print 'ERROR: failed to serialize from file %s' % chooser.get_filename()
+
+ chooser.destroy()
+
+ filter = gtk.FileFilter()
+ filter.add_pattern('*.tam')
+
try:
if (self.handleSaveCount == 1):
- print 'DEBUG: clearing noteDB'
- self.noteDB.deletePages( self.noteDB.pages.keys() )
- # still leaves an empty page at start... grrr
- print 'DEBUG: loading ofile.tam'
- ifile = open('ofile.tam', 'r')
- ttt = ControlStream.TamTamTable ( self.noteDB )
- ttt.parseFile(ifile)
- ifile.close()
+ loadFile(filter)
self.handleSaveCount = 0
return
+
except AttributeError:
pass
- print 'DEBUG: saving to ofile.tam'
- ofile = open('ofile.tam', 'w')
- ofilestream = ControlStream.TamTamOStream (ofile)
- self.noteDB.dumpToStream(ofilestream)
- ofile.close()
+ saveFile(filter)
self.handleSaveCount = 1
- if False:
- chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK))
-
- if chooser.run() == gtk.RESPONSE_OK:
- try:
- print 'INFO: serialize to file %s' % chooser.get_filename()
- f = open( chooser.get_filename(), 'w')
- pickle.dump( self._data, f )
- f.close()
- except IOError:
- print 'ERROR: failed to serialize to file %s' % chooser.get_filename()
-
- chooser.destroy()
def handleLoad(self, widget, data):
chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
diff --git a/Util/ControlStream.py b/Util/ControlStream.py
new file mode 100644
index 0000000..bb4acf4
--- /dev/null
+++ b/Util/ControlStream.py
@@ -0,0 +1,135 @@
+import sys
+import types
+import time
+
+import Config
+
+from Util import NoteDB
+from Util.CSoundNote import CSoundNote
+from Util.CSoundClient import new_csound_client
+
+class TamTamOStream:
+ def __init__(self, file):
+ self.file = file
+
+ 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) ]
+ self.file.write( " ".join([str(i) for i in l]))
+ self.file.write('\n')
+
+ def tune_set(self, tune):
+ self.file.write('tune_set ')
+ self.file.write(" ".join([str(t) for t in tune]))
+ self.file.write('\n')
+
+class TamTamTable:
+
+ def __init__(self, noteDB):
+ self.noteDB = noteDB
+ self.csnd = new_csound_client()
+ self.pid = {}
+
+ 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_inst':self.track_inst,
+ 'track_vol':self.track_vol,
+ 'tune_set':self.tune_set,
+ 'sleep':self.sleep,
+ 'quit':self.quit}
+
+ def parseFile(self, ifile):
+ table = self.parseTable()
+ while True:
+ l = ifile.readline()
+ if l == '\n': break
+ if l == '': break
+ 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])
+ cs = CSoundNote(
+ int(argv[3]),
+ int(argv[4]),
+ float(argv[5]),
+ float(argv[6]),
+ float(argv[7]),
+ int(argv[8]),
+ int(argv[9]),
+ float(argv[10]),
+ float(argv[11]),
+ float(argv[12]),
+ float(argv[13]),
+ float(argv[14]),
+ bool(argv[15]),
+ argv[16])
+
+ self.noteDB.addNote(nid, 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])
+ after = self.noteDB.tune[-1]
+ self.pid[pid] = self.noteDB.addPage(pid, NoteDB.Page(beats), after)
+
+ def page_set(self, argv):
+ print 'page_set', argv
+ def track_inst(self, argv):
+ print 'track_inst not implemented yet'
+ def track_vol(self, argv):
+ print 'track_vol not implemented yet'
+ def tune_set(self, argv):
+ if Config.DEBUG > 3: print 'tune_set', argv
+
+ if Config.DEBUG > 3: print 'ERROR: tune_set is not handled properly by mainwindow yet... skipping\n'
+ return
+
+ self.noteDB.tune = [int(i) for i in argv]
+ pids = self.noteDB.pages.keys()
+ pids_to_del = [pid for pid in self.noteDB.pages.keys()
+ if pid not in self.noteDB.tune]
+ self.noteDB.deletePages( pids_to_del )
+
+ 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)
+
diff --git a/Util/NoteDB.py b/Util/NoteDB.py
index 6679446..ac3b75f 100644
--- a/Util/NoteDB.py
+++ b/Util/NoteDB.py
@@ -83,7 +83,7 @@ class NoteDB:
self.clipboardArea = [] # stores the limits and tracks for each page in the clipboard
def dumpToStream(self, ostream):
- for pid in self.pages:
+ for pid in self.tune:
ostream.page_add(pid, self.pages[pid])
for pid in self.noteD:
for tid in xrange( len( self.noteD[pid])):