Tekst: Marjan Waldorp
Artikel uit Turning Wheel 2025-4
De vorige aflevering hebben we gekeken naar SetBfree zelf en naar de digitale toonopwekking in het bijzonder. In deze aflevering gaan we kijken naar de MIDI aansturing van SetBfree, want met het spelen van een 1-vinger melodie op de klavieren van de GUI komen we natuurlijk niet ver!
MIDI (Musical Instrument Digital Interface, 1983) 1 is een open standaard voor communicatie tussen electronische muziekinstrumenten (synthesizers, samplers), bedieningsorganen (klavieren, knoppen) en computers. Het initiatief om deze open standaard te ontwikkelen werd genomen door de president van Roland, Ikutaro Kakehashi, die zag dat het gebrek aan standaardisatie de ontwikkeling van de electronische muziekindustrie in de weg stond. Hij nam contact op met Dave Smith, de oprichter van Sequential Circuits, om te komen tot een samenwerkingsverband tussen Japanse en Amerikaanse synthesizer fabrikanten voor het ontwikkelen van een breed gedragen standaard. Om iedereen in de muziekindustrie mee te krijgen, werd de MIDI-standaard geheel vrijgegeven.
De MIDI-standaard is veelomvattend en definieert ook het formaat van MIDI-bestanden. In dit artikel zullen we ons vooral richten op wat we voor SetBfree nodig hebben: de communicatie tussen de SetBfree software synthesizer en de klavieren inclusief drukknoppen en regelaars.

