/sequencer/index.js

https://github.com/possan/nodesequencer · JavaScript · 337 lines · 292 code · 36 blank · 9 comment · 38 complexity · 57415e3e38da5cf22e3a30f91770b676 MD5 · raw file

  1. $(document).ready(function() {
  2. console.log('connecting...');
  3. console.log(location);
  4. var socket = io.connect('http://' + location.host);
  5. socket.on('step', function(data) {
  6. var s = Math.floor(data.step) % 16;
  7. $('#steplabel').html(s);
  8. });
  9. function bpm(delta) {
  10. socket.emit('bpm', {
  11. bpmdelta : delta
  12. });
  13. }
  14. console.log('wire events...');
  15. $('.clickable').each(function() {
  16. $(this).bind('mousedown', function() {
  17. socket.emit('deviceButtonDown', {
  18. button : parseInt(this.id.substring(6), 10)
  19. });
  20. });
  21. $(this).bind('mouseup', function() {
  22. socket.emit('deviceButtonUp', {
  23. button : parseInt(this.id.substring(6), 10)
  24. });
  25. });
  26. $(this).bind('click', function(event) {
  27. socket.emit('deviceButtonClick', {
  28. button : parseInt(this.id.substring(6), 10)
  29. });
  30. event.stopPropagation();
  31. });
  32. var lasttouchdown = 0;
  33. $(this).bind('touchstart', function(event) {
  34. socket.emit('deviceButtonClick', {
  35. button : parseInt(this.id.substring(6), 10)
  36. });
  37. event.stopPropagation();
  38. });
  39. $(this).bind('touchend', function(event) {
  40. event.stopPropagation();
  41. });
  42. $(this).bind('touchcancel', function(event) {
  43. event.stopPropagation();
  44. });
  45. $(document).bind('touchstart', function(event) {
  46. event.stopPropagation();
  47. });
  48. });
  49. $('.knob').each(function() {
  50. var self = this;
  51. console.log('init knob', self);
  52. var _lastv = 0;
  53. var _down = false;
  54. var _moved = false;
  55. $(self).bind('mousemove', function(event) {
  56. if (!self._down)
  57. return;
  58. event.stopPropagation();
  59. var o = $(self).offset();
  60. var h = $(self).height();
  61. var knobid = parseInt(this.id.substring(4), 10);
  62. var v = (event.pageY - (o.top)) / h;
  63. var d = v - self._lastv;
  64. if (d < -0.1) {
  65. socket.emit('deviceButtonClick', {
  66. button : 30 + 2 * knobid
  67. });
  68. self._lastv = v;
  69. } else if (d > 0.1) {
  70. socket.emit('deviceButtonClick', {
  71. button : 30 + 2 * knobid + 1
  72. });
  73. self._lastv = v;
  74. }
  75. self._moved = true;
  76. });
  77. $(self).bind('mousedown', function(event) {
  78. event.stopPropagation();
  79. var o = $(self).offset();
  80. var h = $(self).height();
  81. self._down = true;
  82. var v = (event.pageY - (o.top)) / h;
  83. self._lastv = v;
  84. self._moved = false;
  85. });
  86. $(self).bind('mouseup', function(event) {
  87. event.stopPropagation();
  88. self._down = false;
  89. if (!self._moved) {
  90. event.stopPropagation();
  91. var o = $(self).offset();
  92. var h = $(self).height();
  93. var knobid = parseInt(this.id.substring(4), 10);
  94. var v = (event.pageY - (o.top)) / h;
  95. if (v < 0.5) {
  96. socket.emit('deviceButtonClick', {
  97. button : 30 + 2 * knobid
  98. });
  99. } else if (v > 0.5) {
  100. socket.emit('deviceButtonClick', {
  101. button : 30 + 2 * knobid + 1
  102. });
  103. }
  104. }
  105. });
  106. $(self).bind('mouseout', function(event) {
  107. self._down = false;
  108. });
  109. });
  110. $(document).keydown(function(e) {
  111. console.log('keydown');
  112. console.log(e.keyCode, String.fromCharCode(e.keyCode));
  113. var fakebutton = -1;
  114. var fakeknob = -1;
  115. var fakeknobdir = 0;
  116. switch (e.keyCode) {
  117. // 49 50 51 52
  118. // 81 87 69 82
  119. // 65 83 68 70
  120. // 90 88 67 86
  121. case 49:
  122. fakebutton = 0;
  123. break;
  124. case 50:
  125. fakebutton = 1;
  126. break;
  127. case 51:
  128. fakebutton = 2;
  129. break;
  130. case 52:
  131. fakebutton = 3;
  132. break;
  133. case 81:
  134. fakebutton = 4;
  135. break;
  136. case 87:
  137. fakebutton = 5;
  138. break;
  139. case 69:
  140. fakebutton = 6;
  141. break;
  142. case 82:
  143. fakebutton = 7;
  144. break;
  145. case 65:
  146. fakebutton = 8;
  147. break;
  148. case 83:
  149. fakebutton = 9;
  150. break;
  151. case 68:
  152. fakebutton = 10;
  153. break;
  154. case 70:
  155. fakebutton = 11;
  156. break;
  157. case 90:
  158. fakebutton = 12;
  159. break;
  160. case 88:
  161. fakebutton = 13;
  162. break;
  163. case 67:
  164. fakebutton = 14;
  165. break;
  166. case 86:
  167. fakebutton = 15;
  168. break;
  169. // 54 55 56 57
  170. case 54:
  171. fakebutton = 20;
  172. break;
  173. case 55:
  174. fakebutton = 21;
  175. break;
  176. case 56:
  177. fakebutton = 22;
  178. break;
  179. case 57:
  180. fakebutton = 23;
  181. break;
  182. // 89 85 73 79
  183. // 72 74 75 76
  184. case 89:
  185. fakebutton = 30;
  186. fakeknob = 0;
  187. fakeknobdir = 1;
  188. break;
  189. case 85:
  190. fakebutton = 32;
  191. fakeknob = 1;
  192. fakeknobdir = 1;
  193. break;
  194. case 73:
  195. fakebutton = 34;
  196. fakeknob = 2;
  197. fakeknobdir = 1;
  198. break;
  199. case 79:
  200. fakebutton = 36;
  201. fakeknob = 3;
  202. fakeknobdir = 1;
  203. break;
  204. case 72:
  205. fakebutton = 31;
  206. fakeknob = 0;
  207. fakeknobdir = -1;
  208. break;
  209. case 74:
  210. fakebutton = 33;
  211. fakeknob = 1;
  212. fakeknobdir = -1;
  213. break;
  214. case 75:
  215. fakebutton = 35;
  216. fakeknob = 2;
  217. fakeknobdir = -1;
  218. break;
  219. case 76:
  220. fakebutton = 37;
  221. fakeknob = 3;
  222. fakeknobdir = -1;
  223. break;
  224. }
  225. console.log('keyboard triggered button ', fakebutton);
  226. console.log('keyboard triggered knob ', fakeknob, fakeknobdir);
  227. if (fakebutton != -1) {
  228. // event.preventDefault();
  229. socket.emit('deviceButtonClick', {
  230. button : fakebutton
  231. });
  232. } else if (fakeknob != -1) {
  233. // event.preventDefault();
  234. socket.emit('deviceKnobTurn', {
  235. knob : fakeknob,
  236. delta : fakeknobdir
  237. });
  238. }
  239. });
  240. var lcdbuffer = [];
  241. function clearLcd() {
  242. lcdbuffer = [];
  243. for ( var j = 0; j < 4; j++) {
  244. var row = [];
  245. for ( var i = 0; i < 20; i++)
  246. row.push(' ');
  247. lcdbuffer.push(row);
  248. }
  249. }
  250. function drawLcd() {
  251. var html = "";
  252. for ( var j = 0; j < 4; j++) {
  253. if (j > 0)
  254. html += "\n";
  255. for ( var i = 0; i < 20; i++) {
  256. var ch = lcdbuffer[j][i];
  257. html += ch;
  258. }
  259. }
  260. $('#lcd').html(html);
  261. }
  262. function innerAddLcd(x, y, data) {
  263. x--;
  264. y--;
  265. if (y < 0 || y > 4)
  266. return;
  267. for ( var j = 0; j < data.length; j++) {
  268. var x2 = x + j;
  269. if (x2 >= 0 && x2 < 20)
  270. lcdbuffer[y][x2] = data[j];
  271. }
  272. }
  273. function addLcd(x, y, data) {
  274. var arr = data.split('\n');
  275. for ( var j = 0; j < arr.length; j++)
  276. innerAddLcd(x, y + j, arr[j]);
  277. }
  278. clearLcd();
  279. drawLcd();
  280. socket.on('updateDevice', function(d) {
  281. if (d.type == 'led') {
  282. var el = $('#led' + d.led);
  283. if (d.on)
  284. el.addClass('on');
  285. else
  286. el.removeClass('on');
  287. } else if (d.type == 'lcd') {
  288. clearLcd();
  289. addLcd(1, 1, d.content);
  290. drawLcd();
  291. } else if (d.type == 'lcd-xy') {
  292. addLcd(d.column, d.row, d.content);
  293. drawLcd();
  294. } else if (d.type == 'lcd-clear') {
  295. clearLcd();
  296. drawLcd();
  297. } else {
  298. console.log('unhandled updateDevice-message', d);
  299. }
  300. });
  301. });