diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2018-03-03 05:38:35 +0100 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2018-03-03 05:38:35 +0100 |
| commit | 636b62aa6d0d77e19a4b7bb3c039924eeb217a71 (patch) | |
| tree | 042fa3404738e347f8d60f419fa600aa6030c61b /client/lib/sampler.js | |
hall demo
Diffstat (limited to 'client/lib/sampler.js')
| -rw-r--r-- | client/lib/sampler.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/client/lib/sampler.js b/client/lib/sampler.js new file mode 100644 index 0000000..675178b --- /dev/null +++ b/client/lib/sampler.js @@ -0,0 +1,58 @@ +import Tone from 'tone' +import { lerp, choice } from './util' + +const player_count = 2 +const filter_count = 3 + +const crossfaders = [] + +export default class Sampler { + constructor(path, count){ + this.samples = (() => { + let s = '', a = [] + for (let i = 1; i < count; i++) { + const s = i < 10 ? '0' + i : i; + a.push({ root: 100, fn: path.replace(/{}/, s) }) + } + return a + })() + + this.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 = 'http://asdf.us/glass/' + fn.replace('wav','mp3') + } + let player = new Tone.Player({ + url: fn, + retrigger: true, + playbackRate: 1, + }) + sample.players.push(player) + } + }) + } + play(freq, time, output) { + const best = { sample: choice(this.samples) } + best.sample.index = (best.sample.index + 1) % player_count + + const player = best.sample.players[ best.sample.index ] + + freq = freq || best.sample.root + time = time || Tone.now() + + player.playbackRate = freq / best.sample.root + if (player.loaded) { + player.stop() + player.disconnect() + player.connect(output) + player.start(time) + } else { + console.log('loading') + } + + return player + } +} |
