diff options
Diffstat (limited to 'client/index.js')
| -rw-r--r-- | client/index.js | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/client/index.js b/client/index.js new file mode 100644 index 0000000..f9a4902 --- /dev/null +++ b/client/index.js @@ -0,0 +1,68 @@ +import Tone from 'tone' +import WebMidi from 'webmidi' +import 'nexusui' +import keys from './lib/keys' +import kalimba from './lib/kalimba' +import scales from './lib/scales' +import { mod, browser, requestAudioContext, ftom, mtof, tap } from './lib/util' + +import * as data from './data' + +const nx = window.nx + +let midi + +WebMidi.enable(midi_ready) + +function midi_ready(err) { + if (err) { + console.error('webmidi failed to initialize') + return + } + if (!WebMidi.outputs.length) { + console.error('no MIDI output found') + } + console.log(WebMidi.inputs) + console.log(WebMidi.outputs) + midi = WebMidi.outputs[0] +} + +function play(index){ + const freq = scales.current().index(index) + let midi_note = ftom(freq) + let cents = midi_note % 1 + if (cents > 0.5) { + midi_note += 1 + cents -= 1 + } + cents *= 2 + midi_note = Math.floor(midi_note) + // console.log(freq, midi_note, cents.foFixed(1)) + if (midi) { + midi.playNote(Tone.Frequency(Math.floor(midi_note), "midi").toNote(), "all", { duration: 90000 / Tone.Transport.bpm.value }) + // cents + midi.sendPitchBend(cents, "all") + } else { + kalimba.play(freq) + } +} +nx.onload = () => requestAudioContext(ready) + +function ready () { + nx.widgets.scale.choices = scales.names() + nx.widgets.scale.init() + nx.widgets.scale.on('*', e => scales.pick(e.value)) + + // nx.widgets.shiftUp.on('*', tap(shiftUp)) + + nx.colorize('#f4d142') + + Tone.Transport.bpm.value = 108 + nx.widgets.tempo.min = 10 + nx.widgets.tempo.max = 1000 + nx.widgets.tempo.set({ value: 108 }) + nx.widgets.tempo.on('*', () => Tone.Transport.bpm.value = nx.widgets.tempo.val.value ) + Tone.Transport.start() +} + +keys.listen(play) |
