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) {}
};
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() {
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();
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) {
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);