Présentation de fcbnerd
fcbnerd est un utilitaire en ligne de commande destiné aux systèmes macOS 13 et supérieurs. Il interroge les sources CoreMIDI – par défaut toutes les interfaces, ou uniquement celles dont le nom correspond à l’option --source – et traduit chaque message MIDI en un objet JSON ligne par ligne. Le format JSON comprend les champs type, source (nom affiché de la source) et time au format ISO 8601 UTC avec millisecondes, garantissant une horodatage précis pour les traitements en temps réel.
Mécanisme de liaison et flux de données
Chaque liaison se définit par la syntaxe PATTERN=COMMANDE. Le pattern décrit le type de message (ex. pc pour Program Change, cc pour Control Change), le canal (1‑16) et la valeur (0‑127). Les jokers * permettent de matcher toutes les valeurs d’un champ, ce qui est indispensable pour les pédales d’expression (ex. 1:27:*). Un exemple de liaison simple est :
fcbnerd --bind '1:20:127=open ~/Downloads'Lorsque le contrôleur envoie le message correspondant, fcbnerd lance la commande dans un sous‑processus /bin/sh -c (ou le shell indiqué par --shell). Tous les messages sont immédiatement flushés sur stdout, tandis que les messages d’état (connexion, erreurs) sont redirigés vers stderr, ce qui évite toute corruption du flux d’événements.
Gestion des commandes et contraintes d'exécution
Les commandes s’exécutent en arrière‑plan avec stdin redirigé vers /dev/null. Leur sortie standard est capturée sur stderr de fcbnerd, sauf si l’option --quiet est activée, auquel cas la sortie passe sur stdout. Si plusieurs messages correspondent à la même liaison, chaque instance démarre indépendamment, ce qui peut entraîner une multiplication rapide des processus. Pour les contrôles à haute fréquence (pédale d’expression), fcbnerd ne lance qu’une seule instance à la fois : il conserve la valeur la plus récente et ne déclenche le prochain processus qu’après la fin du précédent, limitant ainsi la charge du système. Un timeout de 5 secondes est appliqué ; au dépassement, un avertissement apparaît sur stderr.
Limites et bonnes pratiques
fcbnerd ne nécessite aucune permission particulière pour lire le flux MIDI, mais les actions déclenchées (ouverture de fichiers, contrôle du système via osascript, etc.) requièrent les autorisations macOS classiques (Accessibilité, Automation). Les messages système temps réel (MIDI clock) et communs (song position) ne sont pas émis, ce qui réduit la charge mais exclut certains scénarios de synchronisation. En cas de consommation lente, fcbnerd stocke les événements en mémoire ; un arrêt de lecture entraîne alors un « burst » d’événements anciens dès la reprise, ce qui peut perturber les scripts qui attendent un état actuel. Enfin, la compatibilité est limitée aux environnements CoreMIDI ; aucun support natif n’existe pour les contrôleurs USB non‑MIDI ou les protocoles Bluetooth LE sans passer par une couche de traduction.