diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2018-03-06 13:28:12 +0100 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2018-03-06 13:28:12 +0100 |
| commit | 25fec83f6f7db468721a38adb2c84a0c0a2121f1 (patch) | |
| tree | 5ea8b40951e98639b88b0378618a9ca2f835de7a /client/index.js | |
displaying waveform and spectrogram
Diffstat (limited to 'client/index.js')
| -rw-r--r-- | client/index.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/client/index.js b/client/index.js new file mode 100644 index 0000000..b1351fc --- /dev/null +++ b/client/index.js @@ -0,0 +1,106 @@ +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 + ) +} + + + |
