1 import Bindings, Actions, Views, Events, Logger
2 from Bindings import Binding
3 from Actions import Actions as Action, action
4 from Views import EventWidget
5 from Events import Event
7 import Joyboard, Keyboard, Process, TimeMachine, AlsaPlayer, Metronome
9 import sys, curses, time, os, os.path, subprocess
10 from curses.ascii import alt, ctrl
12 def shift(letter) : return ord(chr(letter).upper())
13 def key(letter) : return ord(letter.lower())
15 global_map = Bindings.KeyMap()
17 ###########################################################################
18 # Setup views and controllers
22 #Logger.init(main.viewmanager, 38, 0, 37, 10, 'audiocontroller.log')
23 Logger.init(main.viewmanager, 0, 17, 65, 5)
27 jb = Joyboard.register(
28 viewmanager = main.viewmanager,
29 dispatcher = main.dispatcher,
32 label = 'Foot Switch',
33 numeric_switches = 10,
40 device = os.path.exists('/dev/input/js0') and '/dev/input/js0' or None,
41 bits = { 1:1, 3:2, 2:4, 0:8 },
44 ctl = Joyboard.registerController(
45 viewmanager = main.viewmanager,
46 dispatcher = main.dispatcher,
47 keylist = main.keylist,
63 viewmanager = main.viewmanager,
64 dispatcher = main.dispatcher,
67 label = 'Key Bindings',
75 ###########################################################################
76 # Global keymap and auxilary actions
86 global_map.add( Binding( Event('kbd',key('q')), 'Quit', Action['quit'] ) )
87 global_map.add( Binding( Event('kbd',ctrl(key('r'))), 'Restart', Action['restart'] ) )
89 for i,k in enumerate(('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e' )):
90 Action.register( Events.EmitEvent('key_%s' % k, main.dispatcher, Event('jb0', i)) )
91 global_map.add( Binding( Event('kbd',key(k)), 'Foot %s' % k.upper(), Action['key_%s' % k] ) )
93 Action.register( Joyboard.StepController( 'controller_increment', ctl, +1 ) )
94 Action.register( Joyboard.StepController( 'controller_decrement', ctl, -1 ) )
96 global_map.add( Binding( Event('kbd', curses.KEY_UP), 'Increment', Action['controller_increment'] ) )
97 global_map.add( Binding( Event('kbd', curses.KEY_DOWN), 'Decrement', Action['controller_decrement'] ) )
99 Action.register( Actions.ChangeBindingsRelative( 'unset_this_map', 0, [] ) )
101 ###########################################################################
104 looper_main_map = Bindings.KeyMap( 'Looper' )
105 Action.register( Actions.ChangeBindingsRelative( 'mode_looper', 0, [ looper_main_map ] ) )
107 looper = Looper.register(
108 oscserver = main.oscserver,
111 remote = ('127.0.0.1',9951),
114 Action.register( Looper.Command('looper_record', looper, 'record') )
115 Action.register( Looper.Command('looper_overdub', looper, 'overdub') )
116 Action.register( Looper.Command('looper_multiply', looper, 'multiply') )
117 Action.register( Looper.Command('looper_mute', looper, 'mute') )
118 Action.register( Looper.Command('looper_undo', looper, 'undo') )
119 Action.register( Looper.Command('looper_redo', looper, 'redo') )
120 Action.register( Looper.Command('looper_trigger', looper, 'trigger') )
121 Action.register( Looper.Command('looper_insert', looper, 'insert') )
122 Action.register( Looper.Command('looper_replace', looper, 'replace') )
123 Action.register( Looper.Command('looper_substitute', looper, 'substitute') )
124 Action.register( Looper.Command('looper_reverse', looper, 'reverse') )
125 Action.register( Looper.Command('looper_oneshot', looper, 'oneshot') )
126 Action.register( Looper.Command('looper_undo_all', looper, 'undo_all') )
127 Action.register( Looper.Command('looper_redo_all', looper, 'redo_all') )
128 Action.register( Looper.Command('looper_mute_off', looper, 'mute_off') )
129 Action.register( Actions.Macro( 'looper_trigger_unmute',
130 [ 'looper_trigger', 'looper_mute_off' ] ) )
132 looper_main_map.add ( Binding( Event('jb0',0), 'Rec', Action['looper_record'] ) )
133 looper_main_map.add ( Binding( Event('jb0',1), 'Over', Action['looper_overdub'] ) )
134 looper_main_map.add ( Binding( Event('jb0',2), 'Mult', Action['looper_multiply'] ) )
135 looper_main_map.add ( Binding( Event('jb0',3), 'Undo', Action['looper_undo'] ) )
136 looper_main_map.add ( Binding( Event('jb0',4), 'Redo', Action['looper_redo'] ) )
137 looper_main_map.add ( Binding( Event('jb0',5), 'Mute', Action['looper_mute'] ) )
138 looper_main_map.add ( Binding( Event('jb0',6), 'Trig', Action['looper_trigger'] ) )
139 looper_main_map.add ( Binding( Event('jb0',7), 'Once', Action['looper_oneshot'] ) )
140 looper_main_map.add ( Binding( Event('jb0',8), 'Ins', Action['looper_insert'] ) )
141 looper_main_map.add ( Binding( Event('jb0',9), 'Repl', Action['looper_replace'] ) )
142 looper_main_map.add ( Binding( Event('jb0',12), 'Undo A', Action['looper_undo_all'] ) )
143 looper_main_map.add ( Binding( Event('jb0',13), 'Redo A', Action['looper_redo_all'] ) )
144 looper_main_map.add ( Binding( Event('jb0',14), 'Subst', Action['looper_substitute'] ) )
147 looper_param_map = Bindings.KeyMap( 'Parameters' )
148 Action.register( Actions.ChangeBindingsRelative('looper_set_param_map', 1, [looper_param_map] ) )
149 looper_main_map.add ( Binding( Event('jb0',11), '[Param]', Action['looper_set_param_map'] ) )
151 Action.register( Looper.AssignController( 'looper_parm_rec_thresh', looper, ctl, 'Rec.Thresh.',
152 'rec_thresh', 0.0, 1.0 ) )
153 Action.register( Looper.AssignController( 'looper_parm_feedback', looper, ctl, 'Feedback',
154 'feedback', 0.0, 1.0 ) )
155 Action.register( Looper.AssignController( 'looper_parm_dry', looper, ctl, 'Dry Level',
156 'global_dry', 0.0, 1.0 ) )
157 Action.register( Looper.AssignController( 'looper_parm_wet', looper, ctl, 'Wet Level',
158 'global_wet', 0.0, 1.0 ) )
159 Action.register( Looper.AssignController( 'looper_parm_igain', looper, ctl, 'In. Gain',
160 'global_input_gain', 0.0, 1.0 ) )
164 x = pow(2.0,2.0*(i+1)/12.0)
168 Action.register( Looper.AssignController( 'looper_parm_rate', looper, ctl, 'Rate',
169 'rate', 0.5, 2.0, steps ) )
171 looper_param_map.add( Binding( Event('jb0',5), '(Feedb)', Action['looper_parm_feedback'] ) )
172 looper_param_map.add( Binding( Event('jb0',6), '(Dry)', Action['looper_parm_dry'] ) )
173 looper_param_map.add( Binding( Event('jb0',7), '(Wet)', Action['looper_parm_wet'] ) )
174 looper_param_map.add( Binding( Event('jb0',8), '(Gain)', Action['looper_parm_igain'] ) )
175 looper_param_map.add( Binding( Event('jb0',9), '(Rec T)', Action['looper_parm_rec_thresh'] ) )
176 looper_param_map.add( Binding( Event('jb0',12), '', Actions.Nop() ) )
177 looper_param_map.add( Binding( Event('jb0',13), 'Rev', Action['looper_reverse'] ) )
178 looper_param_map.add( Binding( Event('jb0',14), '(Rate)', Action['looper_parm_rate'] ) )
180 looper_param_map.add( Binding( Event('jb0',11), '[Main]', Action['unset_this_map'] ) )
182 # Initialize looper: enable 'round' and set quantize to 'cycle'
183 looper.set('quantize',1)
184 looper.set('round',1)
187 ###########################################################################
190 mixer_map = Bindings.KeyMap('Master')
191 Action.register( Actions.ChangeBindingsRelative( 'mode_mixer', 0, [ mixer_map ] ) )
193 mixer = Mixer.register(
194 viewmanager = main.viewmanager,
195 oscserver = main.oscserver,
204 channels = ( 'Guitar', 'Voice' ),
205 remote = ('127.0.0.1', 9901),
208 gain = Mixer.register(
209 viewmanager = main.viewmanager,
210 oscserver = main.oscserver,
219 channels = ( 'Guitar', ),
220 remote = ('127.0.0.1', 9902),
223 tm = TimeMachine.register(
224 viewmanager = main.viewmanager,
227 name = 'TimeMachine',
233 ports = ('minimixer:out_left', 'minimixer:out_right'),
237 metronome = Metronome.register(
238 viewmanager = main.viewmanager,
239 dispatcher = main.dispatcher,
249 Action.register( Mixer.AssignController ( 'mixer_guitar_level', mixer, ctl, 'Guitar', 1 ) )
250 Action.register( Mixer.ToggleMuteChannel ( 'mixer_mute_guitar', mixer, 1 ) )
251 Action.register( Mixer.AssignController ( 'mixer_voice_level', mixer, ctl, 'Voice', 2 ) )
252 Action.register( Mixer.ToggleMuteChannel ( 'mixer_mute_voice', mixer, 2 ) )
253 Action.register( Mixer.AssignController ( 'mixer_master_level', mixer, ctl, 'Master', 0 ) )
254 Action.register( Mixer.ToggleMuteAll ( 'mixer_mute_all', mixer ) )
255 Action.register( Mixer.CycleVolume ( 'mixer_cycle_gain', gain, 1, ( 0.0, 2.0, 4.0 ) ) )
257 Action.register( TimeMachine.ToggleRecord( 'tm_rec_toggle', tm ) )
259 mixer_map.add( Binding( Event('jb0',0), 'Rec', Action['looper_record'] ) )
260 mixer_map.add( Binding( Event('jb0',1), 'Over', Action['looper_overdub'] ) )
261 mixer_map.add( Binding( Event('jb0',2), 'Mult', Action['looper_multiply'] ) )
262 mixer_map.add( Binding( Event('jb0',3), 'Undo', Action['looper_undo'] ) )
263 mixer_map.add( Binding( Event('jb0',4), 'Redo', Action['looper_redo'] ) )
264 mixer_map.add( Binding( Event('jb0',5), 'Un All', Action['looper_undo_all'] ) )
266 mixer_map.add( Binding( Event('jb0',6), 'Lead', Action['mixer_cycle_gain'] ) )
267 mixer_map.add( Binding( Event('jb0',7), 'Mute G', Action['mixer_mute_guitar'] ) )
268 mixer_map.add( Binding( Event('jb0',8), 'Mute V', Action['mixer_mute_voice'] ) )
269 mixer_map.add( Binding( Event('jb0',9), 'Mute', Action['mixer_mute_all'] ) )
271 mixer_map.add( Binding( Event('jb0',13), '(Vol G)', Action['mixer_guitar_level'] ) )
272 mixer_map.add( Binding( Event('jb0',14), '(Vol V)', Action['mixer_voice_level'] ) )
274 mixer_map.add( Binding( Event('jb0',12), 'TM Rec', Action['tm_rec_toggle'] ) )
276 metronome_map = Bindings.KeyMap('Metronome')
278 Action.register( Actions.ChangeBindingsRelative('set_metronome_map', 1, [metronome_map] ) )
279 Action.register( Metronome.Toggle ( 'metronome_toggle', metronome ) )
280 Action.register( Metronome.Tap ( 'metronome_tap', metronome ) )
281 Action.register( Metronome.StepBPM ('metronome_bpm_inc', metronome, +5 ) )
282 Action.register( Metronome.StepBPM ('metronome_bpm_dec', metronome, -5 ) )
283 Action.register( Metronome.AssignVolumeController ( 'metronome_volume', metronome, ctl,
284 "Metr Vol", 0.5, 9.9 ) )
286 metronome_map.add( Binding( Event('jb0', 0), 'Tap', Action['metronome_tap'] ) )
287 metronome_map.add( Binding( Event('jb0', 1), 'Toggle', Action['metronome_toggle'] ) )
288 metronome_map.add( Binding( Event('jb0', 2), '(Vol)', Action['metronome_volume'] ) )
289 metronome_map.add( Binding( Event('jb0', 3), 'bpm Dec', Action['metronome_bpm_dec'] ) )
290 metronome_map.add( Binding( Event('jb0', 4), 'bpm Inc', Action['metronome_bpm_inc'] ) )
292 metronome_map.add( Binding( Event('jb0', 11), '[Main]', Action['unset_this_map'] ) )
294 mixer_map.add( Binding( Event('jb0', 11), '[Metr]', Action['set_metronome_map'] ) )
297 mixer.assignController( ctl, 'Guitar', 1 )
299 ###########################################################################
302 player_map = Bindings.KeyMap('JukeBox')
303 Action.register( Actions.ChangeBindingsRelative( 'mode_player', 0, [ player_map ] ) )
305 player = AlsaPlayer.Player()
307 Action.register( AlsaPlayer.Play ( 'player_start', player ) )
308 Action.register( AlsaPlayer.Pause ( 'player_pause', player ) )
309 Action.register( AlsaPlayer.Stop ( 'player_stop', player ) )
310 Action.register( AlsaPlayer.Skip ( 'player_skip_fwd', player, 5 ) )
311 Action.register( AlsaPlayer.Skip ( 'player_skip_rev', player, -5 ) )
313 player_stop_map = Bindings.KeyMap()
315 Action.register( Actions.ChangeBindingsRelative('player_set_stop_map', 1, [player_stop_map] ) )
316 Action.register( Actions.Macro( 'player_set_playing',
317 [ 'player_start', 'player_set_stop_map' ] ) )
318 Action.register( Actions.Macro( 'player_set_stop',
319 [ 'player_stop', 'unset_this_map' ]) )
321 player_looper_map = Bindings.KeyMap()
323 Action.register( Actions.ChangeBindingsRelative('player_set_looper_map', 1, [player_looper_map] ) )
324 Action.register( Actions.Macro( 'player_start_loop_rec',
325 [ 'looper_record', 'player_set_looper_map' ] ) )
326 Action.register( Actions.Macro( 'player_stop_loop_rec',
327 [ 'looper_record', 'player_pause', 'unset_this_map' ] ) )
328 Action.register( Actions.Macro( 'player_looper_cancel',
329 [ 'looper_undo', 'unset_this_map' ] ) )
330 Action.register( Actions.Macro( 'player_stop_loop',
331 [ 'looper_undo_all', 'player_pause' ] ) )
334 Action.register( AlsaPlayer.Jump ( 'player_jump_%d' % i, player, i+1 ) )
335 Action.register( Actions.Macro( 'player_set_track_%d' % i,
336 [ 'player_jump_%d' % i, 'player_set_stop_map' ] ) )
337 player_map.add( Binding( Event('jb0',i+3), 'Tr %d' % (i+1), Action['player_set_track_%d' % i] ) )
339 player_map.add( Binding( Event('jb0', 0), 'L Rec', Action['player_start_loop_rec'] ) )
340 player_map.add( Binding( Event('jb0', 1), 'L Stp', Action['player_stop_loop'] ) )
341 player_map.add( Binding( Event('jb0', 11), 'Back', Action['player_skip_rev'] ) )
342 player_map.add( Binding( Event('jb0', 12), 'Fwd', Action['player_skip_fwd'] ) )
343 player_map.add( Binding( Event('jb0', 13), 'Play', Action['player_set_playing'] ) )
344 player_map.add( Binding( Event('jb0', 14), 'Pause', Action['player_pause'] ) )
346 player_stop_map.add( Binding( Event('jb0', 13), 'Stop', Action['player_set_stop'] ) )
348 player_looper_map.add( Binding( Event('jb0', 0), 'L Rec', Action['player_stop_loop_rec'] ) )
349 player_looper_map.add( Binding( Event('jb0', 1), 'L Can', Action['player_looper_cancel'] ) )
352 def player_queue_tm_recordings(binding):
357 for f in os.listdir('tm'):
358 wav = os.path.splitext(f)[0] + '.wav'
359 if f.endswith('.w64'):
360 if not os.path.exists('tm/' + wav):
361 os.waitpid(subprocess.Popen(["sndfile-convert","-pcm32",f,wav],cwd='tm').pid,0)
363 elif f.endswith('.wav'):
368 player.add('tm/' + wav)
371 player_map.add( Binding( Event('jb0', 2), 'Add TM', Action['player_queue_tm_recordings'] ) )
373 ###########################################################################
375 mixer_map.add ( Binding( Event('jb0',10), '[Loop]', Action['mode_looper'] ) )
376 looper_main_map.add ( Binding( Event('jb0',10), '[JBox]', Action['mode_player'] ) )
377 player_map.add ( Binding( Event('jb0',10), '[Mastr]', Action['mode_mixer'] ) )
379 main.keylist.append(global_map)
380 main.keylist.append(mixer_map)