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>
<h4>autopan</h4><pre id="autopan"></pre>

CSS

h4, pre { margin:2px }

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;
p.pan = {};
p.pan.rate = 10;
p.pan.amount = 0.8;
p.pan.randomness = 0.1;

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 = $("*", 1.25, out);
    
    return $("out", { bus: 2 }, out);
});

var AutoPan = new Neume(function($, rate, amount, randomness) {
    var out, pos;
    
    pos = $(function() {
        var sign = Math.random() < 0.5 ? -1: +1;
        return (amount * sign) + Math.random() * randomness;
    }, { timeConstant: 0.01});
    
    out = $("in", 2);
    out = $("pan2", { pos: pos }, out);
    
    $.interval(rate + "hz", pos.evaluate);
    
    return out;
});

function degrator() {
    var context = Neume.context;
    
    var scp = context.createScriptProcessor(8192, 1, 1);
    var x = 1;
    var v...