hn4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com
Full version available at http://4u.jcisio.com/r/article424.htm

Quốc Phong,
P&V Music Group

Tìm hiểu tập tin MIDI

1. Thuật ngữ MIDI

Các nhạc cụ điện tử (eletronic instrument) đã có thể "nói chuyện" được với nhau từ những năm 1980. Điều đó được xem như là cuộc cách mạng trong âm nhạc điện tử. Một nhạc cụ có thể "nói" với nhạc cụ khác : "Anh hãy chơi nốt đô trung, lớn cỡ 60% rồi chơi tiếp nốt mi 4 nhỏ một tí, dùng tiếng violon nhé !". Nhạc cụ thứ hai dường như "hiểu" được, và phát ra các nốt nhạc theo yêu cầu.

Giữa các nhạc cụ điện tử giờ đây có một "ngôn ngữ" chung gọi là "MIDI", để nói chuyện với nhau. MIDI tuy là một khái niệm mới nhưng đã trở nên rất quen thuộc trong lĩnh vực âm nhạc điện tử, đến nổi người ta xem nó là một thuật ngữ mà quên rằng MIDI là từ viết tắt của "Miscical Instrument Digital Interfac" (giao diện số với các nhạc cụ). Một cách đơn giản, MIDI là một ngôn ngữ giữa các thiết bị âm nhạc.

Mặc dù có nhiều ngôn ngữ khác nhau trên thế giới (Việt Nam, Anh, Pháp...) nhưng MIDI chỉ có một ngôn ngữ duy nhất. Do đó, MIDI không phụ thuộc nhà chế tạo nhạc cụ và nơi sản xuất. Hơn nữa nó dùng cho nhiều chủng loại nhạc cụ khác nhau; ví dụ một piano điện có thể nối với một bộ trống điện tử, khi đó nếu ta bấm một phím trên piano thì bộ trống sẽ phát ra một tiếng trống tương ứng.

2. Đường đi của tín hiệu MIDI

Nói chung để các nhạc cụ điện tử có thể "nói chuyện" với nhau, thì phải được chế tạo có khả năng MIDI. Ta sẽ thấy trên nhạc cụ đó có 2 cổng MIDI IN, MIDI OUT (loại nhà nghề thường có thêm cổng MIDI THRU). Một cuộc nói chuyện luôn đi theo một chiều từ cổng MIDI OUT của nhạc cụ phát đến cổng MIDI IN của nhạc cụ nhận thông qua cáp MIDI.

Một sợi cáp MIDI có 5 dây dẫn (đầu cắm 5 chấu). Tín hiệu truyền trên cáp theo kiểu tuần tự đơn hướng với tốc độ truyền là 31.250 bit mỗi giây. Mỗi byte dữ liệu truyền bắt đầu bằng một bít khởi đầu và một bit kết thúc. Như vậy, để truyền một byte dữ liệu thực cần 10 bit, do đó tốc độ truyền thực tế trên cáp MIDI là 3.125 byte dữ liệu mỗi giây.

Dữ liệu truyền trên cáp MIDI không phải là tín hiệu âm thanh dạng analog hay digital, mà chính là "ngôn ngữ MIDI", hay nói chhính xác hơn, là các thông điệp MIDI (MIDI message). Mỗi thông điệp MIDI dài từ 1 đến 3 byte dùng để điều khiển một chip trong thiết bị nhận tín hiệu MIDI. Các thiết bị MIDI được phân loại như sau (chưa có thuật ngữ tiếng Việt chính xác, nên chúng tôi chỉ tạm dịch) :

