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)