sketch

by mohayonao

HTML

<script src="http://mohayonao.github.io/neume.js/build/neume.min.js"></script>
<button id="start">start</button>
<div style="margin-top:25px">
間引いた
<img src="https://dchtm6r471mui.cloudfront.net/hackpad.com_nQh1kQoCssB_p.254153_1414717474999_midi.png" style="width:100%" />
</div>

JavaScript

// パラメータを変えたら ↑ の [Run] が必要です
var PATTERN = 1;    // 1 or 2
var BPM     = 120;  // テンポ
var ROOT    = 528;  // C の周波数
var attackTime   = 4.78; // sec
var sustainLevel = 0.3;  // 
var releaseTime  = 46.4; // sec
var gateOffTime  = 12;   // sec (発音12秒後にreleaseする)
var volume       = 0.25; // vol1-13 的な音量


// 楽譜データ
var scale = [ 1, 16/15, 9/8, 6/5, 5/4, 4/3, 45/32, 3/2, 8/5, 5/3, 9/5, 15/8 ];

var Score = [];

Score[0] = null;

Score[1] = {
    name: "PT1",
    score: [
      [9,10],[4,748],[0,1442],[1,1533],[5,1234],[4,0],[11,4],[8,1427],[1,1293],[9,5],[4,317],[0,1110],[1,802],[8,2],[4,5],[6,2],[11,2047],[9,6],[12,981]
    ],
    freqs: toFrequencies([71,67,0,65,64,62,60,59,57,55,0,52,50], scale)
};

Score[2] = {
    name: "PT2",
    score: [
      [0,1788],[2,3106],[4,2],[6,1552],[7,1],[9,2],[1,1018],[4,11],[8,1],[10,1157]
    ],
    freqs: toFrequencies([71,69,66,65,64,62,60,59,57,55,53,52,48], scale)
};

function toFrequencies(list, scale) {
  return list.map(function(midi) {
    return ROOT * scale[midi % 12] * Math.pow(2, Math.floor(midi / 12) - 6);
  });
}

function midiratio(midi) {
    return Math.pow(2, midi / 12);
}

// プログラム
var Neume = neume(new AudioContext());

var Synth = new Neume(function($, freq) {
    var out;
    
    out = $("sin", { freq: freq });
    out = $("asr", {
        a: attackTime, s: sustainLevel * volume, r: releaseTime
    }, out).release("+" + gateOffTime).on("end", function(e) {
        this.stop(e.playbackTime);
    });
    
    return out;
});

var timer = null;

function synthProcess(index) {
    var data = Score[PATTERN];
    if (!data) return;
    
    var score = data.score;
    
    index %= score.length;
    
    var noteId = score[index][0];
    var nextDur = score[index][1] * (120/BPM) * (2/480);
    
    new Synth(data.freqs[noteId]).on("end", function(e) {
        this.stop(e.playbackTime);
    }).start();
    
    console.log(noteId);
    
    timer = new Neume.Timeout(nextDur, function() {
        synthProcess(index...