Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.24 KB | None | 0 0
  1. // Lemur Controller Script based on the touchOSC controller script by Thomas Helzle. Thanks for that!
  2.  
  3. // Things to do
  4.  
  5. /*
  6. * Adding the Datamanager.js by Drew Meyer http://www.sub-version.net ,thanks for that!
  7. * to callback the Clip colors and track names.
  8. * Adding a step sequencer like in the Launchpad controller script.
  9. * Optimisation of the clip launcher in the Lemur template
  10. */
  11.  
  12. loadAPI(1);
  13. load ("DataManager.js");
  14.  
  15. host.defineController("liine", "Lemur", "1.0", "434bb2e0-3932-11e4-916c-0800200c9a66");
  16. host.defineMidiPorts(1, 1);
  17. host.addDeviceNameBasedDiscoveryPair(["Daemon Input 0"], ["Daemon Output 0"]);
  18.  
  19. // Main variable:
  20. var lem;
  21.  
  22.  
  23. // Main Constructor where all the basics are set up:
  24. function Lemur() {
  25. lem = this;
  26.  
  27. // Constants:
  28. this.FADERS = 101; // Start of Fader Range - 8 x track volume + 1 x master volume
  29. this.PANS = 91; // Start of Pan Range - 8 x track pan
  30. this.XY = 12; // Start of the XY Pads - 4 x X and Y, 8 total
  31. this.MACROS = 20; // Start of Device Macro Range - 8 macro knobs on the cursor device
  32. this.PARAMS = 40; // Start of Device Parameter Mappings - 8 parameter mappings on the cursor device
  33. this.PADCENTER = 36; // Start Offset of Pads
  34. this.PADSTEP = 16; // Pad Pagesize per Step
  35. this.KEYCENTER = 36; // Start Offset of Pads
  36. this.KEYSTEP = 12; // Pad Pagesize per Step
  37.  
  38. // Midi Ports:
  39. this.midiInKeys = host.getMidiInPort(0).createNoteInput("Lemur Keys", "?0????");
  40. this.midiInPads = host.getMidiInPort(0).createNoteInput("Lemur Pads", "?9????");
  41. // Disable the consuming of events by the NoteInputs, so they are also available for mapping
  42. this.midiInKeys.setShouldConsumeEvents(false);
  43. this.midiInPads.setShouldConsumeEvents(false);
  44.  
  45. // Setting Callbacks for Midi and Sysex
  46. host.getMidiInPort(0).setMidiCallback(onMidi);
  47. host.getMidiInPort(0).setSysexCallback(onSysex);
  48.  
  49. // States:
  50.  
  51. // Transport States:
  52. this.isPlaying = false;
  53. this.isRecording = false;
  54. this.isOverdubEnabled = false;
  55. this.transpHasChanged = true;
  56.  
  57. // Tracks:
  58. this.masterVolume = 0;
  59. this.masterVolumeHasChanged = false;
  60. this.trackVolume = [];
  61. this.trackVolumeHasChanged = [];
  62. this.trackPan = [];
  63. this.trackPanHasChanged = [];
  64.  
  65. // Macros:
  66. this.deviceMacro = [];
  67. this.deviceMacroHasChanged = [];
  68.  
  69. // Device Mappings:
  70. this.deviceMapping = [];
  71. this.deviceMappingHasChanged = [];
  72. this.pageNames = [];
  73.  
  74. // XY Pads:
  75. this.xyPad = [];
  76. this.xyPadHasChanged = [];
  77.  
  78. // ClipLauncher:
  79. this.clIsPlaying = [];
  80. this.clIsRecording = [];
  81. this.clIsQueued = [];
  82. this.clHasContent = [];
  83. this.clColor = [];
  84. this.clBright = [];
  85.  
  86. // Initializations:
  87. for (var i=0; i<8; i++) {
  88. this.trackVolume[i] = 0;
  89. this.trackVolumeHasChanged[i] = false;
  90. this.trackPan[i] = 0;
  91. this.trackPanHasChanged[i] = false;
  92. this.deviceMacro[i] = 0;
  93. this.deviceMacroHasChanged[i] = false;
  94. this.deviceMapping[i] = 0;
  95. this.deviceMappingHasChanged[i] = false;
  96. this.xyPad[i] = 0;
  97. this.xyPadHasChanged[i] = false;
  98. for (var j=0; j<4; j++) {
  99. this.clIsPlaying[j+i*4] = false;
  100. this.clIsRecording[j+i*4] = false;
  101. this.clIsQueued[j+i*4] = false;
  102. this.clHasContent[j+i*4] = false;
  103. this.clColor[j+i*4] = 5;
  104. this.clColor[j+i*4] = false;
  105. }
  106. }
  107.  
  108. // Change States:
  109. this.trackHasChanged = false;
  110. this.deviceHasChanged = false;
  111. this.presetHasChanged = false;
  112. this.categoryHasChanged = false;
  113. this.creatorHasChanged = false;
  114. this.pPageHasChanged = false;
  115.  
  116. // Translation Tables:
  117. this.padTranslation = initArray(0, 128);
  118. this.padOffset = 0;
  119. this.keyTranslation = initArray(0, 128);
  120. this.keyOffset = 0;
  121.  
  122. // Creating Views:
  123. this.transport = host.createTransport(); // this creates the ability to control transport
  124. this.masterTrack = host.createMasterTrack(0);
  125. this.tracks = host.createMainTrackBank(8, 0, 0);
  126. this.cTrack = host.createCursorTrack(1, 0);
  127. this.cDevice = lem.cTrack.getPrimaryDevice();
  128. this.uMap = host.createUserControls(8);
  129. this.cClipWindow = host.createTrackBank(6, 0, 5);
  130. this.cScenes = lem.cClipWindow.getClipLauncherScenes();
  131.  
  132. this.cMacro = [];
  133. this.cPage = [];
  134. this.cClipTrack = [];
  135. this.cSlots = [];
  136.  
  137. }
  138. var data;
  139.  
  140. function init()
  141. {
  142. data = new DataManager(128, 1024);
  143. enableListeners = true
  144.  
  145. // instantiate a new Lemur Object:
  146. new Lemur()
  147.  
  148. // Creating Observers, indications etc.:
  149.  
  150. lem.transport.addIsPlayingObserver(function(on){
  151. lem.isPlaying = on;
  152. lem.transpHasChanged = true;
  153. });
  154. lem.transport.addIsRecordingObserver(function(on){
  155. lem.isRecording = on;
  156. lem.transpHasChanged = true;
  157. });
  158. lem.transport.addOverdubObserver(function(on){
  159. lem.isOverdubEnabled = on;
  160. lem.transpHasChanged = true;
  161. });
  162.  
  163. lem.masterTrack.getVolume().setIndication(true);
  164.  
  165. lem.masterTrack.getVolume().addValueObserver(128, function(volume){
  166. lem.masterVolume = volume;
  167. lem.masterVolumeHasChanged = true;
  168. })
  169.  
  170. for (var j=0; j<6; j++) {
  171. lem.cClipTrack[j] = lem.cClipWindow.getTrack(j);
  172. lem.cSlots[j] = lem.cClipTrack[j].getClipLauncherSlots();
  173. lem.cSlots[j].setIndication(true);
  174. lem.cSlots[j].addIsPlayingObserver(getClipValueFunc(j, lem.clIsPlaying));
  175. lem.cSlots[j].addIsRecordingObserver(getClipValueFunc(j, lem.clIsRecording));
  176. lem.cSlots[j].addIsQueuedObserver(getClipValueFunc(j, lem.clIsQueued));
  177. lem.cSlots[j].addHasContentObserver(getClipValueFunc(j, lem.clHasContent));
  178. }
  179.  
  180. for (var i=0; i<5; i++) {
  181. // Volume
  182. lem.tracks.getTrack(i).getVolume().setIndication(true);
  183. lem.tracks.getTrack(i).getVolume().addValueObserver(127, getTrackValueFunc(i, lem.trackVolume, lem.trackVolumeHasChanged));
  184. // Pan
  185. lem.tracks.getTrack(i).getPan().setIndication(true);
  186. lem.tracks.getTrack(i).getPan().addValueObserver(127, getTrackValueFunc(i, lem.trackPan, lem.trackPanHasChanged));
  187. // Macro
  188. lem.cMacro[i] = lem.cDevice.getMacro(i);
  189. lem.cMacro[i].getAmount().setIndication(true);
  190. lem.cMacro[i].getAmount().addValueObserver(127, getTrackValueFunc(i, lem.deviceMacro, lem.deviceMacroHasChanged));
  191. // Parameter Mapping
  192. lem.cPage[i] = lem.cDevice.getParameter(i);
  193. lem.cPage[i].setIndication(true);
  194. lem.cPage[i].addValueObserver(127, getTrackValueFunc(i, lem.deviceMapping, lem.deviceMappingHasChanged));
  195. // XY Pads
  196. lem.uMap.getControl(i).setLabel("XY Pad " + (Math.ceil(i/2+0.2)) + " - " + ((i%2<1) ? "X":"Y"))
  197. lem.uMap.getControl(i).addValueObserver(127, getTrackValueFunc(i, lem.xyPad, lem.xyPadHasChanged));
  198. // Clips
  199. for(var k=0; k<4; k++) {
  200.  
  201. }
  202.  
  203. }
  204.  
  205. lem.tracks.addCanScrollTracksUpObserver(function (on)
  206. {
  207. host.getMidiOutPort(0).sendMidi(177, 99, ((on) ? 5 : 0) );
  208. });
  209.  
  210. lem.tracks.addCanScrollTracksDownObserver(function (on)
  211. {
  212. host.getMidiOutPort(0).sendMidi(177, 100, ((on) ? 5 : 0) );
  213. });
  214.  
  215. lem.cDevice.addPresetNameObserver(50, "None", function(on)
  216. {
  217. if(lem.presetHasChanged) {
  218. host.showPopupNotification(on);
  219. lem.presetHasChanged = false;
  220. }
  221. });
  222. lem.cDevice.addPresetCategoryObserver(50, "None", function(on)
  223. {
  224. if(lem.categoryHasChanged) {
  225. host.showPopupNotification(on);
  226. lem.categoryHasChanged = false;
  227. }
  228. });
  229. lem.cDevice.addPresetCreatorObserver(50, "None", function(on)
  230. {
  231. if(lem.creatorHasChanged) {
  232. host.showPopupNotification(on);
  233. lem.creatorHasChanged = false;
  234. }
  235. });
  236. lem.cDevice.addNameObserver(50, "None", function(on)
  237. {
  238. if(lem.deviceHasChanged) {
  239. host.showPopupNotification(on);
  240. lem.deviceHasChanged = false;
  241. }
  242. });
  243. lem.cTrack.addNameObserver(50, "None", function(on)
  244. {
  245. if(lem.trackHasChanged) {
  246. host.showPopupNotification(on);
  247. lem.trackHasChanged = false;
  248. }
  249. });
  250. lem.cDevice.addPageNamesObserver(function(names)
  251. {
  252. lem.pageNames = [];
  253. for(var i=0; i<arguments.length; i++) {
  254. lem.pageNames[i] = arguments[i];
  255. }
  256. });
  257. lem.cDevice.addSelectedPageObserver(0, function(on)
  258. {
  259. if(lem.pPageHasChanged) {
  260. host.showPopupNotification(lem.pageNames[on]);
  261. lem.pPageHasChanged = false;
  262. }
  263. });
  264.  
  265.  
  266.  
  267. }
  268.  
  269. // Updates the controller in an orderly manner when needed
  270. // so that LEDs, Motors etc. react to changes in the Software
  271. // without drowning the Controller with data
  272.  
  273. function flush()
  274. {
  275. var changes = data.getChanges();
  276. for (var index = 0; index < changes.trackMuteStatuses.length; index++) {
  277. var indexOfTrackThatHasMuteStatusChanged = changes.trackMuteStatuses[index];
  278. var muteStatusOfTrackThatHasMuteStatusChanged = data.getTrackMuteStatus(indexOfTrackThatHasMuteStatusChanged);
  279. println("track number " + indexOfTrackThatHasMuteStatusChanged + " mute status has changed to " + muteStatusOfTrackThatHasMuteStatusChanged);
  280. }
  281.  
  282.  
  283. }
  284.  
  285. /*
  286. // Check if transport has changed and if yes, update all of the controlls:
  287. if (lem.transpHasChanged) {
  288. sendChannelController(0, 118, lem.isPlaying ? 127 : 0);
  289. sendChannelController(0, 117, lem.isPlaying ? 0 : 127);
  290. sendChannelController(0, 119, lem.isRecording ? 127 : 0);
  291. sendChannelController(0, 114, lem.isOverdubEnabled ? 127 : 0);
  292. lem.transpHasChanged = false;
  293. }
  294. // Update the Master Volume if it has changed:
  295. if (lem.masterVolumeHasChanged) {
  296. sendChannelController(0, lem.FADERS + 8, lem.masterVolume);
  297. lem.masterVolumeHasChanged = false;
  298. return;
  299. }
  300. // Go through an 8-step Loop to check for all the stuff that could have changed:
  301. for (var k=0; k<8; k++) {
  302. if (lem.trackVolumeHasChanged[k]) {
  303. sendChannelController(0, lem.FADERS + k, lem.trackVolume[k]);
  304. //sendChannelController(1, lem.FADERS + k, lem.trackVolume[k]);
  305. lem.trackVolumeHasChanged[k] = false;
  306. }
  307. if (lem.trackPanHasChanged[k]) {
  308. sendChannelController(0, lem.PANS + k, lem.trackPan[k]);
  309. lem.trackPanHasChanged[k] = false;
  310. }
  311. if (lem.deviceMacroHasChanged[k]) {
  312. sendChannelController(0, lem.MACROS + k, lem.deviceMacro[k]);
  313. lem.deviceMacroHasChanged[k] = false;
  314. }
  315. if (lem.deviceMappingHasChanged[k]) {
  316. sendChannelController(0, lem.PARAMS + k, lem.deviceMapping[k]);
  317. lem.deviceMappingHasChanged[k] = false;
  318. }
  319. if (lem.xyPadHasChanged[k]) {
  320. sendChannelController(0, lem.XY + k, lem.xyPad[k]);
  321. printMidi(0,lem.XY + k, lem.xyPad[k]);
  322. lem.xyPadHasChanged[k] = false;
  323. }
  324. // Add another 4 step Loop for the Clip Launcher Grid:
  325. for(var m=0; m<4; m++) {
  326. host.getMidiOutPort(0).sendMidi(146, m+k*4, lem.clColor[m+k*4]);
  327. host.getMidiOutPort(0).sendMidi(145, m+k*4, (lem.clBright[m+k*4]) ? 1 : 0);
  328. //println(lem.clColor[m+k*4]);
  329. }}
  330. */
  331.  
  332.  
  333.  
  334.  
  335. // React to incoming MIDI:
  336. function onMidi(status, data1, data2)
  337. {
  338. //printMidi(status, data1, data2);
  339.  
  340. // Check if it's CC values:
  341. if (isChannelController(status))
  342. {
  343. // Check if its the Volume Faders:
  344. if (data1 >= lem.FADERS && data1 < lem.FADERS + 9 ) {
  345. // Is it the Master Fader?
  346. if (data1 === lem.FADERS+8) {
  347. lem.masterTrack.getVolume().set(data2, 128);
  348. }
  349. // Otherwise its a Track Volume Fader:
  350. else {
  351. lem.tracks.getTrack(data1 - lem.FADERS).getVolume().set(data2, 128);
  352. }
  353. }
  354. // Check for Track Panning:
  355. else if (data1 >= lem.PANS && data1 < lem.PANS + 8 ) {
  356. lem.tracks.getTrack(data1 - lem.PANS).getPan().set(data2, 128);
  357. }
  358. // Check for Device Macros:
  359. else if (data1 >= lem.MACROS && data1 < lem.MACROS + 8 ) {
  360. lem.cMacro[data1 - lem.MACROS].getAmount().set(data2, 128);
  361. }
  362. // Check for Device Mappings:
  363. else if (data1 >= lem.PARAMS && data1 < lem.PARAMS + 8 ) {
  364. lem.cPage[data1 - lem.PARAMS].set(data2, 128);
  365. }
  366. // Check for XY Pads:
  367. else if (data1 >= lem.XY && data1 < lem.XY + 8 ) {
  368. lem.uMap.getControl(data1 - lem.XY).set(data2, 128);
  369. }
  370. // If we got this far, it's not a continuous controller but some one-off Button.
  371. // We only want to react to it when it's pressed (usually the value is 127 then),
  372. // not on release, which usually sends a value of 0:
  373. else if (data2 > 0)
  374. {
  375. // checking what CC value we get and react accordingly:
  376. switch (data1) {
  377. case 99:
  378. lem.tracks.scrollTracksUp();
  379. break;
  380. case 100:
  381. lem.tracks.scrollTracksDown();
  382. break;
  383. case 29:
  384. lem.cTrack.selectPrevious();
  385. lem.trackHasChanged = true;
  386. break;
  387. case 30:
  388. lem.cTrack.selectNext();
  389. lem.trackHasChanged = true;
  390. break;
  391. case 31:
  392. lem.cDevice.switchToDevice(DeviceType.ANY,ChainLocation.PREVIOUS);
  393. lem.deviceHasChanged = true;
  394. break;
  395. case 32:
  396. lem.cDevice.switchToDevice(DeviceType.ANY,ChainLocation.NEXT);
  397. lem.deviceHasChanged = true;
  398. break;
  399. case 33:
  400. lem.cDevice.switchToPreviousPreset();
  401. lem.presetHasChanged = true;
  402. break;
  403. case 34:
  404. lem.cDevice.switchToNextPreset();
  405. lem.presetHasChanged = true;
  406. break;
  407. case 35:
  408. lem.cDevice.switchToPreviousPresetCategory();
  409. lem.categoryHasChanged = true;
  410. break;
  411. case 36:
  412. lem.cDevice.switchToNextPresetCategory();
  413. lem.categoryHasChanged = true;
  414. break;
  415. case 37:
  416. lem.cDevice.switchToPreviousPresetCreator();
  417. lem.creatorHasChanged = true;
  418. break;
  419. case 38:
  420. lem.cDevice.switchToNextPresetCreator();
  421. lem.creatorHasChanged = true;
  422. break;
  423. case 50:
  424. lem.cDevice.previousParameterPage();
  425. lem.pPageHasChanged = true;
  426. break;
  427. case 51:
  428. lem.cDevice.nextParameterPage();
  429. lem.pPageHasChanged = true;
  430. break;
  431. case 53:
  432. // Checking if the Key-Offset is in a sensible Range before applaying the Offset:
  433. if (lem.keyOffset < 127-lem.KEYCENTER-lem.KEYSTEP) {
  434. lem.keyOffset += lem.KEYSTEP;
  435. setNoteTable(lem.midiInKeys, lem.keyTranslation, lem.keyOffset);
  436. }
  437. break;
  438. case 54:
  439. // Same in the other direction:
  440. if (lem.keyOffset > 0-lem.KEYCENTER+lem.KEYSTEP-1) {
  441. lem.keyOffset -= lem.KEYSTEP;
  442. setNoteTable(lem.midiInKeys, lem.keyTranslation, lem.keyOffset);
  443. }
  444. break;
  445. case 55:
  446. // Same for Pads
  447. if (lem.padOffset < 127-lem.PADCENTER-lem.PADSTEP) {
  448. lem.padOffset += lem.PADSTEP;
  449. setNoteTable(lem.midiInPads, lem.padTranslation, lem.padOffset);
  450. }
  451. break;
  452. case 56:
  453. // And the other way:
  454. if (lem.padOffset > 0-lem.PADCENTER+lem.PADSTEP-1) {
  455. lem.padOffset -= lem.PADSTEP;
  456. setNoteTable(lem.midiInPads, lem.padTranslation, lem.padOffset);
  457. }
  458. break;
  459. case 57:
  460. lem.cClipWindow.scrollTracksUp();
  461. break;
  462. case 58:
  463. lem.cClipWindow.scrollTracksDown();
  464. break;
  465. case 59:
  466. lem.cClipWindow.scrollScenesUp();
  467. break;
  468. case 60:
  469. lem.cClipWindow.scrollScenesDown();
  470. break;
  471. case 117:
  472. lem.transport.stop();
  473. break;
  474. case 118:
  475. lem.transport.play();
  476. break;
  477. case 113:
  478. lem.transport.toggleLoop();
  479. break;
  480. case 119:
  481. lem.transport.record();
  482. break;
  483. case 114:
  484. lem.transport.toggleOverdub();
  485. break;
  486. case 80:
  487. lem.tracks.getTrack(0).getSolo().toggle();
  488. break;
  489. case 81:
  490. lem.tracks.getTrack(0).getMute().toggle();
  491. break;
  492. case 82:
  493. lem.tracks.getTrack(1).getSolo().toggle();
  494. break;
  495. case 83:
  496. lem.tracks.getTrack(1).getMute().toggle();
  497. break;
  498. case 84:
  499. lem.tracks.getTrack(2).getSolo().toggle();
  500. break;
  501. case 85:
  502. lem.tracks.getTrack(2).getMute().toggle();
  503. break;
  504. case 86:
  505. lem.tracks.getTrack(3).getSolo().toggle();
  506. break;
  507. case 87:
  508. lem.tracks.getTrack(3).getMute().toggle();
  509. break;
  510. case 88:
  511. lem.tracks.getTrack(4).getSolo().toggle();
  512. break;
  513. case 89:
  514. lem.tracks.getTrack(4).getMute().toggle();
  515. break;
  516. case 90:
  517. lem.tracks.getTrack(5).getSolo().toggle();
  518. break;
  519. case 61:
  520. lem.tracks.getTrack(5).getMute().toggle();
  521. break;
  522. case 62:
  523. lem.tracks.getTrack(6).getSolo().toggle();
  524. break;
  525. case 63:
  526. lem.tracks.getTrack(6).getMute().toggle();
  527. break;
  528. case 64:
  529. lem.tracks.getTrack(7).getSolo().toggle();
  530. break;
  531. case 65:
  532. lem.tracks.getTrack(7).getMute().toggle();
  533. break;
  534. }
  535. }
  536. else {
  537. // hack to get the Lemur buttons to light up correctly.
  538. // Many Controllers overwrite their own lights on buttons when the button is
  539. // released, so here I tell the flush() function to update the buttons to update on release also:
  540. lem.transpHasChanged = true;
  541. }
  542. }
  543. // Now checking for some Note-On Commands I use for the Cliplauncher. First the Scenes:
  544. else if (isNoteOnC2(status)) {
  545. if (data1 >=100 && data1 < 105) {
  546. lem.cScenes.launch(data1-100);
  547. }
  548. // and then for the Clip Matrix:
  549. else if (data1 >=0 && data1 <32) {
  550. // If the clip is Playing or Queued, Stop it:
  551. if (lem.clIsPlaying[data1] || lem.clIsQueued[data1]) {
  552. lem.cClipTrack[data1%4].getClipLauncherSlots().stop();
  553. }
  554. // otherwise launch it:
  555. else{
  556. lem.cClipTrack[data1%4].getClipLauncherSlots().launch(Math.floor(data1*0.25));
  557. }
  558. }
  559. }
  560. }
  561.  
  562. function onSysex(data)
  563. {
  564. //printSysex(data);
  565. }
  566.  
  567. // A function to create an indexed function for the Observers
  568. function getValueObserverFunc(index, varToStore)
  569. {
  570. return function(value)
  571. {
  572. varToStore[index] = value;
  573. }
  574. }
  575.  
  576. // A function to create an indexed function for the Observers with an added state variable:
  577. function getTrackValueFunc(index, varToStore, varToSet)
  578. {
  579. return function(value)
  580. {
  581. varToStore[index] = value;
  582. varToSet[index] = true;
  583. }
  584. }
  585.  
  586. // A function to create an indexed function for the Observers for Clips including a Color-Update:
  587. function getClipValueFunc(slot, varToStore)
  588. {
  589. return function(index, value)
  590. {
  591. varToStore[slot+index*4] = value;
  592. updateClipColors();
  593. }
  594. }
  595.  
  596. // A function to set the Note Table for Midi Inputs and add / substract an Offset to Transpose:
  597. function setNoteTable(midiIn, table, offset) {
  598. for (var i = 0; i < 128; i++)
  599. {
  600. table[i] = offset + i;
  601. // if the result is out of the MIDI Note Range, set it to -1 so the Note is not played:
  602. if (table[i] < 0 || table[i] > 127) {
  603. table[i] = -1;
  604. }
  605. }
  606. // finally set the Key Translation Table of the respective MidiIn:
  607. midiIn.setKeyTranslationTable(table);
  608. }
  609.  
  610. // A function to update Clip Colors collecting all the Observerdata.
  611. // Lemur only supports a very limited Palette,
  612. // but in addition Colours can be "On" or "Off", brigher or dimmer:
  613. function updateClipColors () {
  614. for (var i=0; i<8; i++) {
  615. for(var j=0; j<4; j++){
  616. if (lem.clIsQueued[j+i*4]) {
  617. lem.clColor[j+i*4] = 3; // Yellow
  618. lem.clBright[j+i*4] = true;
  619. //println("Yellow");
  620. }
  621. else if (lem.clIsRecording[j+i*4]) {
  622. lem.clColor[j+i*4] = 0; // Red
  623. lem.clBright[j+i*4] = true;
  624. //println("Green");
  625. }
  626. else if (lem.clIsPlaying[j+i*4]) {
  627. lem.clColor[j+i*4] = 1; // Green
  628. lem.clBright[j+i*4] = true;
  629. //println("Green");
  630. }
  631. else if (lem.clHasContent[j+i*4]) {
  632. lem.clColor[j+i*4] = 5; // Grau
  633. lem.clBright[j+i*4] = true;
  634. //println("Orange");
  635. }
  636. // if we got so far, the slot is empty:
  637. else {
  638. lem.clColor[j+i*4] = 5; // Grey
  639. lem.clBright[j+i*4] = false;
  640. //println("Grey");
  641. }
  642. }
  643. }
  644. }
  645.  
  646. // Check for Note-Ons on Channel 2
  647. function isNoteOnC2(status) { return (status & 0xF1) == 0x91; }
  648.  
  649.  
  650. function exit()
  651. {
  652. // nothing to do here ;-)
  653. // Au revoir, I hope you enjoy the Tool ;-)
  654. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement