import Tone from 'tone' import Sampler from './lib/sampler' import draw from './draw' import keys from './lib/keys' import color from './lib/color' import mouse from './lib/mouse' import { Hall } from './lib/hall' import { browser, requestAudioContext, randint, randrange, choice, clamp, lerp, dist, shuffle, isMobile, } from './lib/util' const root = 440 const s = 50 const w = window.innerWidth const h = window.innerHeight const ws = w/s, hs = h/s const HALLWAY_LENGTH = 147 const SPEAKER_COUNT = 16 let notes = [299, 336, 374, 399, 449, 498, 561, 598].map(i => i/2) notes = notes.concat(notes.map(i => i/2)) notes = notes.concat(notes.map(i => i*2)) notes = shuffle(notes) let samplers = {} let sampler requestAudioContext( () => { samplers.smash = new Sampler('samples/smash/g{}.mp3', 12) // samplers.glass = new Sampler('samples/glass/0{}Particle.mp3', 20) // samplers.kalimba = new Sampler('samples/kalimba/380731__cabled-mess__sansula-08-c-raw.wav', 10) samplers.choice = (m,n) => { const r = Math.random() if (r < m) return samplers.smash if (r < m+n) return samplers.kalimba return samplers.glass } Tone.Buffer.on('load', function(){ console.log('all buffers are loaded.') redraw() }) }) const hall = new Hall ({ length: HALLWAY_LENGTH, speakers: SPEAKER_COUNT, }) function redraw(){ draw.clear() } keys.listen(index => { // trigger(Math.random(), ((index+7) % SPEAKER_COUNT) / SPEAKER_COUNT, 0, samplers.smash) const sample = samplers.smash.choice() const buf = sample.players[0]._buffer.get() if (! buf) return const pcm = buf.getChannelData(0) const sr = buf.sampleRate const duration = buf.duration console.log(buf) console.log(duration.toFixed(2) + " s.") draw.clear() draw.waveform(pcm) draw.spectrum(pcm) }) mouse.register({ down: (x, y) => { redraw() }, move: (x, y, dx, dy) => { }, up: (x, y) => { }, }) let timeout, px = 0, py = 0 function play(x, y){ } function trigger(x, y, t, sampler){ t = t || 0 t += Tone.now() sampler = sampler || last_dist > 40 ? samplers.choice(0.2, 0.2) : samplers.choice((1-y) * 0.2, y*0.02) const freq = notes[Math.floor(x * notes.length)] const speaker = hall.play(sampler, y, freq, x, t) draw.triangle( lerp(x, 0, 1) * window.innerWidth, lerp(y, 0, 1) * window.innerHeight - 20, 40 ) }