Controller (bộ điều khiển) : là nguồn gửi đi thông điệp MIDI. Các thiết bị có cổng MIDI OUT đều là controller. Ví dụ : piano điện, organ điện tử (gọi chung là MIDI Keyboard Instrument), guitar điện, trống điện tử.... Máy vi tính có gắn MIDI interfac (MIDI card, MIDI built-in sound card....) cũng là một controller. Synthesizer (bộ tổng hợp) : là thiết bị có cổng MIDI IN, có khả năng nhận thông điệp MIDI rồi tổng hợp lại thành âm thanh analog. Việc tổng hợp do một con chip trong thiết bị đảm nhận. Có 2 công nghệ tổng hợp phổ biến hiện nay do 2 hãng nhạc cụ lừng danh Roland và Yamaha phát triển. Công nghệ của hãng Roland dựa trên các âm thanh dạng sóng đã lấy mẫu (Sampled Waveform). Hãng Yamaha dùng kỹ thuật điều tần (Frequency Modulation - FM). Phần lớn các MIDI-built-in sound card hiệu Sound Blaster, Sound Power, Audiowave.... đều sử dụng chip FM của Yamaha, Synthesizer còn được gọi là Sound Module, Sound Generator, Tone Generator. Bạn có thể tham khảo thêm các bài "Multimedia phải chăng đã gặp thời", "Lộ trình tín hiệu của hệ MPC", "Sound Board vận hành ra sao ?" trong tạp chí New số 1/1994 (số chuyên đề về Multimedia & MPC).

Sequencer (bộ phối âm) : là thiết bị có thể nhận tín hiệu MIDI, lưu trữ vào bộ nhớ trong hoặc ngoài, cho phép người dùng thay đổi rồi gửi đi. Đây là thiết bị giúp ích rất lớn cho các nhạc sĩ phối âm, là áp dụng chính của MIDI.

Nói chung, một thiết bị MIDI đều có cả 2 cổng MIDI IN và MIDI OUT, nên theo cách phân loại trên, nó vừa là controller, vừa là synthesizer. Ta dùng tên gọi controller khi quan tâm đến chức năng "phát" tín hiệu MIDI, dùng tên synthesizer khi quan tâm chức năng "nhận". Hình 3 giới thiệu sơ đồ của một cây đàn organ điện tử có MIDI (MIDI keyboard).

3. Một hệ thống âm nhạc vi tính

Máy tính có vẻ chẳng liên quan gì đến âm nhạc trước khi có MIDI. MIDI là một giao diện giữa máy tính với nhạc cụ điện tử chứ ? Với ý tưởng đó, nhiều hãng nhạc cụ điện tử đã chế tạo các MIDI card hay MIDI box gắn vào máy vi tính đóng vai trò giao diện giữa máy tính và nhạc cụ. Hãng Roland là hãng tiên phong trong lĩnh vực này. Apple Macinstosh, Atari Amiga là các họ máy tính đầu tiên giao tiếp với nhạc cụ điện tử. Với họ máy IBM, phải chờ đến sự thành công của Microsoft Windows, mới chen chân vào lĩnh vực âm nhạc điện tử. Khi "anh chàng" vi tính bước chân vào âm nhạc, tiềm năng của MIDI tăng gấp bội : máy tính vừa là controller, synthesizer, vừa là sequencer; bộ nhớ ngoài của máy tính (đa cứng) rất dư dả cho việc lưu trữ thông điệp MIDI dưới dạng tập tin MIDI, người dùng dễ dàng "chế biến" thêm hoặc chen thêm các dữ liệu MIDI khác vào. Ban nhạc một người (One man-Band) đã trở thành hiện thực, chỉ còn lệ thuộc vào khả năng con người : có thể vừa là người soạn nhạc, phối âm, chơi nhạc... không ? Hình 4 giới thiệu một hệ thống âm nhạc vi tính.

4. Phân tích các thông điệp MIDI.

*
*  *

Khái niệm về kênh (channel): Thông điệp MIDI truyền trên cáp bao gồm rất nhiều nhóm thông tin khác nhau. Có thể chỉ một phần hay toàn bộ các thông tin đó được nhận bên thiết bị MIDI nhận. Để thực hiện điều đó, MIDI bao gồm 16 kênh. Tất cả các loại thông điệp MIDI khác nhau có thể truyền riêng biệt trên 16 kênh, bên nhận có thể chọn lọc lại, chỉ nhận dữ liệu trên một số kênh nào đó và các dữ liệu được xử lý đổng thời.

Khái niệm về kênh MIDI cũng giống như kênh trong tivi. Đài truyền hình có thể phát nhiều chương trình khác nhau cùng một lúc trên nhiều kênh khác nhau. Ăng ten ti vi của bạn sẽ nhận được tất cả các kênh cùng một lúc nhưng bạn chỉ chọn kênh nào có chương trình muốn xem thôi. Điều khác nhau duy nhất là synthesizer có thể xử lý đồng thời tín hiệu trên 16 kênh nhận được, trong khi tivi chỉ mới xem được cùng lúc chương trình trên vài kênh mà thôi !

*
*  *

Thông điệp MIDI được chia làm 2 loại : loại thông điệp kênh (Channel Message) và loại thông điệp hệ thống (System Message). Loại thông điệp kênh bao gồm các thông điệp chỉ ảnh hưởng trên kênh này mà không ảnh hưởng trên kênh khác. Ngược lại, thông điệp hệ thống tác dụng trên toàn bộ hệ thống MIDI chứ không trên từng kênh. Trong thông điệp hệ thống còn có một thông điệp dành riêng của từng nhà sản xuất (gọi là System Exclusive Message) chỉ được xử lý trong các thiết bị của nhà sản xuất đó. Các tín hiệu này bắt đầu bằng một số hiệu riêng (ID Number) khác nhau đối với các nhà sản xuất khác nhau. Các thông điệp mà thiết bị nhận không nhận biết sẽ được bỏ qua.

Các nhà sản xuất nhạc cụ điện tử hàng đầu đã xây dựng được một tiêu chuẩn thống nhất gọi là General MIDI trong đó qui ước các loại thông điệp chuẩn mà thiết bị được chế tạo theo chuẩn General MIDI phải tuân theo. Để hiểu thông điệp kênh dùng như thế nào, ta hãy xem xét một ví dụ. Giả sử ta đã nối một MIDI-Keyboard với một synthesizer. Trên MIDI-Keyboard, ta bấm một phím (nốt đô trung chẳng hạn), các "sự việc" sau xảy ra:

Nếu synthesizer có khả năng polophony (phát được nhiều nốt cùng một lúc) thì khi ta bấm nhiều phím cùng lúc trên MIDI-Keyboard, nhiều thông điệp "Note On" sẽ được gửi cùng lúc đến synthesizer. Hình 5 giới thiệu bảng qui định về thông điệp kênh theo định chuẩn MIDI 1.0 mà bạn có thể tham khảo thêm.

Thông điệp "Program Change" (Xem hình 5) rất quan trọng, nó sẽ yêu cầu synthesizer phát ra âm tiết khác nhau, ví dụ : tiếng piano acoustic, violon, string... Các thuật ngữ voice, instrument, patch đều có nghĩa là âm tiết. Có nhà sản xuất "thích" dùng từ voice trên các sản phẩm của mình, nhưng nhà sản xuất khác thì lại dùng từ patch. Thông điệp program change dài 2 byte, có dạng Cn pp với n là số thứ tự của kênh (0-15) và pp là số thứ tự của âm tiết (0-127). Như vậy có 128 âm tiết khác nhau. Hiệp hội các nhà sản xuất MIDI (MMA - MIDI Manufactors Association) đã đưa ra định chuẩn General MIDI trong đó qui ước một synthesizer theo chuẩn General MIDI thì phải có bộ tiếng theo qui ước : tiếng số 1 là Grand Piano, số 2 là Bright Grand Piano... tiếng số 128 là Gun Shot. Bạn có thể tham khảo danh sách các âm tiết theo chuẩn General MIDI trong bài "MIDI và Multimedia Windows", tạp chí New* số 10 & 12/1993.

Một thông điệp MIDI luôn bắt đầu bằng một byte trạng thái (status byte) tiếp theo sau là 0,1 hay 2 byte dữ liệu (ngoại trừ thông điệp System Exclusive). Dễ dàng phân biệt được byte trạng thái và byte dữ liệu. Bit cao luôn thiết lập là 1 với byte trạng thái và là 0 với byte dữ liệu. Như vậy từ 00 đến 7F là byte dữ liệu, 80 đến FF là byte trạng thái. Đối với các thông điệp kênh, byte trạng thái luôn có chứa thông tin cho biết kênh.

