Voice Additive
by Ehsan Ziya
HTML
<script src="http://stuartmemo.com/qwerty-hancock/qwerty-hancock.js"></script>
<div id='keyboard'></div>
JavaScript
var context = new webkitAudioContext();
var gain = context.createGain();
gain.gain.value = 1;
gain.connect(context.destination);
function Voice(oscType, freq, oscNumber, pitchunison, panunison, attack, release) {
var now = context.currentTime;
this.oscillators = [];
this.release = release;
var that = this;
//VOICE GAIN
var voicegain = context.createGain(); //create gain control for each voice
voicegain.connect(gain); //destination
var osc = context.createOscillator();
osc.type = oscType;
osc.connect(voicegain);
osc.frequency.value = freq;
osc.start(now);
this.oscillators.push(osc);
var moreThanOne = false; // if there is only 1 osc needed
// if more than 1 oscillator
if (oscNumber > 1) {
moreThanOne = true;
for (var i = 0; i < oscNumber - 1; i++) {
var osc = context.createOscillator();
that.oscillators.push(osc);
osc.type = oscType;
var pan1 = context.createPanner(); // pan unison for each particle
pan1.panningModel = "equalpower"; // defaults to hrtf
// random pan level selection in the specified range between -1 and 1
var panunisonval = ((Math.random() * panunison) - panunison / 2) * (panunison * 0.0001);
pan1.setPosition(panunisonval, 0, 0);
osc.frequency.value = freq;
//pitch unison random for each particle
var detuneval = (Math.random() * pitchunison) - (pitchunison / 2);
osc.detune.value = detuneval;
osc.connect(pan1);
pan1.connect(voicegain);
osc.start(now);
}
}
//linear attack section
voicegain.gain.setValueAtTime(0, now);
voicegain.gain.linearRampToValueAtTime(1 / oscNumber * 2, now + attack);
// noteOff method
this.noteOff = function () {
//release and deleting the created nodes
...