Advertisement
Guest User

Untitled

a guest
Aug 24th, 2014
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.15 KB | None | 0 0
  1. /*
  2. todo:
  3. investigat initial jump.. macri vs user_ctrl..
  4. user_ctrl = are not written (ala macro callbacks) before used.. ?
  5. so they jump when changed for the first time
  6. */
  7.  
  8. loadAPI(1);
  9.  
  10. host.defineController("Edirol", "PCR-300", "1.1", "fb2e8c80-ee90-11e3-ac10-0800200c9a66");
  11. host.addDeviceNameBasedDiscoveryPair(["PCR MIDI","PCR 1","PCR 2"], ["PCR MIDI","PCR 1"]);
  12. host.defineMidiPorts(3,2);
  13.  
  14. //----------
  15.  
  16. var _knobs = 0; // + 0..7
  17. var _sliders = 8; // + 0..7
  18. var _but_top = 16; // + 0..7
  19. var _but_bot = 24; // + 0..7
  20. var _knob9 = 32;
  21. var _slider9 = 33;
  22. var _a9 = 34;
  23. var _b9 = 35;
  24. var _xfade = 36;
  25. var _c1 = 37;
  26. var _c2 = 38;
  27. var _c3 = 39;
  28. var _rewind = 40;
  29. var _stop = 41;
  30. var _play = 42;
  31. var _record = 43;
  32. var _vlink = 44;
  33. var _v1 = 45;
  34. var _v2 = 46;
  35. var _v3 = 47;
  36. var _v4 = 48;
  37. var _user = 49;
  38.  
  39. var _user_ctrl = _user;
  40.  
  41. //----------------------------------------------------------------------
  42. // helpers
  43. //----------------------------------------------------------------------
  44.  
  45. var c1_is_pressed = false;
  46. var c2_is_pressed = false;
  47. var c3_is_pressed = false;
  48.  
  49. var knob_values = [];
  50. var macro_values = [];
  51. var ctrl_values = [];
  52.  
  53. //----------
  54.  
  55. function getValueFunc(index,variable) {
  56. return function(value) {
  57. variable[index] = value;
  58. }
  59. }
  60.  
  61. //----------
  62.  
  63. function find_control(ctrl,chan) {
  64. switch (ctrl) {
  65. case 16:
  66. return _knobs;
  67. case 17:
  68. return _sliders;
  69. case 18:
  70. if (chan==0) return _knob9;
  71. if (chan==1) return _slider9;
  72. return -1;
  73. case 19:
  74. if (chan==0) return _xfade;
  75. return -1;
  76. case 80:
  77. return _but_top;
  78. case 81:
  79. return _but_bot;
  80. case 82:
  81. if (chan==8) return _rewind;
  82. if (chan==13) return _stop;
  83. if (chan==14) return _play;
  84. if (chan==10) return _record;
  85. if (chan==0) return _c1;
  86. if (chan==1) return _c2;
  87. if (chan==2) return _c3;
  88. return -1;
  89. case 83:
  90. if (chan==0) return _a9;
  91. if (chan==1) return _b9;
  92. if (chan==8) return _vlink;
  93. if (chan==12) return _v1;
  94. if (chan==13) return _v2;
  95. if (chan==14) return _v3;
  96. if (chan==15) return _v4;
  97. return -1;
  98. //default:
  99. // return -1;
  100. }
  101. return -1;
  102. }
  103.  
  104. //----------
  105.  
  106. /*
  107. index = 0..7
  108. value = 0..127
  109. buffer = [0..7]
  110. */
  111.  
  112. function scale_knob(index,value,buffer,offset) {
  113. var io = index + offset;
  114. var param = 0;
  115. var v100 = value * 100;
  116. var vmax = 12700; // 12799?
  117. var knob_prev = knob_values[index];
  118. var knob_cur = v100;
  119. knob_values[index] = knob_cur;
  120. if (knob_cur > knob_prev) {
  121. // up
  122. var range = vmax - knob_prev; // how much we CAN turn up (0..127)
  123. var diff = knob_cur - knob_prev; // how much we DID turn up (0..127)
  124. var scale = diff / range; // % of range we DID turned up (0..1)
  125. var prange = vmax - buffer[io]; // how much parameter CAN increase (0..127)
  126. var change = (prange*scale); // how much to DO change (0..127)
  127. param = buffer[io] + change; // increase parameter
  128. } else {
  129. // down
  130. var range = knob_prev;
  131. var diff = knob_prev - knob_cur;
  132. var scale = diff / range;
  133. var prange = buffer[io];
  134. var change = (prange*scale);
  135. param = buffer[io] - change;
  136. }
  137. param = Math.floor(param);
  138. param = Math.min( Math.max(param,0) ,vmax);
  139. return param;
  140. }
  141.  
  142. //----------------------------------------------------------------------
  143. // init
  144. //----------------------------------------------------------------------
  145.  
  146. function init() {
  147.  
  148. for (var i=0; i<8; i++) macro_values[i] = 0;
  149. for (var i=0; i<8; i++) knob_values[i] = 0;
  150. for (var i=0; i<128; i++) ctrl_values[i] = 0;
  151.  
  152. // 'classes'
  153.  
  154. application = host.createApplication();
  155. //arranger = host.createArranger();
  156. transport = host.createTransport();
  157. cursorDevice = host.createCursorDevice();
  158. cursorTrack = host.createCursorTrack(0,0); // num sends,scenes
  159. tracks = host.createMainTrackBank(8,0,0); // num tracks,sends,scenes
  160. master = host.createMasterTrack(0); // num scenes
  161. primaryDevice = cursorTrack.getPrimaryDevice();
  162.  
  163. // midi inputs/outputs
  164.  
  165. input_0_pcrmidi = host.getMidiInPort(0);
  166. input_0_pcrmidi.setMidiCallback(onMidi_0);
  167. input_0_pcrmidi.setSysexCallback(onSysex_0);
  168.  
  169. input_1_pcr1 = host.getMidiInPort(1);
  170. input_1_pcr1.createNoteInput("PCR-300");
  171. //input_1_pcr1.setShouldConsumeEvents(false);
  172. //input_1_pcr1.assignPolyphonicAftertouchToExpression(0,NoteExpression.TIMBRE_UP,5); // 0=chan
  173. input_1_pcr1.setMidiCallback(onMidi_1);
  174. input_1_pcr1.setSysexCallback(onSysex_1);
  175.  
  176. input_2_pcr2 = host.getMidiInPort(2);
  177. input_2_pcr2.setMidiCallback(onMidi_2);
  178. input_2_pcr2.setSysexCallback(onSysex_2);
  179.  
  180. output_0_pcrmidi = host.getMidiOutPort(0);
  181.  
  182. output_1_pcr1 = host.getMidiOutPort(1);
  183. //output_1_pcr1.setShouldSendMidiBeatClock;
  184.  
  185. // 8 macro knobs
  186.  
  187. for (var i=0; i<8; i++) {
  188. macro = primaryDevice.getMacro(i);
  189. macro.getAmount().setIndication(true);
  190. macro.getAmount().addValueObserver(12700,getValueFunc(i,macro_values)); // 12800 ??
  191. }
  192.  
  193. // 128 user controls
  194.  
  195. userControls = host.createUserControls(128);
  196. for (var i=0; i<128; i++) {
  197. var c = userControls.getControl(i);
  198. c.setLabel("ctrl"+i);
  199. c.addValueObserver(12700,getValueFunc(i,ctrl_values)); // 12800 ??
  200. }
  201.  
  202. }
  203.  
  204. //----------------------------------------------------------------------
  205. // exit
  206. //----------------------------------------------------------------------
  207.  
  208. function exit() {
  209. }
  210.  
  211. //----------------------------------------------------------------------
  212. // onMidi
  213. //----------------------------------------------------------------------
  214.  
  215. // PCR MIDI
  216.  
  217. function onMidi_0(status, data1, data2) {
  218. }
  219.  
  220. //----------
  221.  
  222. // PCR 1
  223.  
  224. function onMidi_1(status, data1, data2) {
  225. }
  226.  
  227. //----------
  228.  
  229. // PCR 2 (hardcoded to pcr-300 control map #0)
  230.  
  231. function onMidi_2(status,data1,data2) {
  232. var chan = MIDIChannel(status); // status & 0xF
  233. var ch8 = chan & 0x07;
  234. var ctrl = data1;
  235. var value = data2;
  236. var pressed = (value>=64);
  237. if (isChannelController(status)) {
  238. var control = find_control(ctrl,chan);
  239. switch (control) {
  240.  
  241. case _knobs:
  242. if (c1_is_pressed) {
  243. var param = scale_knob(ch8,value,ctrl_values,0);
  244. ctrl_values[ch8] = param;
  245. userControls.getControl(_user_ctrl+ch8).set(param,12700);
  246. }
  247. else if (c2_is_pressed) {
  248. var param = scale_knob(ch8,value,ctrl_values,8);
  249. ctrl_values[ch8+8] = param;
  250. userControls.getControl(_user_ctrl+8+ch8).set(param,12700);
  251. }
  252. else if (c3_is_pressed) {
  253. var param = scale_knob(ch8,value,ctrl_values,16);
  254. ctrl_values[ch8+16] = param;
  255. userControls.getControl(_user_ctrl+16+ch8).set(param,12700);
  256. }
  257. else {
  258. var param = scale_knob(ch8,value,macro_values,0);
  259. primaryDevice.getMacro(ch8).getAmount().set(param,12700); // 12799?
  260. }
  261. break;
  262.  
  263. case _knob9:
  264. userControls.getControl(_knob9).set(value,128);
  265. break;
  266.  
  267. case _but_top:
  268. if (c1_is_pressed) {
  269. ctrl_values[ch8+24] = param;
  270. userControls.getControl(_user_ctrl+24+ch8).set(value,127);
  271. }
  272. else if (c2_is_pressed) {
  273. ctrl_values[ch8+32] = param;
  274. userControls.getControl(_user_ctrl+32+ch8).set(value,127);
  275. }
  276. else if (c3_is_pressed) {
  277. ctrl_values[ch8+40] = param;
  278. userControls.getControl(_user_ctrl+40+ch8).set(value,127);
  279. }
  280. else {
  281. if (pressed) tracks.getTrack(ch8).select();
  282. }
  283. break;
  284.  
  285. case _a9:
  286. if (pressed) master.select();
  287. break;
  288.  
  289. case _but_bot:
  290.  
  291. if (c1_is_pressed) {
  292. ctrl_values[ch8+48] = param;
  293. userControls.getControl(_user_ctrl+48+ch8).set(value,127);
  294. }
  295. else if (c2_is_pressed) {
  296. ctrl_values[ch8+56] = param;
  297. userControls.getControl(_user_ctrl+56+ch8).set(value,127);
  298. }
  299. else if (c3_is_pressed) {
  300. ctrl_values[ch8+64] = param;
  301. userControls.getControl(_user_ctrl+64+ch8).set(value,127);
  302. }
  303. else {
  304. switch (ch8) {
  305. case 0:
  306. if (pressed) cursorTrack.getMute().toggle();
  307. break;
  308. case 1:
  309. if (pressed) cursorTrack.getSolo().toggle();
  310. break;
  311. case 2:
  312. if (pressed) cursorTrack.getArm().toggle();
  313. break;
  314. case 3:
  315. if (pressed) cursorTrack.stop();
  316. break;
  317. case 4:
  318. if (pressed) cursorTrack.returnToArrangement();
  319. break;
  320. default:
  321. userControls.getControl(_but_bot+ch8).set(value,128);
  322. break;
  323. }
  324. }
  325. break;
  326.  
  327. case _b9:
  328. if (pressed) application.nextPerspective();
  329. break;
  330.  
  331. case _xfade:
  332. userControls.getControl(_xfade).set(value,128);
  333. break;
  334.  
  335. case _c1:
  336. c1_is_pressed = pressed;
  337. break;
  338.  
  339. case _c2:
  340. c2_is_pressed = pressed;
  341. break;
  342.  
  343. case _c3:
  344. c3_is_pressed = pressed;
  345. break;
  346.  
  347. case _sliders:
  348. tracks.getTrack(ch8).getVolume().set(value,128);
  349. break;
  350.  
  351. case _slider9:
  352. master.getVolume().set(value,128);
  353. break;
  354.  
  355. case _vlink:
  356. if (value>=64) primaryDevice.switchToPreviousPreset();
  357. else primaryDevice.switchToNextPreset();
  358. break;
  359.  
  360. case _v1:
  361. userControls.getControl(_v1).set(value,128);
  362. break;
  363.  
  364. case _v2:
  365. userControls.getControl(_v2).set(value,128);
  366. break;
  367.  
  368. case _v3:
  369. userControls.getControl(_v3).set(value,128);
  370. break;
  371.  
  372. case _v4:
  373. userControls.getControl(_v4).set(value,128);
  374. break;
  375.  
  376. case _rewind:
  377. if (pressed) transport.rewind();
  378. break;
  379.  
  380. case _stop:
  381. if (pressed) transport.stop();
  382. break;
  383.  
  384. case _play:
  385. if (pressed) transport.play();
  386. break;
  387.  
  388. case _record:
  389. if (pressed) transport.record();
  390. break;
  391.  
  392. default:
  393. break;
  394.  
  395. }
  396. } // isChannelController
  397. }
  398.  
  399. //----------------------------------------------------------------------
  400. // onSysex
  401. //----------------------------------------------------------------------
  402.  
  403. function onSysex_0(data) {
  404. }
  405.  
  406. //----------
  407.  
  408. function onSysex_1(data) {
  409. }
  410.  
  411. //----------
  412.  
  413. function onSysex_2(data) {
  414. }
  415.  
  416. //----------------------------------------------------------------------
  417.  
  418. // http://www.famkruithof.net/uuid/uuidgen
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement