Cách thức lưu trữ giá trị

Một phần của tài liệu Ứng dụng hát karaoke trên mobile và xây dựng cộng đồng nhạc KAR (Trang 33 - 41)

Tất cả các dữ liệu số ñều ñược lưu trữ theo ñịnh dạng “Big-Endian”, tức là byte cao nhất sẽ ñứng ñầu tiên.

Trang 34 Giá trị thập phân Dữ liệu lưu trữ Dạng nhị phân Dạng Hexa 5 00000000 00000000 00000000 00000101 00 00 00 05 7241 00000000 00000000 00011100 01001001 00 00 1c 49

Một số dữ liệu số ñược lưu trữ theo dạng dữ liệu có chiều dài biến ñổi, tức là sử dụng 7 bit cuối ñể lưu giá trị, còn bit cao nhất lưu trữ cờ. Nếu cờ bằng 1 tức là dữ liệu còn ñược chứa ở byt e tiếp theo, nếu cờ bằng 0 tức byte hiện tại ñã kết thúc dữ liệu số.

Ví dụ:

Giá trị Giá trị có ñộ dài thay ñổi tương ứng Nhị phân Hexa Nhị phân Hexa 00 00000000 00 00000000 C8 11001000 8148 10000001 01001000 100000 00010000 00000000 00000000 C08000 11000000 10000000 00000000 2.3.3. Cu trúc tp tin MIDI/KAR

Chúng ta sẽ cùng phân tích cấu trúc tập tin MIDI/KAR nhưng sẽ không ñi sâu vào những ñặc ñiểm của nốt nhạc, mà chỉ quan tâm ñến cách thức lấy ñược lời bài hát, và cách thức ñồng bộ lời với nhạc.

Cấu trúc tập tin MIDI/KAR ñược chia làm nhiều phân ñoạn (chunk). Có 2 loại phân ñoạn, ñó là phân ñoạn mở ñầu (header chunk) và phân ñoạn rãnh (track chunk). Cấu trúc tổng quan như sau:

<header_chunk> + <track_chunk> [ + <track_chunk> ...]

Trang 35

Chuỗi nhận dạng phân ñoạn: là một chuỗi gồm 4 ký tự. Nếu chuỗi là

“MThd” thì ñó là phân ñoạn mở ñầu, còn chuỗi là “MTrk” thì ñó là

phân ñoạn rãnh.

4 byte tiếp theo lưu trữ một số nguyên không âm: biểu hiện cho số lượng byte có trong phần dữ liệu của phân ñoạn ñó.

Cuỗi cùng là phần dữ liệu của phân ñoạn, có số byte ñúng bằng giá trị phía trên.

Phân ñoạn mởñầu (header chunk)

Phân ñoạn mở ñầu chứa thông tin của bài hát chứa trong tập tin MIDI/KAR bao gồm loại tập tin MIDI, số lượng các track, và ñộ chia thời gian (time division). Lưu ý là luôn luôn chỉ có duy nhất một phân ñoạn mở ñầu cho một tập tin MIDI/KAR, và phân ñoạn ñó luôn xuất hiện ñầu tiên. Sau ñây là bản tóm tắt cấu trúc của phân ñoạn mở ñầu:

"MThd" + <header_length> + <format> + <n_track> + <division>

Trong ñó:

“MThd”

có giá trị hexa là 0x4d546864, báo hiệu ñây là phân ñoạn mở ñầu

<header_length>

thông thường mang giá trị 6, vì phần dữ liệu của phân ñoạn này chỉ chứa 3 giá trị, mỗi giá trị chiếm 2 byte.

<format>

chiếm 2 byte, lưu trữ kiểu ñịnh dạng của tập tin MIDI, chứa một trong 3 giá trị {0, 1, 2}

o Kiểu 0 cho biết file MIDI/KAR có duy nhất 1 track chứa toàn bộ “sự kiện” (event) của bài nhạc, bao gồm tên bài nhạc, nhịp ñộ bài

