source: trunk/LiveOSC/LiveOSCCallbacks.py @ 67

Revision 67, 46.0 KB checked in by st8, 7 months ago (diff)

LiveOSC: Added meter listener for returns and master, clip position listener, clip name listener and clip color listener. Added calls for clip time signature

Line 
1"""
2# Copyright (C) 2007 Rob King (rob@re-mu.org)
3#
4# This library is free software; you can redistribute it and/or
5# modify it under the terms of the GNU Lesser General Public
6# License as published by the Free Software Foundation; either
7# version 2.1 of the License, or (at your option) any later version.
8#
9# This library is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12# Lesser General Public License for more details.
13#
14# You should have received a copy of the GNU Lesser General Public
15# License along with this library; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17#
18# For questions regarding this module contact
19# Rob King <rob@e-mu.org> or visit http://www.e-mu.org
20
21This file contains all the current Live OSC callbacks.
22
23"""
24import Live
25import RemixNet
26import OSC
27import LiveUtils
28
29class LiveOSCCallbacks:
30    def __init__(self, c_instance, oscServer):
31        if oscServer:
32            self.oscServer = oscServer
33            self.callbackManager = oscServer.callbackManager
34            self.oscClient = oscServer.oscClient
35           
36            self.c_instance = c_instance
37        else:
38            return
39
40        self.callbackManager.add(self.tempoCB, "/live/tempo")
41        self.callbackManager.add(self.timeCB, "/live/time")
42        self.callbackManager.add(self.nextCueCB, "/live/next/cue")
43        self.callbackManager.add(self.prevCueCB, "/live/prev/cue")
44        self.callbackManager.add(self.playCB, "/live/play")
45        self.callbackManager.add(self.playContinueCB, "/live/play/continue")
46        self.callbackManager.add(self.playSelectionCB, "/live/play/selection")
47        self.callbackManager.add(self.playClipCB, "/live/play/clip")
48        self.callbackManager.add(self.playSceneCB, "/live/play/scene") 
49        self.callbackManager.add(self.stopCB, "/live/stop")
50        self.callbackManager.add(self.stopClipCB, "/live/stop/clip")
51        self.callbackManager.add(self.stopTrackCB, "/live/stop/track")
52        self.callbackManager.add(self.scenesCB, "/live/scenes")
53        self.callbackManager.add(self.tracksCB, "/live/tracks")
54        self.callbackManager.add(self.nameSceneCB, "/live/name/scene")
55        self.callbackManager.add(self.sceneCB, "/live/scene")
56        self.callbackManager.add(self.nameSceneBlockCB, "/live/name/sceneblock")
57        self.callbackManager.add(self.nameTrackCB, "/live/name/track")
58        self.callbackManager.add(self.nameTrackBlockCB, "/live/name/trackblock")
59        self.callbackManager.add(self.nameClipCB, "/live/name/clip")
60        self.callbackManager.add(self.nameClipBlockCB, "/live/name/clipblock")   
61        self.callbackManager.add(self.armTrackCB, "/live/arm")
62        self.callbackManager.add(self.muteTrackCB, "/live/mute")
63        self.callbackManager.add(self.soloTrackCB, "/live/solo")
64        self.callbackManager.add(self.volumeCB, "/live/volume")
65        self.callbackManager.add(self.panCB, "/live/pan")
66        self.callbackManager.add(self.sendCB, "/live/send")
67        self.callbackManager.add(self.pitchCB, "/live/pitch")
68        self.callbackManager.add(self.trackJump, "/live/track/jump")
69        self.callbackManager.add(self.trackInfoCB, "/live/track/info")
70        self.callbackManager.add(self.undoCB, "/live/undo")
71        self.callbackManager.add(self.redoCB, "/live/redo")
72        self.callbackManager.add(self.playClipSlotCB, "/live/play/clipslot")
73       
74        self.callbackManager.add(self.viewSceneCB, "/live/scene/view")
75       
76        self.callbackManager.add(self.viewTrackCB, "/live/track/view")
77        self.callbackManager.add(self.viewTrackCB, "/live/return/view")
78        self.callbackManager.add(self.mviewTrackCB, "/live/master/view")
79       
80        self.callbackManager.add(self.viewDeviceCB, "/live/track/device/view")
81        self.callbackManager.add(self.viewDeviceCB, "/live/return/device/view")
82        self.callbackManager.add(self.mviewDeviceCB, "/live/master/device/view")       
83       
84        self.callbackManager.add(self.viewClipCB, "/live/clip/view")
85       
86        self.callbackManager.add(self.detailViewCB, "/live/detail/view")
87       
88        self.callbackManager.add(self.overdubCB, "/live/overdub")
89        self.callbackManager.add(self.stateCB, "/live/state")
90        self.callbackManager.add(self.clipInfoCB, "/live/clip/info")
91       
92        self.callbackManager.add(self.muteTrackCB, "/live/return/mute")
93        self.callbackManager.add(self.soloTrackCB, "/live/return/solo")
94        self.callbackManager.add(self.volumeCB, "/live/return/volume")
95        self.callbackManager.add(self.panCB, "/live/return/pan")
96        self.callbackManager.add(self.sendCB, "/live/return/send")       
97
98        self.callbackManager.add(self.volumeCB, "/live/master/volume")
99        self.callbackManager.add(self.panCB, "/live/master/pan")
100       
101        self.callbackManager.add(self.devicelistCB, "/live/devicelist")
102        self.callbackManager.add(self.devicelistCB, "/live/return/devicelist")
103        self.callbackManager.add(self.mdevicelistCB, "/live/master/devicelist")
104
105        self.callbackManager.add(self.devicerangeCB, "/live/device/range")
106        self.callbackManager.add(self.devicerangeCB, "/live/return/device/range")
107        self.callbackManager.add(self.mdevicerangeCB, "/live/master/device/range")
108       
109        self.callbackManager.add(self.deviceCB, "/live/device")
110        self.callbackManager.add(self.deviceCB, "/live/return/device")
111        self.callbackManager.add(self.mdeviceCB, "/live/master/device")
112       
113        self.callbackManager.add(self.loopStateCB, "/live/clip/loopstate")
114        self.callbackManager.add(self.loopStartCB, "/live/clip/loopstart")
115        self.callbackManager.add(self.loopEndCB, "/live/clip/loopend")
116       
117        self.callbackManager.add(self.loopStateCB, "/live/clip/loopstate_id")
118        self.callbackManager.add(self.loopStartCB, "/live/clip/loopstart_id")
119        self.callbackManager.add(self.loopEndCB, "/live/clip/loopend_id")
120       
121        self.callbackManager.add(self.warpingCB, "/live/clip/warping")
122       
123        self.callbackManager.add(self.sigCB, "/live/clip/signature")
124
125        self.callbackManager.add(self.crossfaderCB, "/live/master/crossfader")
126        self.callbackManager.add(self.trackxfaderCB, "/live/track/crossfader")
127        self.callbackManager.add(self.trackxfaderCB, "/live/return/crossfader")
128
129        self.callbackManager.add(self.quantizationCB, "/live/quantization")
130
131        self.callbackManager.add(self.selectionCB, "/live/selection")
132
133    def sigCB(self, msg):
134        """ Called when a /live/clip/signature message is recieved
135        """
136        track = msg[2]
137        clip = msg[3]
138        c = LiveUtils.getSong().visible_tracks[track].clip_slots[clip].clip
139       
140        if len(msg) == 4:
141            self.oscServer.sendOSC("/live/clip/signature", (track, clip, c.signature_numerator, c.signature_denominator))
142           
143        if len(msg) == 6:
144            self.oscServer.sendOSC("/live/clip/signature", 1)
145            c.signature_denominator = msg[5]
146            c.signature_numerator = msg[4]
147
148    def warpingCB(self, msg):
149        """ Called when a /live/clip/warping message is recieved
150        """
151        track = msg[2]
152        clip = msg[3]
153       
154       
155        if len(msg) == 4:
156            state = LiveUtils.getSong().visible_tracks[track].clip_slots[clip].clip.warping
157            self.oscServer.sendOSC("/live/clip/warping", (track, clip, int(state)))
158       
159        elif len(msg) == 5:
160            LiveUtils.getSong().visible_tracks[track].clip_slots[clip].clip.warping = msg[4]
161
162    def selectionCB(self, msg):
163        """ Called when a /live/selection message is received
164        """
165        if len(msg) == 6:
166            self.c_instance.set_session_highlight(msg[2], msg[3], msg[4], msg[5], 0)
167
168    def trackxfaderCB(self, msg):
169        """ Called when a /live/track/crossfader or /live/return/crossfader message is received
170        """
171        ty = msg[0] == '/live/return/crossfader' and 1 or 0
172   
173        if len(msg) == 3:
174            track = msg[2]
175       
176            if ty == 1:
177                assign = LiveUtils.getSong().return_tracks[track].mixer_device.crossfade_assign
178                name   = LiveUtils.getSong().return_tracks[track].mixer_device.crossfade_assignments.values[assign]
179           
180                self.oscServer.sendOSC("/live/return/crossfader", (track, str(assign), str(name)))
181            else:
182                assign = LiveUtils.getSong().visible_tracks[track].mixer_device.crossfade_assign
183                name   = LiveUtils.getSong().visible_tracks[track].mixer_device.crossfade_assignments.values[assign]
184           
185                self.oscServer.sendOSC("/live/track/crossfader", (track, str(assign), str(name)))
186
187           
188        elif len(msg) == 4:
189            track = msg[2]
190            assign = msg[3]
191           
192            if ty == 1:
193                LiveUtils.getSong().return_tracks[track].mixer_device.crossfade_assign = assign
194            else:
195                LiveUtils.getSong().visible_tracks[track].mixer_device.crossfade_assign = assign
196
197    def tempoCB(self, msg):
198        """Called when a /live/tempo message is received.
199
200        Messages:
201        /live/tempo                 Request current tempo, replies with /live/tempo (float tempo)
202        /live/tempo (float tempo)   Set the tempo, replies with /live/tempo (float tempo)
203        """
204        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
205            self.oscServer.sendOSC("/live/tempo", LiveUtils.getTempo())
206       
207        elif len(msg) == 3:
208            tempo = msg[2]
209            LiveUtils.setTempo(tempo)
210       
211    def timeCB(self, msg):
212        """Called when a /live/time message is received.
213
214        Messages:
215        /live/time                 Request current song time, replies with /live/time (float time)
216        /live/time (float time)    Set the time , replies with /live/time (float time)
217        """
218        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
219            self.oscServer.sendOSC("/live/time", float(LiveUtils.currentTime()))
220
221        elif len(msg) == 3:
222            time = msg[2]
223            LiveUtils.currentTime(time)
224
225    def nextCueCB(self, msg):
226        """Called when a /live/next/cue message is received.
227
228        Messages:
229        /live/next/cue              Jumps to the next cue point
230        """
231        LiveUtils.jumpToNextCue()
232       
233    def prevCueCB(self, msg):
234        """Called when a /live/prev/cue message is received.
235
236        Messages:
237        /live/prev/cue              Jumps to the previous cue point
238        """
239        LiveUtils.jumpToPrevCue()
240       
241    def playCB(self, msg):
242        """Called when a /live/play message is received.
243
244        Messages:
245        /live/play              Starts the song playing
246        """
247        LiveUtils.play()
248       
249    def playContinueCB(self, msg):
250        """Called when a /live/play/continue message is received.
251
252        Messages:
253        /live/play/continue     Continues playing the song from the current point
254        """
255        LiveUtils.continuePlaying()
256       
257    def playSelectionCB(self, msg):
258        """Called when a /live/play/selection message is received.
259
260        Messages:
261        /live/play/selection    Plays the current selection
262        """
263        LiveUtils.playSelection()
264       
265    def playClipCB(self, msg):
266        """Called when a /live/play/clip message is received.
267
268        Messages:
269        /live/play/clip     (int track, int clip)   Launches clip number clip in track number track
270        """
271        if len(msg) == 4:
272            track = msg[2]
273            clip = msg[3]
274            LiveUtils.launchClip(track, clip)
275           
276    def playSceneCB(self, msg):
277        """Called when a /live/play/scene message is received.
278
279        Messages:
280        /live/play/scene    (int scene)     Launches scene number scene
281        """
282        if len(msg) == 3:
283            scene = msg[2]
284            LiveUtils.launchScene(scene)
285   
286    def stopCB(self, msg):
287        """Called when a /live/stop message is received.
288
289        Messages:
290        /live/stop              Stops playing the song
291        """
292        LiveUtils.stop()
293       
294    def stopClipCB(self, msg):
295        """Called when a /live/stop/clip message is received.
296
297        Messages:
298        /live/stop/clip     (int track, int clip)   Stops clip number clip in track number track
299        """
300        if len(msg) == 4:
301            track = msg[2]
302            clip = msg[3]
303            LiveUtils.stopClip(track, clip)
304
305    def stopTrackCB(self, msg):
306        """Called when a /live/stop/track message is received.
307
308        Messages:
309        /live/stop/track     (int track, int clip)   Stops track number track
310        """
311        if len(msg) == 3:
312            track = msg[2]
313            LiveUtils.stopTrack(track)
314
315    def scenesCB(self, msg):
316        """Called when a /live/scenes message is received.
317
318        Messages:
319        /live/scenes        no argument or 'query'  Returns the total number of scenes
320
321        """
322        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
323            sceneTotal = len(LiveUtils.getScenes())
324            self.oscServer.sendOSC("/live/scenes", (sceneTotal))
325            return
326
327    def sceneCB(self, msg):
328        """Called when a /live/scene message is received.
329       
330        Messages:
331        /live/scene         no argument or 'query'  Returns the currently playing scene number
332        """
333        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
334            selected_scene = LiveUtils.getSong().view.selected_scene
335            scenes = LiveUtils.getScenes()
336            index = 0
337            selected_index = 0
338            for scene in scenes:
339                index = index + 1       
340                if scene == selected_scene:
341                    selected_index = index
342                   
343            self.oscServer.sendOSC("/live/scene", (selected_index))
344           
345        elif len(msg) == 3:
346            scene = msg[2]
347            LiveUtils.getSong().view.selected_scene = LiveUtils.getSong().scenes[scene]
348       
349
350    def tracksCB(self, msg):
351        """Called when a /live/tracks message is received.
352
353        Messages:
354        /live/tracks       no argument or 'query'  Returns the total number of scenes
355
356        """
357        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
358            trackTotal = len(LiveUtils.getTracks())
359            self.oscServer.sendOSC("/live/tracks", (trackTotal))
360            return
361
362
363    def nameSceneCB(self, msg):
364        """Called when a /live/name/scene message is received.
365
366        Messages:
367        /live/name/scene                            Returns a a series of all the scene names in the form /live/name/scene (int scene, string name)
368        /live/name/scene    (int scene)             Returns a single scene's name in the form /live/name/scene (int scene, string name)
369        /live/name/scene    (int scene, string name)Sets scene number scene's name to name
370
371        """       
372        #Requesting all scene names
373        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
374            sceneNumber = 0
375            for scene in LiveUtils.getScenes():
376                self.oscServer.sendOSC("/live/name/scene", (sceneNumber, str(scene.name)))
377                sceneNumber = sceneNumber + 1
378            return
379        #Requesting a single scene name
380        if len(msg) == 3:
381            sceneNumber = msg[2]
382            self.oscServer.sendOSC("/live/name/scene", (sceneNumber, str(LiveUtils.getScene(sceneNumber).name)))
383            return
384        #renaming a scene
385        if len(msg) == 4:
386            sceneNumber = msg[2]
387            name = msg[3]
388            LiveUtils.getScene(sceneNumber).name = name
389
390    def nameSceneBlockCB(self, msg):
391        """Called when a /live/name/sceneblock message is received.
392
393        /live/name/clipblock    (int offset, int blocksize) Returns a list of blocksize scene names starting at offset
394        """
395        if len(msg) == 4:
396            block = []
397            sceneOffset = msg[2]
398            blocksize = msg[3]
399            for scene in range(0, blocksize):
400                block.extend([str(LiveUtils.getScene(sceneOffset+scene).name)])                           
401            self.oscServer.sendOSC("/live/name/sceneblock", block)
402           
403           
404    def nameTrackCB(self, msg):
405        """Called when a /live/name/track message is received.
406
407        Messages:
408        /live/name/track                            Returns a a series of all the track names in the form /live/name/track (int track, string name)
409        /live/name/track    (int track)             Returns a single track's name in the form /live/name/track (int track, string name)
410        /live/name/track    (int track, string name)Sets track number track's name to name
411
412        """       
413        #Requesting all track names
414        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
415            trackNumber = 0
416            for track in LiveUtils.getTracks():
417                self.oscServer.sendOSC("/live/name/track", (trackNumber, str(track.name)))
418                trackNumber = trackNumber + 1
419            return
420        #Requesting a single track name
421        if len(msg) == 3:
422            trackNumber = msg[2]
423            self.oscServer.sendOSC("/live/name/track", (trackNumber, str(LiveUtils.getTrack(trackNumber).name)))
424            return
425        #renaming a track
426        if len(msg) == 4:
427            trackNumber = msg[2]
428            name = msg[3]
429            LiveUtils.getTrack(trackNumber).name = name
430
431    def nameTrackBlockCB(self, msg):
432        """Called when a /live/name/trackblock message is received.
433
434        /live/name/trackblock    (int offset, int blocksize) Returns a list of blocksize track names starting at offset
435        """
436        if len(msg) == 4:
437            block = []
438            trackOffset = msg[2]
439            blocksize = msg[3]
440            for track in range(0, blocksize):
441                block.extend([str(LiveUtils.getTrack(trackOffset+track).name)])                           
442            self.oscServer.sendOSC("/live/name/trackblock", block)
443
444
445    def nameClipBlockCB(self, msg):
446        """Called when a /live/name/clipblock message is received.
447
448        /live/name/clipblock    (int track, int clip, blocksize x/tracks, blocksize y/clipslots) Returns a list of clip names for a block of clips (int blockX, int blockY, clipname)
449
450        """
451        #Requesting a block of clip names X1 Y1 X2 Y2 where X1,Y1 is the first clip (track, clip) of the block, X2 the number of tracks to cover and Y2 the number of scenes
452       
453        if len(msg) == 6:
454            block = []
455            trackOffset = msg[2]
456            clipOffset = msg[3]
457            blocksizeX = msg[4]
458            blocksizeY = msg[5]
459            for clip in range(0, blocksizeY):
460                for track in range(0, blocksizeX):
461                        trackNumber = trackOffset+track
462                        clipNumber = clipOffset+clip
463                        if LiveUtils.getClip(trackNumber, clipNumber) != None:
464                            block.extend([str(LiveUtils.getClip(trackNumber, clipNumber).name)])
465                        else:
466                            block.extend([""])
467                           
468            self.oscServer.sendOSC("/live/name/clipblock", block)
469
470
471
472    def nameClipCB(self, msg):
473        """Called when a /live/name/clip message is received.
474
475        Messages:
476        /live/name/clip                                      Returns a a series of all the clip names in the form /live/name/clip (int track, int clip, string name)
477        /live/name/clip    (int track, int clip)             Returns a single clip's name in the form /live/name/clip (int clip, string name)
478        /live/name/clip    (int track, int clip, string name)Sets clip number clip in track number track's name to name
479
480        """
481       
482        #Requesting all clip names
483        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
484            trackNumber = 0
485            clipNumber = 0
486            for track in LiveUtils.getTracks():
487                for clipSlot in track.clip_slots:
488                    if clipSlot.clip != None:
489                        self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(clipSlot.clip.name), clipSlot.clip.color))
490                    clipNumber = clipNumber + 1
491                clipNumber = 0
492                trackNumber = trackNumber + 1
493            return
494        #Requesting a single clip name
495        if len(msg) == 4:
496            trackNumber = msg[2]
497            clipNumber = msg[3]
498            self.oscServer.sendOSC("/live/name/clip", (trackNumber, clipNumber, str(LiveUtils.getClip(trackNumber, clipNumber).name), LiveUtils.getClip(trackNumber, clipNumber).color))
499            return
500        #renaming a clip
501        if len(msg) == 5:
502            trackNumber = msg[2]
503            clipNumber = msg[3]
504            name = msg[4]
505            LiveUtils.getClip(trackNumber, clipNumber).name = name
506   
507    def armTrackCB(self, msg):
508        """Called when a /live/arm message is received.
509
510        Messages:
511        /live/arm     (int track)   (int armed/disarmed)     Arms track number track
512        """
513        track = msg[2]
514       
515        if len(msg) == 4:
516            if msg[3] == 1:
517                LiveUtils.armTrack(track)
518            else:
519                LiveUtils.disarmTrack(track)
520        # Return arm status       
521        elif len(msg) == 3:
522            status = LiveUtils.getTrack(track).arm
523            self.oscServer.sendOSC("/live/arm", (track, int(status)))     
524           
525    def muteTrackCB(self, msg):
526        """Called when a /live/mute message is received.
527
528        Messages:
529        /live/mute     (int track)   Mutes track number track
530        """
531        ty = msg[0] == '/live/return/mute' and 1 or 0
532        track = msg[2]
533           
534        if len(msg) == 4:
535            if msg[3] == 1:
536                LiveUtils.muteTrack(track, ty)
537            else:
538                LiveUtils.unmuteTrack(track, ty)
539               
540        elif len(msg) == 3:
541            if ty == 1:
542                status = LiveUtils.getSong().return_tracks[track].mute
543                self.oscServer.sendOSC("/live/return/mute", (track, int(status)))
544               
545            else:
546                status = LiveUtils.getTrack(track).mute
547                self.oscServer.sendOSC("/live/mute", (track, int(status)))
548           
549    def soloTrackCB(self, msg):
550        """Called when a /live/solo message is received.
551
552        Messages:
553        /live/solo     (int track)   Solos track number track
554        """
555        ty = msg[0] == '/live/return/solo' and 1 or 0
556        track = msg[2]
557       
558        if len(msg) == 4:
559            if msg[3] == 1:
560                LiveUtils.soloTrack(track, ty)
561            else:
562                LiveUtils.unsoloTrack(track, ty)
563           
564        elif len(msg) == 3:
565            if ty == 1:
566                status = LiveUtils.getSong().return_tracks[track].solo
567                self.oscServer.sendOSC("/live/return/solo", (track, int(status)))
568               
569            else:
570                status = LiveUtils.getTrack(track).solo
571                self.oscServer.sendOSC("/live/solo", (track, int(status)))
572           
573    def volumeCB(self, msg):
574        """Called when a /live/volume message is received.
575
576        Messages:
577        /live/volume     (int track)                            Returns the current volume of track number track as: /live/volume (int track, float volume(0.0 to 1.0))
578        /live/volume     (int track, float volume(0.0 to 1.0))  Sets track number track's volume to volume
579        """
580        if msg[0] == '/live/return/volume':
581            ty = 1
582        elif msg[0] == '/live/master/volume':
583            ty = 2
584        else:
585            ty = 0
586       
587        if len(msg) == 2 and ty == 2:
588            self.oscServer.sendOSC("/live/master/volume", LiveUtils.getSong().master_track.mixer_device.volume.value)
589       
590        elif len(msg) == 3 and ty == 2:
591            volume = msg[2]
592            LiveUtils.getSong().master_track.mixer_device.volume.value = volume
593       
594        elif len(msg) == 4:
595            track = msg[2]
596            volume = msg[3]
597           
598            if ty == 0:
599                LiveUtils.trackVolume(track, volume)
600            elif ty == 1:
601                LiveUtils.getSong().return_tracks[track].mixer_device.volume.value = volume
602
603        elif len(msg) == 3:
604            track = msg[2]
605
606            if ty == 1:
607                self.oscServer.sendOSC("/live/return/volume", (track, LiveUtils.getSong().return_tracks[track].mixer_device.volume.value))
608           
609            else:
610                self.oscServer.sendOSC("/live/volume", (track, LiveUtils.trackVolume(track)))
611           
612    def panCB(self, msg):
613        """Called when a /live/pan message is received.
614
615        Messages:
616        /live/pan     (int track)                            Returns the pan of track number track as: /live/pan (int track, float pan(-1.0 to 1.0))
617        /live/pan     (int track, float pan(-1.0 to 1.0))    Sets track number track's pan to pan
618
619        """
620        if msg[0] == '/live/return/pan':
621            ty = 1
622        elif msg[0] == '/live/master/pan':
623            ty = 2
624        else:
625            ty = 0
626       
627        if len(msg) == 2 and ty == 2:
628            self.oscServer.sendOSC("/live/master/pan", LiveUtils.getSong().master_track.mixer_device.panning.value)
629       
630        elif len(msg) == 3 and ty == 2:
631            pan = msg[2]
632            LiveUtils.getSong().master_track.mixer_device.panning.value = pan
633           
634        elif len(msg) == 4:
635            track = msg[2]
636            pan = msg[3]
637           
638            if ty == 0:
639                LiveUtils.trackPan(track, pan)
640            elif ty == 1:
641                LiveUtils.getSong().return_tracks[track].mixer_device.panning.value = pan
642           
643        elif len(msg) == 3:
644            track = msg[2]
645           
646            if ty == 1:
647                self.oscServer.sendOSC("/live/pan", (track, LiveUtils.getSong().return_tracks[track].mixer_device.panning.value))
648           
649            else:
650                self.oscServer.sendOSC("/live/pan", (track, LiveUtils.trackPan(track)))
651
652           
653    def sendCB(self, msg):
654        """Called when a /live/send message is received.
655
656        Messages:
657        /live/send     (int track, int send)                              Returns the send level of send (send) on track number track as: /live/send (int track, int send, float level(0.0 to 1.0))
658        /live/send     (int track, int send, float level(0.0 to 1.0))     Sets the send (send) of track number (track)'s level to (level)
659
660        """
661        ty = msg[0] == '/live/return/send' and 1 or 0
662        track = msg[2]
663       
664        if len(msg) == 5:
665            send = msg[3]
666            level = msg[4]
667            if ty == 1:
668                LiveUtils.getSong().return_tracks[track].mixer_device.sends[send].value = level
669           
670            else:
671                LiveUtils.trackSend(track, send, level)
672       
673        elif len(msg) == 4:
674            send = msg[3]
675            if ty == 1:
676                self.oscServer.sendOSC("/live/return/send", (track, send, float(LiveUtils.getSong().return_tracks[track].mixer_device.sends[send].value)))
677
678            else:
679                self.oscServer.sendOSC("/live/send", (track, send, float(LiveUtils.trackSend(track, send))))
680           
681        elif len(msg) == 3:
682            if ty == 1:
683                sends = LiveUtils.getSong().return_tracks[track].mixer_device.sends
684            else:
685                sends = LiveUtils.getSong().visible_tracks[track].mixer_device.sends
686               
687            so = [track]
688            for i in range(len(sends)):
689                so.append(i)
690                so.append(float(sends[i].value))
691               
692            if ty == 1:
693                self.oscServer.sendOSC("/live/return/send", tuple(so))
694            else:
695                self.oscServer.sendOSC("/live/send", tuple(so))
696               
697       
698           
699    def pitchCB(self, msg):
700        """Called when a /live/pitch message is received.
701
702        Messages:
703        /live/pitch     (int track, int clip)                                               Returns the pan of track number track as: /live/pan (int track, int clip, int coarse(-48 to 48), int fine (-50 to 50))
704        /live/pitch     (int track, int clip, int coarse(-48 to 48), int fine (-50 to 50))  Sets clip number clip in track number track's pitch to coarse / fine
705
706        """
707        if len(msg) == 6:
708            track = msg[2]
709            clip = msg[3]
710            coarse = msg[4]
711            fine = msg[5]
712            LiveUtils.clipPitch(track, clip, coarse, fine)
713        if len(msg) ==4:
714            track = msg[2]
715            clip = msg[3]
716            self.oscServer.sendOSC("/live/pitch", LiveUtils.clipPitch(track, clip))
717
718    def trackJump(self, msg):
719        """Called when a /live/track/jump message is received.
720
721        Messages:
722        /live/track/jump     (int track, float beats)   Jumps in track's currently running session clip by beats
723        """
724        if len(msg) == 4:
725            track = msg[2]
726            beats = msg[3]
727            track = LiveUtils.getTrack(track)
728            track.jump_in_running_session_clip(beats)
729
730    def trackInfoCB(self, msg):
731        """Called when a /live/track/info message is received.
732
733        Messages:
734        /live/track/info     (int track)   Returns clip slot status' for all clips in a track in the form /live/track/info (tracknumber, armed  (clipnumber, state, length))
735                                           [state: 1 = Has Clip, 2 = Playing, 3 = Triggered]
736        """
737       
738        clipslots = LiveUtils.getClipSlots()
739       
740        new = []
741        if len(msg) == 3:
742            new.append(clipslots[msg[2]])
743            tracknum = msg[2] - 1
744        else:
745            new = clipslots
746            tracknum = -1
747       
748        for track in new:
749            tracknum = tracknum + 1
750            clipnum = -1
751            tmptrack = LiveUtils.getTrack(tracknum)
752            armed = tmptrack.arm and 1 or 0
753            li = [tracknum, armed]
754            for clipSlot in track:
755                clipnum = clipnum + 1
756                li.append(clipnum);
757                if clipSlot.clip != None:
758                    clip = clipSlot.clip
759                    if clip.is_playing == 1:
760                        li.append(2)
761                        li.append(clip.length)
762                       
763                    elif clip.is_triggered == 1:
764                        li.append(3)
765                        li.append(clip.length)
766                       
767                    else:
768                        li.append(1)
769                        li.append(clip.length)
770                else:
771                    li.append(0)
772                    li.append(0.0)
773                   
774            tu = tuple(li)
775           
776            self.oscServer.sendOSC("/live/track/info", tu)
777
778
779    def undoCB(self, msg):
780        """Called when a /live/undo message is received.
781       
782        Messages:
783        /live/undo      Requests the song to undo the last action
784        """
785        LiveUtils.getSong().undo()
786       
787    def redoCB(self, msg):
788        """Called when a /live/redo message is received.
789       
790        Messages:
791        /live/redo      Requests the song to redo the last action
792        """
793        LiveUtils.getSong().redo()
794       
795    def playClipSlotCB(self, msg):
796        """Called when a /live/play/clipslot message is received.
797       
798        Messages:
799        /live/play/clipslot     (int track, int clip)   Launches clip number clip in track number track
800        """
801        if len(msg) == 4:
802            track_num = msg[2]
803            clip_num = msg[3]
804            track = LiveUtils.getTrack(track_num)
805            clipslot = track.clip_slots[clip_num]
806            clipslot.fire()
807
808    def viewSceneCB(self, msg):
809        """Called when a /live/scene/view message is received.
810       
811        Messages:
812        /live/scene/view     (int track)      Selects a track to view
813        """
814       
815        if len(msg) == 3:
816            scene = msg[2]
817            LiveUtils.getSong().view.selected_scene = LiveUtils.getSong().scenes[scene]
818           
819    def viewTrackCB(self, msg):
820        """Called when a /live/track/view message is received.
821       
822        Messages:
823        /live/track/view     (int track)      Selects a track to view
824        """
825        ty = msg[0] == '/live/return/view' and 1 or 0
826        track_num = msg[2]
827       
828        if len(msg) == 3:
829            if ty == 1:
830                track = LiveUtils.getSong().return_tracks[track_num]
831            else:
832                track = LiveUtils.getSong().visible_tracks[track_num]
833               
834            LiveUtils.getSong().view.selected_track = track
835            Live.Application.get_application().view.show_view("Detail/DeviceChain")
836               
837            #track.view.select_instrument()
838           
839    def mviewTrackCB(self, msg):
840        """Called when a /live/master/view message is received.
841       
842        Messages:
843        /live/track/view     (int track)      Selects a track to view
844        """
845        track = LiveUtils.getSong().master_track
846
847        LiveUtils.getSong().view.selected_track = track
848        Live.Application.get_application().view.show_view("Detail/DeviceChain")       
849       
850        #track.view.select_instrument()
851       
852    def viewClipCB(self, msg):
853        """Called when a /live/clip/view message is received.
854       
855        Messages:
856        /live/clip/view     (int track, int clip)      Selects a track to view
857        """
858        track = LiveUtils.getSong().visible_tracks[msg[2]]
859       
860        if len(msg) == 4:
861            clip  = msg[3]
862        else:
863            clip  = 0
864       
865        LiveUtils.getSong().view.selected_track = track
866        LiveUtils.getSong().view.detail_clip = track.clip_slots[clip].clip
867        Live.Application.get_application().view.show_view("Detail/Clip") 
868
869    def detailViewCB(self, msg):
870        """Called when a /live/detail/view message is received. Used to switch between clip/track detail
871
872        Messages:
873        /live/detail/view (int) Selects view where 0=clip detail, 1=track detail
874        """
875        if len(msg) == 3:
876            if msg[2] == 0:
877                Live.Application.get_application().view.show_view("Detail/Clip")
878            elif msg[2] == 1:
879                Live.Application.get_application().view.show_view("Detail/DeviceChain")
880
881    def viewDeviceCB(self, msg):
882        """Called when a /live/track/device/view message is received.
883       
884        Messages:
885        /live/track/device/view     (int track)      Selects a track to view
886        """
887        ty = msg[0] == '/live/return/device/view' and 1 or 0
888        track_num = msg[2]
889       
890        if len(msg) == 4:
891            if ty == 1:
892                track = LiveUtils.getSong().return_tracks[track_num]
893            else:
894                track = LiveUtils.getSong().visible_tracks[track_num]
895
896            LiveUtils.getSong().view.selected_track = track
897            LiveUtils.getSong().view.select_device(track.devices[msg[3]])
898            Live.Application.get_application().view.show_view("Detail/DeviceChain")
899           
900    def mviewDeviceCB(self, msg):
901        track = LiveUtils.getSong().master_track
902       
903        if len(msg) == 3:
904            LiveUtils.getSong().view.selected_track = track
905            LiveUtils.getSong().view.select_device(track.devices[msg[2]])
906            Live.Application.get_application().view.show_view("Detail/DeviceChain")
907       
908    def overdubCB(self, msg):
909        """Called when a /live/overdub message is received.
910       
911        Messages:
912        /live/overdub     (int on/off)      Enables/disables overdub
913        """       
914        if len(msg) == 3:
915            overdub = msg[2]
916            LiveUtils.getSong().overdub = overdub
917
918    def stateCB(self, msg):
919        """Called when a /live/state is received.
920       
921        Messages:
922        /live/state                    Returns the current tempo and overdub status
923        """
924        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
925            tempo = LiveUtils.getTempo()
926            overdub = LiveUtils.getSong().overdub
927            self.oscServer.sendOSC("/live/state", (tempo, int(overdub)))
928       
929    def clipInfoCB(self,msg):
930        """Called when a /live/clip/info message is received.
931       
932        Messages:
933        /live/clip/info     (int track, int clip)      Gets the status of a single clip in the form  /live/clip/info (tracknumber, clipnumber, state)
934                                                       [state: 1 = Has Clip, 2 = Playing, 3 = Triggered]
935        """
936       
937        if len(msg) == 4:
938            trackNumber = msg[2]
939            clipNumber = msg[3]   
940           
941            clip = LiveUtils.getClip(trackNumber, clipNumber)
942           
943            playing = 0
944           
945            if clip != None:
946                playing = 1
947               
948                if clip.is_playing == 1:
949                    playing = 2
950                elif clip.is_triggered == 1:
951                    playing = 3
952
953            self.oscServer.sendOSC("/live/clip/info", (trackNumber, clipNumber, playing))
954       
955        return
956       
957    def deviceCB(self, msg):
958        ty = msg[0] == '/live/return/device' and 1 or 0
959        track = msg[2]
960   
961        if len(msg) == 4:
962            device = msg[3]
963            po = [track, device]
964           
965            if ty == 1:
966                params = LiveUtils.getSong().return_tracks[track].devices[device].parameters
967            else:
968                params = LiveUtils.getSong().visible_tracks[track].devices[device].parameters
969   
970            for i in range(len(params)):
971                po.append(i)
972                po.append(float(params[i].value))
973                po.append(str(params[i].name))
974           
975            self.oscServer.sendOSC(ty == 1 and "/live/return/device/allparam" or "/live/device/allparam", tuple(po))
976   
977        elif len(msg) == 5:
978            device = msg[3]
979            param  = msg[4]
980           
981            if ty == 1:
982                p = LiveUtils.getSong().return_tracks[track].devices[device].parameters[param]
983            else: 
984                p = LiveUtils.getSong().visible_tracks[track].devices[device].parameters[param]
985       
986            self.oscServer.sendOSC(ty == 1 and "/live/return/device/param" or "/live/device/param", (track, device, param, p.value, str(p.name)))
987   
988   
989        elif len(msg) == 6:
990            device = msg[3]
991            param  = msg[4]
992            value  = msg[5]
993       
994            if ty == 1:
995                LiveUtils.getSong().return_tracks[track].devices[device].parameters[param].value = value
996            else:
997                LiveUtils.getSong().visible_tracks[track].devices[device].parameters[param].value = value
998
999    def devicerangeCB(self, msg):
1000        ty = msg[0] == '/live/return/device/range' and 1 or 0
1001        track = msg[2]
1002   
1003        if len(msg) == 4:
1004            device = msg[3]
1005            po = [track, device]
1006           
1007            if ty == 1:
1008                params = LiveUtils.getSong().return_tracks[track].devices[device].parameters
1009            else:
1010                params = LiveUtils.getSong().visible_tracks[track].devices[device].parameters
1011   
1012            for i in range(len(params)):
1013                po.append(i)
1014                po.append(params[i].min)
1015                po.append(params[i].max)
1016           
1017            self.oscServer.sendOSC(ty == 1 and "/live/return/device/range" or "/live/device/range", tuple(po))
1018   
1019        elif len(msg) == 5:
1020            device = msg[3]
1021            param  = msg[4]
1022           
1023            if ty == 1:
1024                p = LiveUtils.getSong().return_tracks[track].devices[device].parameters[param]
1025            else: 
1026                p = LiveUtils.getSong().visible_tracks[track].devices[device].parameters[param]
1027       
1028            self.oscServer.sendOSC(ty == 1 and "/live/return/device/range" or "/live/device/range", (track, device, param, p.min, p.max))
1029               
1030    def devicelistCB(self, msg):
1031        ty = msg[0] == '/live/return/devicelist' and 1 or 0
1032
1033        track = msg[2]
1034   
1035        if len(msg) == 3:
1036            do = [track]
1037           
1038            if ty == 1:
1039                devices = LiveUtils.getSong().return_tracks[track].devices
1040            else:
1041                devices = LiveUtils.getSong().visible_tracks[track].devices
1042       
1043            for i in range(len(devices)):
1044                do.append(i)
1045                do.append(str(devices[i].name))
1046           
1047            self.oscServer.sendOSC(ty == 1 and "/live/return/devicelist" or "/live/devicelist", tuple(do))
1048
1049    def mdeviceCB(self, msg):
1050        if len(msg) == 3:
1051            device = msg[2]
1052            po = [device]
1053           
1054            params = LiveUtils.getSong().master_track.devices[device].parameters
1055   
1056            for i in range(len(params)):
1057                po.append(i)
1058                po.append(float(params[i].value))
1059                po.append(str(params[i].name))
1060           
1061            self.oscServer.sendOSC("/live/master/device", tuple(po))
1062   
1063        elif len(msg) == 4:
1064            device = msg[2]
1065            param  = msg[3]
1066           
1067            p = LiveUtils.getSong().master_track.devices[device].parameters[param]
1068       
1069            self.oscServer.sendOSC("/live/master/device", (device, param, p.value, str(p.name)))
1070   
1071        elif len(msg) == 5:
1072            device = msg[2]
1073            param  = msg[3]
1074            value  = msg[4]
1075       
1076            LiveUtils.getSong().master_track.devices[device].parameters[param].value = value
1077
1078    def mdevicerangeCB(self, msg):
1079        if len(msg) == 3:
1080            device = msg[2]
1081            po = [device]
1082           
1083            params = LiveUtils.getSong().master_track.devices[device].parameters
1084   
1085            for i in range(len(params)):
1086                po.append(i)
1087                po.append(params[i].max)
1088                po.append(params[i].min)
1089           
1090            self.oscServer.sendOSC("/live/master/device/range", tuple(po))
1091   
1092        elif len(msg) == 4:
1093            device = msg[2]
1094            param  = msg[3]
1095           
1096            p = LiveUtils.getSong().master_track.devices[device].parameters[param]
1097       
1098            self.oscServer.sendOSC("/live/master/device/range", (device, param, p.min, p.max))
1099           
1100    def mdevicelistCB(self, msg):
1101        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
1102            do = []
1103            devices = LiveUtils.getSong().master_track.devices
1104       
1105            for i in range(len(devices)):
1106                do.append(i)
1107                do.append(str(devices[i].name))
1108           
1109            self.oscServer.sendOSC("/live/master/devicelist", tuple(do))           
1110           
1111           
1112    def crossfaderCB(self, msg):
1113        if len(msg) == 2 or (len(msg) == 3 and msg[2] == "query"):
1114            self.oscServer.sendOSC("/live/master/crossfader", float(LiveUtils.getSong().master_track.mixer_device.crossfader.value))
1115       
1116        elif len(msg) == 3:
1117            val = msg[2]
1118            LiveUtils.getSong().master_track.mixer_device.crossfader.value = val
1119
1120
1121    def loopStateCB(self, msg):
1122        type = msg[0] == '/live/clip/loopstate_id' and 1 or 0
1123   
1124        trackNumber = msg[2]
1125        clipNumber = msg[3]
1126   
1127        if len(msg) == 4:
1128            if type == 1:
1129                self.oscServer.sendOSC("/live/clip/loopstate", (trackNumber, clipNumber, int(LiveUtils.getClip(trackNumber, clipNumber).looping)))
1130            else:
1131                self.oscServer.sendOSC("/live/clip/loopstate", (int(LiveUtils.getClip(trackNumber, clipNumber).looping)))   
1132       
1133        elif len(msg) == 5:
1134            loopState = msg[4]
1135            LiveUtils.getClip(trackNumber, clipNumber).looping =  loopState
1136
1137    def loopStartCB(self, msg):
1138        type = msg[0] == '/live/clip/loopstart_id' and 1 or 0
1139       
1140        trackNumber = msg[2]
1141        clipNumber = msg[3]
1142   
1143        if len(msg) == 4:
1144            if type == 1:
1145                self.oscServer.sendOSC("/live/clip/loopstart", (trackNumber, clipNumber, float(LiveUtils.getClip(trackNumber, clipNumber).loop_start)))   
1146            else:
1147                self.oscServer.sendOSC("/live/clip/loopstart", (float(LiveUtils.getClip(trackNumber, clipNumber).loop_start)))   
1148   
1149        elif len(msg) == 5:
1150            loopStart = msg[4]
1151            LiveUtils.getClip(trackNumber, clipNumber).loop_start = loopStart
1152           
1153    def loopEndCB(self, msg):
1154        type = msg[0] == '/live/clip/loopend_id' and 1 or 0
1155   
1156        trackNumber = msg[2]
1157        clipNumber = msg[3]   
1158        if len(msg) == 4:
1159            if type == 1:
1160                self.oscServer.sendOSC("/live/clip/loopend", (trackNumber, clipNumber, float(LiveUtils.getClip(trackNumber, clipNumber).loop_end)))
1161            else:
1162                self.oscServer.sendOSC("/live/clip/loopend", (float(LiveUtils.getClip(trackNumber, clipNumber).loop_end)))   
1163       
1164        elif len(msg) == 5:
1165            loopEnd = msg[4]
1166            LiveUtils.getClip(trackNumber, clipNumber).loop_end =  loopEnd
1167
1168    def quantizationCB(self, msg):
1169        quant = msg[2]
1170        LiveUtils.getSong().clip_trigger_quantization = quant
1171
Note: See TracBrowser for help on using the repository browser.