
MIDI (Musical Instrument Digital Interface) là một giao thức truyền thông kỹ thuật số được thiết kế để giao tiếp giữa các nhạc cụ điện tử, máy tính, và các thiết bị liên quan đến âm nhạc. Nó không truyền âm thanh mà chỉ gửi các lệnh điều khiển như:
- Ghi nhận phím bấm: Khi nào một phím đàn được nhấn hoặc thả.
- Cường độ (Velocity): Mức độ mạnh yếu của phím đàn.
- Thay đổi âm sắc (Control Change – CC): Điều chỉnh âm lượng, độ vang (reverb), độ ngân (sustain), v.v.
- Thay đổi chương trình (Program Change): Chuyển đổi giữa các âm sắc khác nhau (ví dụ: piano, violin, guitar điện…).
Xem thêm: Ethernet hoạt động như thế nào? Tất tần tật từ A đến Z
Cơ bản về MIDI
1. MIDI là gì?
MIDI (Musical Instrument Digital Interface) là một giao thức chuẩn để truyền dữ liệu nhạc dưới dạng kỹ thuật số. Nó không chứa âm thanh thực tế mà chỉ gửi đi các thông điệp MIDI (MIDI messages) để điều khiển nhạc cụ điện tử hoặc phần mềm âm nhạc.
Ví dụ: Khi bạn nhấn một phím trên bàn phím MIDI, nó không phát ra âm thanh trực tiếp mà chỉ gửi thông điệp “đã nhấn phím nào, lực nhấn bao nhiêu, giữ bao lâu” đến thiết bị khác (như sound module hoặc phần mềm) để phát ra âm thanh tương ứng.
2. Cách hoạt động của MIDI
MIDI truyền dữ liệu theo dạng luồng bit một chiều với tốc độ 31.25 Kbit/s, trong đó mỗi byte dữ liệu gồm 10 bit (1 bit bắt đầu, 8 bit dữ liệu, 1 bit kết thúc).
Mỗi thiết bị MIDI thường có 3 cổng kết nối chính:
- MIDI IN: Nhận dữ liệu từ thiết bị khác.
- MIDI OUT: Gửi dữ liệu đến thiết bị khác.
- MIDI THRU: Lặp lại dữ liệu từ MIDI IN để truyền tiếp đến các thiết bị khác.
Ví dụ:
- Bàn phím MIDI gửi dữ liệu qua MIDI OUT đến sound module thông qua MIDI IN.
- Sound module nhận lệnh và phát âm thanh tương ứng.

3. Thiết bị trong hệ thống MIDI

- MIDI Controller (Bộ điều khiển MIDI)
- Đây là thiết bị để bạn chơi nhạc, ví dụ như bàn phím MIDI hoặc bộ điều khiển pad.
- Nó không phát ra âm thanh mà chỉ gửi tín hiệu MIDI (ví dụ: “nhấn phím C4”, “đánh trống”).
- MIDI Sequencer (Bộ thu và phát MIDI)
- Đây là thiết bị hoặc phần mềm giúp ghi lại, chỉnh sửa và phát lại dữ liệu MIDI.
- Ví dụ: Bạn chơi piano trên bàn phím MIDI, sequencer sẽ lưu lại cách bạn chơi. Sau đó, bạn có thể phát lại hoặc chỉnh sửa nốt nhạc mà không cần chơi lại.
- Sound Module/Synthesizer (Bộ tạo âm thanh)
- Đây là thiết bị nhận tín hiệu MIDI từ controller hoặc sequencer và tạo ra âm thanh thực tế.
- Ví dụ: Một sound module có thể biến tín hiệu “C4” thành tiếng piano, guitar, hoặc trống tuỳ theo cài đặt.
4. MIDI Channels (Kênh MIDI)
Một kết nối MIDI duy nhất (chỉ cần một dây cáp MIDI) có thể truyền dữ liệu trên 16 kênh MIDI khác nhau (từ kênh 1 đến 16). Điều này cho phép một thiết bị có thể phát nhiều âm thanh khác nhau cùng lúc.
Ví dụ:
- Kênh 1: Piano
- Kênh 5: Bass
- Kênh 10: Trống (Theo chuẩn, trống luôn được đặt trên kênh 10)
Nếu một sound module hỗ trợ đa âm sắc (multitimbral), nó có thể nhận nhiều kênh MIDI cùng lúc và chơi nhiều loại nhạc cụ khác nhau đồng thời.
5. Hệ thống MIDI trên PC

Hệ thống này sử dụng máy tính (PC) làm trung tâm để xử lý và phát nhạc MIDI. Trong hệ thống này, máy tính được trang bị card giao tiếp MIDI (MIDI interface card) để gửi dữ liệu MIDI đến bộ tổng hợp âm thanh (synthesizer) bên ngoài.
Nói dễ hiểu: Máy tính không tự tạo ra âm thanh MIDI mà chỉ gửi dữ liệu MIDI đến một thiết bị khác (sound module/synthesizer), và thiết bị này sẽ phát ra âm thanh.
Xem thêm: Tìm hiểu FlexRay – Giao thức truyền thông thế hệ mới cho xe hơi
a. Nguyên lý hoạt động
Phần mềm trên máy tính (phần mềm sáng tác nhạc, game, trình chiếu, v.v.) tạo ra dữ liệu MIDI.
Card MIDI trong máy tính nhận dữ liệu này và chuyển thành tín hiệu MIDI chuẩn.
Sound module bên ngoài hoặc sound card trong máy tính sẽ nhận tín hiệu MIDI và phát ra âm thanh thực tế.
Âm thanh cuối cùng được phát ra qua loa hoặc tai nghe.
b. Các kiểu hệ thống MIDI trên PC
Cách 1: Máy tính có card MIDI riêng và sử dụng sound module bên ngoài (âm thanh chất lượng cao). Cách 2: Máy tính dùng sound card có MIDI tích hợp (âm thanh phụ thuộc vào chất lượng sound card). Cách 3: Máy tính sử dụng phần mềm giả lập sound module thay vì cần thiết bị phần cứng.
Phần cứng
1. Tốc độ truyền dữ liệu của MIDI
MIDI sử dụng giao tiếp nối tiếp với tốc độ 31.25 Kbps (±1%). Mỗi byte dữ liệu truyền đi sẽ gồm:
• 1 bit Start (Luôn là 0 – bật dòng điện)
• 8 bit dữ liệu (D0 – D7)
• 1 bit Stop (Luôn là 1 – tắt dòng điện)
Tổng cộng mỗi byte sẽ gồm 10 bit và mất 320 micro giây để truyền.
Dữ liệu được gửi theo thứ tự LSB trước (Least Significant Bit – Bit thấp nhất truyền trước).
2. Cấu trúc phần cứng giao tiếp MIDI

• Dòng điện hoạt động: 5mA (dạng vòng lặp dòng điện – Current Loop)
• MIDI sử dụng Opto-isolator để cách ly mạch điện giữa thiết bị gửi và nhận, giúp tránh nhiễu và lỗi tín hiệu.
Opto-isolator hoạt động như thế nào?
• Dữ liệu MIDI đến MIDI IN, đi qua đèn LED trong opto-isolator.
• Một cảm biến quang học đọc ánh sáng từ LED và chuyển thành tín hiệu điện.
• Điều này giúp bảo vệ mạch MIDI khỏi nhiễu điện và vòng lặp dòng điện.
Một số opto-isolator phổ biến:
• Sharp PC-900
• HP 6N138
Yêu cầu của opto-isolator trong MIDI:
• Dòng điện kích hoạt < 5mA.
• Thời gian lên/xuống tín hiệu < 2 micro giây.
3. Cổng kết nối và dây cáp MIDI

MIDI sử dụng cổng DIN 5 chân (180 độ) để truyền tín hiệu.
MIDI Cable Wiring | ||
First Connector | Cable | Second Connector |
Pin 1 | No Connection | Pin 1 |
Pin 2 | Shield | Pin 2 |
Pin 3 | No Connection | Pin 3 |
Pin 4 | Voltage Reference Line | Pin 4 |
Pin 5 | Data Line | Pin 5 |
4. MIDI Input (Cổng Nhận MIDI)
Chức năng:
- Nhận tín hiệu MIDI từ nhạc cụ hoặc thiết bị MIDI khác.
- Cách ly điện để tránh nhiễu và bảo vệ mạch điện.
- Chuyển đổi tín hiệu MIDI thành tín hiệu điện tử để vi điều khiển xử lý.
Tại sao cần Opto-Isolator?
- Opto-isolator là thành phần cách ly quang học, giúp tránh kết nối điện trực tiếp giữa thiết bị MIDI gửi và nhận.
- Nó hoạt động bằng cách:
- Đèn LED bên trong phát sáng khi có tín hiệu đến.
- Phototransistor nhận ánh sáng, biến nó thành tín hiệu điện tử.
- Vì LED và transistor không tiếp xúc điện trực tiếp, chúng giúp cách ly mạch điện của hai thiết bị.
Xem thêm: Tối ưu quản lý năng lượng hệ thống nhúng với giao thức PMBus
5. MIDI Output (Cổng Gửi MIDI)
Chức năng:
- Gửi dữ liệu MIDI từ thiết bị điều khiển đến nhạc cụ hoặc máy tính.
- Kết nối trực tiếp với UART (cổng truyền dữ liệu nối tiếp).
Cấu tạo phần cứng của MIDI Output
- Đường truyền UART từ vi điều khiển → qua một cặp cổng đảo (logic inverter) → MIDI OUT.
- Tại sao cần cổng đảo?
- Trong các vi điều khiển đời cũ, chân I/O không đủ mạnh để kích hoạt LED trong opto-isolator.
- Cặp cổng đảo giúp tăng dòng điện, đảm bảo tín hiệu MIDI đủ mạnh.
- Nếu có lỗi ngắn mạch hoặc tĩnh điện (ESD), cổng đảo chịu trách nhiệm bảo vệ mạch chính (giống như cầu chì bảo vệ).
Lưu ý trên vi điều khiển hiện đại (VD: AVR, STM32):
- Các vi điều khiển hiện nay có chân I/O mạnh hơn, có thể bỏ qua cổng đảo và điều khiển trực tiếp.
- Tuy nhiên, dùng bộ đệm vẫn tốt vì nó bảo vệ vi điều khiển khỏi hư hại do lỗi kết nối.
6. MIDI Thru (Cổng Lặp MIDI)
Chức năng:
- Sao chép y nguyên tín hiệu từ MIDI Input sang thiết bị khác.
- Giúp kết nối nhiều nhạc cụ theo chuỗi (daisy-chain).
Cách hoạt động:
- MIDI Thru không lấy dữ liệu từ vi điều khiển mà từ tín hiệu nhận được tại MIDI Input.
- Điều này giúp dữ liệu đi thẳng từ thiết bị gửi đến nhiều thiết bị nhận, giảm độ trễ khi xử lý qua vi điều khiển.
Lưu ý khi dùng MIDI Thru:
- Nếu có quá nhiều thiết bị nối chuỗi (VD: hơn 3-4 thiết bị), tín hiệu có thể bị suy giảm.
- Opto-isolator chậm có thể làm méo tín hiệu, gây lỗi truyền dữ liệu.
Giải pháp:
• Dùng opto-isolator nhanh hơn (VD: 6N138).
• Dùng thiết bị MIDI hub chuyên dụng để phân luồng tín hiệu tốt hơn.
Data format
Trong giao tiếp MIDI, dữ liệu được truyền dưới dạng các tin nhắn (messages), mỗi tin nhắn gồm nhiều byte. Các byte này có thể là:
- Status Byte (Byte trạng thái): Xác định loại tin nhắn.
- Data Byte (Byte dữ liệu): Chứa thông tin thực tế (VD: cao độ nốt nhạc, vận tốc nhấn phím).
- Real-Time và Exclusive messages là ngoại lệ, không tuân theo cấu trúc tiêu chuẩn.
Xem thêm: System Management Bus (SMBus) trong hệ thống nhúng
1. Các loại bytes

