The hardest part

At least, for me. Now I have to code something that enables me to select banks and instruments on my synth module. I’ve settled for pyliblo to talk to ZynAddSubFX but I’m just no coder. My elbow now rests on “Learning Python” from O’Reilly, I started reading it like a year ago but never got past chapter 3 or something. Time to persist, I’ve been wanting to be able to code a little bit for years now.

As a note to self, and maybe it’s helpful for others too, what follows are some of the relevant OSC messages to change banks and instruments in ZynAddSubFX.

Changing banks can be done with /loadbank. pyliblo comes with an example script send_osc.py and loading a bank with send_osc.py works as follows:

send_osc.py 7777 /loadbank ,i 3

7777 is the port ZynAddSubFX runs on. The /loadbank message wants an integer (,i) and ,i 3 loads the fourth bank (Choir and Voice) as ZynAddSubFX starts counting from 0. Bear in mind that this will only load the bank, it won’t change the instrument that is loaded. To load an instrument from a loaded bank the following send_osc.py incantation does the trick:

send_osc.py 7777 /setprogram ,c $'\x03'

So /setprogram loads an instrument from an active bank. It takes a character (,c) as an argument because the program numbers are in hex. But hex are multiple characters so you have to add some escape sequences to make it work (and I lost it there so I could be completely wrong). The above command should load the fourth instrument from the Choir and Voice bank (Voice OOH) as that bank should have been loaded by the previous /loadbank message.

It is also possible to load instrument (.xiz) files. This can be done with the /load_xiz message:

send_osc.py 7777 /load_xiz 0 "/usr/share/zynaddsubfx/banks/Bass/0001-Bass 1.xiz"

This will load the Bass 1 instrument fom the Bass bank into part 1 (remember that ZynAddSubFX starts counting from 0). So to load the Bass 2 instrument into part 2 you’d do the following:

send_osc.py 7777 /load_xiz 1 "/usr/share/zynaddsubfx/banks/Bass/0002-Bass 2.xiz"

So now I have to incorporate this stuff into Python code that gets called when I press buttons on my LCD display. These are the mappings I’d like to accomplish:

  • Up: toggle next bank and display first instrument from that bank
  • Down: toggle previous bank and display first instrument from that bank
  • Left: toggle previous instrument and display instrument
  • Right: toggle next instrument and display instrument
  • Select: select displayed instrument

That shouldn’t be too hard right? Well, first hurdle, pyliblo can only send or dump OSC messages, it doesn’t seem to be able to handle return messages from the OSC server (ZynAddSubFX in this case). To be continued…

Edit: of course sending just messages with pyliblo won’t handle any return messages, you will need a receiving part. But maybe I should take a look at using MIDI with mididings for instance. Thanks Georg Mill for the tip!

The hardest part

JackLinx site online

De site van het JackLinx project is online gegaan: http://www.jacklinx.nl/

Dit is het project waar ik het in een eerdere blogpost al over had gehad, de educatieve muziekomgeving onder Linux die gebruik maakt o.a. JACK, mididings, QMidiRoute, QmidiNet, Qsynth en Bash scripts:

JackLinx is an application management framework that makes it possible for children and young music students to instantly start working with a complex array of inter-connected Linux Music and Audio applications.

The targeted use scenario is the primary or high school music classroom furnished with a a set of networked desktop or laptop computers, where a music teacher directs and guides a group of music students to perform various music educational assignments and activities using the JackLinx platform.

The JackLinx platform can be used for individual musical instruction and training, for small group work over the network and for live musical performances.

JackLinx aims to be a full featured but simple and flexible music laboratory for all ages that focuses on live musicking.

Ik ben hier ontzettend enthousiast over, vooral vanwege de keuzes van de auteur (Fred de Borst) en het feit dat het optimaal gebruik maakt van de mogelijkheden van Linux audio en Linux in het algemeen (JackLinx maakt bijvoorbeeld goed gebruik van meerdere desktops).


JackLinx op Lubuntu 11.10 met Gnome MPLayer, MuseScore, 9menu en VMPK

Volgende stap is de software geschikt maken om te distribueren en deze zal misschien her en der nog wat gefinetuned moeten worden. Ik ga proberen om de ontwikkelingen zoveel mogelijk te volgen hier op mijn blog.

JackLinx site online

Veel gebeurd

Een alleszeggende titel. Vorige week kennis gemaakt met iemand die bij mij om de hoek woont (en dan ook echt om de hoek) die een complete educatieve muziekomgeving onder Linux heeft gebouwd met behulp van JACK, mididings, QMidiRoute, QmidiNet, Qsynth en Bash scripts. Waanzinnig. En werken als een trein. Hele klassen kunnen via het netwerk met elkaar muziek maken, meespelen met backing tracks of gewoon lekker rommelen met diverse instrumenten. Heel bijzonder en je begrijpt wel dat ik heel graag wil meewerken aan het verder perfectioneren en professionaliseren van deze leeromgeving.

M’n Raspberry Pi’s lagen wat stof te happen maar daar is sinds een paar weken wel een einde aan gekomen. Werd eigenlijk getriggered door een post op de Jack-Devel mailinglist met een patch voor ARM platformpjes zoals de RPi. Een vergelijkbare patch was maanden geleden al een keer gepost maar is bijkans niet meer googlebaar dus aan mijn aandacht ontglipt. Door de patch op Jack-Devel kon ik weer verder als in JACK (zowel Jack1 als Jack2) draait prima op de RPi met deze patch. In eerste instantie kreeg ik de boel niet goed draaiende (vooral full-duplex kreeg ik niet voor elkaar) maar na me goed ingelezen te hebben heb ik mijn RPi zo weten te tweaken dat deze bruikbaar is voor real-time, low-latency audio. Afgelopen woensdag m’n bevindingen laten zien en horen op een Horus meeting en de RPi hield zich prima als virtuele gitaarversterker. En dat allemaal op een ontwikkelboardje van nog geen €30,-. Mijn bevindingen heb ik neergepend in de linuxaudio.org Wiki: http://wiki.linuxaudio.org/wiki/raspberrypi

