Hi zynthian ctrldev driver lovers! ![]()
I have a working implementation of Real-Time MIDI processors for ctrldev drivers. I’m proud of introducing “midiproc” for zynthian ctrldev drivers.
It works in a very simple way and you can use any “jackd client” as a MIDI processor for your drivers. I’ve prepared 2 very simple examples using mididings:
- First, a simple generic driver chorder. You can load it for any MIDI device:
import mididings
from zyngine.ctrldev.zynthian_ctrldev_base import zynthian_ctrldev_base
# ------------------------------------------------------------------------------------------------------------------
# Generic Basic Chorder with mididings
# ------------------------------------------------------------------------------------------------------------------
class zynthian_ctrldev_generic_chorder(zynthian_ctrldev_base):
dev_ids = ["*"]
driver_description = "Basic chorder example using mididings for RT midi processing"
unroute_from_chains = False
autoload_flag = False
# The midiproc task itself. It runs in a spawned process.
def midiproc_task(self):
self.midiproc_task_reset_signal_handlers()
mididings.config(
backend='jack-rt',
client_name=self.midiproc_jackname,
in_ports=1,
out_ports=1
)
mididings.run(
mididings.Pass() // mididings.Transpose(4) // mididings.Transpose(7) // mididings.Transpose(11)
)
- A slighty more elaborated driver for the launchpad mini MK3. It’s also a simple chorder with some LED feedback:
import mididings
from zyncoder.zyncore import lib_zyncore
from zyngine.ctrldev.zynthian_ctrldev_base import zynthian_ctrldev_base
PLAYING_COLOUR = 21
# ------------------------------------------------------------------------------------------------------------------
# Basic Chorder for Novation Launchpad Mini MK3
# ------------------------------------------------------------------------------------------------------------------
class zynthian_ctrldev_launchpad_mini_mk3_chorder(zynthian_ctrldev_base):
dev_ids = ["Launchpad Mini MK3 IN 2"]
driver_description = "Basic chorder example using mididings for RT midi processing"
unroute_from_chains = False
autoload_flag = False
# The midiproc task itself. It runs in a spawned process.
def midiproc_task(self):
self.midiproc_task_reset_signal_handlers()
mididings.config(
backend='jack-rt',
client_name=self.midiproc_jackname,
in_ports=1,
out_ports=1
)
mididings.run(
mididings.Pass() // mididings.Transpose(4) // mididings.Transpose(7)
)
def midi_event(self, ev):
evtype = (ev[0] >> 4) & 0x0F
# Note ON
if evtype == 0x9:
note = ev[1] & 0x7F
vel = ev[2] & 0x7F
if vel > 0:
lib_zyncore.dev_send_note_on(self.idev_out, 0, note, PLAYING_COLOUR)
else:
lib_zyncore.dev_send_note_on(self.idev_out, 0, note, 0)
return True
# Note OFF
elif evtype == 0x8:
note = ev[1] & 0x7F
lib_zyncore.dev_send_note_on(self.idev_out, 0, note, 0)
return True
Both examples are included in Vangelis branch.
I will try to add more complex examples, showing how to communicate between the UI python side and the RT process (midiproc).
Enjoy the coding!