/** * Kalimba * @module lib/kalimba.js; */ import Tone from "tone"; import { choice } from "./util"; const player_count = 4; const samples = [ { root: 219.5, fn: "samples/380737__cabled-mess__sansula-01-a-raw.wav" }, { root: 260.9, fn: "samples/380736__cabled-mess__sansula-02-c-raw.wav" }, { root: 330.2, fn: "samples/380735__cabled-mess__sansula-03-e-raw.wav" }, // { root: 440.9, fn: "samples/380733__cabled-mess__sansula-06-a-02-raw.wav" }, // { root: 507, fn: 'samples/380734__cabled-mess__sansula-07-b-h-raw.wav', }, // { root: 535, fn: 'samples/380731__cabled-mess__sansula-08-c-raw.wav', }, // { root: 671, fn: 'samples/380732__cabled-mess__sansula-09-e-raw.wav', }, ]; function load({ output }) { samples.forEach((sample) => { sample.players = []; sample.index = -1; for (let i = 0; i < player_count; i++) { let fn = sample.fn; if (window.location.href.match(/asdf.us/)) { fn = "//asdf.us/kalimba/" + fn.replace("wav", "mp3"); } let player = new Tone.Player({ url: fn, retrigger: true, playbackRate: 1, }); player.name = fn; const gain = new Tone.Gain(1.6); player.connect(gain); gain.connect(output); sample.players.push(player); } }); console.log( "+ Voices:", samples.reduce((count, sample) => count + sample.players.length, 0), ); } function play(interval, root) { const sample = choice(samples); sample.index = (sample.index + 1) % sample.players.length; const player = sample.players[sample.index]; player.playbackRate = (interval * root) / sample.root; player.start(); } function pause() { // no-op } export default { load, play, pause }; // for help tuning the kalimba samples // function keydown(e) { // // console.log(e.keyCode) // if (e.metaKey && last) { // let step = e.shiftKey ? (e.ctrlKey ? 0.01 : 0.1) : 1; // switch (e.keyCode) { // case 38: // up // e.preventDefault(); // samples[0].root -= step; // play(last); // break; // case 40: // down // e.preventDefault(); // samples[0].root += step; // play(last); // break; // } // console.log(samples[0].root); // } // } // window.addEventListener("keydown", keydown, true);