| 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 | |
|---|
| 21 | This file contains all the current Live OSC callbacks. |
|---|
| 22 | |
|---|
| 23 | """ |
|---|
| 24 | import Live |
|---|
| 25 | import RemixNet |
|---|
| 26 | import OSC |
|---|
| 27 | import LiveUtils |
|---|
| 28 | |
|---|
| 29 | class 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 | |
|---|