Mỗi tin nhắn MIDI có ít nhất 1 byte trạng thái, theo sau là 1 hoặc 2 byte dữ liệu.
Byte trạng thái (Status Byte) luôn có giá trị từ 80H đến FFH (bit cao nhất = 1).
Byte dữ liệu (Data Byte) có giá trị từ 00H đến 7FH (bit cao nhất = 0).
2. Các Loại Tin Nhắn MIDI

MIDI có 5 loại tin nhắn chính, phục vụ cho nhiều mục đích khác nhau: Channel Voice, Channel Mode, System Common, System Real-Time and System Exclusive.
Chi tiết về các loại byte trong MIDI
1. Status Byte – Byte Trạng Thái
Là byte đầu tiên trong mỗi tin nhắn MIDI, xác định loại dữ liệu được gửi đi.
Đặc Điểm Của Status Byte:
- Là số nhị phân 8-bit.
- Bit cao nhất (MSB – Most Significant Bit) luôn là 1 (Từ 10000000 đến 11111111, tức 80H đến FFH trong hệ thập lục phân).
- Xác định loại tin nhắn (VD: Note On, Note Off, Control Change,…).
- Khi một thiết bị nhận Status Byte, nó sẽ thiết lập chế độ xử lý dữ liệu mới.
a. Running Status – Trạng Thái Chạy Liên Tục
Giúp giảm lượng dữ liệu truyền đi khi gửi nhiều lệnh liên tiếp (đặc biệt với Note On/Off).
Cách Hoạt Động:
- Sau khi nhận một Status Byte, MIDI giữ nguyên trạng thái đó cho đến khi có một Status Byte mới.
- Nếu cần gửi cùng một Status Byte liên tục, có thể bỏ qua nó và chỉ gửi Data Bytes.
- Giúp giảm số byte truyền tải, tối ưu cho các Note On/Off liên tiếp.
Ví dụ Running Status:
Không sử dụng Running Status (gửi cả Status Byte lặp lại):90 3C 40 90 3E 40 90 40 40 90 41 40
• 90 (Note On, Kênh 1), 3C (C4), 40 (Velocity 64)
• 90 (Note On, Kênh 1), 3E (D4), 40 (Velocity 64)
• 90 (Note On, Kênh 1), 40 (E4), 40 (Velocity 64)
• 90 (Note On, Kênh 1), 41 (F4), 40 (Velocity 64)
Sử dụng Running Status (giảm số byte truyền tải):90 3C 40 3E 40 40 40 41 40
• Lần đầu gửi 90 3C 40 (Note On C4).
• Lần sau, không cần gửi 90 nữa, chỉ gửi 3E 40, 40 40, 41 40.
b. Unimplemented Status – Trạng Thái Không Hỗ Trợ
Nếu một thiết bị MIDI nhận được một Status Byte không hỗ trợ, nó nên bỏ qua.
Ví dụ: Một cây đàn MIDI chỉ hỗ trợ Note On/Off nhưng nhận được một System Exclusive (F0H) ⇒ Bỏ qua.
c. Undefined Status – Trạng Thái Không Xác Định
Tránh gửi các mã trạng thái không được quy định trong MIDI.
Nếu một thiết bị nhận được Status Byte không hợp lệ, nó nên bỏ qua thay vì gây lỗi hệ thống.
Cảnh báo: Trong quá trình bật/tắt nguồn, thiết bị MIDI không được gửi dữ liệu rác, vì điều này có thể gây lỗi dữ liệu.
2. Data Byte – Byte Dữ Liệu
Chứa thông tin thực tế của tin nhắn MIDI (cao độ, vận tốc, điều khiển hiệu ứng,…).
Đặc Điểm Của Data Byte:
• Là số nhị phân 8-bit.
• Bit cao nhất (MSB) luôn là 0 (00000000 đến 01111111, tức 00H đến 7FH).
• Mỗi Status Byte yêu cầu 1 hoặc 2 Data Bytes.

