]> git.0d.be Git - nanofun.git/blobdiff - nanofun.js
dynamically create touches
[nanofun.git] / nanofun.js
index 78d250e80accad437cbd58e11f4c073a9a83d156..bb571a9350cb559b3fbfa8080e82b607a3f56552 100644 (file)
@@ -170,15 +170,20 @@ onPortStateChange: function(event) {
 onMIDIMessage: function(message) {
     var port = message.target;
     var data = message.data;
+    console.log(message);
     if (data[0] == 144) { /* touch on */
       var sample_idx = NANOPAD_TOUCHS.indexOf(data[1]);
       if (sample_idx != -1) {
         this.onTouchOn(port, data, sample_idx);
       }
     }
+    if (data[0] == 176) { /* control change */
+      this.onControlChange(port, data, data[1], data[2]);
+    }
 },
 
-onTouchOn: function(port, data, sample_idx) {}
+onTouchOn: function(port, data, sample_idx) {},
+onControlChange: function(port, data, number, value) {}
 
 };
 
@@ -291,8 +296,13 @@ var nanofun = function() {
     self.sample_buffers = Array(16);
     self.samples = Array(16);
     self.audioCtx = new window.AudioContext();
-    self.gainNode = self.audioCtx.createGain();
-    self.gainNode.connect(self.audioCtx.destination);
+    self.touchGainNodes = Array(16);
+    self.masterGainNode = self.audioCtx.createGain();
+    for (var i=0; i<16; i++) {
+      self.touchGainNodes[i] = self.audioCtx.createGain();
+      self.touchGainNodes[i].connect(self.masterGainNode);
+    }
+    self.masterGainNode.connect(self.audioCtx.destination);
   }
 
   self.initMIDI = function() {
@@ -306,8 +316,14 @@ var nanofun = function() {
 
   self.initUI = function() {
     var $nanopad = $('#nanopad');
+    var $nanotouch = $('.nanotouch');
+    for (var i=1; i<16; i++) {
+      var $new_touch = $nanotouch.clone();
+      $new_touch.attr('data-touch', i);
+      $new_touch.appendTo($nanopad);
+    }
 
-    $('.nanotouch input').on('change', function(ev) {
+    $('.nanotouch input[type=file]').on('change', function(ev) {
       var nanotouch = $(this).parent();
       var sample_idx = $nanopad.children().index(nanotouch);
       var reader = new FileReader();
@@ -329,12 +345,30 @@ var nanofun = function() {
       self.startSample(sample_idx);
     }
 
+    midi.onControlChange = function(port, data, control, value) {
+      if (control > 7 && control < 16) return; /* range between sliders and pots */
+      if (control > 23) return; /* after pots */
+      if (control >= 16) { control -= 8; }
+      $('[data-touch=' + control + '] .touch-gain').val(value).trigger('change');
+    }
+
     $(document).keypress(function(ev) {
       var sample_idx = KEYBOARD_CODES.indexOf(ev.key);
       if (sample_idx != -1) {
         self.startSample(sample_idx);
       }
     });
+
+    $('#master-gain').on('change', function() {
+      var fraction = parseInt(this.value) / parseInt(127);
+      self.masterGainNode.gain.value = fraction * fraction;
+    });
+
+    $('.touch-gain').on('change', function() {
+      var fraction = parseInt(this.value) / parseInt(127);
+      var touchIdx = parseInt($(this).parent().data('touch'));
+      self.touchGainNodes[touchIdx].gain.value = fraction * fraction;
+    });
   }
 
   self.startSample = function(sample_idx) {
@@ -346,6 +380,7 @@ var nanofun = function() {
         self.samples[sample_idx] = undefined;
       } else {
         var sample = self.audioCtx.createBufferSource();
+        var gainNode = self.touchGainNodes[sample_idx];
         self.samples[sample_idx] = sample;
         sample.loop = false;
         sample.connect(gainNode);