Driver for Ableton Push 1 - First Steps

Hi zynthian ctrldev driver lovers! :grin:

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!

11 Likes