diff --git a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiDevices.kt b/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiDevices.kt index 266710c1..fee94f0a 100644 --- a/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiDevices.kt +++ b/orx-jvm/orx-midi/src/demo/kotlin/DemoMidiDevices.kt @@ -1,16 +1,15 @@ import org.openrndr.application +import org.openrndr.extra.midi.MidiConsole import org.openrndr.extra.midi.MidiDeviceDescription import org.openrndr.extra.midi.MidiTransceiver -import org.openrndr.extra.midi.bindMidiControl -import org.openrndr.extra.parameters.DoubleParameter fun main() { application { program { - //MidiDeviceDescription.list().forEach { println(it.toString()) } - val midi = MidiTransceiver.fromDeviceVendor(this,"MIDI2x2 [hw:3,0,0]", "ALSA (http://www.alsa-project.org)") - midi.controlChanged.listen { - println(it) + MidiDeviceDescription.list().forEach { println(it.toString()) } + val midi = MidiTransceiver.fromDeviceVendor(this,"Launchpad [hw:4,0,0]", "ALSA (http://www.alsa-project.org)") + extend(MidiConsole()) { + register(midi) } } } diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt new file mode 100644 index 00000000..d4bba268 --- /dev/null +++ b/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt @@ -0,0 +1,61 @@ +package org.openrndr.extra.midi + +import org.openrndr.Extension +import org.openrndr.Program +import org.openrndr.color.ColorRGBa +import org.openrndr.draw.Drawer +import org.openrndr.draw.loadFont +import org.openrndr.math.Vector2 +import org.openrndr.shape.Rectangle +import java.io.File + +class MidiConsole: Extension { + override var enabled = true + + var box = Rectangle(0.0, 0.0, 130.0, 200.0) + val messages = mutableListOf() + var historySize = 2 + + val demoFont = File("demo-data/fonts/IBMPlexMono-Regular.ttf").exists() + + fun register(transceiver: MidiTransceiver) { + transceiver.controlChanged.listen { + synchronized(messages) { + messages.add("CC ${it.control}: ${it.value}") + if (messages.size > historySize) { + messages.removeAt(0) + } + } + } + transceiver.noteOn.listen { + synchronized(messages) { + messages.add("NOTE ON ${it.note}: ${it.velocity}") + if (messages.size > historySize) { + messages.removeAt(0) + } + } + } + + transceiver.noteOff.listen { + synchronized(messages) { + messages.add("NOTE OFF ${it.note}") + if (messages.size > historySize) { + messages.removeAt(0) + } + } + } + } + + override fun afterDraw(drawer: Drawer, program: Program) { + drawer.defaults() + box = Rectangle(drawer.width - box.width, 0.0, box.width, drawer.height*1.0) + val positions = List(messages.size) { index -> + Vector2(box.x, box.y + index * 16.0 + 16.0) + } + if (demoFont) { + drawer.fontMap = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 16.0) + } + drawer.fill = ColorRGBa.WHITE + drawer.texts(messages, positions) + } +} \ No newline at end of file diff --git a/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt b/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt index f3bf85db..81ac1716 100644 --- a/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt +++ b/orx-jvm/orx-midi/src/main/kotlin/MidiTransceiver.kt @@ -124,14 +124,27 @@ class MidiTransceiver(program: Program, val receiverDevice: MidiDevice?, val tra override fun send(message: MidiMessage, timeStamp: Long) { val cmd = message.message val channel = (cmd[0].toInt() and 0xff) and 0x0f + val velocity = cmd[2].toInt() and 0xff when ((cmd[0].toInt() and 0xff) and 0xf0) { - ShortMessage.NOTE_ON -> noteOn.trigger( - MidiEvent.noteOn( - channel, - cmd[1].toInt() and 0xff, - cmd[2].toInt() and 0xff + + + + ShortMessage.NOTE_ON -> if (velocity > 0) { + noteOn.trigger( + MidiEvent.noteOn( + channel, + cmd[1].toInt() and 0xff, + velocity + ) ) - ) + } else { + noteOff.trigger( + MidiEvent.noteOff( + channel, + cmd[1].toInt() and 0xff + ) + ) + } ShortMessage.NOTE_OFF -> noteOff.trigger( MidiEvent.noteOff(