Trang 36 nhạc, và thông tin các nốt nhạc (thông thường, tập tin KAR không thuộc kiểu ñịnh dạng này, do phải có ít nhất 1 track riêng biệt chứa lời bài hát ñã ñược ñồng bộ theo thời gian, và ít nhất 1 track chứa thông tin bài nhạc)

o Kiểu 1 cho biết tập tin MIDI/KAR có ít nhất 2 track. Thông thường, track ñầu tiên chứa thông tin về bài nhạc như tiêu ñề, nhịp ñiệu nhạc … Từ track thứ 2 trở ñi chứa thông tin về tiêu ñề, thông tin các nốt nhạc …

o Kiểu 2 là một sự kết hợp của 2 kiểu trên. Nó chứa nhiều track, nhưng mỗi track chứa một bài nhạc riêng biệt và không nhất thiết phải ñược phát cùng lúc. Kiểu này thường ñược dùng ñể lưu trữ các dãy âm ñiệu mẫu của trống, hoặc những dãy âm ñiệu mẫu của những nhạc cụ khác.

<n_track>

chiếm 2 byte, lưu trữ một số không âm, là số lượng track có trong tập tin MIDI. ðối với kiểu ñịnh dạng 1 thì số lượng track sẽ là 1, còn ñối với ñịnh dạng 2-3, số lượng track có thể lên ñến 65536 (0xffff).

<division>

chiếm 2 byte, lưu trữ ñộ chia thời gian. ðây là trường dữ liệu cuối cùng và cũng là trường dữ liệu phức tạp nhất. Nó ñược dùng ñể xác ñịnh thời gian thực ñể phát một nốt nhạc hoặc việc ñồng bộ lời cho nhạc, so với thời gian delta ñược lưu trữ trong thông tin bài nhạc. Giá trị ñộ chia thời gian mang một trong 2 ñơn vị: số tick trên một nhịp (tick per beat), hoặc số khung trên một giây (frame per second);

Bit cao nhất (bit mask 0x8000) của giá trị này sẽ lưu trữ loại ñơn vị ñược sử dụng cho giá trị của 15 bit còn lại (bit mask 0x7fff): nếu là 0 thì ñơn vị là số tick trên một nhịp, ngược lại nếu là 1 thì ñơn vị sẽ là số khung trên một giây.

Trang 37 Số tick trên một nhịp chuyển ñổi số nhịp ñồng hồ hoặc vị trí tương ñối của track (sẽ ñược mô tả ở phân ñoạn track) trong mỗi ¼ nốt nhạc. Thông thường, giá trị nằm ở phạm vị 48 ñến 960.

Số khung trên một giây ñược ñịnh nghĩa bởi việc chia 15bit còn lại ra thành 2 giá trị. 7bite ñầu tiên (có mặt nạ 0x7f00) ñịnh nghĩa số lượng khung SMPTE và có thể mang các giá trị 24, 25, 29 và 30. 8bit còn lại ñịnh nghĩa số lượng nhịp ñồng hồ hoặc vị trí tương ñối của track trên mỗi khung. Ví dụ: giá trị 0x9978 có thể ñược phân ra làm 3 phần, bit ñầu tiên báo hiệu rằng thời gian ñược tính theo dạng số khung trên giây. 7bit tiếp theo mang giá trị 25 (0x19) và 8bit còn lại mang giá trị 120 (0x78). ðiều ñó có nghĩa là tập tin MIDI ñược phát với tốc ñộ 24 khung trên giây và có 120 nhịp trên một khung.

Phân ñoạn rãnh (track chunk)

Cấu trúc chung của phân ñoạn track như sau:

"MTrk" + <length> + <track_event> [+ <track_event> ...]

Trong ñó:

“MTrk”

có giá trị hexa là 0x4d54726b, báo hiệu ñây là phân ñoạn rãnh • <length>

chiếm 4 byte

<track_event>

dữ liệu của track event chứa thông tin về bài nhạc và ñịnh nghĩa các nốt nhạc, thời gian phát từng nốt như thế nào. Chi tiết về track event sẽ ñược phân tích trong phần sau.

Trang 38 Track Event

Cấu trúc của mỗi track event như sau:

<delta_time> + <event>

