4. Phạm vi luận án Error! Bookmark not defined.
8.2. Truy cập file midi
Cấu trúc một file midi được tổ chức gồm nhiều khúc, khúc đầu tiên là Header, tiếp theo là n khúc Track với n được định nghĩa trong Header.
Mô phỏng cấu trúc Header của file MIDI //---
publicstructMIDIHeader
{
char[4] chunkID; // { 'MThd' } uint chunkSize; // { 6 } short formatType; // { 0-1-2 } short nTrack; // { số Track theo sau}
short timeDivision; // { Định nghĩa khuôn dạng thời gian } }
//---
Sau khi đọc xong phần Header ta sẽ biết được số Track qua biến nTrack, sau đó sẽ lần lượt duyệt qua từng Track rút trích nốt nhạc ghi ra file 3t.
Mô phỏng cấu trúc một khúc Track:
//---
publicstructMIDITrack
{
char[4] chunkID; // { 'MTrk' }
uint chunkSize; //{Kích thước số byte dữ liệu theo sau thuộc Track=N } byte[N] data; // {N byte dữ liệu theo sau}
//---
Với mỗi Track: dữ liệu là tập các event, mỗi event gồm một số byte biễu diễn số delta time kèm theo phía trước và các byte dữ liệu mô tả kiểu và dữ liệu của event theo sau, tùy theo từng loại event mà sẽ có sẽ chiếm kích thước là bao nhiêu byte, dựa vào cơ sở lý thuyết đã trình bày ứng dụng chỉ giữ lại các event biểu diễn cho nốt nhạc, các event còn lại được bỏ qua.
Cách tính delta time của một event được cài đặt như sau:
//---
//-Đầu tiên lấy thành phần delta_time: chiếm bao nhiêu byte //--với i là vị trí trỏ đến byte đầu tiên thuộc Event
int j = i;// gan j vao vi tri cua i while (data[j] >= 128)
{
j++; }
//-Chuyển số delta_time về giá trị thực
int delta_time = 0;
for (int m =i; m <=j ; m++) {
if (m < j)
delta_time +=((int)(data[m] & 0x7F)) << ((p - m) * 8 - 1); // bo bit cao roi dich trai...
else
delta_time += (int)(data[m]); }