Trên hình 5, ta thấy n trong các byte trạng thái cho biết số thứ tự của kênh (có tổng cộng 16 kênh, 0-15). Ta thấy rằng mỗi kênh có thể phát ra một âm tiết khác nhau, do đó, một synthesizer có thể phát ra tối đa 16 tiếng nhạc cụ khác nhau cùng một lúc. Như thế có thể làm việc giống như một ban nhạc thật vậy ! Trên hình 5 ta thấy không có các thông điệp với Byte trạng thái từ F0 đến FF. Các thông điệp này thuộc loại thông điệp hệ thống (system message) như đã trình bày ở phần trên. Controller thường xuyên gửi đi thông điệp với byte trạng thái FE gọi là Active Sensing Message cho biết controller vẫn còn đang nối với hệ thống. Một thông điệp hệ thống quan trọng đã nói là System Exclusive message có byte trạng thái là FO. Thông điệp này có thể có hơn 2 byte dữ liệu (tất cả các thông điệp khác có tối đa là 2 byte dữ liệu), và vẫn tuân theo qui ước bit cao được thiết lập là 0. Thông điệp này thường được nhà sản xuất dùng để gửi đi thông tin định nghĩa một âm tiết nào đó cho synthesizer, hay xuất một dãy dữ liệu đặc biệt nào đó.

5. Tập tin MIDI.

Khi máy vi tính đi vào lĩnh vực âm nhạc điện tử, việc lưu trữ các thông điệp MIDI trở nên dễ dàng do dung lượng của bộ nhớ ngoài khá dư dả. Tập tin lưu trữ thông điệp MIDI lúc đầu có dạng thức không thống nhất. May mắn là Hiệp hội MIDI (IMA-MIDIA Association) ở Mỹ đề ra được một tiêu chuẩn thống nhất. Macinstosh và Amiga là 2 họ máy đầu tiên đi vào lĩnh vực âm nhạc, do đó tiêu chuẩn trên áp dụng cho họ máy đó. Với họ máy vi tính IBM và tương thích, "kẻ đến muộn", đành phải tuân theo chuẩn trên. Macinstosh và Amiga sử dụng bộ xử lý của Motorola khác với bộ xử lý Intel dùng trong họ máy IBM, do đó các phần mềm MIDI viết trên họ máy IBM phải "phiên dịch" lại. Bộ xử lý Motorola không ghi byte theo kiểu từ phải sang trái (right most) như bộ xử lý Intel. Chẳng hạn với trị số 186A0h, trong khi Intel lưu trữ là : A0 86 01 00. Vì vậy tin MIDI định dạng theo bộ xử lý Motorola nên nếu dùng debug để xem thì sẽ thấy là : 00 01 86 A0. Như vậy phần mềm MIDI trên họ máy IBM phải xử lý lại dữ liệu đọc từ tập tin MIDI. Với sự chú ý về trình tự lưu trữ dữ liệu trên, ta hãy xem xét một đoạn nhạc đơn giản được lưu trữ như thế nào. Đoạn nhạc bao gồm 4 nốt, với 2 khuôn nhạc (hình 6) phát tiếng Church Organ. Hình 7 cho thấy nội dung tập tin MIDI xem bằng trình Debug của DOS.

Tập tin MIDI trong Windowns được viết cho 3 loại synthesizer : Base-level synthesizer : chỉ phát được 4 kênh từ 13 đến 16 Extended synthesizer : phát được 10 kênh từ 1 đến 10 General MIDI synthesizer : phát đủ 16 kênh.

Một cách tổng quát, tập tin MIDI lưu trữ thông điệp MIDI và thông tin về nhịp để điều khiển synthesizer phát lại bài nhạc. Tập tin MIDI được tổ chức theo từng nhóm dữ liệu; mỗi nhóm bắt đầu bằng 4 ký tự (4 byte) nhận dạng và tiếp theo đó là 4 byte cho biết số byte của dữ liệu trong nhóm. Chỉ có 2 loại nhóm dữ liệu : header và track. Mỗi tập tin MIDI luôn bắt đầu bằng nhóm dữ liệu header và tiếp theo là một hay nhiều nhóm dữ liệu track.