De originele MIDI 1.0 specificatie 2 voorzag in een 8-bit asynchrone seriële verbinding tussen zender en ontvanger met een vaste snelheid van 31,25 kbit/s, vergelijkbaar met de “COM” poorten van de PC. In plaats van RS232 (+/-12V) wordt echter een stroomlus van 5mA toegepast. De ontvanger leidt de stroom door een zg. “opto-koppler” (LED/fototransistor), zodat zender en ontvanger elektrisch gescheiden zijn. De verbinding is hierdoor minder gevoelig voor stoorsignalen. Standaard wordt een 5-polige DIN-connector gebruikt, of (om ruimte te sparen) een 3.5mm steekplugje. Optioneel is een MIDI-apparaat voorzien van een “MIDI-Through” uitgang, waarop het ingangssignaal onveranderd naar buiten komt. Op deze manier kan het MIDI-signaal van één zender aan een keten van ontvangers worden doorgegeven.
Hoewel de oorspronkele seriële verbindingen nog steeds worden toegepast, gebruiken tegenwoordig veel MIDI-apparaten MIDI over USB. De USB verbinding is veel sneller en kan bovendien het apparaat meteen van stroom voorzien. Ook MIDI over LAN is mogelijk, bijv. via QmidiNet (Linux), compatibel met ipMIDI (Windows).
MIDI stuurt opdrachten van een zender naar één of meer ontvangers. Een zender is bijv. een MIDI-keyboard of een computer, een ontvanger een synthesizer. Het MIDI-protocol zendt deze opdrachten in de vorm van een statusbyte, gevolgd door één of meer databytes. De statusbyte bevat het commando, de databytes bevatten de argumenten. De statusbyte ontleent zijn naam aan het feit dat deze byte de status van de ontvanger(s) verandert. Een statusbyte heeft altijd bit7=1, een databyte altijd bit7=0. Effectief zijn status- en databytes dus 7-bit (0-127)!
De communicatie tussen een MIDI-keyboard en een synthesizer lijkt op de communicatie tussen een PC-toetsenbord en de computer. Het protocol geeft door of een toets wordt ingedrukt dan wel losgelaten. Wanneer we op een MIDI-keyboard de centrale “C” indrukken genereert het keyboard een “Note-On” commando bijv.:
90 3C 40
90H = 1001.0000 = Note-On, MIDI kanaal 1
3CH = 60d = Noot C4
40H = 64d = Aanslag Mezzo Forte
De eerste byte (90 hex) is de “Note-On” statusbyte. De tweede byte bevat de noot “C4” (60 decimaal). De derde byte bevat de aanslag (Velocity). Bij SetBfree speelt de aanslag geen rol, maar bij bijv. een piano uiteraard wel! De laatste 4 bit van de “Note-On” statusbyte geven het MIDI-kanaal aan. MIDI ondersteunt 16 kanalen in één fysieke verbinding. De kanalen worden genummerd 1-16. Dus 0000 is kanaal 1, 1111 kanaal 16! Een ontvanger kan luisteren naar alle MIDI-kanalen (Mode Omni On) of alleen naar de ingestelde kanalen (Mode Omni Off). SetBfree luistert standaard naar drie kanalen: kanaal 1 is het bovenklavier, kanaal 2 het onderklavier en kanaal 3 de pedalen.
Wanneer we de centrale “C” loslaten, genereert het MIDI-keyboard een “Note-Off”: 80 3C 00. Als alternatief kan een “Note-On” met een velocity 0 gestuurd worden: 90 3C 00. Dit laatste is met name praktisch wanneer we een aantal “Note-On” en “Note-Off” achter elkaar willen sturen. Een statusbyte blijft namelijk geldig totdat een nieuw statusbyte wordt gestuurd (Running Status) en hoeft dus niet telkens opnieuw gestuurd te worden! Onderstaande is dus een geldige reeks voor “C4 On, D4 On, C4 Off”:
90 3C 40 3E 40 3C 00
Maar met alleen noten zijn we er natuurlijk niet! We willen ook vibrato, percussie, enz. kunnen bedienen en natuurlijk de drawbars! Daarvoor hebben we MIDI-controls nodig. Stel dat we de vibrato aan willen zetten op het onderklavier, dan sturen we:
B0 1E 7F
B0H = 1011.0000 = Control Change, MIDI kanaal 1
1EH = 30d = Vibrato lower (SetBfree)
7FH = 127d = On (0-63: Off, 64-127: On)
De eerste byte (B0 hex) is de “Control Change” statusbyte. De tweede byte is het “Control Number” en de derde byte de waarde. Echter waar bij de muzieknoten de MIDI-nummers eenduidig vast liggen, is dat voor de “Control Numbers” veel minder het geval! Weliswaar geeft tabel III in de MIDI 1.0 specificatie een raamwerk voor het gebruik van de diverse “Control Numbers”, maar binnen dit raamwerk is er veel ruimte voor eigen invulling. Muziekinstrumenten verschillen onderling. Niet alle muziekinstrumenten gebruiken bijv. Drawbars. In de praktijk kan een functie bij een ander instrument een ander “Control Number” hebben en een “Control Number” een andere functie! Met de optie “–dumpcc” kunnen we de actuele toewijzingen van alle “Control Numbers” in SetBfree opvragen. Zo kunnen we bijv. zien welke nummers aan de drawbars van het bovenklavier zijn toegewezen:
$ setBfree --dumpcc
..
MIDI CC Assignments:
--- Upper Manual - Channel 0 ---
Controller | Function
070 | upper.drawbar16
071 | upper.drawbar513
072 | upper.drawbar8
073 | upper.drawbar4
074 | upper.drawbar223
075 | upper.drawbar2
076 | upper.drawbar135
077 | upper.drawbar113
078 | upper.drawbar1
..
Soms kan het nodig zijn om de standaard configuratie te wijzigen. Bijv. stel dat we een keyboard hebben dat op zich geschikt zou zijn als onderklavier, maar waarvan het MIDI-kanaal vast op 1 staat ingesteld. Dan zouden we in de SetBfree configuratie de MIDI-kanalen van het boven- en onderklavier kunnen omwisselen:
$HOME/.config/setBfree/default.cfg:
# setBfree config file
#
# modifications on top of default config
# Swap upper/lower MIDI-channels:
midi.upper.channel=2
midi.lower.channel=1
In de nieuwe configuratie zien we dat het “Upper Manual” nu “Channel 1” en het “Lower Manual” “Channel 0” geworden is. (De uitvoer telt de MIDI-kanalen vanaf 0!)
$ setBfree --dumpcc
..
MIDI CC Assignments:
--- Upper Manual - Channel 1 ---
Controller | Function
070 | upper.drawbar16
..
--- Lower Manual - Channel 0 ---
Controller | Function
070 | lower.drawbar16
..
Naast “controls” kent de MIDI-standaard “programs”, bedoeld om de sound van een MIDI instrument te wijzigen. Bij een algemene synthesizer zoals “fluidsynth” kan met een “Control change” het instrument van een MIDI-kanaal veranderd worden. De programmanummers lopen van 0-127. Bij het “General MIDI” soundfont is programma 0 een “grand piano”, 40 een viool, 73 een fluit, enz. Om meer dan 128 sounds mogelijk te maken, voorziet de MIDI-standaard in een “Bank Select” mechanisme. In totaal zijn er zo 16.384 banks x 128 sounds mogelijk!
SetBfree gebruikt de programma’s als presets voor drawbars, vibrato, Leslie en andere instellingen. SetBfree gebruikt het “Bank Select” mechanisme niet. Tijdens de opstart laadt SetBfree standaard de programma’s, zoals gedefinieerd in “/usr/share/setBfree/pgm/default.pgm”. De programma’s lopen van 1-128! Als voorbeeld de definitie van programma 1 (aan te sturen via 0!). Met “rotary” wordt de Leslie aangeduid:
1 {name="Jazz 1 all",
drawbars="888 0000 000",
perc=on,
percvol=soft,
percspeed=fast,
percharm=3rd,
vibrato=c3,
vibratoupper=on,
overdrive=on,
rotaryspeed=chorale} Desgewenst kan de gebruiker een eigen programmabestand laden via “$HOME/.config/setBfree/default.pgm”.
Welke keyboards zijn geschikt om met SetBfree te gebruiken? In principe elk keyboard dat een MIDI-uitgang heeft. Bijzonder geschikt is natuurlijk een keyboard dat beschikt over 9 schuifjes voor de drawbars en de benodigde draai- en drukknoppen, zoals een “M-Audio Oxygen Pro61”. Hebben we een keyboard zonder deze bedieningselementen, dan kan een MIDI-controller, bijv. een “Devine EZ-Creator Fade” uitkomst bieden. Om de bedieningselementen te programmeren, biedt de fabrikant doorgaans een hulpprogramma (Windows) aan. Voor Linux gebruikers is “Wine” 3 hier van onschatbare waarde!
Met “aseqdump” kunnen we controleren of een bedieningselement de juiste MIDI stuurcode genereert. Eerst maken we een listing van de beschikbare MIDI apparaten met “aseqdump -l”. Vervolgens monitoren we het betreffende apparaat (optie “-p”) en bewegen het bedieningselement, bijv. de 16’ drawbar. In de uitvoer zien we dat het schuifje van de 16’ drawbar op “controller 70” staat ingesteld, wat overeenkomt met de toewijzing in SetBfree:
$ aseqdump -l
Port Client name Port name
0:0 System Timer
0:1 System Announce
14:0 Midi Through Midi Through Port-0
24:0 EZ-Creator Fade EZ-Creator Fade MIDI 1
$ aseqdump -p 24:0
Waiting for data. Press Ctrl+C to end.
Source Event Ch Data
0:1 Port subscribed 145:0 -> 130:0
24:0 Control change 0, controller 70, value 1
24:0 Control change 0, controller 70, value 2
24:0 Control change 0, controller 70, value 3
^C
SetBfree gaat in principe uit van een configuratie met een boven- en onderklavier en eventueel pedalen. Beschikken we over slechts één keyboard, dan kunnen we in de “default.pgm” een split-keyboard programmeren, waarbij bijv. alle toetsen lager dan de G2 (decimaal 55) als via het onderklavier gespeeld worden. Om de gebruiker een visuele feedback te geven, worden in onderstaand voorbeeld de drawbars van het bovenklavier op “054” gezet:
1 {
name="No split"
, keysplitlower=0
, keysplitpedals=0
}
2 {
name="split F#2"
, keysplitlower=55
, drawbarsupper="00 0000 054"
} Bij een Hammondorgel willen we natuurlijk graag een expressiepedaal gebruiken. Helaas hebben de meeste keyboards geen aansluiting voor een expressiepedaal. Een oplossing is een expressiepedaal met een MIDI-uitgang te gebruiken of een standaard expressiepedaal in combinatie met een MIDI-converter.

