sketch
by mohayonao
HTML
<script src="http://mohayonao.github.io/neume.js/build/neume.min.js"></script>
<button id="start">start</button>
<h4>amp</h4><pre id="amp"></pre>
<h4>degrade</h4><pre id="degrade"></pre>
<h4>reverb</h4><pre id="reverb"></pre>
JavaScript
var score = [[4,9],0,0,0,0,0,[1],0,0,0,[5],0,0,[4,8,11],0,0,0,[1],0,0,[4,9],[0],0,0,[1],0,[4,6,8,11],0,0,0,0,[5,7,9,12]];
var pt2map = [ 71, 67, 0, 65, 64, 62, 60, 59, 57, 55, 0, 52, 50 ];
var p = {};
p.amp = new Float32Array(13);
p.degrade = 1;
p.reverb = 0.8;
function makeReverbBuffer(data, spec) {
var amp = 1;
for (var i = 0; i < data.length; i++) {
data[i] = Math.random() * 2 - 1;
data[i] *= amp;
data[i] *= i < spec.room ? 1 : 0.05;
amp *= spec.coef;
}
return data;
}
var reverb = new Float32Array(65536);
makeReverbBuffer(reverb, { coef: 0.99999, room: 128 });
var Neume = neume(new AudioContext());
var Synth = new Neume(function($, i) {
var out;
out = $("sin", { freq: mtof(pt2map[i]) });
out = $(p.amp, { key: i, interval: 14, timeConstant: 13 }, out);
out = $("asr", {
a: 4.78, s: 0.4, r: 46.4
}, out).release("+12").on("end", function(e) {
this.stop(e.playbackTime);
});
return $("out", { bus: 1 }, out);
});
var Efx = new Neume(function($, reverb) {
var out;
out = $("in", 1);
out = $("comp", out);
out = $(degrator(), out);
out = $("conv", {
buf: reverb, mix: $(p, {
key: "reverb", interval: 14, timeConstant: 13
})
}, out);
out = $("*", 2, out);
return out;
});
function degrator() {
var context = Neume.context;
var scp = context.createScriptProcessor(8192, 1, 1);
var x = 1;
var v = 0;
scp.onaudioprocess = function(e) {
var inp = e.inputBuffer.getChannelData(0);
var out = e.outputBuffer.getChannelData(0);
if (p.degrade === 1) {
out.set(inp);
} else {
for (var i = 0; i < 8192; ++i) {
if (x >= 1) {
x -= 1;
v = inp[i];
}
x += p.degrade;
out[i] = v;
}
}
};
...