Hacker News

Show HN: Macros with a Behringer FCB1010 MIDI Pedalboard in macOS

macOS에서 Behringer FCB1010 MIDI 페달보드로 매크로 실행하기 — fcbnerd

MIDI 풋 컨트롤러를 Mac의 보조 키보드처럼 활용할 수 있게 해주는 오픈소스 CLI 도구 fcbnerd가 공개되었습니다. MIDI 메시지를 셸 명령에 바인딩하거나 JSON 스트림으로보내 Hammerspoon 등 다른 도구가 처리하게 할 수 있으며, 테스트 실행·CI 확인·마이크 음소거 같은 개발자 매크로에 활용할 수 있습니다.

본문

음악용 MIDI 풋 컨트롤러를 Mac의 '추가 키보드'로 바꿔주는 도구가 Hacker News에 공개되었습니다. James Ryan이 만든 fcbnerd는 Behringer FCB1010 페달보드를 염두에 두고 개발했지만, 코드 어디에도 FCB1010 전용 로직이 없어 CoreMIDI 소스라면 무엇이든 연결됩니다. 발로 스위치를 밟으면 지정한 셸 명령이 실행되거나, 이벤트가 한 줄당 하나의 JSON 객체(JSONL)로 흘러나와 다른 프로그램이 의미를 결정하는 구조입니다.

설계: 읽기만 담당하고 실행은 외부에 위임

이 도구의 핵심 설계 판단은 권한 모델입니다. 키 입력이나 스크립트 실행처럼 Mac에 실제로 작용하는 행위는 샌드박스 앱이 얻기 어려운 권한을 필요로 하고, 사용자마다 원하는 액션도 다릅니다. 그래서 fcbnerd는 권한이 필요 없는 MIDI 읽기만 담당하고, 실제 액션은 사용자의 셸이나 Hammerspoon·Keyboard Maestro처럼 이미 접근 권한을 가진 도구에 맡깁니다. 설치는 Homebrew 탭(brew install JamesRyanATX/tap/fcbnerd) 또는 Xcode/Swift 툴체인으로 소스에서 swift build -c release하면 되며 macOS 13 이상이 필요합니다.

세 가지 서브커맨드와 바인딩 문법

기본 listen 모드는 모든 MIDI 소스(또는 --source로 이름이 포함된 소스만)에 연결해 이벤트를 스트리밍하며, 공연 중간에 인터페이스를 뽑았다 꽂아도 disconnected/connected 라인과 함께 스트림이 이어지는 핫플러그를 지원합니다. list는 현재 소스를 출력하고, simulate는 'fcbnerd simulator'라는 가상 MIDI 소스를 만들어 합성 버튼 누름·페달 스윕·SysEx를 반복 재생하므로 실물 페달 없이 소비자 프로그램을 개발할 수 있습니다.

바인딩은 PATTERN=COMMAND 형식입니다. CC 메시지는 1:20:127(채널:컨트롤러:값), 프로그램 체인지는 pc:1:7처럼 쓰고, 어느 자리든 *를 쓸 수 있어 1:30:*처럼 익스프레션 페달 전체 값 범위를 잡을 수 있습니다. 명령은 /bin/sh -c(또는 --shell로 지정한 셸)로 백그라운드 실행되며 MIDI_TYPE, MIDI_CHANNEL, MIDI_CONTROLLER, MIDI_VALUE, MIDI_PROGRAM, MIDI_SOURCE 같은 환경 변수를 받습니다. 매칭되는 바인딩이 여러 개면 모두 동시에 시작되고, 빠르게 두 번 밟으면 첫 실행이 안 끝나도 두 번 실행됩니다. 다만 페달 스윕은 예외로, 값이 *인 바인딩은 채널·컨트롤러당 한 번에 하나씩만 실행되고 실행 중에는 최신 값만 유지해 마지막에 최종 위치로 수렴합니다. 명령이 5초를 넘기거나 0이 아닌 코드로 종료하면 stderr에 알림이 나가고, fcbnerd 종료 시 실행 중인 명령에 SIGTERM을 보냅니다.

이벤트 스트림과 실전 예시

JSON 스트림은 pc, cc, note_on/off, poly_pressure, channel_pressure, pitch_bend, sysex, connected, disconnected 타입을내며, 각 객체에는 type·source·time(ISO 8601 UTC, 밀리초)이 공통으로 들어갑니다. MIDI 클록 같은 시스템 리얼타임 메시지는 방출되지 않고, 소비자는 모르는 타입과 필드를 무시해야 합니다. 소비자가 읽기를 멈추면 이벤트가 메모리에 큐잉되어 재개 시 한꺼번에 밀려오므로 즉시 읽어야 한다는 주의점도 명시되어 있습니다.

저장소의 examples/developer.sh는 열 개의 스위치에 테스트 실행, CI 대기, 브랜치 동기화, 마이크 음소거를 배정하고 익스프레션 페달로 출력 볼륨을 조절하는 완성된 개발자용 설정입니다. 프로그램 체인지로 macOS Space를 좌우 이동하는 jq 파이프라인 예시(접근성·자동화 권한 필요)와, hs.task로 스트림을 읽어 재생/일시정지와 볼륨을 제어하는 Hammerspoon Lua 코드도 제공됩니다.

FCB1010 하드웨어의 특성

소비자가 직접 처리해야 할 하드웨어 특성도 정리되어 있습니다. 스위치는 누를 때만 메시지를 보내고 뗄 때는 아무것도 보내지 않아 온/오프 토글은 소비자가 상태를 추적해야 하고, 프리셋에 따라 같은 스위치가 다른 CC 번호를내며, 스위치를 누르면 해당 프리셋의 익스프레션 페달 값도 재전송됩니다. 익스프레션 페달은 0–127 전체에 못 미치고 대략 3분의 2 범위만 커버하므로 실측 범위로 리스케일해야 하고, 5핀 DIN MIDI만 있어 USB MIDI 인터페이스가 필요합니다. 코드는 CoreMIDI 의존이 없어 하드웨어 없이 테스트되는 FCBNerdCore(UMP 디코딩·포매팅·바인딩 파싱)와 CLI 계층으로 나뉘며, MIT 라이선스입니다.

Hacker News 반응

  • @_def — 디버거 단축키 용도로 이런 걸 쓰면 재미있겠다고 생각해왔습니다.
  • @NewJazz — 멋지다며 Linux로도 가져오고 싶다는 반응입니다.
  • @wyre — SCC 기준 전체 2,500줄 정도라 선호하는 코딩 에이전트에 저장소를 넘기면 원하는 언어로 한두 번에 비슷한 걸 만들 수 있을 것이라고 평가했습니다.
  • @tetraodonpuffer — Linux에서는 Novation LaunchControl과 aseqdump로 비슷한 걸 구현해 버튼으로 데스크톱을 전환하고 있으며, 세션 시작 시 백그라운드로 띄워 쓰는 셸 스크립트를 공유했습니다.
  • @_kb — vim-pedal의 강화판 같다며 호평했습니다.

원문: Hacker News / 번역·요약: Trawling