Listen to midi

This commit is contained in:
2024-06-17 21:06:39 +02:00
parent 68b7ffffa8
commit 94dec1f636
6 changed files with 160 additions and 46 deletions

View File

@@ -0,0 +1,89 @@
package nl.astraeus.vst.chip.midi
import kotlinx.browser.window
import nl.astraeus.vst.chip.audio.VstChipWorklet
import nl.astraeus.vst.chip.view.MainView
external class MIDIInput {
val connection: String
val id: String
val manufacturer: String
val name: String
val state: String
val type: String
val version: String
var onmidimessage: (dynamic) -> Unit
var onstatechange: (dynamic) -> Unit
fun open()
fun close()
}
external class MIDIOutput {
val connection: String
val id: String
val manufacturer: String
val name: String
val state: String
val type: String
val version: String
fun send(message: dynamic)
}
object Midi {
var inputs = mutableListOf<MIDIInput>()
var outputs = mutableListOf<MIDIInput>()
var currentInput: MIDIInput? = null
fun start() {
val navigator = window.navigator.asDynamic()
navigator.requestMIDIAccess().then(
{ midiAccess ->
val inp = midiAccess.inputs
val outp = midiAccess.outputs
console.log("Midi inputs:", inputs)
console.log("Midi outputs:", outputs)
inp.forEach() { input ->
console.log("Midi input:", input)
inputs.add(input)
console.log("Name: ${(input as? MIDIInput)?.name}")
}
outp.forEach() { output ->
console.log("Midi output:", output)
outputs.add(output)
}
MainView.requestUpdate()
},
{ e ->
println("Failed to get MIDI access - $e")
}
)
}
fun setInput(input: MIDIInput) {
console.log("Setting input", input)
currentInput?.close()
currentInput = input
currentInput?.onstatechange = { message ->
console.log("State change:", message)
}
currentInput?.onmidimessage = { message ->
console.log("Midi message:", message)
VstChipWorklet.postMessage(
message.data
)
}
currentInput?.open()
}
}