Trong ñó:

<delta_time>

lưu trữ theo ñịnh dạng dữ liệu có ñộ dài thay ñổi. Nó quyết ñịnh khi nào một sự kiện ñược tiến hành phát so với sự kiện trước ñó trong cùng một track. Giá trị này bằng 0 có nghĩa là sự kiện ñó phải ñược phát cũng lúc với sự kiện trước ñó. Sự kiện ñầu tiên của một track quy ñịnh thời gian phải chờ ñể bắt ñầu phát. Những sự kiện không bị tác ñộng bởi thời gian như thông tin tác giả, thông tin bài hát, bản quyền … thường có giá trị 0 và thường ở vị trí ñầu tiên của track. ðiều quan trọng là giá trị này không phải là một giá trị cố ñịnh, mà nó phụ thuộc vào ñộ chia thời gian (quy ñịnh trong phân ñoạn mở ñầu) và nhịp ñộ (tempo - ñược ñịnh nghĩa trong một track event). Nếu nhịp ñộ không ñược ñịnh nghĩa, thì giá trị mặc ñịnh của nó là 120.

<event>

ñược phân ra làm 3 loại sự kiện chính, ñể nhận biết ñược từng loại sự kiện, ta dựa vào byte nhận dạng ñầu tiên của chuỗi dữ liệu sự kiện.

<meta_event> là loại event không ñược gửi hoặc nhận thông qua

cổng MIDI. Event này có byte nhận dạng là 0xff

<sysex_event> là loại event dành riêng cho hệ thống, thường bắt

ñầu bằng byte 0xf0 hoặc 0xf7.

Trang 39 MIDI Channel Event

Phần này chúng ta không ñi sâu vào phân tích, chúng ta chỉ chú ý ñến cấu trúc chung của nó ñể có thể ñọc ñược chính xác những dữ liệu tiếp theo. Cấu trúc cơ bản của MIDI Channel Event gồm:

<event_type> + <midi_channel> + <para1> + <para2>

Trong ñó

<event_type>

chiếm ñộ dài 4 bit, lưu trữ loại nốt nhạc

<midi_event>

chiếm ñộ dài 4 bit, lưu trữ kênh của midi

<para1>

chiếm ñộ dài 1 byte, lưu trữ thông số kèm theo thứ 1

<para1>

chiếm ñộ dài 1 byte, lưu trữ thông số kèm theo thứ 2 SysEx Event

Có 2 cấu trúc chính như sau:

0xF0 + <data_bytes> 0xF7

0xF7 + <data_bytes> 0xF7

Event này chỉ kết thúc khi gặp byte 0xf7. Và là event chỉ dàng riêng cho hệ thống. Chúng ta cũng phân tích sâu event này vì nó không ảnh hưởng ñến việc phân tích lời. Chúng ta chỉ tìm hiểu cấu trúc sơ bộ ñể có thể ñọc ñược chính xác event tiếp theo.

Meta Event

Cấu trúc chung của meta event như sau:

0xff + <meta_type> + <v_length> + <meta_data>

Trang 40

0xff

byte nhận dạng event ñó là meta event

<meta_type>

loại thông tin lưu trữ trong meta event. Có các loại meta event sau:

Mã loại Nội dung

0x00 Số thứ tự (dàng cho tập tin MIDI dạng 2) 0x01 Dữ liệu chuỗi văn bản

0x02 Thông tin bản quyền 0x03 Tên track, tên bài nhạc 0x04 Tên loại nhạc cụ 0x05 Lời bài hát 0x06 Marker text 0x07 ðiểm tín hiệu

0x20 MIDI channel prefix assignment 0x2f kết thúc track

0x51 Hiệu chỉnh nhịp ñộ 0x54 SMPTE offset 0x58 Time signature 0x59 Key signature

0x7f Sequencer specific event

<v_length>

Trang 41

<meta_data>

dữ liệu của meta event

Một phần của tài liệu Ứng dụng hát karaoke trên mobile và xây dựng cộng đồng nhạc KAR (Trang 33 - 41)

Tải bản đầy đủ (PDF)

(94 trang)