fcbnerd: Biến bàn đạp MIDI Behringer FCB1010 thành bàn phím phụ cho macOS
fcbnerd là công cụ dòng lệnh mã nguồn mở giúp kết nối bàn đạp MIDI Behringer FCB1010 với macOS, cho phép chạy lệnh shell hoặc xuất luồng JSON mỗi khi bàn đạp gửi tín hiệu. Công cụ này không yêu cầu quyền truy cập đặc biệt vì chỉ đọc dữ liệu MIDI, mở ra nhiều ứng dụng sáng tạo cho lập trình viên và nhạc sĩ.

fcbnerd: Biến bàn đạp MIDI Behringer FCB1010 thành bàn phím phụ cho macOS
fcbnerd - Công cụ kết nối bàn đạp MIDI với macOS
fcbnerd là một công cụ dòng lệnh mã nguồn mở mới cho macOS, cho phép bạn sử dụng bàn đạp MIDI Behringer FCB1010 (hoặc bất kỳ nguồn CoreMIDI nào) như một bàn phím phụ. Khi bạn giẫm lên công tắc hoặc đạp pedal, fcbnerd có thể chạy lệnh shell hoặc xuất ra luồng JSON để chương trình khác xử lý.
fcbnerd là gì và tại sao lại hữu ích?
fcbnerd được thiết kế để lấp đầy khoảng trống giữa phần cứng MIDI truyền thống và các tác vụ tự động hóa trên macOS. Thay vì phải viết ứng dụng phức tạp với quyền truy cập hệ thống, fcbnerd chỉ đọc tín hiệu MIDI — vốn không cần bất kỳ quyền đặc biệt nào — rồi chuyển tiếp sự kiện cho shell hoặc các công cụ đã có quyền như Hammerspoon hay Keyboard Maestro.
"Bất cứ thứ gì tác động lên máy Mac của bạn — như gõ phím hay chạy script — đều cần quyền mà ứng dụng sandbox không thể có. fcbnerd chỉ đọc MIDI, vốn không cần quyền gì cả."
Công cụ này đặc biệt hữu ích cho các nhạc sĩ, kỹ sư âm thanh hoặc lập trình viên muốn điều khiển máy tính bằng chân trong khi tay vẫn đang bận chơi nhạc cụ.
Cài đặt và sử dụng cơ bản
Cài đặt qua Homebrew:
brew trust --tap jamesryanatx/tap
brew install JamesRyanATX/tap/fcbnerd
Hoặc build từ mã nguồn (yêu cầu Xcode hoặc Swift toolchain, macOS 13+):
swift build -c release
cp .build/release/fcbnerd /usr/local/bin/
Sau khi cài đặt, bạn có thể chạy fcbnerd ở chế độ lắng nghe mặc định để xem tín hiệu MIDI đang được gửi đến:
fcbnerd -f text
Kết quả sẽ hiển thị thông tin như:
16:30:41.115 pc channel=1 program=7 bind=pc:1:7 [USB MIDI Interface]
16:30:41.115 cc channel=1 controller=20 value=127 bind=1:20:127 [USB MIDI Interface]
Gán lệnh cho từng nút bấm
Điểm mạnh của fcbnerd nằm ở khả năng gán lệnh shell cho từng mẫu tín hiệu MIDI. Cú pháp --bind 'PATTERN=COMMAND' cho phép bạn định nghĩa hành động cụ thể:
fcbnerd -q --bind '1:20:127=open ~/Downloads' --bind 'pc:1:0=say hello'
Mẫu PATTERN tuân theo định dạng CHANNEL:CONTROLLER:VALUE hoặc pc:CHANNEL:PROGRAM. Dấu hoa thị * đóng vai trò ký tự đại diện — ví dụ 1:27:* sẽ khớp với mọi giá trị của controller 27 trên kênh 1, rất phù hợp để gán pedal biểu cảm.
Ví dụ điều chỉnh âm lượng bằng pedal biểu cảm:
fcbnerd -q --bind '1:27:*=osascript -e "set volume output volume $((MIDI_VALUE * 100 / 127))"'
Các biến môi trường như MIDI_TYPE, MIDI_CHANNEL, MIDI_VALUE, MIDI_PROGRAM được truyền vào lệnh, giúp bạn dễ dàng xử lý logic phức tạp.
Xuất luồng JSON cho lập trình viên
Ngoài chế độ gán lệnh, fcbnerd còn có thể xuất mỗi sự kiện MIDI dưới dạng một đối tượng JSON trên một dòng. Điều này cho phép các chương trình khác — viết bằng Python, Node.js, Go hay bất kỳ ngôn ngữ nào — tiêu thụ luồng dữ liệu và quyết định hành động.
{"type":"connected","source":"UM-ONE","time":"2026-09-14T20:01:00.120Z"}
{"type":"pc","channel":1,"program":0,"source":"UM-ONE","time":"2026-09-14T20:01:02.345Z"}
{"type":"cc","channel":1,"controller":27,"value":84,"source":"UM-ONE","time":"2026-09-14T20:01:03.910Z"}
Các loại sự kiện được hỗ trợ bao gồm pc (program change), cc (control change), note_on, note_off, poly_pressure, channel_pressure, pitch_bend, sysex, cùng các sự kiện connected và disconnected khi thiết bị được cắm hoặc rút ra.
Tích hợp với Hammerspoon và các công cụ khác
fcbnerd hoạt động rất tốt khi kết hợp với Hammerspoon — một công cụ tự động hóa mạnh mẽ trên macOS. Bạn có thể dùng Lua để lắng nghe sự kiện và thực hiện các hành động như bật/tắt nhạc, điều chỉnh âm lượng, chuyển không gian làm việc:
local buffer = ""
fcbnerd = hs.task.new("/opt/homebrew/bin/fcbnerd", nil, function(_, stdout, _)
buffer = buffer .. stdout
for line in buffer:gmatch("([^\n]*)\n") do
local event = hs.json.decode(line)
if event and event.type == "pc" and event.program == 0 then
hs.eventtap.event.newSystemKeyEvent("PLAY", true):post()
hs.eventtap.event.newSystemKeyEvent("PLAY", false):post()
elseif event and event.type == "cc" and event.controller == 27 then
hs.audiodevice.defaultOutputDevice():setVolume(event.value / 127 * 100)
end
end
buffer = buffer:match("[^\n]*$")
return true
end)
fcbnerd:start()
Lưu ý khi dùng với Behringer FCB1010
Bàn đạp FCB1010 có một số đặc điểm cần lưu ý:
- Nhấn công tắc gửi một tín hiệu, nhả ra không gửi gì — hành vi bật/tắt phải do phía tiêu thụ tự theo dõi (ví dụ bằng cách toggle file trong
/tmp). - Các preset gốc gửi số CC khác nhau từ cùng một công tắc tùy theo preset đang hoạt động. Hãy chạy
fcbnerd -f textvà nhấn từng công tắc để ghi lại tín hiệu. - Pedal biểu cảm không đạt đủ dải 0–127 — một phần hành trình không gửi gì, dải quét chỉ chiếm khoảng hai phần ba giá trị, nên cần chuẩn hóa lại.
- FCB1010 chỉ có cổng MIDI DIN 5 chân, bạn cần một bộ chuyển đổi USB MIDI, thiết bị này sẽ hiện ra dưới tên nguồn MIDI.
Điểm đáng chú ý về kiến trúc
fcbnerd được viết bằng Swift và chia thành hai phần chính: FCBNerdCore giải mã Universal MIDI Packets của CoreMIDI, định dạng đầu ra và phân tích cú pháp binding — không phụ thuộc vào CoreMIDI nên có thể kiểm thử mà không cần phần cứng. fcbnerd là CLI xử lý kết nối CoreMIDI, hotplug và trình mô phỏng.
Công cụ hỗ trợ chế độ simulate tạo một nguồn MIDI ảo tên "fcbnerd simulator" phát các lần nhấn tổng hợp, quét pedal và thông điệp sysex theo vòng lặp — rất tiện để phát triển mà không cần cắm bàn đạp thật.
Với giấy phép MIT và mã nguồn mở hoàn toàn, fcbnerd là một ví dụ thú vị về cách kết hợp phần cứng âm nhạc truyền thống với tự động hóa hiện đại trên macOS.

