function compose(e) { const token = tokens.shift(); if (!token) { return process.exit(); } const playbackTime = e.playbackTime; switch (token.type) { case "punctuator": sched.insert(playbackTime, hihat, { token }); break; case "keyword": sched.insert(playbackTime, chord, { token }); break; case "number": case "string": sched.insert(playbackTime, beep, { token }); break; default: sched.insert(playbackTime, synth, { token }); break; } sched.insert(playbackTime + beat, compose); }
function compose(e) { const token = tokens.shift(); if (!token) { return process.exit(); } const t0 = e.playbackTime; const index = e.args.index; // kick if (index % 4 === 0) { sched.insert(t0, shot, { inst: 0, amp: 0.4, dur: 1 }); } else { if (token.type === "keyword") { const amp = token.type === "identifier" ? 0.25 : 0.125; sched.insert(t0, shot, { inst: 0, amp: amp, dur: 0.25 }); } } // snare if (token.type !== "punctuator") { if (index % 8 === 4) { sched.insert(t0, shot, { inst: 1, amp: 0.75, dur: 1 }); } else if (token.type === "keyword" || token.type === "identifier") { const amp = Math.min(token.value.length / 32, 0.5); const dur = token.type === "identifier" ? 0.25 : 0.5; sched.insert(t0, shot, { inst: 1, amp: amp, dur: dur }); } } // hihat if (token.type === "keyword" || token.type === "identifier") { if (index % 4 === 2) { const dur = token.type === "keyword" ? 0.75 : 0.5; sched.insert(t0, shot, { inst: 2, amp: 0.325, dur: dur }); } else { sched.insert(t0, shot, { inst: 2, amp: 0.25, dur: 0.1 }); } } else if (token.type === "number" || token.type === "string") { const amp = Math.min(token.value.length / 12, 0.5); sched.insert(t0, shot, { inst: 2, amp: amp, dur: 1 }); } else { const amp = wrapAt([ 0.125, 0.05, 0.1, 0.075 ], index); sched.insert(t0, shot, { inst: 2, amp: amp, dur: 0.1 }); } sched.insert(t0 + beat, compose, { index: e.args.index + 1 }); }
function compose(e) { const t0 = e.playbackTime; const token = tokens.shift(); if (token) { const index = e.args.index; // kick if (index % 4 === 0) { sched.insert(t0, shot, { inst: 0, amp: 0.4, dur: 1 }); } else { if (/\d/.test(token)) { const amp = /[02468]/.test(token) ? 0.25 : 0.125; sched.insert(t0, shot, { inst: 0, amp: amp, dur: 0.25 }); } } // snare if (/\w/.test(token.test)) { if (index % 8 === 4) { sched.insert(t0, shot, { inst: 1, amp: 0.75, dur: 1 }); } else if (/[A-Z]/.test(token)) { const amp = 0.25; const dur = /AEIOU/.test(token) ? 0.25 : 0.5; sched.insert(t0, shot, { inst: 1, amp: amp, dur: dur }); } } // hihat if (/\w/.test(token)) { if (index % 4 === 2) { const dur = /[a-zA-Z]/.test(token) ? 0.75 : 0.5; sched.insert(t0, shot, { inst: 2, amp: 0.325, dur: dur }); } else { sched.insert(t0, shot, { inst: 2, amp: 0.25, dur: 0.1 }); } } else if (/\d/.test(token)) { const amp = +token / 10; sched.insert(t0, shot, { inst: 2, amp: amp, dur: 1 }); } else { const amp = wrapAt([ 0.125, 0.05, 0.1, 0.075 ], index); sched.insert(t0, shot, { inst: 2, amp: amp, dur: 0.1 }); } sched.insert(t0 + beat, compose, { index: e.args.index + 1 }); } }