1. Nhóm dữ liệu header:

Bắt đầu bằng 4 ký tự nhận dạng: MThd. Số byte dữ liệu luôn luôn là 6. Do đó, tổng số byte của nhóm header là 14.

Hình 7 cho thấy 6 byte dữ liệu của nhóm header là 00 01 00 03 00 F0. Hai byte đầu cho biết kiểu của tập tin MIDI (có thể mang các trị 0, 1, 2), trong ví dụ đang xét hai byte này có giá trị 1. Tập tin kiểu 0 chỉ có một track, kiểu 1 có nhiều track, kiểu 2 chưa được xử lý trong Windows. Một bài nhạc lưu trữ vào tập tin MIDI kiểu 1 sẽ giúp cho việc sửa đổi nội dung dễ dàng, vì tiến hành trên từng track. Hai byte tiếp theo cho biết tổng số track, trị số này ở đây là 3 : tập tin MIDI có 3 track, track thứ nhất chứa thông tin về nhịp điệu, track thứ nhì chứa các thông điệp MIDI để phát 4 nốt trên kênh 0 (dành cho bộ extended synthesizer), track thứ ba dùng để phát ra 4 nốt trên kênh 12 (dành cho bộ base-level synthesizer). Hai byte cuối, sau khi xử lý theo cách riêng sẽ cho biết đơn vị xử lý thời gian.

2. Nhóm dữ liệu track:

Bắt đầu bằng 4 ký tự MTrk tiếp sau là con số 32 bit (4 byte) cho biết chiều dài của dữ liệu chứa trong track. Trong hình 7, ta thấy có 3 track bắt đầu ở các offset 0Eh, 29h. 59h. Dữ liệu trong nhóm gồm nhiều track event. Mỗi track event bắt đầu bằng một trị số delta time (lưu trữ với kích cỡ thay đổi từ 1 đến 4 byte) theo sau là một event. Trị số delta time cho biết khoảng thời gian nghỉ giữa 2 lần xử lý event (có thể bằng 0). Event có thể là các thông điệp MIDI (dùng để điều khiển trực tiếp synthesizer) hoặc meta-event (là các chỉ thị hay thông tin gửi đến phần mềm xử lý tập tin MIDI).

Delta time:

Để giảm kích cỡ tập tin MIDI, delta time được lưu trữ với kích cỡ thay đổi, có chiều dài từ 1 đến 4 byte. Một sự "phù phép" đã được dùng ở đây, rất rắc rối. Mỗi byte của delta time chỉ sử dụng 7 bit thấp để chứa số liệu. Bit cao còn lại được thiết lập là 1, trừ byte cuối. Nếu delta time chỉ dài một byte, bit cao được thiết lập là 0. Khi trị số của delta time nằm từ 0 đến 127, delta time chỉ dài một byte với trị thay đổi từ 00 đến 7Fh. Nhưng nếu delta time là 128, cần dùng đến 2 byte : 81h và 00h. Bit cao của byte thứ nhất được thiếp lập là 1, ta kết hợp 7 bit còn lại của byte thứ nhất là 7 bit còn lại của byte thứ nhì để cho ra trị 80h ứng với trị số thập phân 128.

Ta thêm một ví dụ : delta time = 240 (F0h) được lưu trữ thành giá trị gì trong tập tin MIDI ? Trước hết, hãy viết dưới dạng cơ số 2 với 8 bit :

11110000

Sau đó tách ra thành 2 nhóm, mỗi nhóm 7 bit (thêm các bit 0 vào) :

000001 1110000

Đưa thêm vào bit 1 ở đầu nhóm thứ nhất, bit 0 ở đầu nhóm thứ hai :

10000001 01110000

Chuyển sang cơ số 16, ta được trị 8170h. Như vậy giá trị 240 của delta time khi lưu trữ vào tập tin MIDI sẽ chiếm 2 byte có trị như trên.

