import keys from './lib/keys' import color from './lib/color' import kalimba from './lib/kalimba' import { browser, requestAudioContext } 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 add_on = 0 const mul_on = 1.0 const add_off = 0.1 const mul_off = 0.9 let dragging = false let lastFreq = 0 let notes = [] requestAudioContext( () => { for (var i = 0; i < ws; i++) { notes[i] = [] for (var j = 0; j < hs; j++) { notes[i][j] = add(i, j) } } }) function add (x, y) { const i = x + 1 const j = y + 1 const div = document.createElement('div') const freq = root * i/j let add = 0 let frac = Math.log2(i/j) % 1 div.style.left = (x * s) + 'px' div.style.top = (y * s) + 'px' div.innerHTML = `
${i}<\/div>
\/
${j}<\/div>` if (frac < 0) { frac += 1 } if (i < j) { add = -Math.log(j/i) / 3.5 } else { add = Math.log(i/j) / 6 } if ( frac === 0) { div.style.fontWeight = '900' div.style.left = (x * s) + 'px' div.style.top = (y * s) + 'px' } div.style.backgroundColor = color(frac, add_off + add, mul_off) if (browser.isDesktop) { div.addEventListener('mousedown', function(){ div.style.backgroundColor = color(frac, add + add_on, mul_on) kalimba.play( freq ) }) div.addEventListener('mouseenter', function(){ div.style.backgroundColor = color(frac, add + add_on, mul_on) if (dragging) { kalimba.play( freq ) } }) div.addEventListener('mouseleave', function(){ div.style.backgroundColor = color(frac, add + add_off, mul_off) }) } else { div.addEventListener('touchstart', function(e){ e.preventDefault() kalimba.play( freq ) lastFreq = freq }) } document.body.appendChild(div) return freq } if (browser.isDesktop) { document.addEventListener('mousedown', () => { dragging = true }) document.addEventListener('mouseup', () => { dragging = false }) } else { document.addEventListener('touchstart', (e) => { e.preventDefault(); dragging = true }) document.addEventListener('touchmove', (e) => { e.preventDefault() const x = Math.floor( e.touches[0].pageX / s ) const y = Math.floor( e.touches[0].pageY / s ) if (! (x in notes) || ! (y in notes[x])) return const freq = notes[x][y] if (freq !== lastFreq) { kalimba.play( freq ) lastFreq = freq } }) document.addEventListener('touchend', () => { dragging = false }) } keys.listen(function(index){ // const freq = scales.current().index(index) // document.body.style.backgroundColor = color( index / scales.current().scale.length ) // kalimba.play(freq) })