Lưu ý:
• Data Byte KHÔNG thể xuất hiện trước Status Byte.
• Số lượng Data Byte phải chính xác. Nếu thiếu, thiết bị chờ dữ liệu trước khi thực hiện lệnh.
Xem thêm: Tổng quan về Inter-Integrated Circuit (I2C)
Channel voice meassages
Đây là nhóm lệnh chính trong giao tiếp MIDI, dùng để truyền thông tin về việc chơi nhạc giữa các thiết bị MIDI.
Lệnh | Mã Status Byte | Ý nghĩa |
Note-Off | 8nH | Tắt nốt nhạc |
Note-On | 9nH | Bật nốt nhạc |
Poly Key Pressure | AnH | Cảm ứng lực nhấn đa nốt |
Control Change | BnH | Điều khiển tham số MIDI |
Program Change | CnH | Thay đổi nhạc cụ |
Channel Pressure | DnH | Cảm ứng lực nhấn đơn kênh |
Pitch Bend | EnH | Điều chỉnh cao độ |
Chú thích về n trong 8nH, 9nH, …: n là số kênh MIDI (từ 0 đến 15). Ví dụ, 90H là lệnh “Note-On” trên kênh 1, còn 91H là trên kênh 2.
Mỗi Note-On (bật nốt) có 3 byte, mất 960 µs để truyền. Nếu chơi nhiều nốt cùng lúc, tổng thời gian truyền có thể kéo dài đến vài mili-giây, gây ra độ trễ (lag). MIDI có thể bị chậm khi truyền nhiều lệnh liên tục, ảnh hưởng đến âm thanh.
Sử dụng Running Status khi gửi nhiều Note-On hoặc Note-Off, ta không cần lặp lại Status Byte. Giúp tiết kiệm dữ liệu và giảm trễ.
1. Note Number (Số hiệu nốt nhạc)
Mỗi nốt nhạc trên bàn phím có một mã số riêng, giống như địa chỉ của từng phím đàn.
Ví dụ:
- Middle C (Đô giữa) có số 60.
- Nốt Đô cao hơn (C5) có số 72.
- Nốt Đô thấp hơn (C3) có số 48.
Khi bạn nhấn một phím, MIDI sẽ gửi số của nốt đó để xác định nó là nốt nào.

2. Velocity (Lực nhấn mạnh hay nhẹ)
Byte Velocity thể hiện cường độ nhấn của phím đàn:
- Giá trị cao (127) → Âm thanh mạnh, to.
- Giá trị trung bình (64) → Âm thanh vừa (mezzo-forte).
- Giá trị thấp (1-10) → Âm thanh nhẹ.
- Giá trị 0 → Được dùng để tắt nốt nhạc.
Một số nhạc cụ sử dụng Velocity để điều chỉnh âm lượng theo công thức hàm mũ (exponential).
Nếu đàn không hỗ trợ Velocity, mặc định sẽ dùng giá trị 64 (40H).
Velocity | Mức độ âm thanh |
1-20 | Rất nhẹ (pianissimo – pp) |
21-50 | Nhẹ (piano – p) |
51-80 | Trung bình (mezzo-forte – mf) |
81-110 | Mạnh (forte – f) |
111-127 | Rất mạnh (fortissimo – ff) |

