import Tone from 'tone' import { lerp, choice } from './util' import output from './output' const player_count = 2 const filter_count = 3 const notes = [299, 336, 374, 399, 449, 498, 561, 598].map(i => i/2) const reverb = new Tone.Freeverb({ roomSize: 0.2, dampening: 12000, }).connect(output) 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.filters = [] sample.crossfaders = [] 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/glass/' + fn.replace('wav','mp3') } let player = new Tone.Player({ url: fn, retrigger: true, playbackRate: 1, }) let crossFade = new Tone.CrossFade(0.5) sample.crossfaders.push(crossFade) let wet = new Tone.Gain(1) player.connect(crossFade, 0, 0) wet.connect(crossFade, 0, 1) crossFade.connect(output) let filter, note let filters = sample.filters = [] for (let j = 0; j < filter_count; j++) { note = choice(notes) filter = new Tone.Filter({ frequency: filter_count * j * note, Q: 5 * (filter_count-j) + 20, }) player.connect(filter) filter.connect(wet) filters.push(filter) } // player.connect(reverb) sample.players.push(player) sample.filters.push(filters) } }) } play(freq, time) { const best = { sample: choice(this.samples) } best.sample.index = (best.sample.index + 1) % player_count const player = best.sample.players[ best.sample.index ] const crossfader = best.sample.crossfaders[ best.sample.index ] freq = freq || best.sample.root time = time || Tone.now() player.playbackRate = freq / best.sample.root if (player.loaded) { player.start(time) } else { console.log('loading') } crossfader.fade.value = lerp(x_pos, 0.0, 1.0) return player } } let x_pos = 0.5 document.body.addEventListener('mousemove', (e) => { x_pos = (e.pageX / window.innerWidth) })