Files
orx/orx-jvm/orx-midi/src/main/kotlin/MidiConsole.kt
2023-04-26 10:53:11 +02:00

63 lines
1.9 KiB
Kotlin

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<String>()
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()
synchronized(messages) {
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)
}
}
}