Listen to midi
This commit is contained in:
89
src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt
Normal file
89
src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt
Normal 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()
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user