diff options
Diffstat (limited to 'client/lib/sampler.js')
| -rw-r--r-- | client/lib/sampler.js | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/client/lib/sampler.js b/client/lib/sampler.js index c1faa7e..b392caf 100644 --- a/client/lib/sampler.js +++ b/client/lib/sampler.js @@ -1,17 +1,22 @@ import Tone from 'tone' -import { choice } from './util' +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 compressor = new Tone.Compressor(-30, 3).toMaster() const reverb = new Tone.Freeverb({ roomSize: 0.2, dampening: 12000, -}).connect(compressor) +}).connect(output) + +const crossfaders = [] export default class Sampler { constructor(path, count){ - this.samples = (()=>{ + this.samples = (() => { let s = '', a = [] for (let i = 1; i < count; i++) { const s = i < 10 ? '0' + i : i; @@ -22,6 +27,8 @@ export default class Sampler { 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 @@ -33,8 +40,32 @@ export default class Sampler { retrigger: true, playbackRate: 1, }) - player.connect(reverb) + + 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) } }) @@ -44,6 +75,7 @@ export default class Sampler { 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() @@ -54,6 +86,14 @@ export default class Sampler { } 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) +})
\ No newline at end of file |
