diff options
-rw-r--r-- | Edit/MainWindow.py | 72 | ||||
-rw-r--r-- | Util/ControlStream.py | 135 | ||||
-rw-r--r-- | Util/NoteDB.py | 2 |
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])): |