Als we de keyboards en controllers correct geprogrammeerd hebben, rest nog deze met SetBfree te verbinden. Helaas is dat nog niet zo eenvoudig! Keyboards en controllers komen binnen via de ALSA MIDI-driver. In onderstaande screenshot van “Qpwgraph” zien we onderaan de ALSA MIDI-apparaten met paarse poorten. SetBfree gebruikt echter Jack-MIDI! Jack-MIDI werd door de makers van Jack ontwikkeld om een sample synchrone MIDI-timing tussen Jack-applicaties mogelijk te maken zonder jitter. ALSA-MIDI poorten en Jack-MIDI poorten kunnen niet direct met elkaar verbonden worden. We kunnen dus de ALSA “Oxygen Pro61 USB MIDI” niet met de “control” ingang van SetBfree verbinden! Hiervoor is een bridge-daemon nodig (a2jmidid). Pipewire heeft deze bridge functionaliteit ingebouwd.
In de screenshot zien we bovenaan in de Midi-Bridge alle paarse ALSA-poorten als rode Jack-poorten. Met Qpwgraph leggen we vervolgens de verbindingen tussen de rode Jack-poorten en de “control” ingang van SetBfree. Let op dat we met het leggen van verbindingen geen MIDI-loops creëren, bijv. van Midi-Through naar SetBfree “control” en van de “notify” uitgang weer naar Midi-Through. Dit maakt SetBfree onbestuurbaar! Qpwgraph biedt de mogelijkheid verbindingen vast te leggen (Pin) en deze configuratie op te slaan. Tijdens de volgende opstart zal Qpwgraph deze verbindingen dan automatisch aanleggen.

En hiermee is ons SetBfree Hammond orgel geheel operationeel en zijn we aan het einde gekomen van deze reis door digitaal-audio muziekland. Tijd om te gaan spelen en genieten! Hé, wat hoor ik uit de luidsprekers? De Hammondsound die we allemaal zo liefhebben!

Op deze website plaatsen we cookies die de website goed laten werken of anoniem het gebruik van onze website analyseren.
We plaatsen geen cookies waar u toestemming voor moet geven. Meer informatie vindt u in onze privacyverklaring of geef akkoord en sluit deze melding.