fcbnerd: Biến bàn đạp MIDI Behringer FCB1010 thành bàn phím phụ cho macOS

Công nghệ14 tháng 9, 2026·5 phút đọc

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: 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 macOSfcbnerd - 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 connecteddisconnected 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 text và 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.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