MIDIRouter by example

This article provides some detailed example and associated configuration file for MIDIRouter (https://github.com/NothNoth/MIDIRouter).

Simple forward

Let’s start with a very simple use case: “I want to forward all messages received on my input MIDI interface to my output MIDI interface”.

This may typically happen when you have a MIDI Usb keyboard connected to your audio interface and you want to send everything to you freshly acquired analog synthesizer connected to your MIDI output.

Our configuration file will first specify your MIDI input and output devices.

Simply run MIDIRouter with no arguments to list available devices:

Usage: ./midirouter <config file>
MIDI inputs:
   Périphérique MIDI USB
   Korg
   MOOG
   Faderfox EC4
   Port 1
   Port 2
   Port 3
   Port 4
   Port 5
   Port 6
   Port 7
   Port 8
MIDI outputs:
   Périphérique MIDI USB
   Korg
   MOOG
   Faderfox EC4
   Port 1
   Port 2
   Port 3
   Port 4
   Port 5
   Port 6
   Port 7
   Port 8

Let’s say I want to route everything from “Korg” to “MOOG”.

{
    "SourceDevice": "Korg",
    "DestinationDevice": "MOOG",
    "DefaultPassthrough": true,
    "Verbose": true
}

The “DefaultPassthrough” simply tells the MIDIRouter to forward all messages not matching any other rule. Since we don’t have any other rule set, this default behaviour will match all captured messages on the input interface.

The “Verbose” option is useful when setting everything up: it will show a message everytime a MIDI event is received (you can switch it to ‘false’ once everything works fine).

Note On/off forward only

On our previous example we’ve used the DefaultPassthrough feature to allow a complete forward of all messages from the input MIDI device to the output MIDI device.

Now we may not want to send everything to our vintage Analog Synth since it only supports NoteOn and NoteOff MIDI mesages. In order to do that, we will use what is the main feature of MIDIRouter: “rules”.

A “Rule” is built using three main sections:

  • A filter which describes what kind of MIDI message to look for on the input MIDI interface
  • A transformation which optionally defines how you want to change the extracted value
  • A generator which describes what kind of MIDI message to replay on the output MIDI interface

Our complete forward scenario is quite simple:

  • Filter: we want to match any Note On or Note Off message whatever the MIDI channel, value or velocity
  • Transform: we don’t want to transform anything
  • Generator: we want to replay using the same type of MIDI message (Note on, note Off), same MIDI channel, same note, same Velocity

We will here need two rules, one for the Note On events and one for the Note Off events.

Let’s start with Note On forward.

{
    "SourceDevice": "Korg",
    "DestinationDevice": "MOOG",
    "DefaultPassthrough": false,
    "Verbose": true,
    "Rules": [
        {
            "Name": "Raw forward of any Note On",
            "Filter": {
                "Name": "Note On in (I can write anything here)",
                "MsgType": "Note On",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            },
            "Transform": {
                "Mode": "None"
            },
            "Generator": {
                "Name": "Note On out",
                "MsgType":"Note On",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            }
        }
    ]
}

In the first part of this configuration file, we have the same section defining the input and output. Note that we’ve disabled the Defaultpassthrough option.

Then we have the “Rules” array which – for now – only contains one rule for our “Note On” events. The “Name” fields can be used to put any comments to be used for display only.

The “Filter” is built using:

  • MsgType: the type of midi message to look for (among “Note On”, “Note Off”, “Aftertouch”, “Control Change”, “Program Change”, “Channel Pressure”, “Pitch Wheel”). Here we set it to “Note On”
  • Channel: the MIDI channel to look for (1 to 16). Here we want to match any channel and use ‘*’.
  • Now comes the “Note On” specific settings which are “Note” (the note value) and “Velocity”. Since we want to match any note or velocity, we use ‘*’ again.

Then comes the “Transform” entry which would technically allow us to transform a note to another one. Here we just want to replay the MIDI message as it, so we use “None”.

The “Generator” section describes what kind of MIDI message we want to generate when a MIDI message matching our filter is captured. These settings are quite similar to the filter settings.

  • MsgType: the type of midi message to generate (among “Note On”, “Note Off”, “Aftertouch”, “Control Change”, “Program Change”, “Channel Pressure”, “Pitch Wheel”). So here we set it to “Note On”
  • Channel: the MIDI channel to set (1 to 16). Here we want reuse the same MIDI channel found on the captured Note on, we set it to “*”.
  • Now comes the “Note On” specific settings which are “Note” (the note value) and “Velocity”. Since we want to replay the same note and velocity, we use ‘*’ again.

And that’s it: the rule will match all Note on events and replay them to the output interface using the exact same settings (MIDI channel, note, velocity).

Because we want to send also Note Off messages, we add another rule with very similar settings:

{
    "SourceDevice": "Faderfox EC4",
    "DestinationDevice": "Périphérique MIDI USB",
    "DefaultPassthrough": false,
    "Verbose": false,
    "Rules": [
        {
            "Name": "Match any NoteOn",
            "Filter": {
                "Name": "Note On in",
                "MsgType": "Note On",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            },
            "Transform": {
                "Mode": "None"
            },
            "Generator": {
                "Name": "Note On out",
                "MsgType":"Note On",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            }
        },
        {
            "Name": "Match any NoteOff",
            "Filter": {
                "Name": "Note Off in",
                "MsgType": "Note Off",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            },
            "Transform": {
                "Mode": "None"
            },
            "Generator": {
                "Name": "Note Off out",
                "MsgType":"Note Off",
                "Channel": "*",
                "Settings": {
                    "Note": "*",
                    "Velocity": "*"
                }
            }
        }
    ]
}

On the next article, we will see how we can send Pitch Wheel events captured on a given MIDI channel to another MIDI channel and transform them to Aftertouch events:

MIDIRouter, the Origins

I’ve developped a tool for MacOS called “MIDIRouter” which does what the name implies: it’s able to route (and transform) MIDI messages over MIDI interfaces.

Before going deeper into its features, let’s try to understand what I’m trying to achieve.

I have a few multi-effects on my studio (an Ensoniq DP/4, a Digitech Studio Quad v2) and actually I don’t use them that much. They’re behind me on a rack which is not really convenient to update settings and listen to the results, especially for reverbs.

So I ended up buying a Faderfox EC4 (http://faderfox.de/ec4.html) wich is a programmable MIDI remote.

Using the EC4, I’m able to associate any VPot to a given MIDI mesage type: send a program change, a control change (pitch bend, aftertouch, Note On, etc.) and customize displayed text to my needs.

This looked quite promizing, but the EC4 has some limitations:

  • When using a ControlChange, displayed value does not necessarily match with the ouput value. Control Changes values can be 7 bits (0 to 127) or 14 bits (0 to 16383) while I can setup displayed value to (0, 127), (0,1000), etc.
  • The Ensoniq DP/4 requires proprietary Sysex messages to change its parameters, this is not supported by the EC4
  • I plan to use the EC4 for other purposes (control DAW plugins is among them), so I want it to be connected to my Mac and forward some messages to my effects chain

So I needed a software that would be able to:

  • Watch an input MIDI device for a certain type of messages (with wildcard support)
  • Extract a value (7bits or 14bits) from those messages (a program value from a Program Change, a control value from a Control Change, etc.
  • Remap the value to the expected output value range (“my EC4 shows a value in the range [0-100], sends a [0-127] value and I want to then to my effect a [0-64] value”)
  • Re-emit a MIDI message to the output interface using eventually another MIDI message type (“transform the EC4 Control Change messages into DP/4 Sysex messages) including the extracted value

This actually does not exist, so I developped MIDIRouter: https://github.com/NothNoth/MIDIRouter

MIDIRouter is free to use for personal use and “quite cheap” for professional use.

In the next article, we’ll be setting up a simple routing:

Exporter une session Logic pour le mixage

Lorsque vous avez terminé vos enregistrement, votre session Logic contient toute une série de fichiers audios ou midis. Certains sont utilisés, certains correspondent à des prises que vous avez faites mais que vous n’avez pas retenus et certains fichiers peuvent être situés “ailleurs” sur votre disque (issus de banques de sons par exemple).

Il est nécessaire d’exporter proprement votre session Logic avant de l’envoyer afin de:

– Réduire sa taille en supprimant les fichiers qui ne servent à rien

– Rassembler tous les fichiers dans la session Logic et faire en sorte qu’elle ne fasse pas référence à des fichiers restés sur votre ordinateur

Commencer par afficher le “Browser” en cliquant sur l’icone “medias” en haut à droite (raccourci clavier: “F”).

Logic affiche la liste des fichiers utilisés par le projet. Rendez vous dans le menu Edit et cliquez sur “Select Unused” (raccourci cavier: Shift + U).

Logic sélectionne tous les fichiers du projet qui ne sont pas utilisés par la session.

Rendez vous maintenant dans “Audio Files” et cliquez sur “Delete Files” (raccourci clavier: Command + backspace).

ATTENTION: cette opération va supprimer les fichiers du disque. Si vous envisagez de réutiliser finalement certains des prises, pensez à faire une copie de sauvegarde du projet avant!

Votre session vient de s’alléger de quelques Go, reste désormais à rassembler tous les fichiers du projets dans une seule session.

Rendez vous dans le menu “Files” et cliquez sur “Save a copy as…”.

Dans la boite de dialogue, pensez a bien cocher toutes les cases, notamment “Audio Files”.

C’est terminé ! Le projet sauvegardé contient tous les éléments utilisés par votre projet, et rien que ceux-ci !

Pourquoi il me faut un fader

Nous sommes en 2021 et aujourd’hui, avec un bon ordinateur, une paire d’enceintes correctes (ou à défaut un bon casque) je devrais avoir tout ce qu’il faut pour mixer.

J’ai une belle collection de plugins, qui émulent d’une manière générale plutôt bien des équipements de studio vintage qui valent plus cher que ma voiture.

Alors pourquoi est-ce que je m’acharne à travailler avec une console en face de moi ? Pourquoi j’envisage d’en acheter une nettement plus grosse ? Pourquoi je m’ennuie à acheter ou monter des équipements en rack alors que j’ai grosso modo les même en plugin ?

Je me souviens d’une video de Chris Lord-Alge qui fondamentalement expliquait que sa console était son instrument à lui. Bien sûr vous pouvez demander à Jimmy Page de jouer sur une copie de Fender à 50€, il en sortira probablement quelque chose d’incroyable. Mais pourquoi irait-il s’abimer les doigts sur une mauvaise guitare alors qu’il pourrait sortir quelque chose de meilleur, plus facilement, en prenant du plaisir, avec un bel instrument ?

Travailler sur une console, pour moi c’est la même chose: bien sûr je pourrais aller cliquer sur un bouton de fader dans Protools, mais où est le plaisir ?

J’ai passé les 20 premières années de ma vie professionnelle à travailler dans la cybersécurité, derrière un ordinateur. Même si j’ai adoré toutes ces années, je n’ai pas changé de carrière pour simplement passer d’un logiciel à un autre.

Pire: je suis fondamentalement convaincu que je mixe mieux derrière une console qu’avec une souris à la main. Une console c’est tactile, vous sentez les boutons, vous entendez comment le mix réagit lorsque vous touchez à un réglage.

Si vous faites les même opérations à la souris, vous introduisez un nouvel élément: la vue. Ce n’est plus une interaction main -> son, mais c’est un combo main -> écran -> son, et fondamentalement cela change tout pour moi.

On a tous fait l’expérience de fermer les yeux pour écouter de la musique et plus facilement accéder aux détails de celle-ci, preuve que la vue vient effectivement jouer au trouble fête en forçant le cerveau à analyser des informations qui ne sont pas utiles dans ce contexte. Avec une console en face de moi, je peux ignorer ce que je vois (ce qui avec mon niveau de myopie est en pratique assez facile) et me concentrer sur l’essentiel: le son.

Par extension c’est précisément la même chose sur tous mes équipements en rack: tourner un bouton physique est plus efficace que d’aller cliquer sur un bouton de plugin.

Je n’irai pas non plus tomber dans le travers du tout analogique: le concept est attrayant mais à l’usage c’est beaucoup de contraintes. On tombe alors dans le studio hybride, mélangeant du logiciel (donc des plugins), une console (qui peut être un simple contrôleur DAW) et quelques équipements en rack.

Pour moi c’est le meilleur compromis entre efficacité et plaisir de mixer!

Les Folk Days

Du 18 au 28 février 2021 j’organise les “Folk Days” avec une offre à 50€ pour votre titre Folk, mixé et masterisé.

Vous avez passé les derniers confinements enfermé chez vous avec votre guitare et cette vieille compo que vous jouez depuis 12 ans à vos potes ?

Il est peut être temps d’en faire quelque chose de propre…!

Comment cela se passe ?

  1. Vous enregistrez votre titre Folk (donc essentiellement guitare voix, 5 pistes max) avec les moyens du bord
  2. Vous m’envoyez votre session (wetransfer, Dropbox, Google Drive..) pour avoir un avis gratuit : est-ce mixable ou faut-il refaire des prises ?
  3. Vous me donnez le nom d’un titre de référence (“j’aimerai que ça sonne comme…”) et la/les plateformes sur lesquelles vous envisagez de le diffuser
  4. Je vous envoie la version masterisée, prête à être diffusée
  5. Si certaines choses ne vous vont pas, vous avez le droit à un aller retour pour des correctifs

Conditions:

Paiement à l’étape 2.

Je ne prends pas en charge la diffusion du titre ni son référencement (SDRM, Sacem…)

Tous les envois (étape 2) effectués du 18 au 28 février peuvent bénéficier de la promo, même si les étapes suivantes débordent de la période!

Les sessions peuvent être des projets Garageband, Logic ou Protools. Si vous utilisez un autre DAW, vous pouvez exporter les pistes une a une en WAV après avoir désactivé vos différents effets (EQ, compresseurs, reverbs..) ainsi qu’un bounce en l’état de votre mix maison.

Envois à faire à folkdays@radix-studio.fr

Accompagner les groupes indés dans leurs projets

Lorsque l’on fait partie d’un groupe indépendant, on s’occupe par définition de tout: des compos, des enregistrements, du matériel, de la promo…

On vit une époque où on a la chance d’avoir du matériel audio d’une qualité très correcte à des prix vraiment accessibles. Quand j’ai commencé à faire du son dans les années 90, la configuration de base pour enregistrer un album tapait dans les 20 k€. A ce prix là, le super projet d’album du groupe finissait généralement enregistré au dictaphone et l’aventure s’arrêtait là.

Aujourd’hui avec un Mac de base, Garageband, une interface audio à 200€ et un micro a 100€ on a de quoi sortir un titre parfaitement “écoutable”.

J’ai créé mon studio de mixage pour accompagner ces groupes, leur donner la possibilité de finaliser ces morceaux et les faire passer au stade d’après: obtenir un titre “radio ready”. L’accompagnement ça n’est pas simplement prendre les pistes qui ont été enregistrées puis sortir un mix avec l’excuse: “Ça ne sonne pas trop, mais bon avec les pistes que j’ai eu aussi …”

Accompagner un groupe cela se passe souvent avant même les premières prises: conseiller pour l’achat d’un nouveau micro, valider (ou pas 🙂 ) une installation, conseiller sur la façon de faire les prises, celles qui doivent être doublées, le placement des micros… Ensuite vient le temps de valider les pistes qui ont été faites: parfois on peut corriger certains problèmes au mix, parfois c’est plus simple de refaire la prise. Pour finir il y a aussi l’accompagnement artistique: même si un ingé de mixage doit rester à sa place (je ne suis pas producteur), il m’arrive de proposer quelques arrangements sur des morceaux, car lors de mix on se rend compte que certains passages sont “plats”.

Dans tous les cas, la décision finale revient au groupe: le seul et unique critère de qualité valable d’un mix est qu’il plaise à l’artiste (et a son public, accessoirement) !

Groupes indés & COVID19

On peut essayer de prendre la question dans tous les sens, la conclusion sera la même: la crise du COVID19 met à mal une industrie musicale encore bien fragile.

Les artistes gagnent leur vie essentiellement grâce aux concerts et il n’y en a pour ainsi dire plus depuis bientôt un an.

J’ai toujours joué dans des groupes auto-produits, où l’on a l’habitude de faire beaucoup avec peu de moyens. Nos ventes d’albums servaient essentiellement à financer le pressage de l’album en question, et un peu de matériel.

Fondamentalement j’ai l’impression que les groupes purement indé seront peut être moins impactés que les autres par la crise. Ils enregistrent généralement chez eux avec leur propre matériel et on souvent un “job alimentaire” à coté pour tenir le coup.

Avec les confinements j’ai vu démarrer pas mal de projets (quitte à être enfermé avec des instruments et des micros..) qui devraient voir le jour dans les mois qui viennent. Pour enchaîner avec une série de concerts quand cela sera de nouveau possible ?

SSL Nucleus debug interface

Just a few technical notes on debugging the SSL Nucleus (mk1) through serial port. I will enventually update this article with additional commands tests.

Playing with the LCD driver

First of all, you’ll need a USB to serial cable, which can easily be found on amazon, aliexpress and so on. Such a cable it about 1€, don’t spend more on it!

On macOS: open a Terminal and type:

screen /dev/tty.wchusbserial141330

The actual name of the device may differ, but it’s probably be something close.

You now have a pretty nice shell, opened on your Nucleus, type “help” to show all available commands:

CMD>help

TP220_3 [] Daw channels layer 3 diags
ALLOC_3 [] DAW allocator
TP220_2 [] Daw channels layer 2 diags
ALLOC_2 [] DAW allocator
ACTIVE  [] Ptoosl active send
TP220_1 [] Daw channels layer 1 diags
ALLOC_1 [] DAW allocator
TP180   [] Soft key diag
TP186   [] Layer Control
TP215   [] control groups
TP177   [] UDP midi
IP      [] TCPIP Diags
ETHer   [] PX1 Ether diags
DAW     [] DAW config
CCC     [] cc config
SOKS    [] Soft key diag
FLIST   [] function lists
TP234   [] Centre meters
TP199   [] USB KBD Functions
SVEN2   [] 7 seg diag
SURF    [] ctrl surface diags
TP5     [] Control manager
TP86    [] Power up restore
LOG     [] Logging
FRAM    [] FRAM cmds
FS      [] File system
RTC     [] Real time clock
USB     [] USB Kbd Diags
TH6     [] SPI Access
TH17    [] 675 Live Bus
TH16    [] MD Bus
REP     [] Diags
TH18_0  [] LCD Driver
TH19    [] Firmware Revision
INTEG      check code integrity
CRASH      crash system
VER        SW version
G          Flip back to the trusty "G" interpreter; same as <ctrl D>
DEBUG   [] Stuff which should probably be somewhere else
HEAP    [] Heap diags
MOS     [] Operating system diagnostics
FILES      Show file task ids
REPort  [] Diagnostic reporting

CMD>

Now, it’s probably the best time for the traditional disclaimer: you may break things here, I’m not responsable for anything.

CommandShort descriptionDescription
TP220_3Daw channels layer 3 diagsuntested
ALLOC_3DAW allocatoruntested
TP220_2Daw channels layer 2 diagsuntested
ALLOC_2DAW allocatoruntested
ACTIVEPtoosl active senduntested
TP220_1Daw channelslayer 1 diagsuntested
ALLOC_1DAW allocatoruntested
TP180Soft key diaguntested
TP186Layer Controluntested
TP215Control GroupsList all internal states for all DAW sync-ed items (faders, buttons, pots, etc.).
TP177UDP midiuntested
IPTCPIP Diagsuntested
ETHerPX1 Ether Diagsuntested
DAWDAW Configuntested
CCCCC configuntested
SOKSSoft key diaguntested
FLISTfunction listsuntested
TP234centre metersSetup the MIC meter (from 1 to 2) led display to a given value (from 0 4000) to . Ex: “TESTmtr 1 2000” lights up half the left channel leds.
TP199USB KBD functionsuntested
SVEN27 seg diagShows a 2 letter text on the center “MODE” 7 segments display.
SURFctrl surface diagsuntested
TP5Control manageruntested
TP86Power up restoreuntested
LOGLoggingDumps the last boot message (see below)
FRAMFRAM cmdsuntested
FSFile systemuntested
RTCReal Time Clockuntested
USBUSB kbd diagsuntested
TH6SPI Accessuntested
TH17675 Live Busuntested
TH16MD Busuntested
REPDiagsuntested
TH18_0LCD DriversA set of commands to display text on the left/right two lines LCD
TH19Firmware revisionShows the firmware revision “FPGA Firmware version is : V2.01”
INTEGcheck code integrityCheck the OS integity, supposed to show “Code integrity test passed.”
CRASHcrash systemuntested
VERSW versionShows the software version: “Software : Nucleus
Version : V1.6/2 I
Build : Tue 17 Jun 14, 15:59:17 by alanj”
GFlip back to the trusty “G” interpreter; same asuntested
DEBUGStuff which should probably be somewhere elseuntested
HELPHeap diagsuntested
MOSOperating system diagnosticsuntested
FILESShow file task idsuntested
REPortDiagnostic reportinguntested
List of commands

Boot logs:

Version        : V1.6/2 I
Build          : Tue 17 Jun 14, 15:59:17 by alanj
TP96: Monitor type is SSL Aude 505 CPU Monitor



TH19: Firmware: V2.01
th5_control_bus
th16_bud_md_bus
th5_control_bus
th17_bud_live_bus
TF1: File system
th12: MMC/SD init: Caching ON
th12: card type 8
TF1: File system status: OK
TF1: 3896246272/3942645760 bytes free
tp301: Read 8192 bytes of FRAM data from disk (requested 8192)
TS4: Crash logger
tp86: Valid console PUR data found
TP5: Control manager
tp299: xdaw control surface
tp234_bud_centre_meters
TP226: Function lists
TP184: Soft Key Manager
TP253: CC Config
TP190: DAW config
tp190: setting profile 'BG Protools' ('/userprof/4') on daw layer 1
tp190: setting profile 'B Logic Standard' ('/userprof/2') on daw layer 2
tp190: setting profile 'Live Standard' ('/sslprof/14') on daw layer 3
PX1: Ethernet
PX1: mem map B
PX1: 82559 Detected
TC4: TCPIP setup
TC4: 31 bytes of FRAM used
TC4: Using DHCP assigned addresses
TC1: OpenTCP Init
TC1: Using DHCP assigned addresses
TC1: MAC address is 58:0c:13:04:02:90
TP185: Soft Key Assignments
TP219: Layer 1 initialisation for protocol 'HUI'
TP212 Creating HUI layer. First chan 1, last chan 16
tp75: constructing HUI LUT
TP219: Layer 2 initialisation for protocol 'Logic Audio'
TP213 Creating MCU layer. First chan 1, last chan 16
tp75: constructing MCU LUT
TP160: Starting 2 MCU handhake ports for layer 2
tp160: rcvd port active on port 0
tp160: rcvd port active on port 1
TP219: Layer 3 initialisation for protocol 'Logic Audio'
TP213 Creating MCU layer. First chan 1, last chan 16
tp75: constructing MCU LUT
TP160: Starting 2 MCU handhake ports for layer 3
tp160: rcvd port active on port 0
tp160: rcvd port active on port 1
TP176: AWS90 Remote [serial no. 262800]
TC1: Starting IP services
TC1: got DHCP IP address 10.0.1.107
TP277: Calibrating fader touch 1...16
TP277: Calibrating faders 1...16

Software       : Nucleus
Version        : V1.6/2 I
Build          : Tue 17 Jun 14, 15:59:17 by alanj

Code integrity test passed.
Boot completed in 1030 ticks.