Ook op mijn werk heb ik het erg druk. Heb me gestort op het WebRTC gebeuren en dat begint nu wel te lopen. Klanten zijn bijzonder geïnteresseerd in het videobelplatform dat we aan het ontwikkelen zijn en het werkt gewoon goed. Ook is het altijd fijn om nieuwe dingen te leren (WebRTC, WebSocket, STUN/TURN/ICE) of je meer te kunnen verdiepen in dingen waar je al wel wat van af wist maar die je nooit echt praktisch hebt hoeven toepassen (audio- en videocodecs, encrypten van datastromen, iptables). Ondertussen zijn we al weer verder aan het kijken naar een volgend project waarbij de focus ligt op router-achtige hardware en software, oftewel we gaan proberen zelf eenvoudige network appliances te gaan bouwen. Onze bureaus worden inmiddels bevolkt door RPi’s, MikroTik RouterBoards en PC Engines Alix boardjes. En die mag je dan onder de baas z’n tijd gaan zitten hacken. Hoe vet is dat. Vooral als het werkt en je met elkaar kunt bellen via een boardje met een 400MHz MIPS processor waar zelfgebouwde OpenWRT firmware op draait.

Oh ja, en maandag gaan we trouwen.

Veel gebeurd

Nog meer mididings

Mididings script voor 29 oktober is klaar:

#!/usr/bin/python

from mididings import *
from mididings.extra import *

config(
    backend='jack',
    client_name='sodap-live',
    data_offset=0,
)

run(
    Filter(PROGRAM) >> [
        [
            ProgramFilter(0) >> NoteOn(64,50),
            ProgramFilter(7) >> NoteOn(69,86),
            ProgramFilter(0) >> NoteOn(72,60),
            ProgramFilter(1) >> NoteOn(74,62),
            ProgramFilter(2) >> NoteOn(76,64),
            ProgramFilter(3) >> NoteOn(71,30),
            ProgramFilter(7) >> NoteOn(77,88),
            ProgramFilter(8) >> NoteOn(79,96),
            ProgramFilter(9) >> NoteOn(81,84),
        ] >>
        LatchNotes() >> [
            KeyFilter(64) % NoteOff(69,0),
            KeyFilter(69) % NoteOff(64,0),
        ],
        ProgramFilter(4) >> Panic(),
        ProgramFilter(10) >>
        Channel(2) >>
        NoteOn(36,64),
    ]
)

Met dit script kan ik nu de strijkers spelen in Soda P – Icon of your Time en heb een Vibraslap sample van Freesound.org in een soundfontje gezet met Swami zodat ik deze met de FluidSynth DSSI plug-in ook vanuit Qtractor kan triggeren met behulp van de Boss FC-50. De strijkers gaan via het eerste paralelle ‘blok’ waarin Program Changes worden omgezet in Note Ons, daarna gaan ze door de LatchNotes Unit en daarna worden in een genest parallel blok nog twee Note Offs gedefinieerd. Stuurt de FC-50 Program Change 4 uit dan worden alle noten uitgezet (‘Panic’), bij Program Change 10 stuurt mididings een MIDI noot 36 op MIDI kanaal 2 naar Qtractor voor de Vibraslap. Het config deel aan het begin van het script vertelt mididings dat er JACK MIDI poorten aangemaakt moeten worden met als naam ‘sodap-live’. data_offset=0 is nodig omdat de FC-50 bij 0 begint met tellen en niet bij 1.

Nog meer mididings

Boss FC-50 en mididings

De Boss FC-50 doet alleen aan MIDI Program Changes en wat Control Changes. Maar ik wil er noten mee kunnen spelen. Dat zou op zich kunnen met QMidiRoute maar het mooiste zou zijn als ik ook Note Off events zou kunnen genereren, of nog beter, als een volgende noot de vorige af zou kunnen kappen. mididings heeft deze functionaliteit en heb een scriptje gemaakt dat precies doet wat ik wil:

#!/usr/bin/python

from mididings import *
from mididings.extra import *

run(
    Filter(PROGRAM) >>
    NoteOn(EVENT_VALUE,100) >>
    Transpose(36) >>
    LatchNotes(),
)

Wat dit mididings scriptje doet is de Program Changes eruit filteren, deze omzetten naar Note On events, de gegenereerde noten 3 octaven omhoog gooien en met de LatchNotes Unit ‘latch’ je de noten (je laat ze aanhouden) en zet je elke vorige noot uit bij een nieuwe noot. Dit scriptje maakt van de FC-50 een mooi footkeyboardje.

mididings kun je vinden in de lucid-unstable repository van Tango Studio.

Boss FC-50 en mididings

MIDI Foot Controller

Van de week heb ik een tweedehands Boss FC-50 MIDI Foot Controller op de kop weten te tikken. Gelijk aangesloten op mijn live set-up (HP Notebook met Focusrite Saffire Pro 10, Ubuntu 10.04) en getest met o.a. QMidiRoute. Werkt perfect. Ga in mididings duiken zodat ik deze controller kan gaan gebruiken als keyboard (dus om noten te produceren) en als MIDI footswitch voor Rakarrack en Guitarix. Hopelijk kan ik de controller de 29e al live gebruiken op het Rock de IJmond XL Festival.



MIDI Foot Controller