From 598fa3b434de51e809d00be2cbac3ccdfad7305e Mon Sep 17 00:00:00 2001 From: Live System User Date: Mon, 31 Oct 2011 16:32:50 +0000 Subject: Version 5 Changes: GUI tweaks --- diff --git a/activity/activity.info b/activity/activity.info index 4ec9e0b..61003c2 100755 --- a/activity/activity.info +++ b/activity/activity.info @@ -5,7 +5,7 @@ name = FileMixAuto bundle_id = org.laptop.FileMixAuto icon = activity-filemixauto -activity_version = 4 +activity_version = 5 host_version = 1 diff --git a/filemixauto.py b/filemixauto.py index 8fa76a4..66c00f7 100755 --- a/filemixauto.py +++ b/filemixauto.py @@ -1,228 +1,187 @@ -# FILEMIXAUTO - Audio File Looper/Mixer/Processor for Children (2011) -# Art Hunkins (www.arthunkins.com) -# -# FileMixAuto is licensed under the Creative Commons Attribution-Share -# Alike 3.0 Unported License. To view a copy of this license, visit -# http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to -# Creative Commons, 171 Second Street, Suite 300, San Francisco, -# California, 94105, USA. -# -# It is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# version 4 Changes: -# Record Activity compatibility updated. - - -import csndsugui -import gobject -from sugar.activity import activity -from sugar.graphics.objectchooser import ObjectChooser -from sugar import mime -import gtk -import os - -class FileMixAuto(activity.Activity): - - def __init__(self, handle): - - activity.Activity.__init__(self, handle) - - red = (0xDDDD, 0, 0) - brown = (0x6600, 0, 0) - green = (0, 0x5500, 0) - self.path1 = "0" - self.path2 = "0" - self.path3 = "0" - self.path4 = "0" - self.jobject1 = None - self.jobject2 = None - self.jobject3 = None - self.jobject4 = None - - win = csndsugui.CsoundGUI(self) - width = gtk.gdk.screen_width() - height = gtk.gdk.screen_height() - if os.path.exists("/etc/olpc-release") or os.path.exists("/sys/power/olpc-pm"): - adjust = 78 - else: - adjust = 57 - screen = win.box() - screen.set_size_request(width, height - adjust) - scrolled = gtk.ScrolledWindow() - scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - screen.pack_start(scrolled) - all = gtk.VBox() - all.show() - scrolled.add_with_viewport(all) - scrolled.show() - - win.text("FILEMIXAUTO - Audio File Looper/Mixer/Processor \ -for Children (2011)\n\ -\t\t\t\t Art Hunkins (www.arthunkins.com)", all) - - win.text("Loop and process 1 to 4 mono/stereo files; \ -wav and ogg vorbis formats only (no ogg vorbis on Sugar 0.84).\n\ - User sound files must be placed in Journal (Record activity \ -does this). No user files on Sugar 0.82 (original XO-1).\n\ - The default files are abbreviated versions of those from the author's \ -DUSK AT ST. FRANCIS SPRINGS.\n\ -You are urged to create your own sound files suitable for looping, for example, \ -with the Record activity - \n especially nature soundscapes - to set a mood \ -or accompany movement, drama, pantomime, etc.", all, brown) - - self.b2box = win.box(False, all) - bbox = win.box(False, all) - self.bb = bbox - self.w = win - self.r = red - self.g = green - self.br = brown - self.p = False - - try: - from jarabe import config - version = [int(i) for i in config.version.split('.')][:2] - except ImportError: - version = [0, 82] - if version >= [0, 84]: - boxa = win.box(False, self.b2box) - boxb = win.box(False, self.b2box) - boxc = win.box(True, boxb) - boxd = win.box(False, boxc) - boxe = win.box(True, boxc) - win.text("\t\tOptionally, select your own audio file(s) from the Journal.\n\ -\t\tDeselect a file by choosing another, or by closing Journal.\n\ -\t\tCreate your files with Record or Audacity (see ReadMe.txt).\t ", boxa, green) - win.text("Select File(s):", boxd, brown) - but5 = win.cbbutton(boxd, self.choose1, " 1 ") - but5.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) - but5.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x6600, 0, 0)) - but6 = win.cbbutton(boxd, self.choose2, " 2 ") - but6.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) - but6.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x6600, 0, 0)) - but7 = win.cbbutton(boxd, self.choose3, " 3 ") - but7.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) - but7.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x6600, 0, 0)) - but8 = win.cbbutton(boxd, self.choose4, " 4 ") - but8.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) - but8.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x6600, 0, 0)) - but9 = win.cbbutton(boxe, self.auto, " CLICK when selections made ") - but9.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) - but9.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) - else: - self.auto(self) - - def choose1(self, widget): - chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO) - result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: - self.jobject1 = chooser.get_selected_object() - self.path1 = str(self.jobject1.get_file_path()) - else: - self.jobject1 = None - self.path1 = "0" - - def choose2(self, widget): - chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO) - result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: - self.jobject2 = chooser.get_selected_object() - self.path2 = str(self.jobject2.get_file_path()) - else: - self.jobject2 = None - self.path2 = "0" - - def choose3(self, widget): - chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO) - result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: - self.jobject3 = chooser.get_selected_object() - self.path3 = str(self.jobject3.get_file_path()) - else: - self.jobject3 = None - self.path3 = "0" - - def choose4(self, widget): - chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO) - result = chooser.run() - if result == gtk.RESPONSE_ACCEPT: - self.jobject4 = chooser.get_selected_object() - self.path4 = str(self.jobject4.get_file_path()) - else: - self.jobject4 = None - self.path4 = "0" - - def send_data(self): - self.w.set_filechannel("file1", self.path1) - self.w.set_filechannel("file2", self.path2) - self.w.set_filechannel("file3", self.path3) - self.w.set_filechannel("file4", self.path4) - - def playcsd(self, widget): - def start(self): - self.p = True - self.w.play() - gobject.timeout_add(500, checkstat) - self.but.child.set_label("STOP !") - self.but.child.set_use_markup(True) - self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0xFFFF, 0, 0)) - self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0xFFFF, 0, 0)) - def stop(self): - self.p = False - self.w.recompile() - self.w.channels_reinit() - self.send_data() - self.but.child.set_label("START !") - self.but.child.set_use_markup(True) - self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) - self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) - def checkstat(): - if self.w.perf.GetStatus() == 2: - stop(self) - return True - if self.p == False: - start(self) - else: - stop(self) - - def auto(self, widget): - self.b2box.destroy() - self.box1 = self.w.box(True, self.bb) - self.w.text(" ", self.box1) - self.box2 = self.w.box(True, self.bb) - self.f = self.w.framebox(" FileMixAuto - Select Options First ",\ -False, self.box2, self.r) - self.b1 = self.w.box(True, self.f) - self.b2 = self.w.box(True, self.f) - self.b3 = self.w.box(True, self.f) - self.b4 = self.w.box(True, self.f) - self.b5 = self.w.box(True, self.f) - self.b6 = self.w.box(True, self.f) - self.b7 = self.w.box(True, self.f) - self.w.csd("FileMixAuto.csd") - self.w.spin(4, 1, 4, 1, 1, self.b1, 0, "Files", "# of Files") - self.w.spin(0, 0, 50, 1, 5, self.b1, 0, "RandRate", "Random Rate\n\ -[0=no change]") - self.w.spin(10, 0, 10, 1, 1, self.b2, 0, "MaxVol1", "Max Vol/File1 ") - self.w.spin(10, 0, 10, 1, 1, self.b2, 0, "MaxVol2", "Max Vol/File2 \n\ - Random Vol") - self.w.spin(10, 0, 10, 1, 1, self.b3, 0, "MaxVol3", "Max Vol/File3 ") - self.w.spin(10, 0, 10, 1, 1, self.b3, 0, "MaxVol4", " Max Vol/File4 \n\ -is < Max Vol") - self.w.spin(0, 0, 10, 1, 1, self.b4, 0, "RandVol", "Random Volume") - self.w.spin(0, 0, 10, 1, 1, self.b4, 0, "RandPtch", "Random Pitch\n\ -[+/- 10% max]") - self.w.spin(0, 0, 10, 1, 1, self.b5, 0, "RandPeak", "Random Peak") - self.w.spin(0, 0, 10, 1, 1, self.b5, 0, "RandFilt", "Random Filter") - self.w.spin(0, -10, 10, 1, 1, self.b6, 0, "FiltShft", "Filter Center +/-") - self.w.spin(5, -10, 60, 1, 10, self.b6, 0, "FadeDur", " Fade Duration\n\ -[+ = secs;- = mins]") - self.dur = self.w.spin(1, -24, 60, 1, 10, self.b7, 0, "TotalDur",\ -" Total Duration\n[+ = mins;- = hrs;\n 0 = 30 secs]") - self.send_data() - self.but = self.w.cbbutton(self.b7, self.playcsd, "START !") - self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) - self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) - +# FILEMIXAUTO - Audio File Looper/Mixer/Processor for Children (2011) +# Art Hunkins (www.arthunkins.com) +# +# FileMixAuto is licensed under the Creative Commons Attribution-Share +# Alike 3.0 Unported License. To view a copy of this license, visit +# http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to +# Creative Commons, 171 Second Street, Suite 300, San Francisco, +# California, 94105, USA. +# +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# version 5 Changes: +# GUI tweaks + + +import csndsugui +import gobject +from sugar.activity import activity +from sugar.graphics.objectchooser import ObjectChooser +from sugar import mime +import gtk +import os + +class FileMixAuto(activity.Activity): + + def __init__(self, handle): + + activity.Activity.__init__(self, handle) + + red = (0xDDDD, 0, 0) + brown = (0x6600, 0, 0) + green = (0, 0x5500, 0) + self.paths = ["0"]*5 + self.jobjects = [None]*5 + self.buts = [None]*5 + + win = csndsugui.CsoundGUI(self) + width = gtk.gdk.screen_width() + height = gtk.gdk.screen_height() + if os.path.exists("/etc/olpc-release") or os.path.exists("/sys/power/olpc-pm"): + adjust = 78 + else: + adjust = 57 + screen = win.box() + screen.set_size_request(width, height - adjust) + scrolled = gtk.ScrolledWindow() + scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + screen.pack_start(scrolled) + all = gtk.VBox() + all.show() + scrolled.add_with_viewport(all) + scrolled.show() + + win.text("FILEMIXAUTO - Audio File Looper/Mixer/Processor \ +for Children (2011)\n\ +\t\t\t\t Art Hunkins (www.arthunkins.com)", all) + + win.text("Loop and process 1 to 4 mono/stereo files; \ +wav and ogg vorbis formats only (no ogg vorbis on Sugar 0.84).\n\ + User sound files must be placed in Journal (Record activity \ +does this). No user files on Sugar 0.82 (original XO-1).\n\ + The default files are abbreviated versions of those from the author's \ +DUSK AT ST. FRANCIS SPRINGS.\n\ +You are urged to create your own sound files suitable for looping, for example, \ +with the Record activity - \n especially nature soundscapes - to set a mood \ +or accompany movement, drama, pantomime, etc.", all, brown) + + self.b2box = win.box(False, all) + bbox = win.box(False, all) + self.bb = bbox + self.w = win + self.r = red + self.g = green + self.br = brown + self.p = False + + try: + from jarabe import config + version = [int(i) for i in config.version.split('.')][:2] + except ImportError: + version = [0, 82] + if version >= [0, 84]: + boxa = win.box(False, self.b2box) + boxb = win.box(False, self.b2box) + boxc = win.box(True, boxb) + self.boxd = win.box(False, boxc) + boxe = win.box(True, boxc) + win.text("\t\tOptionally, select your own audio file(s) from the Journal.\n\ +\t\tDeselect a file by choosing another, or by closing Journal.\n\ +\t\tCreate your files with Record or Audacity (see ReadMe.txt).\t ", boxa, green) + win.text("Select File(s):", self.boxd, brown) + for i in range(1, 5): + self.buts[i] = win.cbbutton(self.boxd, self.choose, " %d " %i) + self.buts[i].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) + but = win.cbbutton(boxe, self.auto, " CLICK when selections made ") + but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) + but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) + else: + self.auto(self) + + def choose(self, widget): + chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO) + result = chooser.run() + index = self.boxd.child_get_property(widget, "position") + if result == gtk.RESPONSE_ACCEPT: + self.jobjects[index] = chooser.get_selected_object() + self.paths[index] = str(self.jobjects[index].get_file_path()) + self.buts[index].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x8800, 0)) + self.buts[index].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x8800, 0)) + else: + self.paths[index] = "0" + self.jobjects[index] = None + self.buts[index].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x6600, 0, 0)) + self.buts[index].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x6600, 0, 0)) + + def send_data(self): + for i in range(1, 5): + self.w.set_filechannel("file%d" % i, self.paths[i]) + + def playcsd(self, widget): + def start(self): + self.p = True + self.w.play() + gobject.timeout_add(500, checkstat) + self.but.child.set_label("STOP !") + self.but.child.set_use_markup(True) + self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0xFFFF, 0, 0)) + self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0xFFFF, 0, 0)) + def stop(self): + self.p = False + self.w.recompile() + self.w.channels_reinit() + self.send_data() + self.but.child.set_label("START !") + self.but.child.set_use_markup(True) + self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) + self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) + def checkstat(): + if self.w.perf.GetStatus() == 2: + stop(self) + return True + if self.p == False: + start(self) + else: + stop(self) + + def auto(self, widget): + self.b2box.destroy() + self.box1 = self.w.box(True, self.bb) + self.w.text(" ", self.box1) + self.box2 = self.w.box(True, self.bb) + self.f = self.w.framebox(" FileMixAuto - Select Options First ",\ +False, self.box2, self.r) + self.b1 = self.w.box(True, self.f) + self.b2 = self.w.box(True, self.f) + self.b3 = self.w.box(True, self.f) + self.b4 = self.w.box(True, self.f) + self.b5 = self.w.box(True, self.f) + self.b6 = self.w.box(True, self.f) + self.b7 = self.w.box(True, self.f) + self.w.csd("FileMixAuto.csd") + self.w.spin(4, 1, 4, 1, 1, self.b1, 0, "Files", "# of Files") + self.w.spin(0, 0, 50, 1, 5, self.b1, 0, "RandRate", "Random Rate\n\ +[0=no change]") + self.w.spin(10, 0, 10, 1, 1, self.b2, 0, "MaxVol1", "Max Vol/File1 ") + self.w.spin(10, 0, 10, 1, 1, self.b2, 0, "MaxVol2", "Max Vol/File2 \n\ + Random Vol") + self.w.spin(10, 0, 10, 1, 1, self.b3, 0, "MaxVol3", "Max Vol/File3 ") + self.w.spin(10, 0, 10, 1, 1, self.b3, 0, "MaxVol4", " Max Vol/File4 \n\ +is < Max Vol") + self.w.spin(0, 0, 10, 1, 1, self.b4, 0, "RandVol", "Random Volume") + self.w.spin(0, 0, 10, 1, 1, self.b4, 0, "RandPtch", "Random Pitch\n\ +[+/- 10% max]") + self.w.spin(0, 0, 10, 1, 1, self.b5, 0, "RandPeak", "Random Peak") + self.w.spin(0, 0, 10, 1, 1, self.b5, 0, "RandFilt", "Random Filter") + self.w.spin(0, -10, 10, 1, 1, self.b6, 0, "FiltShft", "Filter Center +/-") + self.w.spin(5, -10, 60, 1, 10, self.b6, 0, "FadeDur", " Fade Duration\n\ +[+ = secs;- = mins]") + self.dur = self.w.spin(1, -24, 60, 1, 10, self.b7, 0, "TotalDur",\ +" Total Duration\n[+ = mins;- = hrs;\n 0 = 30 secs]") + self.send_data() + self.but = self.w.cbbutton(self.b7, self.playcsd, "START !") + self.but.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0x7700, 0)) + self.but.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0, 0x7700, 0)) + -- cgit v0.9.1