<div class="nanotouch">
<span class="name"></span>
<span class="duration"></span>
+ <label class="effects"><input type="checkbox">Effects</label><br>
<label class="loop"><input type="checkbox">Loop</label><br>
<input type="file" accept="audio/*" multiple>
<input class="touch-gain" type="range" min="0" max="127" value="127">
<form>
<div><label>Master</label> <input id="master-gain" type="range" min="0" max="127" value="127"></div>
- <br>
+ <fieldset>
+ <legend>Effects</legend>
<div><label>Delay</label> <input id="delay" type="range" min="0" max="5" value="0" step="0.1"></div>
<div><label>Feedback</label> <input id="feedback" type="range" min="0" max="1" value="0.8" step="0.1"></div>
<div><label>Filter</label> <input id="filter" type="range" min="0" max="5000" value="1000" step="100"></div>
+ </fieldset>
</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>
var self = this;
self.initAudio = function() {
- self.sample_buffers = Array(16);
- self.samples = Array(16);
- self.sample_start_times = Array(16);
+ self.sample_buffers = Array(NANOPAD_TOUCHS.length);
+ self.samples = Array(NANOPAD_TOUCHS.length);
+ self.sample_start_times = Array(NANOPAD_TOUCHS.length);
self.audioCtx = new window.AudioContext();
- self.touchGainNodes = Array(16);
+ self.touchGainNodes = Array(NANOPAD_TOUCHS.length);
self.masterGainNode = self.audioCtx.createGain();
- for (var i=0; i<16; i++) {
+ self.effectsGainNode = self.audioCtx.createGain();
+ for (var i=0; i<NANOPAD_TOUCHS.length; i++) {
self.touchGainNodes[i] = self.audioCtx.createGain();
self.touchGainNodes[i].connect(self.masterGainNode);
}
self.filter = self.audioCtx.createBiquadFilter();
self.filter.frequency.value = 1000;
+ self.effectsGainNode.connect(self.delay);
self.delay.connect(self.feedback);
self.feedback.connect(self.filter);
self.filter.connect(self.delay);
- self.masterGainNode.connect(self.delay);
+ self.filter.connect(self.masterGainNode);
}
self.initMIDI = function() {
self.initUI = function() {
var $nanopad = $('#nanopad');
var $nanotouch = $('.nanotouch');
- for (var i=0; i<16; i++) {
+ for (var i=0; i<NANOPAD_TOUCHS.length; i++) {
var $new_touch = $nanotouch.clone();
$new_touch.attr('data-touch', i);
$new_touch.appendTo($nanopad);
}
});
+ $('.effects input').on('change', function() {
+ var effects = $(this).prop('checked');
+ var i = parseInt($(this).parents('.nanotouch').data('touch'));
+ if (effects) {
+ self.touchGainNodes[i].connect(self.effectsGainNode);
+ } else {
+ self.touchGainNodes[i].disconnect(self.effectsGainNode);
+ }
+ });
+
$('#master-gain').on('change', function() {
var fraction = parseInt(this.value) / parseInt(127);
self.masterGainNode.gain.value = fraction * fraction;
});
self.time_interval_id = setInterval(function() {
- for (var i=0; i<16; i++) {
+ for (var i=0; i<NANOPAD_TOUCHS.length; i++) {
var sample = self.samples[i];
if (sample !== undefined) {
var start_time = self.sample_start_times[i];