Audio/AudioControl: Lots of fixes
[audiocontrol.git] / Looper.py
1 import Actions, OSC, Events
2
3 class Controller(object):
4
5     def __init__(self, context, oscserver, remote):
6         self._context = context
7         self._server = oscserver
8         self._remote = remote
9         self._server.registerHandler(self._remote, self._oscEvent)
10
11     def hit(self, command, index=0):
12         self._server.command(self._remote,"/sl/%d/hit" % index, str(command))
13
14     def get(self, parameter, index=0):
15         if parameter.startswith('global_'):
16             path = "/get"
17             parameter = parameter[7:]
18         else:
19             path = "/sl/%d/get" % index
20         self._server.command(self._remote, path, parameter, self._server.localUrl(), "")
21
22     def set(self, parameter, value, index=0):
23         if parameter.startswith('global_'):
24             path = "/set"
25             parameter = parameter[7:]
26         else:
27             path = "/sl/%d/set" % index
28         self._server.command(self._remote, path, parameter, float(value))
29
30     def _oscEvent(self, path, data):
31         # data = (loop-number, parameter-name, value)
32         if len(data) != 3: return
33         if data[0]<0:
34             param = "global_%s" % data[1]
35         else:
36             param = "%s/%d" % (data[1], data[0])
37         return [ Events.ControlEvent(self._context, param, data[2]) ]
38
39     class ParamGetter(object):
40
41         def __init__(self, controller, parameter, index=0):
42             self._parameter = parameter
43             self._controller = controller
44             self._index = index
45
46         def __call__(self):
47             self._controller.get(self._parameter, self._index)
48
49     class ParamSetter(object):
50
51         def __init__(self, controller, parameter, index=0):
52             self._parameter = parameter
53             self._controller = controller
54             self._index = index
55
56         def __call__(self, value):
57             self._controller.set(self._parameter, value, self._index)
58
59     def assignController( self, controller, title, parameter, min, max, stops=[], index=0 ):
60         if parameter.startswith('global_'):
61             event = parameter
62         else:
63             event = "%s/%d" % (parameter, index)
64         controller.assign(title,
65                           self.ParamSetter(self, parameter, index),
66                           self.ParamGetter(self, parameter, index),
67                           Events.Event(self._context, event),
68                           min, max, stops)
69                       
70 class Command(Actions.Action):
71
72     def __init__(self, name, controller, command):
73         Actions.Action.__init__(self, name)
74         self._controller = controller
75         self._command = command
76
77     def __call__(self, binding):
78         self._controller.hit(self._command)
79
80 class AssignController(Actions.Action):
81
82     def __init__(self, name, loopController, pedalController, title, parameter, min, max,
83                  stops = [], index=0):
84         Actions.Action.__init__(self, name)
85         self._loopController = loopController
86         self._pedalController = pedalController
87         self._title = title
88         self._parameter = parameter
89         self._min = min
90         self._max = max
91         self._stops = stops
92         self._index = index
93
94     def __call__(self, binding):
95         self._loopController.assignController(self._pedalController,
96                                               self._title,
97                                               self._parameter,
98                                               self._min,
99                                               self._max,
100                                               self._stops,
101                                               self._index)
102
103 def register( oscserver,
104               context,
105               remote ):
106     return Controller(context, oscserver, remote)