fcbnerd convierte cualquier controlador MIDI en un teclado extra para macOS
Una utilidad de línea de comandos lee mensajes CoreMIDI y los mapea a comandos de shell, o los emite como JSON por línea para que otro programa decida.
fcbnerd es una utilidad de línea de comandos para macOS que escucha mensajes MIDI y los convierte en comandos de shell. La escribió un desarrollador para su pedal Behringer FCB1010, pero nada dentro es específico de ese modelo: vale cualquier fuente CoreMIDI que el sistema vea.
El enganche típico es un binding del tipo 1:20:127=open ~/Downloads, que hace que el controlador 20 del canal 1 con valor 127 abra esa carpeta. También se puede usar pc:1:0=say hello para cambios de programa. Si prefieres que la decisión la tome otro programa, fcbnerd emite un objeto JSON por línea —tipo, canal, controlador, valor, programa, fuente y hora en ISO 8601— y se acabó.
Por qué una CLI y no una app
El autor lo justifica en el propio repositorio: tocar el Mac de verdad, pulsar teclas o lanzar scripts, exige permisos que una app en sandbox no obtiene, y cada usuario quiere un conjunto de acciones distinto. fcbnerd solo lee MIDI, y leer MIDI no necesita permisos. Las acciones se quedan en el shell o en herramientas que ya tienen ese acceso, como Hammerspoon.
Se instala por Homebrew, con un paso previo: Homebrew 7 no carga taps de terceros sin confiar en ellos, así que primero brew trust --tap jamesryanatx/tap y después brew install JamesRyanATX/tap/fcbnerd. Compilar desde fuente pide macOS 13 o posterior y el toolchain de Swift.
Los subcomandos son tres. listen es el modo por defecto y sigue el hotplug: si desenchufas la interfaz a mitad de sesión y la vuelves a enchufar, el flujo continúa con líneas de desconexión y conexión. list imprime las fuentes disponibles en ese momento. simulate levanta una fuente MIDI virtual llamada fcbnerd simulator que reproduce pulsaciones sintéticas, un barrido de pedal y un mensaje sysex en bucle, útil para montar el consumidor sin tener el pedal delante.
Cómo se comportan los bindings
Cada comando arranca en segundo plano a través de /bin/sh -c —o del shell que indiques con --shell—, con la entrada estándar en /dev/null y la salida redirigida al stderr de fcbnerd para no corromper el flujo de eventos. El proceso recibe variables de entorno con el contexto del mensaje: MIDI_TYPE, MIDI_CHANNEL, MIDI_CONTROLLER, MIDI_VALUE, MIDI_PROGRAM y MIDI_SOURCE, que bastan para montar cualquier cosa, desde cambiar el volumen del sistema hasta lanzar un script propio.
Los comodines permiten patrones amplios (1:30:* es cualquier valor del controlador 30 en el canal 1), pero conviene usarlos con cuidado: cada mensaje que coincide lanza un shell, así que dos pulsaciones rápidas ejecutan el comando dos veces aunque la primera siga corriendo. Los barridos de pedal de expresión son la excepción, porque envían decenas de valores por segundo; con un valor comodín solo se ejecuta una copia a la vez por cada control de canal y controlador, y fcbnerd se queda con el último valor para el siguiente arranque. Si un comando sigue vivo a los 5 segundos, lo avisa por stderr, y al interrumpir la herramienta manda SIGTERM a lo que quede en marcha. Las funciones del shell hay que exportarlas o cargarlas desde un fichero: zsh no puede exportarlas.
El FCB1010 no envía nada al soltar el interruptor, así que un binding salta solo en la pulsación. El comportamiento de encendido y apagado hay que construirlo a mano, normalmente guardando el estado en un fichero temporal.
Es un proyecto de un solo autor, sin binarios firmados y con un tap de Homebrew que hay que confiar a mano, nada raro en esta categoría. Lo interesante es el enfoque: en lugar de fabricar otra app con permisos de accesibilidad, deja el MIDI como entrada y el shell como salida, y eso encaja con cualquier controlador que tengas criando polvo en un cajón.

