add per-touch gain nodes
authorFrédéric Péters <fpeters@0d.be>
Tue, 21 Feb 2017 09:28:21 +0000 (10:28 +0100)
committerFrédéric Péters <fpeters@0d.be>
Tue, 21 Feb 2017 09:28:21 +0000 (10:28 +0100)
index.html
nanofun.js

index a48ff02..2f6e87b 100644 (file)
   <div id="msg"></div>
   <div id="midiinputs"></div>
   <div id="midioutputs"></div>
-  <form><input id="gain" type="range" min="0" max="127" value="127"></form>
+  <form>
+    <input class="touch-gain" data-touch="0" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="1" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="2" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="3" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="4" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="5" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="6" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="7" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="8" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="9" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="10" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="11" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="12" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="13" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="14" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="15" type="range" min="0" max="127" value="127">
+    <input class="touch-gain" data-touch="16" type="range" min="0" max="127" value="127">
+    <br><input id="master-gain" type="range" min="0" max="127" value="127">
+  </form>
   <div id="gitclone">Source code at <a href="https://git.0d.be/?p=nanofun.git">https://git.0d.be/?p=nanofun.git</a></div>
  </body>
 </html>
index 5794cbe..9cf7773 100644 (file)
@@ -296,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() {
@@ -335,9 +340,10 @@ var nanofun = function() {
     }
 
     midi.onControlChange = function(port, data, control, value) {
-      if (control == 7) {
-        $('#gain').val(value).trigger('change');
-      }
+      if (control > 7 && control < 16) return; /* range between sliders and pots */
+      if (control > 23) return; /* after pots */
+      if (control >= 16) { control -= 8; }
+      $('.touch-gain[data-touch=' + control + ']').val(value).trigger('change');
     }
 
     $(document).keypress(function(ev) {
@@ -347,9 +353,15 @@ var nanofun = function() {
       }
     });
 
-    $('#gain').on('change', function() {
+    $('#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);
-      self.gainNode.gain.value = fraction * fraction;
+      var touchIdx = parseInt($(this).data('touch'));
+      self.touchGainNodes[touchIdx].gain.value = fraction * fraction;
     });
   }
 
@@ -362,6 +374,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);