Bây giờ ta thử xem giá trị của delta time là bao nhiêu ứng với trị lưu trong tập tin MIDI là 86 8D 20h. Trước hết viết lại dưới dạng cơ số 2 :

10000110 10001101 0010000

Bỏ các bit cao trên 3 nhóm :

0000110 0001101 010000

Nhóm lại thành các nhóm 8 bit :

00000001 10000110 1010000

Chuyển sang cơ số 16, ta được trị 0186A0h hay 100000.

4. Meta-Event:

Như đã trình bày ở trên, mỗi event trong track event có thể là thông điệp MIDI hay meta-event. Meta-event luôn bắt đầu bằng 1 byte FFh. Byte thứ nhì cho biết loại meta-event, byte thứ ba cho biết chiều dài của dữ liệu liên quan. Trong ví dụ đang xét, track thứ nhất dài 19 (13h) byte có chứa 3 track event. Delta time trong mỗi track event đều mang trị là 0 (các event trong track này sẽ xảy ra liên tiếp nhau, không có thời gian nghỉ). Để ý rằng, 3 event trong 3 track event ở đây đều thuộc loại meta-event.

*
*  *

Meta-event thứ nhất là : FF 58 04 03 02 18 08. Byte 58h cho biết meta-event này chứa thông tin về việc khai báo nhịp của bài nhạc (time signature). Meta-event này có 4 byte dữ liệu. Hai byte thứ nhất (03h và 02h) cho biết nhịp của bài nhạc là (3)/(2)*2 hay 3/4, theo ký hiệu âm nhạc thì con số đó cho biết trong một khuôn nhạc có 3 nốt 1/4 (3 nốt đen). Trên hình 6, bạn thấy con số 3/4 chứ ? Byte tiếp theo (18h) cho biết số nhịp MIDI được phát ra trong một nhịp của metronome (metronome là máy gõ nhịp giúp người đánh đàn chơi nhạc đúng nhịp, synthesizer có một bộ phận để tạo ra nhịp như metronome). Như vậy ở đây, một nhịp metronome có 24 (18h) nhịp MIDI. Byte cuối cùng (08h) cho biết số nốt 1/32 (nốt móc ba) có trong 24 nhịp gõ MIDI, trị số 08 ở đây qui định cứ 24 nhịp gõ MIDI thì có 8 nốt 1/32 hay 1 nốt 1/4 được chơi. Kết hợp với thông tin ở trên, cho biết trong một nhịp gõ của metronome có một nốt 1/4 được chơi.

*
*  *

Meta-event thứ hai là : FF 51 03 07 A1 20. Byte 51h cho biết đây là tempo meta-event, chứa thông tin cho biết bài nhạc được chơi nhanh chậm như thế nào. Dữ liệu dài 3 byte : 07A120h = 500.000, cho biết mỗi miligiây có 500.000 nốt 14 (gọi là nốt đen) được chơi, tương ứng với 120 nốt đen được chơi trong một phút. Bạn hãy xem hình 5 và để ý phía trên khuôn nhạc có ghi ký hiệu một nốt đen = 120. Từ đây, ta thấy rằng dễ dàng thay đổi nhịp (nhanh hơn, chậm hơn) của một bài nhạc khi phát ra.

*
*  *

Meta-event cuối cùng là :FF 2F 00. Event này không có dữ liệu. Mỗi track event đều kết thúc bằng meta-event này.
5. Thông điệp MIDI và việc ghi nhớ byte trạng thái:

