summaryrefslogtreecommitdiff
path: root/client/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/index.js')
-rw-r--r--client/index.js68
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)