39. みんな大好きディストーション
波形をブーストしてからクリップ
var fuzz = ctx.createScriptProcessor(1024, 1, 1);
fuzz.onaudioprocess = function(event) {
var sin = event.inputBuffer.getChannelData(0);
var sout = event.outputBuffer.getChannelData(0);
var limit = 0.2;
for (var i = 0; i < sin.length; i++) {
var sig = sin[i] * 6;
// Boost
if (sig > limit) sig = limit;
// Clip
if (sig < -limit) sig = -limit;
// Clip
sout[i] = sig;
}
};
http://aikelab.net/webaudodemo/fuzz/
40. FFTでピッチチェンジャー
var pshift = function(val, indata) {
this.fft.forward(indata);
for (var i = 0; i < stream_length; i++) {
a_real[i] = 0;
a_imag[i] = 0;
}
for (var i = 0; i < stream_length; i++) {
var index = parseInt(i * val);
var eq = 1.0;
if (i > stream_length / 2) {
eq = 0;
}
if ((index >= 0) && (index < stream_length)) {
a_real[index] += fft.real[i] * eq;
a_imag[index] += fft.imag[i] * eq;
}
}
return this.fft.inverse(this.a_real, this.a_imag);
}
pitchShifter.onaudioprocess = function(event) {
var sin
= event.inputBuffer.getChannelData(0);
var sout
= event.outputBuffer.getChannelData(0);
var data = pshift(2.0, sin);
for (var i = 0; i < sin.length; i++) {
sout[i] = data[i];
}
};
DSP.js by cobanbrook
https://github.com/corbanbrook/dsp.js/
http://aikelab.net/webaudiodemo/pitch/
44. ベンダープレフィックス問題
var ctx = new webkitAudioContext();
var ctx = new AudioContext();
window.AudioContext
= window.AudioContext || window.webkitAudioContext;
var ctx = new AudioContext();
60. 簡易シーケンサーの作成 (完成版)
全部鳴らす
var drum = new Drum(ctx);
var bass = new Bass(ctx);
var synth = new Synth(ctx);
var play = function() {
var t = ctx.currentTime;
for (var i = 0; i < 128; i++) {
t += 0.1;
drum.play(i, t);
bass.play(i, t);
synth.play(i, t);
}
}
http://aikelab.net/webaudiodemo/seq7/