Audio/AudioControl: Commit loads of long uncommited changes
[audiocontrol.git] / config.py
index d4b5abf..3ec155c 100644 (file)
--- a/config.py
+++ b/config.py
@@ -5,35 +5,60 @@ from Views import EventWidget
 from Events import Event
 import main
 import Joyboard, Keyboard, Process
-import Looper
-import sys, curses
+import Looper, Mixer
+import sys, curses, time, os
 from curses.ascii import alt, ctrl
 
 def shift(letter) : return ord(chr(letter).upper())
 def key(letter) : return ord(letter.lower())
 
+global_map = Bindings.KeyMap()
+
 ###########################################################################
 # Setup views and controllers
 #
-# Display size: 77x17
-
-Logger.init(main.viewmanager, 38, 0, 39, 10)
-
-Joyboard.register(
-    viewmanager = main.viewmanager,
-    dispatcher = main.dispatcher,
-
-    context          = 'jb0',
-    label            = 'Foot Switch',
-    numeric_switches =  10,
-    alpha_switches   =   5,
-    x                =   2,
-    y                =  10,
-    size             =   6,
-
-    device           = '/dev/input/js0',
-    bits             = { 1:1, 3:2, 2:4, 0:8 }
-)
+# Display size: 88x22
+
+#Logger.init(main.viewmanager, 38, 0, 37, 10, 'audiocontroller.log')
+Logger.init(main.viewmanager, 0, 17, 88, 5)
+
+jb = None
+ctl = None
+if os.path.exists('/dev/input/js0'):
+    jb = Joyboard.register(
+        viewmanager = main.viewmanager,
+        dispatcher = main.dispatcher,
+        
+        context          = 'jb0',
+        label            = 'Foot Switch',
+        numeric_switches =  10,
+        alpha_switches   =   5,
+        x                =   0,
+        y                =  10,
+        dx               =  88,
+        size             =   7,
+        
+        device           = '/dev/input/js0',
+        bits             = { 1:1, 3:2, 2:4, 0:8 },
+    )
+
+    ctl = Joyboard.registerController(
+        viewmanager = main.viewmanager,
+        dispatcher = main.dispatcher,
+        keylist = main.keylist,
+        source = jb,
+        
+        context          = 'c0',
+        name             = 'Control',
+        x                = 75,
+        y                =  0,
+        dx               = 13,
+        dy               = 10,
+
+        controller       = 0,
+        low              = -27200,
+        high             = -32700,
+    )        
 
 Keyboard.register(
     viewmanager = main.viewmanager,
@@ -43,39 +68,50 @@ Keyboard.register(
     label            = 'Key Bindings',
     x                =  0,
     y                =  0,
-    dx               = 38,
-    dy               = 10
+    dx               = 52,
+    dy               = 10,
+    size             =  7
 )
 
-jackd = Process.Process("jackd -d alsa -S -r 44100 -p 256",'jack')
-
 ###########################################################################
 # Global keymap and auxilary actions
 
-global_map = Bindings.KeyMap()
-
 @action
 def quit(binding):
-    sys.exit(0)
+    sys.exit(1)
 
-global_map.add( Binding( Event('jb0',0), '()', Actions.Nop() ) )
-global_map.add( Binding( Event('jb0',1), '()', Actions.Nop() ) )
-global_map.add( Binding( Event('jb0',10), '()', Actions.Nop() ) )
+@action
+def restart(binding):
+    sys.exit(0)
 
 global_map.add( Binding( Event('kbd',key('q')), 'Quit', Action['quit'] ) )
+global_map.add( Binding( Event('kbd',ctrl(key('r'))), 'Restart', Action['restart'] ) )
+
+for i,k in enumerate(('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e' )):
+    Action.register( Events.EmitEvent('key_%s' % k, main.dispatcher, Event('jb0', i)) )
+    global_map.add( Binding( Event('kbd',key(k)), 'Foot %s' % k.upper(), Action['key_%s' % k] ) )
+    
+if ctl is not None:
+    Action.register( Joyboard.StepController( 'controller_increment', ctl, +1 ) )
+    Action.register( Joyboard.StepController( 'controller_decrement', ctl, -1 ) )
+
+    global_map.add( Binding( Event('kbd', curses.KEY_UP), 'Increment', Action['controller_increment'] ) )
+    global_map.add( Binding( Event('kbd', curses.KEY_DOWN), 'Decrement', Action['controller_decrement'] ) )
 
 Action.register( Actions.ChangeBindingsRelative( 'unset_this_map', 0, [] ) )
 
 ###########################################################################
-# Looper mode
+# Looper
 
 looper_main_map = Bindings.KeyMap( 'Looper' )
-looper_aux_map = Bindings.KeyMap( 'Aux' )
+Action.register( Actions.ChangeBindingsRelative( 'mode_looper', 0, [ looper_main_map ] ) )
 
-Action.register( Actions.ChangeBindingsAbsolute('set_mode_looper', 1, [looper_main_map]) )
-Action.register( Actions.ChangeBindingsRelative('looper_set_aux_map', 1, [looper_aux_map]) )
+looper = Looper.register(
+    oscserver = main.oscserver,
 
-looper = Looper.Controller('localhost',9951)
+    context = 'sl',
+    remote  = ('127.0.0.1',9951),
+)
 
 Action.register( Looper.Command('looper_record', looper, 'record') )
 Action.register( Looper.Command('looper_overdub', looper, 'overdub') )
@@ -89,44 +125,134 @@ Action.register( Looper.Command('looper_replace', looper, 'replace') )
 Action.register( Looper.Command('looper_substitute', looper, 'substitute') )
 Action.register( Looper.Command('looper_reverse', looper, 'reverse') )
 Action.register( Looper.Command('looper_oneshot', looper, 'oneshot') )
-
-looper_main_map.add ( Binding( Event('jb0',2),  'Rec',     Action['looper_record'] ) )
-looper_main_map.add ( Binding( Event('jb0',3),  'Over',    Action['looper_overdub'] ) )
-looper_main_map.add ( Binding( Event('jb0',4),  'Mult',   Action['looper_multiply'] ) )
-looper_main_map.add ( Binding( Event('jb0',5),  'Mute',       Action['looper_mute'] ) )
-looper_main_map.add ( Binding( Event('jb0',6),  'Undo',       Action['looper_undo'] ) )
-looper_main_map.add ( Binding( Event('jb0',7),  'Redo',       Action['looper_redo'] ) )
-looper_main_map.add ( Binding( Event('jb0',8),  'Trig',    Action['looper_trigger'] ) )
-looper_main_map.add ( Binding( Event('jb0',9),  'Aux',        Action['looper_set_aux_map'] ) )
-
-looper_aux_map.add  ( Binding( Event('jb0',2),  'Ins',     Action['looper_insert'] ) )
-looper_aux_map.add  ( Binding( Event('jb0',3),  'Repl',    Action['looper_replace'] ) )
-looper_aux_map.add  ( Binding( Event('jb0',4),  'Subst', Action['looper_substitute'] ) )
-looper_aux_map.add  ( Binding( Event('jb0',6),  'Rev',    Action['looper_reverse'] ) )
-looper_aux_map.add  ( Binding( Event('jb0',7),  'Once',    Action['looper_oneshot'] ) )
-looper_aux_map.add  ( Binding( Event('jb0',9),  'Main',       Action['unset_this_map'] ) )
+Action.register( Looper.Command('looper_undo_all', looper, 'undo_all') )
+Action.register( Looper.Command('looper_redo_all', looper, 'redo_all') )
+
+looper_main_map.add ( Binding( Event('jb0',0),  'Rec',    Action['looper_record'] ) )
+looper_main_map.add ( Binding( Event('jb0',1),  'Over',   Action['looper_overdub'] ) )
+looper_main_map.add ( Binding( Event('jb0',2),  'Mult',   Action['looper_multiply'] ) )
+looper_main_map.add ( Binding( Event('jb0',3),  'Undo',   Action['looper_undo'] ) )
+looper_main_map.add ( Binding( Event('jb0',4),  'Redo',   Action['looper_redo'] ) )
+looper_main_map.add ( Binding( Event('jb0',5),  'Mute',   Action['looper_mute'] ) )
+looper_main_map.add ( Binding( Event('jb0',6),  'Trig',   Action['looper_trigger'] ) )
+looper_main_map.add ( Binding( Event('jb0',7),  'Once',   Action['looper_oneshot'] ) )
+looper_main_map.add ( Binding( Event('jb0',8),  'Ins',    Action['looper_insert'] ) )
+looper_main_map.add ( Binding( Event('jb0',9),  'Repl',   Action['looper_replace'] ) )
+looper_main_map.add ( Binding( Event('jb0',12), 'Undo A', Action['looper_undo_all'] ) )
+looper_main_map.add ( Binding( Event('jb0',13), 'Redo A', Action['looper_redo_all'] ) )
+looper_main_map.add ( Binding( Event('jb0',14), 'Subst',  Action['looper_substitute'] ) )
+
+
+looper_param_map = Bindings.KeyMap( 'Parameters' )
+Action.register( Actions.ChangeBindingsRelative('looper_set_param_map', 1, [looper_param_map] ) )
+looper_main_map.add ( Binding( Event('jb0',11), '[Param]', Action['looper_set_param_map'] ) )
+
+if ctl is not None:
+    Action.register( Looper.AssignController( 'looper_parm_rec_thresh', looper, ctl, 'Rec.Thresh.',
+                                              'rec_thresh', 0.0, 1.0 ) )
+    Action.register( Looper.AssignController( 'looper_parm_feedback', looper, ctl, 'Feedback',
+                                              'feedback', 0.0, 1.0 ) )
+    Action.register( Looper.AssignController( 'looper_parm_dry', looper, ctl, 'Dry Level',
+                                              'global_dry', 0.0, 1.0 ) )
+    Action.register( Looper.AssignController( 'looper_parm_wet', looper, ctl, 'Wet Level',
+                                              'global_wet', 0.0, 1.0 ) )
+    Action.register( Looper.AssignController( 'looper_parm_igain', looper, ctl, 'In. Gain',
+                                              'global_input_gain', 0.0, 1.0 ) )
+
+    steps = [ 1.0 ]
+    for i in range(6):
+        x = pow(2.0,2.0*(i+1)/12.0)
+        steps.append(x)
+        steps[0:0] = [1/x]
+
+    Action.register( Looper.AssignController( 'looper_parm_rate', looper, ctl, 'Rate',
+                                              'rate', 0.5, 2.0, steps ) )
+
+    looper_param_map.add( Binding( Event('jb0',5),  'Feedb', Action['looper_parm_feedback'] ) )
+    looper_param_map.add( Binding( Event('jb0',6),  'Dry',   Action['looper_parm_dry'] ) )
+    looper_param_map.add( Binding( Event('jb0',7),  'Wet',   Action['looper_parm_wet'] ) )
+    looper_param_map.add( Binding( Event('jb0',8),  'Gain',  Action['looper_parm_igain'] ) )
+    looper_param_map.add( Binding( Event('jb0',9),  'Rec T', Action['looper_parm_rec_thresh'] ) )
+    looper_param_map.add( Binding( Event('jb0',12), '',      Actions.Nop() ) )
+    looper_param_map.add( Binding( Event('jb0',13), 'Rev',    Action['looper_reverse'] ) )
+    looper_param_map.add( Binding( Event('jb0',14), 'Rate',  Action['looper_parm_rate'] ) )
+
+looper_param_map.add( Binding( Event('jb0',11), '[Main]',    Action['unset_this_map'] ) )
+
+# Initialize looper: enable 'round' and set quantize to 'cycle'
+looper.set('quantize',1)
+looper.set('round',1)
+looper.set('sync',1)
 
 ###########################################################################
-# MegaPedal mode
+# Mixer and effects
 
-megapedal_main_map = Bindings.KeyMap( 'MegaPedal' )
+mixer_map = Bindings.KeyMap('Mixer & Effects')
+Action.register( Actions.ChangeBindingsRelative( 'mode_mixer', 0, [ mixer_map ] ) )
 
-Action.register( Actions.ChangeBindingsAbsolute('set_mode_megapedal', 1, [megapedal_main_map]) )
+looper_main_map.add( Binding( Event('jb0',10),  '[Mixer]', Action['mode_mixer'] ) )
 
-megapedal_main_map.add ( Binding( Event('jb0',11), 'Looper', Action['set_mode_looper'] ) )
-global_map.add ( Binding( Event('jb0',11), 'MegaPedal', Action['set_mode_megapedal'] ) )
+mixer = Mixer.register(
+    viewmanager = main.viewmanager,
+    oscserver = main.oscserver,
 
-###########################################################################
-# RythmBox mode
+    context  = 'mix',
+    label    = 'Mixer',
+    x        = 52,
+    y        =  0,
+    dx       = 23,
+    dy       = 4,
+
+    channels = ( 'Guitar', 'Voice' ),
+    remote  = ('127.0.0.1', 9901),
+)
 
-rythmbox_main_map = Bindings.KeyMap( 'RythmBox' )
+gain = Mixer.register(
+    viewmanager = main.viewmanager,
+    oscserver = main.oscserver,
 
-Action.register( Actions.ChangeBindingsAbsolute('set_mode_rythmbox', 1, [rythmbox_main_map]) )
+    context  = 'gain',
+    label    = 'Gain',
+    x        = 52,
+    y        =  7,
+    dx       = 23,
+    dy       = 3,
 
-rythmbox_main_map.add ( Binding( Event('jb0',11), 'MegaPedal', Action['set_mode_megapedal'] ) )
-global_map.add ( Binding( Event('jb0',11), 'RythmBox', Action['set_mode_rythmbox'] ) )
+    channels = ( 'Guitar', ),
+    remote  = ('127.0.0.1', 9902),
+)
 
+Action.register( Mixer.AssignController( 'mixer_guitar_level', mixer, ctl, 'Guitar', 1 ) )
+Action.register( Mixer.ToggleMuteChannel( 'mixer_mute_guitar', mixer, 1 ) )
+Action.register( Mixer.AssignController( 'mixer_voice_level', mixer, ctl, 'Voice', 2 ) )
+Action.register( Mixer.ToggleMuteChannel( 'mixer_mute_voice', mixer, 2 ) )
+Action.register( Mixer.AssignController( 'mixer_master_level', mixer, ctl, 'Master', 0 ) )
+Action.register( Mixer.ToggleMuteAll( 'mixer_mute_all', mixer ) )
+Action.register( Mixer.CycleVolume( 'mixer_cycle_gain', gain, 1, ( 0.0, 2.0, 4.0 ) ) )
+
+mixer_map.add( Binding( Event('jb0',0),  'Rec',    Action['looper_record'] ) )
+mixer_map.add( Binding( Event('jb0',1),  'Over',   Action['looper_overdub'] ) )
+mixer_map.add( Binding( Event('jb0',2),  'Mult',   Action['looper_multiply'] ) )
+mixer_map.add( Binding( Event('jb0',3),  'Undo',   Action['looper_undo'] ) )
+mixer_map.add( Binding( Event('jb0',4),  'Redo',   Action['looper_redo'] ) )
+mixer_map.add( Binding( Event('jb0',5), 'Un All', Action['looper_undo_all'] ) )
+
+mixer_map.add( Binding( Event('jb0',6), 'Lead', Action['mixer_cycle_gain'] ) )
+mixer_map.add( Binding( Event('jb0',7), 'Mute G', Action['mixer_mute_guitar'] ) )
+mixer_map.add( Binding( Event('jb0',8), 'Mute V', Action['mixer_mute_voice'] ) )
+mixer_map.add( Binding( Event('jb0',9), 'Mute', Action['mixer_mute_all'] ) )
+
+mixer_map.add( Binding( Event('jb0',13), 'Vol G', Action['mixer_guitar_level'] ) )
+mixer_map.add( Binding( Event('jb0',14), 'Vol V', Action['mixer_voice_level'] ) )
+
+mixer.set(1,0.0)
+mixer.set(2,0.0)
+mixer.assignController( ctl, 'Guitar', 1 )
+gain.set(1,0.0)
+    
 ###########################################################################
 
+mixer_map.add( Binding( Event('jb0',10), '[Loop]', Action['mode_looper'] ) )
+
 main.keylist.append(global_map)
-main.keylist.append(looper_main_map)
+main.keylist.append(mixer_map)