Track thứ hai trong hình 7 chứa 40 (28h) byte dữ liệu dùng để phát ra 4 nốt trên synthesizer loại extended. * Track event đầu tiên (ở offset 31h) là 00 C0 13. Delta time ở đây bằng 0. Event ở đây là thông điệp MIDI loại Program Change, gửi đến kênh 0 và yêu cầu synthesizer sử dụng tiếng số 13 để phát ra các nốt sau đó (theo định chuẩn General MIDI, đây là tiếng church Organ). * Track event thứ nhì là 00 B0 07 7 (delta time cũng bằng 0) chứa thông điệp MIDI kiểu Control Change (B0h) thiết lập controller số 7 (07h) giá trị lớn nhất là 127 (7F). Controller này chỉnh synthesizer phát ra nốt trên kênh 0 với độ to lớn nhất. * Bây giờ đã có thể ra lệnh cho synthesizer phát nốt nhạc được rồi ? Track event thứ ba : 00 90 C 40 thực hiện điều đó, vì nó chứa thông điệp "Note On" (90h) trên kênh 0, nốt phát ra là đô trung (key number = 3Ch) với velocity là 40h. Việc phát nốt nhạc này được thực hiện ngay sau khi controller số 7 được thiết lập vì delta time bằng 0. *Track event kế tiếp là : 81 70 40 40. Hai byte đầu đặc trưng cho delta time. Hai byte sau ra lệnh phát nốt mi trên nốt đô trung (key number = 40h) với velocity là 40h. Ta thấy hình như thông điệp "Note On" này thiếu byte trạng thái 90h (theo dạng chung của thông điệp "Note On" : 0 kk vv) ? Người ta đã sử dụng kỹ thuật "tham khảo byte trạng thái của thông điệp MIDI trước đó" gọi là "running status": trong quá trình lưu trữ vào tập tin MIDI, khi 2 byte trạng thái của 2 thông điệp MIDI liên tiếp giống nhau, thì thông điệp MIDI sau không cần có byte trạng thái.

*
*  *

Hai track event tiếp theo là : 81 70 43 40 81 70 48 40. Phân tích tương tự, ta xác định rằng 2 track event này sẽ ra lệnh cho synthesizer pht ra tiếp nốt sol và nốt đô (cách nốt đô trung một quãng tám). Như vậy 4 nốt của bài nhạc đến đây đã được phát ra đủ. Tuy nhiên 4 nốt này sẽ "kêu" mãi nếu không 4 có thông điệp "Note Off" tiếp theo được gửi tới để tắt việc phát ra 4 nốt đó. * Bốn track event tiếp theo là : 85 50 3C 00, 00 40 00, 00 43 00, 00 48 00 sẽ làm cho synthesizer tắt hết bốn nốt đã phát ra. * Track cuối cùng là 00 FF 2F 00, ta thấy chứa meta-event FF 2F 00 báo hiệu cho biết đã hết track thứ hai.

Track thứ ba tương tự track thứ hai, chỉ khác ở các chỉ định kênh trong các byte trạng thái của thông điệp MIDI là 12 (Ch) thay vì là 0.

Bây giờ, bạn có thể tạo thử tập tin MIDI bằng dùng trình Debug của DOS. Sau đó dùng chương trình Media Player trong nhóm Accessories của Windows để chơi thử. Dĩ nhiên máy của bạn phải có Sound card.

Kết luận

Đến đây chúng tôi xin kết thúc loạt bài "Chơi nhạc trên Windows". Mong rằng các bạn sẽ hứng thú khi tìm hiểu về MIDI. Đây mới chỉ là một kiến thức ban đầu. Với hệ thống âm nhạc vi tính, việc soạn nhạc trên máy vi tính đã trở thành hiện thực. Ta có thể in ấn (bằng các phần mềm Edior như : Finale, Music Time, Encore for Windows...), phối âm (bằng các phần mềm Sequencer như : Cakewalk, MIDIsoft for Windows...)tự học nhạc, nghe nhạc, làm karaoke vi tính... MIDI là các thông điệp điều khiển synthesizer phát nhạc, do đó ta có thể dễ dàng biến đổi tín hiệu này trước khi nó được gửi đến synthesizer. Vì vậy, các phần mềm MIDI luôn cho phép ta có thể can thiệp vào bản nhạc một cách dễ dàng, chẳng hạn : lên/xuống giọng (transposer), cho chậm lại hay nhanh lên, nghe đi nghe lại, xem nốt nhạc ngay trên màn hình, tắt bớt một kênh nào đó...


hainam4u @ Last updated 21/11/04 22:42
Go to my homepage at http://4u.jcisio.com