From 9cc2209fc797d76fcef370a1fe2b32aac7407650 Mon Sep 17 00:00:00 2001 From: Byron Date: Sat, 20 Jun 2020 00:52:07 +0300 Subject: [PATCH] [orx-midi] program change support (#128) --- orx-midi/README.md | 5 +++++ orx-midi/src/main/kotlin/MidiEvent.kt | 13 +++++++++++-- orx-midi/src/main/kotlin/MidiTransceiver.kt | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/orx-midi/README.md b/orx-midi/README.md index eabbf850..54a69b10 100644 --- a/orx-midi/README.md +++ b/orx-midi/README.md @@ -18,6 +18,11 @@ val dev = MidiTransceiver.fromDeviceVendor("BCR2000 [hw:2,0,0]", "ALSA (http://w dev.controlChanged.listen { println("${it.channel} ${it.control} ${it.value}") } + +// or program changes +dev.programChange.listen { + println("${it.channel} ${it.program}") +} ``` ## Further reading diff --git a/orx-midi/src/main/kotlin/MidiEvent.kt b/orx-midi/src/main/kotlin/MidiEvent.kt index ba14f5a3..aa0651e4 100644 --- a/orx-midi/src/main/kotlin/MidiEvent.kt +++ b/orx-midi/src/main/kotlin/MidiEvent.kt @@ -3,12 +3,14 @@ package org.openrndr.extra.midi enum class MidiEventType { NOTE_ON, NOTE_OFF, - CONTROL_CHANGED + CONTROL_CHANGED, + PROGRAM_CHANGE } class MidiEvent(val eventType: MidiEventType) { var origin = Origin.DEVICE var control: Int = 0 + var program: Int = 0 var note: Int = 0 var channel: Int = 0 var value: Int = 0 @@ -42,9 +44,16 @@ class MidiEvent(val eventType: MidiEventType) { midiEvent.value = value return midiEvent } + + fun programChange(channel:Int, program: Int): MidiEvent { + val midiEvent = MidiEvent(MidiEventType.PROGRAM_CHANGE) + midiEvent.channel = channel + midiEvent.program = program + return midiEvent + } } override fun toString(): String { - return "MidiEvent(eventType=$eventType, origin=$origin, control=$control, note=$note, channel=$channel, value=$value, velocity=$velocity)" + return "MidiEvent(eventType=$eventType, origin=$origin, program=$program, control=$control, note=$note, channel=$channel, value=$value, velocity=$velocity)" } } \ No newline at end of file diff --git a/orx-midi/src/main/kotlin/MidiTransceiver.kt b/orx-midi/src/main/kotlin/MidiTransceiver.kt index 89b808bf..bcac7a80 100644 --- a/orx-midi/src/main/kotlin/MidiTransceiver.kt +++ b/orx-midi/src/main/kotlin/MidiTransceiver.kt @@ -101,6 +101,7 @@ class MidiTransceiver(val receiverDevice: MidiDevice, val transmitterDevicer: Mi ShortMessage.NOTE_ON -> noteOn.trigger(MidiEvent.noteOn(channel, cmd[1].toInt() and 0xff, cmd[2].toInt() and 0xff)) ShortMessage.NOTE_OFF -> noteOff.trigger(MidiEvent.noteOff(channel, cmd[1].toInt() and 0xff)) ShortMessage.CONTROL_CHANGE -> controlChanged.trigger(MidiEvent.controlChange(channel,cmd[1].toInt() and 0xff, cmd[2].toInt() and 0xff)) + ShortMessage.PROGRAM_CHANGE -> programChanged.trigger(MidiEvent.programChange(channel,cmd[1].toInt() and 0xff)) } } override fun close() { @@ -116,6 +117,7 @@ class MidiTransceiver(val receiverDevice: MidiDevice, val transmitterDevicer: Mi } val controlChanged = Event("midi-transceiver::controller-changed").signature(MidiEvent::class.java) + val programChanged = Event("midi-transceiver::program-changed").signature(MidiEvent::class.java) val noteOn = Event("midi-transceiver::note-on").signature(MidiEvent::class.java) val noteOff = Event("midi-transceiver::note-off").signature(MidiEvent::class.java) @@ -131,6 +133,18 @@ class MidiTransceiver(val receiverDevice: MidiDevice, val transmitterDevicer: Mi } } + fun programChange(channel: Int, program: Int) { + try { + val msg = ShortMessage(ShortMessage.PROGRAM_CHANGE, channel, program) + if (receiverDevice != null) { + val tc = receiverDevice!!.microsecondPosition + receiver.send(msg, tc) + } + } catch (e: InvalidMidiDataException) { + // + } + } + fun noteOn(channel: Int, key: Int, velocity: Int) { try { val msg = ShortMessage(ShortMessage.NOTE_ON, channel, key, velocity)