Xem thêm: Giao thức SDIO (Secure Digital Input Output) Là Gì?
3. Note-Off (Tắt nốt nhạc)
Có 2 cách chính để tắt một nốt trong MIDI:
• Gửi lệnh Note-Off (8nH) → Cách này ít được dùng vì tốn dữ liệu hơn.
• Gửi lệnh Note-On với Velocity = 0 (9nH, Velocity = 0) → Cách phổ biến hơn, giúp tối ưu dữ liệu.
Tại sao nên dùng “Note-On với Velocity = 0” để tắt nốt?
• Khi dùng Running Status, chỉ cần gửi Data Bytes, tiết kiệm băng thông.
• MIDI không cần gửi lại Status Byte, giúp phản hồi nhanh hơn.
4. Control Change (CC)
Control Change (CC) là một loại tin nhắn MIDI dùng để điều chỉnh âm thanh theo thời gian thực bằng cách sử dụng các bộ điều khiển như:
• Cần gạt (fader)
• Nút xoay (knob)
• Bánh xe (modulation wheel)
• Pedal (như sustain pedal)
Nó không dùng để thay đổi các tham số kỹ thuật của bộ tổng hợp (synth) như tần số cắt (VCF Cut-off) hay tốc độ suy giảm (Envelope Decay). Tuy nhiên, có một số ngoại lệ như Bank Select và RPN/NRPN.
Mỗi tin nhắn CC có 3 phần:
Bố cục: Bn XX YY
Bn
= B là mã Control Change (B0 – BF),n
là số kênh (0-15)XX
= Số CC (cái gì sẽ thay đổi, ví dụ 7 là âm lượng)YY
= Giá trị (mức độ thay đổi, từ 0 đến 127)
5. Program Change
Program Change là tin nhắn MIDI dùng để chuyển đổi âm sắc (patch, preset, sound) trên một nhạc cụ MIDI.
Ví dụ: Bạn đang chơi đàn piano điện tử và muốn chuyển từ âm sắc Grand Piano sang Electric Guitar. Khi nhấn nút chọn âm sắc, đàn sẽ gửi một Program Change Message đến thiết bị nhận MIDI để đổi sang âm thanh mới.
Cấu trúc tin nhắn Program Change: 0xCn, 0xpp
• 0xC → Mã lệnh Program Change (C0 – CF)
• n → Kênh MIDI (0-15)
• pp → Số hiệu chương trình (0-127)
Một thiết bị MIDI có thể chứa hàng trăm âm sắc (tiếng nhạc cụ khác nhau). Nhưng Program Change chỉ có 128 giá trị (0-127), nên không thể chọn quá 128 âm sắc. Để khắc phục, Bank Select (CC #0 và CC #32) được sử dụng để nhóm âm sắc thành ngân hàng (banks). CC #0 (Bank Select MSB) chọn nhóm ngân hàng lớn, CC #32 (Bank Select LSB) chọn ngân hàng nhỏ hơn.
Giả sử bạn có một bàn phím điện tử (keyboard) chứa 256 âm sắc:
- Bank 0: chứa 128 âm sắc đầu tiên (Piano, Violin, Guitar, v.v.).
- Bank 1: chứa 128 âm sắc tiếp theo (Synth, Organ, Pad, v.v.).
Nếu chỉ có Program Change, bạn chỉ có thể chọn từ 128 âm sắc đầu tiên.
Muốn chọn âm sắc trong Bank 1, bạn cần gửi CC #0 = 1 để đổi sang Bank 1, rồi mới gửi Program Change.
Chọn Bank 1 và Program 5 (âm sắc số 133):B0 00 01 (CC #0 - Chọn Bank 1)
C0 05 (Program Change 5 - Chọn âm sắc số 133 trong Bank 1)
Giải thích:
• B0 00 01
→ Chọn Bank 1.
• C0 05
→ Chọn âm sắc số 5 trong Bank 1 (tức âm sắc số 133 (vì số thứ tự tổng=(Bank Number×128) + Program Number = (1×128) + 5=133) trong tổng số 256 âm sắc).
Xem thêm: Tổng quan về CAN Flexible Data-rate (CAN FD)
6. Pitch Bend Change
Pitch Bend Change là một bộ điều khiển đặc biệt giúp làm thay đổi cao độ của nốt nhạc một cách mượt mà. Nó hoạt động khác với Note-On/Off, vì thay vì nhảy từ một nốt này sang nốt khác, nó giúp bẻ cong (bend) âm thanh liên tục lên hoặc xuống.
Pitch Bend luôn gửi 14-bit dữ liệu (2 byte), tức là có 16.384 mức độ khác nhau.
Pitch Bend có định dạng sau: 0xnc, 0xLL, 0xMM
Trong đó:
0xnc
→ Byte trạng thái (Status Byte)0xE
là mã lệnh dành cho Pitch Bend.c
là số kênh MIDI (0 → 15, tương ứng với kênh 1 → 16).
0xLL
→ 7 bit thấp (LSB – Least Significant Byte) của giá trị Pitch Bend.0xMM
→ 7 bit cao (MSB – Most Significant Byte) của giá trị Pitch Bend.
Công thức tính giá trị Pitch Bend: Giá trị tổng = (MSB×128) + LSB.
Cao độ | Giá trị MSB | Giá trị LSB | Giá trị Tổng |
Bẻ xuống tối đa | 0 | 0 | 0 |
Vị trí trung tâm (không ảnh hưởng đến cao độ) | 64 | 0 | 8192 |
Bẻ lên tối đa | 127 | 127 | 16.383 |
7. Aftertouch (Cảm ứng sau)
Aftertouch là tín hiệu MIDI được gửi khi bạn ấn phím mạnh hơn hoặc di chuyển ngang sau khi đã nhấn xuống hoàn toàn. Điều này giúp điều chỉnh hiệu ứng âm thanh như tăng âm lượng, thay đổi sắc thái (timbre), tạo rung (vibrato), v.v.
Có 2 loại Aftertouch:
a. Channel Pressure (Aftertouch toàn kênh)
- Mã lệnh:
Dn, 0vvvvvvv
- Ảnh hưởng toàn bộ nốt nhạc đang phát trên kênh MIDI đó.
- Ứng dụng: Phù hợp với đàn không hỗ trợ cảm ứng từng nốt riêng lẻ.
Ví dụ:
0xD3, 0x40
0xD3
→ Aftertouch (0xD) trên kênh 4.0x40
→ Giá trị cảm ứng 64 (trong khoảng 0 – 127).
Tất cả các nốt trên kênh 4 sẽ nhận hiệu ứng Aftertouch cùng mức 64.
b. Polyphonic Key Pressure (Aftertouch riêng từng nốt)
- Mã lệnh:
An, 0kkkkkkk, 0vvvvvvv
- Ảnh hưởng từng nốt nhạc cụ thể.
- Ứng dụng: Phù hợp với bàn phím MIDI cao cấp hoặc các nhạc cụ có cảm ứng lực riêng từng nốt.
Ví dụ:
0xA2, 0x3C, 0x50
0xA2
→ Aftertouch riêng trên kênh 3.0x3C
→ Nốt C4 (Số 60 – Middle C).0x50
→ Giá trị cảm ứng 80 (trong khoảng 0 – 127).
Chỉ nốt C4 trên kênh 3 bị ảnh hưởng với lực Aftertouch là 80.
Xem thêm: Fritzing Cơ Bản: Hướng dẫn chi tiết vẽ mạch trực quan
Channel mode messages
Channel Mode Messages là các lệnh điều khiển cách một nhạc cụ MIDI phản hồi với các tin nhắn MIDI tiếp theo.
Chúng sử dụng cùng mã trạng thái (Status Byte) với Control Change (BnH), nhưng có giá trị số thứ hai từ 121 đến 127 để xác định loại lệnh.
Các lệnh Channel Mode Messages phổ biến:
Lệnh | Giá trị (Dec) | Chức năng |
All Sound Off | 120 | Tắt toàn bộ âm thanh ngay lập tức |
Reset All Controllers | 121 | Đặt lại tất cả bộ điều khiển về mặc định |
Local Control | 122 | Bật/tắt kết nối giữa bàn phím và âm thanh của chính nó |
All Notes Off | 123 | Dừng tất cả các nốt đang phát nhưng không ảnh hưởng đến sustain |
Omni Off | 124 | Chỉ nhận tín hiệu MIDI từ một kênh cụ thể |
Omni On | 125 | Nhận tín hiệu từ tất cả các kênh MIDI |
Mono On (Poly Off) | 126 | Chuyển về chế độ Mono (chỉ phát 1 nốt mỗi kênh) |
Poly On (Mono Off) | 127 | Chuyển về chế độ Poly (phát nhiều nốt trên một kênh) |
1. All Sound Off (120)
Tắt toàn bộ âm thanh ngay lập tức, bất kể sustain hay release.
Ví dụ: Nếu bạn đang giữ pedal sustain hoặc bị lỗi kẹt nốt, gửi lệnh này sẽ tắt tất cả âm thanh ngay lập tức.
2. Reset All Controllers (121)
Đặt lại tất cả các bộ điều khiển về giá trị mặc định (ví dụ: modulation, pitch bend, sustain, v.v.).
Ví dụ: Nếu bạn thay đổi pitch bend hoặc filter cutoff và muốn đưa nó về ban đầu, lệnh này sẽ đặt lại toàn bộ về mặc định.
3. Local Control (122)
Kiểm soát kết nối giữa bàn phím MIDI và bộ xử lý âm thanh bên trong nó.
- Local Control On: Khi bạn nhấn phím đàn, nó phát âm thanh từ chính đàn đó.
- Local Control Off: Đàn không phát âm thanh nội bộ, chỉ gửi tín hiệu MIDI đến thiết bị khác.
Ví dụ: Khi sử dụng bàn phím MIDI để điều khiển phần mềm DAW, bạn tắt Local Control để tránh âm thanh bị lặp lại hai lần (từ đàn và từ DAW).
4. All Notes Off (123)
Dừng toàn bộ các nốt đang phát, nhưng không tắt sustain nếu pedal đang được nhấn.
Ví dụ: Nếu bạn chơi một đoạn nhạc và muốn tắt tất cả nốt mà không làm gián đoạn âm thanh sustain, lệnh này sẽ hữu ích.
5. Omni On/Off (124-125)
Điều chỉnh cách nhạc cụ MIDI nhận tín hiệu từ các kênh MIDI
- Omni On (125) → Nhận tất cả tín hiệu từ mọi kênh MIDI (1-16).
- Omni Off (124) → Chỉ nhận tín hiệu từ một kênh MIDI cụ thể.
Ví dụ:
- Nếu bạn muốn nhạc cụ nhận tất cả dữ liệu MIDI từ bất kỳ kênh nào, bật Omni On.
- Nếu bạn muốn nhạc cụ chỉ nhận từ một kênh cụ thể, bật Omni Off.
Xem thêm: Cách Tạo Linh Kiện Mới Trong Fritzing: Hướng Dẫn Từ A Đến Z
6. Mono On / Poly On (126-127)
Chọn chế độ phát âm thanh đơn âm hay đa âm:
- Mono On (126) → Chỉ chơi một nốt tại một thời điểm trên mỗi kênh MIDI.
- Poly On (127) → Chơi nhiều nốt cùng lúc trên mỗi kênh MIDI.
Ví dụ:
- Mono phù hợp với synth lead, bass, trumpet, v.v. (vì các nhạc cụ này thường chỉ phát một nốt một lúc).
- Poly phù hợp với piano, strings, pads, v.v. (cần phát nhiều nốt cùng lúc).

Xem thêm: Tìm hiểu về Universal Serial Bus (USB)
System common meassages
System Common Messages là một nhóm tin nhắn MIDI được dùng để đồng bộ hóa và kiểm soát trình phát nhạc. Dưới đây là danh sách các lệnh chính và cách hoạt động của chúng:
1. MIDI Time Code Quarter Frame (F1H)
- Được dùng để đồng bộ hóa thiết bị MIDI theo chuẩn MIDI Time Code (MTC).
- MTC sử dụng hai loại tin nhắn chính:
- Quarter Frame: Gửi thông tin về thời gian (Frame, Giây, Phút, Giờ) theo chuỗi 8 tin nhắn.
- Full Frame: Một tin nhắn System Exclusive (SysEx) chứa toàn bộ thông tin thời gian.
2. Song Position Pointer (F2H)
- Xác định vị trí trong bài hát (tính bằng số MIDI beats từ đầu bài hát).
- 1 beat = 6 MIDI clocks.
- Được dùng để bắt đầu phát lại từ một vị trí bất kỳ, thay vì từ đầu.
- Công thức tính vị trí phát lại:
Song Position Pointer × 6 × sequencer time base- Ví dụ: Nếu Song Position Pointer = 10
- 10×6=60 MIDI clocks
- Nếu time base của sequencer là 96 clocks per beat, thì:60×4=240 → Playback bắt đầu từ 240 clock ticks trong bài hát.
- Ví dụ: Nếu Song Position Pointer = 10
Ví dụ minh hoạ:
Hãy tưởng tượng bài hát giống như một quyển sách, và mỗi MIDI clock giống như một từ trong quyển sách đó.
- MIDI Clocks = Từng từ trong sách
- Giá trị SPP = Số trang
Ví dụ 1: Phát lại bình thường
- Khi bạn nhấn Start (FA), bài hát sẽ phát từ từ đầu tiên (MIDI clock 0).
- Nó sẽ phát từng từ, từng trang một, từ đầu đến cuối.
Ví dụ 2: Nhảy đến một vị trí cụ thể bằng SPP
- Giả sử bạn đang đọc sách và dừng lại ở trang 10, bây giờ bạn muốn đọc tiếp từ đó.
- Bạn gửi lệnh SPP = 10.
- Hệ thống sẽ nhảy đến trang 10 (tương đương với MIDI clock 10 × 6 = 60) và chờ.
- Khi bạn nhấn Continue (FB), bài hát sẽ phát lại từ trang 10 (MIDI clock 61).
Ví dụ 3: Điều gì xảy ra nếu SPP = 4 thay vì 10?
- Nếu SPP = 4, bài hát sẽ nhảy đến trang 4 (MIDI clock 4 × 6 = 24) thay vì trang 10.
- Khi bạn nhấn Continue (FB), bài hát sẽ phát tiếp từ MIDI clock 24.
Vậy nên, SPP cho phép bạn “nhảy” đến một vị trí trong bài hát, giống như mở một quyển sách và đọc từ một trang cụ thể thay vì phải đọc từ đầu.
3. Song select (Lựa chọn bài hát)
- Chức năng:
- Xác định bài hát hoặc đoạn nhạc nào sẽ được phát khi nhận lệnh Start (FA).
- Dùng trong sequencer hoặc máy trống điện tử (drum machine) có khả năng lưu nhiều bài hát.
- Nếu thiết bị không ở chế độ MIDI Sync, thì nó phớt lờ lệnh này.
4. Tune request (Yêu cầu điều chỉnh âm thanh)
- Dùng trong:
- Synthesizer analog để yêu cầu chỉnh lại tần số của bộ dao động (oscillator tuning).
- Không có dữ liệu đi kèm, chỉ đơn giản là gửi tín hiệu yêu cầu chỉnh âm.
5. EOX (End of Exclusive – Kết thúc chuỗi dữ liệu độc quyền)
- Chức năng:
- Đánh dấu kết thúc một thông điệp System Exclusive (Sysex).
- Sysex bắt đầu bằng F0H và có thể chứa nhiều byte dữ liệu. Nó chỉ kết thúc khi:
- Nhận được EOX (F7H)
- Nhận được bất kỳ Status Byte nào khác (trừ Real-Time Messages)
- Lưu ý quan trọng:
- Sau khi gửi Sysex, cần gửi ngay một Status Byte để đảm bảo thiết bị nhận không bị “treo”.
- Real-Time Messages có thể xuất hiện trong Sysex mà không kết thúc nó.
Xem thêm: Tìm hiểu về Digital-to-Analog Converter (DAC)
System real time messages
System Real-Time Messages Là các tín hiệu thời gian thực để đồng bộ các thiết bị MIDI có cơ chế dựa trên xung nhịp (clock). Không phụ thuộc vào số kênh MIDI (không có Channel Number). Có thể được gửi bất kỳ lúc nào, kể cả khi thiết bị MIDI đang xử lý dữ liệu khác. Các lệnh Real-Time không làm gián đoạn các lệnh MIDI khác.
Lệnh MIDI | Mã Hex | Chức năng |
Timing Clock | F8H | Đồng bộ hóa hệ thống MIDI, gửi 24 tín hiệu mỗi nốt đen để giữ nhịp. |
Start | FAH | Bắt đầu phát nhạc từ đầu khi nhấn nút PLAY trên thiết bị chính. |
Continue | FBH | Tiếp tục phát nhạc từ vị trí đã dừng khi nhận được tín hiệu Timing Clock. |
Stop | FCH | Dừng phát nhạc ngay lập tức khi nhấn nút STOP. |
1. Start hoặc continue meassages

- Khi một thiết bị nhận Start (FAH) hoặc Continue (FBH) trong chế độ đồng bộ MIDI (MIDI Sync mode), nó sẽ không bắt đầu phát ngay lập tức. Thay vào đó, nó chờ đến tín hiệu Timing Clock (F8H) tiếp theo mới bắt đầu chạy.
- Khoảng thời gian giữa lệnh Start (FAH) và Timing Clock (F8H) nên cách nhau ít nhất 1ms để thiết bị có thời gian xử lý.
- Tuy nhiên, thiết bị phải có khả năng phản hồi ngay lập tức khi nhận được Timing Clock (F8H) sau Start hoặc Continue.
- Nếu thiết bị chạy theo đồng hồ nội bộ của chính nó (không ở chế độ MIDI Sync), nó có thể bỏ qua các lệnh Start, Stop, Continue, hoặc tự quyết định có phản hồi hay không. Điều này tùy thuộc vào cách thiết kế của nhà sản xuất.
2. Stop meassage
Khi bộ sequencer dừng, nó phải gửi lệnh Stop (FCH) ngay lập tức để các thiết bị đồng bộ cũng dừng theo. Vị trí hiện tại của bài hát trong sequencer không thay đổi khi lệnh Stop được gửi. Điều này giúp các thiết bị khác có thể tiếp tục từ đúng vị trí đó khi lệnh Continue (FBH) được nhận, mà không cần dùng đến Song Position Pointer (SPP). Khi nhận được lệnh Stop, thiết bị phải:
- Dừng phát nhạc ngay lập tức.
- Không tăng giá trị Song Position dù có nhận thêm tín hiệu Timing Clock (F8H).
- Giữ nguyên giá trị Song Position, để khi tiếp tục (Continue), nó sẽ phát lại từ vị trí đã dừng.
- Nếu nhận được Song Position Pointer (SPP), nó phải cập nhật vị trí mới và chuẩn bị phát nhạc từ điểm đó.
Nếu có Note-On chưa được tắt trước khi nhấn Stop, thiết bị phải gửi Note-Off tương ứng để tránh tình trạng kẹt nốt (stuck notes).
- Có thể gửi lệnh All Notes Off, nhưng không thay thế hoàn toàn cho Note-Off vì không phải thiết bị nào cũng hỗ trợ All Notes Off.
Các bộ điều khiển MIDI như pitch wheel, sustain pedal,… cũng nên được đưa về trạng thái ban đầu. Minh họa bên dưới mô tả cách giữ đồng bộ chính xác bằng cách sử dụng tốc độ xung nội bộ 96 nhịp mỗi 1/4 nốt, tương ứng 4 xung nội bộ mỗi MIDI clock (F8H).

3. Mối quan hệ giữa các tín hiệu Clock và các lệnh MIDI
Sequencer có thể phát lại dữ liệu timing và voice từ MIDI In ra MIDI Out trong khi chơi nhạc.
Các lệnh Real Time (F8H, FAH, FBH, FCH) phải được ưu tiên để đảm bảo đồng bộ thời gian.
Khi cần thiết, thứ tự của các byte có thể thay đổi để ưu tiên gửi các lệnh Real Time trước. Tuy nhiên, các lệnh Real Time không được thay đổi thứ tự gốc.
Ví dụ: Nếu một lệnh Note-On đang được xử lý nhưng có một tín hiệu Clock (F8H) đến, thì Clock sẽ được gửi trước, sau đó mới đến Note-On.

4. Ưu tiên lệnh
- Các lệnh dư thừa (ví dụ: nhận lệnh Stop khi đã dừng, hoặc Start khi đã chạy) sẽ bị bỏ qua.
- Nếu thiết bị nhận lệnh từ cả bảng điều khiển vật lý và MIDI In, lệnh nhận sau cùng sẽ được ưu tiên.
- Thiết bị có thể chọn bỏ qua lệnh từ bảng điều khiển nếu đang chạy theo MIDI Clock hoặc bỏ qua MIDI Clock nếu đang hoạt động với xung nội bộ.
5. Active Sensing (Cảm biến tín hiệu MIDI hoạt động)
- Active Sensing không bắt buộc nhưng nếu được hỗ trợ, nó giúp kiểm tra kết nối MIDI còn hoạt động không.
- Thiết bị gửi Active Sensing (FEH) mỗi 300ms nếu không có dữ liệu MIDI khác.
- Nếu thiết bị nhận đã nhận FEH trước đó, nó phải nhận thêm dữ liệu trong 300ms tiếp theo. Nếu không, nó sẽ cho rằng cáp MIDI đã bị ngắt kết nối và:
- Tắt toàn bộ nốt nhạc
- Khôi phục trạng thái bình thường
- Thực tế: Bộ phát thường gửi FEH trong 270ms và bộ nhận kiểm tra sau 330ms để có độ trễ an toàn.
6. Lệnh Reset hệ thống (System Reset – FFH)
- Khi nhận lệnh System Reset, thiết bị phải quay về trạng thái mặc định như khi mới khởi động:
- Bật chế độ Omni On, Poly Mode (nếu có)
- Bật Local On
- Tắt tất cả giọng (Turn Voices Off)
- Reset toàn bộ bộ điều khiển (Pitch Wheel, Modulation, Sustain, v.v.)
- Đặt Song Position về 0
- Dừng phát nhạc
- Xóa trạng thái Running Status
- Khôi phục thiết bị về trạng thái ban đầu
System exclusive messages
System Exclusive (SysEx) là một loại tin nhắn MIDI đặc biệt, cho phép gửi dữ liệu tùy chỉnh giữa các thiết bị MIDI. Nó thường được dùng để:
• Gửi dữ liệu riêng của từng nhà sản xuất (ví dụ: cài đặt nhạc cụ, patch, preset).
• Cập nhật firmware cho thiết bị MIDI.
• Gửi lệnh phức tạp như điều khiển thời gian MIDI chính xác.
1. Cấu trúc tin nhắn SysEx
Tin nhắn SysEx không cố định độ dài, nhưng luôn có định dạng sau:
0xF0, 0xID, 0xdd, …… 0xF7
0xF0 → Bắt đầu tin nhắn (Start Of Exclusive – SOX)
ID → Mã nhận diện nhà sản xuất hoặc loại tin nhắn:
0x01 - 0x7C
: Mã nhà sản xuất 1 byte (dành cho các hãng có từ đầu MIDI).0x00
: Mã nhà sản xuất 3 byte (cần thêm 2 byte ID tiếp theo).0x7D
: Dùng cho tổ chức phi thương mại.0x7E
: Tin nhắn SysEx không đồng bộ (Non-realtime).0x7F
: Tin nhắn SysEx đồng bộ (Realtime).
Dữ liệu payload → Gửi nội dung tin nhắn. Lưu ý:
- Chỉ dùng 7 bit dữ liệu trên mỗi byte (MSB = 0).
- Nếu MSB = 1, nó sẽ bị coi là một lệnh MIDI khác, kết thúc SysEx.
0xF7 → Kết thúc tin nhắn (End Of Exclusive – EOX).
2. Xử lý dữ liệu trong SysEx
- SysEx có thể chứa các lệnh Real-Time MIDI (F8H, FAH, v.v.) mà không làm gián đoạn truyền dữ liệu.
- Bất kỳ byte trạng thái MIDI khác (không phải Real-Time) sẽ tự động kết thúc SysEx.
3. Lỗi thường gặp với SysEx
Cảnh báo: Một số bộ chuyển đổi USB-to-MIDI rẻ tiền không thể xử lý SysEx dài hơn 4 byte. Nếu gặp lỗi khi truyền SysEx, hãy dùng phần mềm phân tích MIDI như MIDI-Ox để kiểm tra dữ liệu.
Kết luận
MIDI là một giao thức mạnh mẽ, đóng vai trò quan trọng trong sản xuất âm nhạc và điều khiển nhạc cụ điện tử. Từ việc đồng bộ hóa thời gian với Real-Time Messages, điều khiển phát nhạc bằng Start/Stop/Continue, cho đến truyền dữ liệu nâng cao với System Exclusive (SysEx), giao thức này mang lại khả năng linh hoạt cao cho các nhạc sĩ và kỹ sư âm thanh. Dù đã ra đời từ những năm 1980, MIDI vẫn tiếp tục phát triển và giữ vị trí quan trọng trong ngành công nghiệp âm nhạc hiện đại.
Xem thêm: Analog-to-Digital Converter (ADC): Nguyên lý và Ứng dụng