1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thiết kế midi player theo phương pháp tra bảng cài đặt fpga

91 11 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 91
Dung lượng 1,98 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ờ

Trang 1

Đại học Quốc Gia Thành phố Hồ Chí Minh

Trường Đại học Bách khoa

-

LA HOÀNG DŨNG

THIẾT KẾ MIDI PLAYER THEO PHƯƠNG

PHÁP TRA BẢNG - CÀI ĐẶT FPGA

CBHD1 : ThS Hồ Trung Mỹ CBHD2 : TS Nguyễn Như Anh Chuyên ngành : Kỹ thuật Điện tử Khoá : K2006

LUẬN VĂN THẠC SĨ

TP HỒ CHÍ MINH, tháng 07 năm 2008

Trang 2

CÔNG TRÌNH ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH

Trang 3

Em cũng xin bày tỏ lòng biết ơn đến các thầy cô trong trường Đại học Bách khoa TPHCM đã tận tình dạy dỗ và truyền thụ những kinh nghiệm quý báu trong suốt thời gian qua

Cuối cùng mình xin chân thành cảm ơn sự đóng góp ý kiến cuả tất cả các bạn học viên trong suốt quá trình thực hiện luận văn

Học viên thực hiện

La Hoàng Dũng

Trang 4

ĐẠI HỌC QUỐC GIA TP HCM CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM

- -oOo -

Tp HCM, ngày tháng năm

NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ và tên học viên: LA HOÀNG DŨNG Giới tính : Nam Ngày, tháng, năm sinh : 08/08/1983 Nơi sinh : TPHCM Chuyên ngành : KĨ THUẬT ĐIỆN TỬ MSHV : 01406296 Khoá (Năm trúng tuyển) : K2006 1- TÊN ĐỀ TÀI: THIẾT KẾ MIDI PLAYER THEO PHƯƠNG PHÁP TRA BẢNG – CÀI ĐẶT FPGA 2- NHIỆM VỤ LUẬN VĂN :

3- NGÀY GIAO NHIỆM VỤ :

4- NGÀY HOÀN THÀNH NHIỆM VỤ :

5- HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN : TS Nguyễn Như Anh và ThS Hồ Trung

Mỹ

Nội dung và đề cương Luận văn thạc sĩ đã được Hội Đồng Chuyên Ngành thông qua

(Họ tên và chữ ký)

Trang 5

LỜI NÓI ĐẦU

MIDI (Musical Instrument Digital Interface) – một dạng chuẩn âm thanh rất phổ biến hiện nay Những dàn máy karaoke vi tính hay những chiếc điện thoại đời mới bây giờ đều có thể đọc được nó Ngoài chuẩn MIDI còn có rất nhiều chuẩn âm thanh khác như WAV, MP3, WMA … Những chuẩn này chiếm một dung lượng bộ nhớ khá lớn do lưu trữ các mẫu âm thanh Tuy nhiên, MIDI thì hoàn toàn khác Nó chỉ lưu trữ các lệnh dùng để điều khiển 1 thiết bị khác phát ra âm thanh Do đó, dung lượng của một bài hát với định dạng MIDI thường không lớn (vài chục KB) so với các chuẩn thông thường (vài MB)

Tuy nhiên chất lượng của bài hát MIDI lại là đều đáng quan tâm Chất lượng hay hay không phụ thuộc vào bộ tổng hợp MIDI Bộ MIDI Player có khả năng nhận thông điệp MIDI rồi tổng hợp lại thành âm thanh analog Có nhiều phương pháp tổng hợp MIDI như: Phương pháp cộng (Additive Synthesis), phương pháp kết hợp (Granular Synthesis), phương pháp phân tích phổ (Spectral Modeling Synthesis) Tuy nhiên, 2 công nghệ tổng hợp phổ biến hiện nay do 2 hãng nhạc cụ lừng danh Yamaha và Roland phát triển 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 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 hay còn gọi là Wavetable) Phương pháp này đơn giản, người ta lấy mẫu các âm chuẩn, số hoá rồi lưu trữ trong 1 bảng gọi là Wavetable, sau đó phát lại các mẫu này để tạo ra âm thanh mong muốn nhờ quá trình biến đổi DAC Tuy nhiên, để đạt được chất lượng âm thanh hay cần nhiều bộ nhớ để lưu trữ mẫu Nhưng điều này không là vấn đề lớn khi hiện nay bộ nhớ của những thiết bị lưu trữ được cải tiến đáng kể, hơn nữa giá thành lại thấp

Trang 6

ABSTRACT

MIDI (Musical Instrument Digital Interface) – a kind of very popular sound format nowadays Many Karaoke systems or new mobile phones also can play it easily Beside MIDI, there are a lot of other sound formats like WAV, MP3, WMA … but these formats have a little bit disadvantage that they occupy lot of capacities for each song MIDI, however, it’s quite different MIDI just stores commands to control devices to sound., that is called MIDI Player Therefore, the capacity of a MIDI song

is just about a few of KBs compare to few of MBs of other formats

However, the quality of sound MIDI is the thing that should be considered the most The quality’s good or bad quite depends on the MIDI Player MIDI Player can receive MIDI message then make analog sound There are many methods such as Additive Synthesis, Granular Synthesis, Spectral Modeling Synthesis… The most popular two approaches used by Yamaha and Roland are FM (Frequency Modulation) and Wavetable at present

Most of MIDI-built-in sound card such as Sound Blaster, Sound Power, Audiowave… are used FM chip of Yamaha The Roland technology is based on sampled waveforms (also called Wavetable Synthesis) This method is quite simple Firstly, the standard waveform is sampled, digitalized and then stored into a table called Wavetable The samples, finally, can be reused to sound based on DAC process The better quality of sound is, the more memory capacites are needed to store But, it’s not a big deal due

to low price memory chip today

Trang 7

MỤC LỤC

PHẦN I 13

CƠ SỞ LÝ THUYẾT 13

1 Giới thiệu 14

2 So sánh giữa phương pháp Wavetable và các phương pháp khác 14

3 Phạm vi nghiên cứu 15

3.1 Tìm hiểu về cấu trúc tập tin MIDI và các thông điệp của MIDI .15

3.2 Tìm hiểu về phương pháp tra bảng và cách ứng dụng thực tế cho KIT Spartan 3E .15

3.3 Thiết kế bộ tổng hợp MIDI dùng phương pháp tra bảng (cài đặt trên KIT Spartan3E) .15

4 Sơ lược lý thuyết cấu trúc thông điệp MIDI và tập tin MIDI 15

4.1 Cấu trúc thông điệp MIDI 15

4.2 Tập tin MIDI 17

5 Tổ chức lấy mẫu và lưu trữ trong ROM 22

6 Sơ lược về Card MMC/SDC 24

6.1 Sơ đồ chân của Card 25

6.2 Chế độ hoạt động của Card 26

6.3 Tập lệnh (Command set) 26

6.4 Đáp ứng (Response) 27

6.5 Quá trình khởi động Card ở chế độ SPI 28

6.5.1 Power On (Insertion) 28

6.5.2 Software Reset 28

6.5.3 Initialization 28

6.6 Đọc một khối dữ liệu (Single Block Read) 29

6.7 Đọc nhiều khối dữ liệu (Multiple Block Read) 30

6.8 Ghi một khối dữ liệu vào Card 30

6.9 Ghi nhiều khối dữ liệu 31

7 Sơ lược về cấu trúc FAT 31

7.1 Giới thiệu FAT 31

7.2 Giới thiệu Sector 32

7.3 Giới thiệu Cluster 32

Trang 8

7.4 Bắt đầu hệ thống FAT32 32

7.5 Bảng FAT32 37

8 Giới thiệu phần mềm chơi nhạc và tạo file MIDI .38

9 Các phần mềm có sẵn và tự thiết kế: 39

9.1 Các phần mềm có sẵn: 39

9.2 Phần mềm tự thiết kế: 40

10 Sơ lược về tính năng KIT Spartan 3E 41

PHẦN II 43

THIẾT KẾ VÀ CÀI ĐẶT 43

1 Giải pháp thực hiện 44

1.1 Sơ đồ tổng quát 44

1.2 Sơ đồ thiết kế khối 44

1.3 Tính năng mỗi khối 45

1.3.1 Com port 45

1.3.2 Uart 45

1.3.3 MMC Card 46

1.3.4 LCD Interface 47

1.3.5 LCD ST7066U 47

1.3.6 Block RAM 48

1.3.7 WRITEREADRAM 49

1.3.8 RAM Interface 51

1.3.9 ROM Interface 52

1.3.10 ROM Block 54

1.3.11 Sound Gen 55

1.3.12 DAC 55

1.3.13 Amplifier 57

1.4 Trình tự các bước lấy mẫu một Note nhạc và lưu vào ROM 58

1.4.1 Chơi một Note nhạc và lưu thành file MIDI: 58

1.4.2 Chuyển định dạng file MIDI thành WAV: 58

1.4.3 Tối thiểu dung lượng một Note: 59

1.4.4 Tách một chu kì của Note nhạc: 60

1.4.5 Xử lí các mẫu: 61

1.4.6 Lưu giá trị Hex vào file CGF: 64

1.4.7 Tạo file COE: 65

Trang 9

1.4.8 Dùng Memory Editor: 65

1.4.9 Tạo ROM: 66

2 Kết quả mô phỏng của một số khối 67

2.1 Khối UART 67

2.2 Khối RAMINTERFACE 67

2.3 Khối DAC 67

2.4 Khối Clock Divider 68

3 Kết quả đạt được 68

4 Tài nguyên sử dụng 69

5 Ưu điểm, khuyết điểm và hướng phát triển đề tài 70

5.1 Ưu điểm 70

5.2 Khuyết điểm 70

5.3 Hướng phát triển đề tài 70

PHỤ LỤC 71

TÀI LIỆU THAM KHẢO 90

Trang 10

DANH MỤC HÌNH VẼ

Hình 1 Cấu trúc cơ bản của 1 âm 22

Hình 2 Bảng thể hiện cao độ của note nhạc 22

Hình 3 SDC và MMC trong thực tế 25

Hình 4 Sơ đồ chân MMC và SDC 25

Hình 5 Khung lệnh 6 byte được truyền đến Card 26

Hình 6 Tập lệnh giao tiếp với Card 27

Hình 7 Đáp ứng R1 và R3 của Card trong đa số các trường hợp 28

Hình 8 Cấu trúc gói dữ liệu, đáp ứng và lỗi 29

Hình 9 Cấu trúc đọc một khối dữ liệu 30

Hình 10 Cấu trúc việc nhận nhiều khối dữ liệu liên tiếp 30

Hình 11 Cấu trúc ghi một khối dữ liệu 31

Hình 12 Cấu trúc ghi nhiều khối dữ liệu liên tiếp vào Card 31

Hình 13 Vùng MBR khởi động hệ thống ổ đĩa 32

Hình 14 Cấu trúc một Partition 16 byte 33

Hình 15 Cấu trúc phần Volume ID 33

Hình 16 Bảng Offset của các vùng trong Volume ID 34

Hình 17 Sự sắp xếp các vùng trong hệ thống FAT32 34

Hình 18 Cấu trúc thư mục 32 bytes, định dạng tên ngắn 36

Hình 19 Bảng vị trí Offset trong thư mục 32 bytes 36

Hình 20 Bảng thuộc tính của tập tin 37

Hình 21 Bảng FAT32 cho 3 tập tin dung lượng nhỏ và 1 thư mục gốc 38

Hình 22 Giao diện phần mềm Keyboard Music 39

Hình 23 Giao diện chương trình Send MIDI to COM 40

Hình 24 Minh họa KIT Spartan 3E của Xilinx thực tế 41

Hình 25 Sơ đồ tổng quát của hệ thống 44

Hình 26 Sơ đồ khối MIDI Player dùng phương pháp tra bảng 44

Hình 27 Lưu đồ giải thuật khối UART 45

Hình 28 Hình minh họa mặt sau và trước của Card MMC 46

Hình 29 Sơ đồ chân MMC Card 46

Hình 30 Sơ đồ chân FPGA giao tiếp với thiết bị dùng chuẩn giao tiếp SPI 47

Hình 31 Tạo Single Block RAM dùng CORE GEN 48

Hình 32 Bảng Block RAM của Series Spartan 3 48

Trang 11

Hình 33 Lưu đồ giải thuật khối WRITEREADRAM 50

Hình 34 Lưu đồ giải thuật khối RAM INTERFACE 51

Hình 35 Lưu đồ giải thuật khối ROM INTERFACE 53

Hình 36 Minh họa Memory Editor 54

Hình 37 Bảng Rom Address Table của nhạc cụ Piano 55

Hình 38 IC DAC LTC2624 56

Hình 39 Sơ đồ kết nối với FPGA 56

Hình 40 Thanh ghi DAC 32 bit 57

Hình 41 Hình minh họa việc chơi một Note nhạc và lưu lại thành file MIDI 58

Hình 42 Chuyển định dạng MIDI file sang WAV 59

Hình 43 Hình chuyển từ tần số lấy mẫu 44,1 KHz,16 bit sang 8 Khz, 8 bit 60

Hình 44 Dạng sóng của một Note nhạc gồm nhiều chu kì lặp lại 60

Hình 45 Các giá trị mẫu của một chu kì Note nhạc 61

Hình 46 Dùng Wordpad soạn nội dung file CGF 64

Hình 47 Tạo COE file 65

Hình 48 Generate để tạo file COE 66

Hình 49 Tài nguyên sử dụng Kit 69

Trang 12

CÁC CHỮ VIẾT TẮT TRONG LUẬN VĂN

MIDI Musical Instrument Digital Interface

UART Universal Asynchronous Receiver Transmitter

VHDL VHSIC (Very High Speed Integrated Circuit) Hardware

Description Language

Trang 13

PHẦN I

CƠ SỞ LÝ THUYẾT

Trang 14

1 Giới thiệu

Hiện nay có rất nhiều phương pháp để thực hiện bộ tổng hợp MIDI của những hãng sản xuất khác nhau Mỗi phương pháp đều có những ưu và nhược điểm riêng của nó Nhằm mục đích nghiên cứu, hiểu rõ cấu trúc thông điệp MIDI cũng như cách thực hiện bộ tổng hợp MIDI dùng Wavetable, tôi quyết định chọn đề tài: “Thiết kế bộ tổng hợp MIDI theo phương pháp tra bảng – cài đặt trên FPGA”

Để thực thi bộ tổng hợp trên thực tế, trong cuốn luận văn này, tôi sử dụng Kit Spartan3E của hãng Xilinx cùng với phần mềm ISE8.2i để viết code và chạy mô phỏng Sau đó, nạp vào chip FPGA trên Kit, ngôn ngữ lập trình sử dụng VHDL

2 So sánh giữa phương pháp Wavetable và các phương pháp khác

Hiện nay, ngoài phương pháp Wavetable còn có rất nhiều phương pháp khác để thực hiện bộ tổng hợp MIDI, trong đó có phương pháp FM (Frequency Modulation) được

sử dụng rất rộng rãi và phổ biến hiện nay

Một cách tổng quát, FM synthesis dùng 1 tín hiệu tuần hoàn (gọi là tín hiệu điều chế)

để điều chế ra 1 tín hiệu có tần số khác (gọi là sóng mang) Nếu tín hiệu điều chế là tín hiệu âm thanh (có tần số nằm trong dãy tần nghe được 20Hz đến 20KHz) thì tín hiệu sóng mang thu được sẽ có âm sắc thay đổi đáng kể

Phương pháp FM synthesis tỏ ra rất hiệu quả trong việc tổng hợp ra các âm thanh mới

lạ, với chất lượng tương đối và giá thành thấp Tuy nhiên, phương pháp này đòi hỏi các phép tính toán tương đối phức tạp

Wavetable synthesis hay còn được gọi là Digital Sampling synthesis, là phương pháp tổng hợp âm bằng cách phát lại các mẫu âm thanh đã được thu trước Các mẫu âm thanh này thường có định dạng PCM ( Pulse Code Modulation )

Một cách nôm na, người ta lấy mẫu các âm chuẩn,số hóa rồi lưu trữ trong 1 bảng gọi

là wavetable, sau đó, phát lại các mẫu này để tạo ra âm thanh mong muốn

So với các phương pháp tổng hợp âm khác, phương pháp này thực hiện tính toán ít hơn, nhưng lại cho ra âm thanh trung thực hơn Đó chính là lí do vì sao hầu hết các sound card của máy tính hiện nay đều dùng phương pháp này Khuyết điểm duy nhất của phương pháp này là muốn đạt được chất lượng âm thanh hay, cần nhiều bộ nhớ để lưu trữ mẫu Nhưng khuyết điểm này đang trở nên không đáng ngại khi mà giá của các thiết bị lưu trữ giảm dần

Trang 15

3 Phạm vi nghiên cứu

3.1 Tìm hiểu về cấu trúc tập tin MIDI và các thông điệp của MIDI

3.2 Tìm hiểu về phương pháp tra bảng và cách ứng dụng thực tế cho KIT Spartan 3E

3.3 Thiết kế bộ tổng hợp MIDI dùng phương pháp tra bảng (cài đặt trên KIT Spartan3E)

Bộ tổng hợp có chức năng đọc một file nhạc MIDI hoặc được truyền từ cổng COM máy tính xuống Kit hoặc từ thẻ nhớ MMC Card, sau đó Kit xử lí và phát âm thanh ra loa Bộ tổng hợp có thể phát nhiều tiếng của những nhạc cụ khác nhau như Piano, Violon, trống, kèn Hamonica…

Ngoài ra, LCD trên Kit hiển thị Tổng số file MIDI đang có trong MMC Card và Số thứ tự file MIDI đang phát trong MMC

4 Sơ lược lý thuyết cấu trúc thông điệp MIDI và tập tin MIDI

4.1 Cấu trú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 An-ten ti vi sẽ nhận được tất cả các kênh cùng một lúc nhưng ta 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à 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à

Trang 16

đ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 Player 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 :

[1] Khi bấm phím, MIDI-Keyboard gửi đi thông điệp dài 3 byte đến cổng MIDI OUT, viết dạng cơ số 16 (hexadecimal) là 903C40 Thông điệp này gọi là "Note On" (chơi nốt nhạc) Byte thứ nhất (90) cho biết thông điệp là "Note On", kênh tác dụng là kênh số 0, dạng tổng quát là 9n trong đó n thay đổi từ 0 đến 15 cho biết số thứ tự của kênh Byte thứ hai (3C) cho biết số thứ tự của nốt sẽ chơi (key number), thay đổi từ 0 đến 127 Byte thứ ba (40) cho biết tốc độ bấm phím (velocity) thay đổi từ 0 đến 127,

số càng lớn thì nốt phát ra kêu càng to Thông điệp dài 3 byte này sẽ gửi đến Player qua cổng MIDI IN của nó, và Player sẽ trả lời bằng cách phát ra nốt đô theo đúng yêu cầu Nốt đô này sẽ kêu hoài cho đến khi ta nhấc ngón tay khỏi phím

[2] Khi nhấc ngón tay khỏi phím, MIDI-Keyboard gửi đi thông điệp dài 3 byte là

90 3C00 Thông điệp này giống như thông điệp ở trên, chỉ khác ở giá trị của byte thứ

ba là 00, giá trị velocity bằng 0 này sẽ làm tắt việc phát ra nốt đô Player khi nhận được thông điệp này, sẽ ngưng việc phát ra nốt đô trước đó ở kênh 0 Do đó thông điệp này được gọi là "Note Off"

Nếu Player 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 Player

Trang 17

Thông điệp "Program Change" rất quan trọng, nó sẽ yêu cầu Player 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 Player 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

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

4.2 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

Tập tin MIDI trong Windowns được viết cho 3 loại :

Trang 18

+ Extended : phát được 10 kênh từ 1 đến 10

+ General MIDI : 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 Player 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

Để dễ hiểu hơn, ta lấy ví dụ nội dung của một file MIDI gồm những chuỗi Bytes đơn giản như sau:

Vd: 4D 54 68 64 00 00 00 06 00 01 00 03 00 F0 4D 54 72 6B 00 00 00 36 00 FF

58 04 03 02 18 08 00 FF 51 03 07 A1 20 00 C0 13 00 B0 07 7F 00 90 1C 40 81 70

40 40 81 70 43 40 81 70 48 40 85 50 3C 00 00 40 00 00 43 00 00 48 00 FF 2F 00

[1] - Nhóm dữ liệu header : Bắt đầu bằng 4 ký tự nhận dạng: MThd (tương ứng với

4 bytes 4D 54 68 64) Kế đến 4 bytes 00 00 00 06 cho biết byte dữ liệu theo sau nó là

6 bytes Trong ví dụ trên ta thấy 6 bytes theo sau nó là 00 01 00 03 00 F0 Do đó, tổng

số bytes của nhóm header là 14

Giả sử ta có 6 byte dữ liệu của nhóm header như trên 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), track thứ ba dùng để phát ra 4 nốt trên kênh 12 (dành cho

bộ base-level) Hai byte cuối, sau khi xử lý theo cách riêng sẽ cho biết đơn vị xử lý thời gian

Trang 19

[2]- Nhóm dữ liệu track : Bắt đầu bằng 4 ký tự MTrk (4D 54 72 6B), tiếp sau là 4 byte (00 00 00 36) cho biết chiều dài của dữ liệu chứa trong track Ở đây 36 là số hex tương ứng với số 54 thập phân, cho thấy dữ liệu trong track có tất cả 54 bytes 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 Player) 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)

[3] - 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ỗ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 :

Trang 20

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) 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, Player 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 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 Từ đây, ta thấy

Trang 21

meta-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 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 Player 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 7F (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 Player 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 Player 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 Player phát 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 Player 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

Trang 22

5 Tổ chức lấy mẫu và lưu trữ trong ROM

Một âm có cấu trúc cơ bản như sau

Hình 1 Cấu trúc cơ bản của 1 âm

Mỗi âm thanh chuẩn đề cập ở đây thường là 1 nốt Ta thấy, dạng sóng có chu kì lặp lại nhưng chỉ khác biệt ở chỗ biên độ ở phần khởi đầu, ổn định và tắt dần Do đó, để tiết kiệm bộ nhớ ROM, ta chỉ lưu đặc trưng của mỗi note nhạc là dữ liệu của một chu

kì Sau đó, ta cho lặp lại số chu kì trên theo thời gian mong muốn Việc thay đổi biên

độ ta thực hiện bằng cách dịch trái các giá trị mẫu (tăng biên độ) hoặc dịch phải các giá trị mẫu (giảm biên độ)

Khi phát lại nốt nhạc này, bộ tổng hợp âm sẽ phát phần khởi đầu trước, rồi đến phần

ổn định Nếu nốt được phát tiếp tục kéo dài thì bộ tổng hợp âm sẽ phát lặp vòng phần

ổn định Cho đến khi có lệnh “note off”, bộ tổng hợp âm sẽ hoàn tất phần ổn định đang phát rồi chuyển sang phát phần tắt dần MIDI có tổng cộng 128 nốt nhạc:

Hình 2 Bảng thể hiện cao độ của note nhạc

Nốt Quãng

Trang 23

Ví dụ: C2 sẽ có tần số gấp đôi C1; A5 sẽ có tần số gấp đôi A4…

Đặc trưng cho sự khác biệt giữa các nốt nhạc với nhau là cao độ ( pitch ) mà nhìn ở khía cạnh toán học đó chính là tần số của tín hiệu Những con số trong bảng mô tả nốt của MIDI chính là cao độ của từng nốt, chúng có quan hệ logarit với tần số theo công thức :

f = 440 x 2(k – 69)/12 trong đó : f là tần số [Hz]

k là cao độ ( lấy từ bảng nốt của MIDI )

Theo đó, ta thấy nốt La ở quãng tám thứ 4 (A4) có cao độ là 69, tương ứng

Như vậy 2 âm cách nhau 1 quãng tám sẽ có tần số lệch nhau 2 lần Ví dụ như âm A5

sẽ có tần số gấp đôi âm A4, tức là 880Hz

Trang 24

Dựa vào mối quan hệ giữa cao độ và tần số này, ta thấy để có được các âm với cao độ khác nhau ta có thể thay đổi tần số của chúng Ta sẽ thay đổi tần số thông qua việc thay đổi cách truy xuất mẫu từ wavetable Giả sử âm A4 được lưu trữ trong wavetable với n mẫu : x1, x2, x3, x4,…, xn-2, xn-1, xn

Nếu ta truy xuất từng mẫu theo đúng thứ tự như vậy thì ta sẽ thu được âm A4 ở ngõ ra của bộ tổng hợp

Nhưng nếu ta truy xuất : x1, x3,…, xn-3,x n-1 thì ở ngõ ra ta sẽ thu được âm A5, có tần

số gấp đôi A4

Nói cách khác, nếu gọi b là bước truy xuất mẫu, khi b =1, ta có trường hợp thứ

nhất và khi b = 2, ta có trường hợp thứ 2 Hai âm này cách nhau đúng 1 quãng tám, hay nói cách khác là tần số lệch nhau 2 lần Với các âm khác trong cùng quãng tám này, b sẽ mang các giá trị không nguyên 1 <= b <= 2 Khi đó, sẽ xuất hiện trường hợp chỉ số mẫu ( i + b ) không nguyên, tức là giá trị mẫu xi+b không có trong wavetable

Có nhiều cách để tính toán giá trị này Xin trình bày 2 cách ở đây :

+ Cách 1 : đơn giản nhất là làm tròn chỉ số mẫu (xuống hoặc lên) Cách này

tuy cho âm ra không trung thực nhưng đơn giản

+ Cách 2 : dùng phương pháp nội suy tuyến tính

Ví dụ : muốn tìm xi nằm giữa xk và xk+1 (k <= i <= k+1), ta có công thức :

xi = xk + (i – k)( xk+1 - xk )

6 Sơ lược về Card MMC/SDC

Ngày nay, thẻ nhớ SDC (Secure Digital Card) và MMC (MultiMedia Card) là 2 loại thẻ được sử dụng rộng rãi nhất trong những máy quay phim, chụp hình kĩ thuật số hay những chiếc điện thoại di động đời mới có thể chứa vô số những bài hát và phim Tiền thân của SDC là MMC Card có tốc độ chậm hơn Có những chuẩn MMC và SDC khác nhau như RS-MMC, miniSD và microSD Thực chất chúng chỉ khác nhau về kích thước nhỏ gọn bề ngoài nhưng bản chất hoạt động hoàn toàn giống nhau Card MMC/SDC có một chip điều khiển (controller) và bộ nhớ Flash (Flash Memory) bên trong nó Dữ liệu giao tiếp giữa MMC/SDC và bộ điều khiển chủ (host controller) theo mặc định là 512 bytes (ta có thể thay đổi thông số này bằng cách gửi lệnh cho Card) Những file được định nghĩa trong MMC/SDC có định dạng FAT12/FAT16/FAT32 của Microsoft

Trang 25

Hình 3 SDC và MMC trong thực tế

6.1 Sơ đồ chân của Card

Hình sau cho thấy sơ đồ chân của 2 loại Card MMC và SDC MMC có 7 chân trong khi SDC có 9 chân Số thứ tự chân từ 1 đến 7 của hai Card là giống nhau Tuy nhiên, SDC có thêm 2 chân dữ liệu DAT1 và DAT2 Các chân gồm Vcc, Vss1 = Vss2 = GND, CLK, DI, DO

Chân Vcc, GND và CLK cung cấp nguồn và xung clock cho Card

Chân DI nhận dữ liệu từ Controller host

Chân DO xuất dữ liệu

Điện áp hoạt động cho Card có tầm từ 2.7 đến 3.6 Volts, dòng tiêu thụ khoảng 100

mA Hình sau cho thấy sơ đồ chân của MMC và SDC:

Hình 4 Sơ đồ chân MMC và SDC

Trang 26

6.2 Chế độ hoạt động của Card

Mỗi loại Card đều có chế độ hoạt động riêng của nó được gọi là Native Mode Ví dụ như MMC có chế độ hoạt động MMC Mode, còn SDC thì có SD mode Ngoài ra, chúng cũng có thể giao tiếp ở chế độ SPI (Serial Peripheral Interface) Trong phạm vi luận văn này, ta sử dụng chế độ SPI Mode Chế độ SPI Mode giao tiếp đơn giản hơn nhiều so với chế độ mặc định Hơn nữa, ở chế độ này sẽ thuận tiện hơn khi giao tiếp với những vi điều khiển, fpga có sẵn SPI Port Ngoài ra, một lý do khác để ta thiết lậo

ở chế độ SPI đó là tốc độ xung clock Nếu ở chế độ Native Mode thì tốc độ xung clock cung cấp tối đa cho Card sẽ rất thấp (giới hạn tối đa là 400 kHz), trong khi tốc

độ tối đa của Card ở chế độ SPI là 20MHz (MMC) hoặc 25MHz (SDC) Tuy nhiên, khi khởi động (cấp nguồn) ban đầu thì Card vào chế độ mặc định là Native Mode Do

đó ta phải dùng lệnh CMD (Command) để thiết lập chế độ SPI cho chúng Có rất nhiều lệnh (đọc, ghi, xóa, thiết lập chế độ …) cho Card Ta sẽ đề cập tập lệnh ở phần sau

6.3 Tập lệnh (Command set)

Trong chế độ SPI, chiều dữ liệu là cố định trên mỗi đường dây Ví dụ như DI chỉ cho phép tín hiệu nhận vào Card và DO cho phép Card xuất dữ liệu Dữ liệu truyền trên mỗi đường dây được truyền theo định hướng byte nối tiếp (byte-oriented serial communication) Khung lệnh (command frame) truyền từ chủ (host – vi điều khiển, fpga ) có chiều dài cố định là 6 byte Khi một khung lệnh được truyền đến Card, Card sẽ đáp ứng lại bằng lệnh R1, R2, R3 có chiều dài khác nhau Thông thường đáp ứng bằng R1 = 1 byte Việc đọc các giá trị của R1 cho biết trạng thái của Card lúc đó Hình sau là khung lệnh 6 byte được truyền đến Card:

Hình 5 Khung lệnh 6 byte được truyền đến Card

Bit đầu tiên và thứ hai là 0 và 1 cho biết bắt đầu một khung lệnh gửi đến Card Vùng Index (bit 5-0) là tập lệnh gửi đến Card Tập lệnh có tất cả 64 lệnh từ CMD0 đến

Trang 27

CMD63 (tương ứng từ 000000 đến 111111) Kế đến vùng Argument có giá trị 4 byte (32 bit) định địa chỉ của ô nhớ trong Card (dùng cho lệnh đọc/ghi) Cuối cùng là byte CRC dùng để đồng bộ khung với bit tận cùng là 1 cho biết kết thúc một khung lệnh

Khoảng NCR là thời gian Card xử lí lệnh, có giá trị từ 0 đến 8 bytes (SDC) và 1 đến 8 bytes (MMC) Cuối cùng là R1 Response (bit đầu bằng 0) là byte đáp ứng của Card cho biết trạng thái của Card lúc đó Bảng sau là tập lệnh để giao tiếp với Card

Hình 6 Tập lệnh giao tiếp với Card

Các lệnh cơ bản ta thường sử dụng như CMD0, CMD1, CMD17, CMD18, CMD24 và CMD25

6.4 Đáp ứng (Response)

Có những đáp ứng của Card như R1, R2, R3 có chiều dài khác nhau tùy thuộc vào lệnh đó là gì Đáp ứng R1 có chiều dài 1 byte thường dùng trong đa số trường hợp Khi Card trả đáp ứng R1 có giá trị là 0x00 có nghĩa là thành công Ngược lại, nếu có bất cứ lỗi nào xảy ra thì bit tương ứng của R1 sẽ có giá trị 1 Đáp ứng R3 chỉ dùng cho lệnh CMD58, byte đầu tiên của R3 giống như R1, phần sau là OCR có giá trị 32 bit Một vài lệnh có thời gian xử lí lâu hơn khoảng NCR nên sẽ có đáp ứng là R1b R1b theo sau là cờ báo bận (busy flag) Chân DO được giữ ở mức thấp trong suốt quá

Trang 28

0xFF trước khi nhận dữ liệu Hình sau thể hiện 2 loại đáp ứng của Card:

Hình 7 Đáp ứng R1 và R3 của Card trong đa số các trường hợp

6.5 Quá trình khởi động Card ở chế độ SPI

Như đã đề cập, sau khi cung cấp nguồn cho Card Card sẽ tự động đi vào chế độ mặc định Native Mode của nó Do đó, để đặt Card vào chế độ SPI, cần làm theo những bước sau:

6.5.1 Power On (Insertion)

Sau khi cung cấp nguồn đạt đến điện áp 2.2 Volts, đợi khoảng ít nhất 1 ms, sau đó giữ chân DI và CS ở mức cao khoảng ít nhất 74 xung clocks nữa Card sẽ vào chế độ mặc định của nó là Native Mode

6.5.2 Software Reset

Gửi lệnh CMD0 với CS = 0 để Reset Card Vì đang ở chế độ Native Mode nên vùng CRC trong CMD0 phải là giá trị hợp lệ (giá trị CRC ở đây là 0x95) Khi lệnh CMD0 được chấp nhận, Card sẽ vào chế độ SPI Khi đó giá trị của CRC sẽ không cần quan tâm nữa (thường ta chọn 0x00) ngoại trừ CMD59 Khi vào chế độ SPI Mode, Card sẽ

ở trạng thái nghỉ (Idle) với byte R1 Response có giá trị tương ứng là 0x01

6.5.3 Initialization

Ở chế độ nghỉ (Idle) chỉ có 3 lệnh CMD0, CMD1 và CMD58 là hợp lệ Tất cả các lệnh khác sẽ bị hủy bỏ Kế đến, ta sẽ liên tiếp gửi đến Card lệnh CMD1 và kiểm tra giá trị R1 Response Việc kiểm tra sẽ hoàn tất khi ta nhận được byte R1 Response với giá trị 0x00 Quá trình kiểm tra R1 diễn ra khoảng vài trăm ms Sau quá trình Initialization thì ta có thể tiếp hành quá trình đọc/ghi Card bình thường bằng các lệnh CMD17, CMD18 (đọc) và CMD24, CMD25(ghi) Mặc định khối dữ liệu sẽ được đọc/

Trang 29

ghi là 512 bytes Ta có thể thiết lập kích cỡ của khối dữ liệu bằng lệnh CMD16 Đối với SDC Card, ta dùng lệnh ACMD41 để thay cho lệnh CMD1

Truyền nhận dữ liệu (Data transfer)

Gói dữ liệu và đáp ứng dữ liệu (Data packet and Data Response)

Trong việc truyền nhận dữ liệu, một hay nhiều khối sẽ được truyền trên đường truyền sau khi Card đáp ứng Response thành công Gói dữ liệu bắt đầu bằng 1 byte Data Token, kế đến là khối dữ liệu và 2 bytes CRC Hình sau cho thấy cấu trúc của một gói

dữ liệu và những đáp ứng cũng như lỗi tương ứng xảy ra trên đường truyền:

Hình 8 Cấu trúc gói dữ liệu, đáp ứng và lỗi

Trên hình ta thấy có 3 giá trị cho Data Token đáp ứng cho từng loại lệnh Đối với Stop Tran Token được sử dụng trong trường hợp ta muốn ngừng gửi một khối dữ liệu bất kì trong một chuỗi khối dữ liệu được gửi Vì là lệnh ngừng gửi dữ liệu, nên sẽ không cần khối dữ liệu và vùng CRC trong lệnh này

Kế đến là đáp ứng dữ liệu và lỗi tương ứng trên đường truyền được Card thiết lập ở những vị trí tương ứng

6.6 Đọc một khối dữ liệu (Single Block Read)

Ta sử dụng lệnh CMD17 để đọc một khối dữ liệu Vùng Argument thể hiện địa chỉ sector cần đọc (1 sector = 512 bytes) Khi lệnh CMD17 được chấp nhận, lệnh đọc được khởi tạo, khối dữ liệu sau đó sẽ được gửi đến chủ Sau khi nhận byte Data token

Trang 30

đến giá trị của 2 bytes CRC này Nếu có bất cứ lỗi nào xảy ra, bit lỗi tương ứng sẽ được đặt lên 1 trong byte Data token Hình sau minh họa cấu trúc đọc một khối dữ liệu:

Hình 9 Cấu trúc đọc một khối dữ liệu

6.7 Đọc nhiều khối dữ liệu (Multiple Block Read)

Dùng lệnh CMD18 để đọc nhiều khối dữ liệu liên tiếp Vùng Argument là địa chỉ sector bắt đầu của chuỗi dữ liệu nhiều khối liên tiếp Dùng lệnh CMD12 nếu muốn kết thúc việc nhận dữ liệu bất kì lúc nào Byte nhận được theo sau lệnh CMD12 là byte chèn (stuff byte), ta nên loại bỏ giá trị byte này trước khi nhận được giá trị Response đáp ứng của CMD12 Hình sau minh họa cấu trúc của việc đọc nhiều khối

dữ liệu liên tiếp:

Hình 10 Cấu trúc việc nhận nhiều khối dữ liệu liên tiếp

6.8 Ghi một khối dữ liệu vào Card

Khi lệnh ghi CMD24 được chấp nhận bởi Card thì chủ sẽ gửi dữ liệu đến Card sau một byte trống (space byte) Định dạng gói dữ liệu cũng giống như lệnh đọc khối dữ liệu Khi một gói dữ liệu được truyền đi, Card sẽ đáp ứng bằng một byte Response Theo sau byte Response là một khoảng thời gian Card busy để ghi dữ liệu vào Card Hầu như các Card có kích thước khối cố định là 512 bytes Theo nguyên tắc của SPI Mode, tín hiệu CS nên tích cực (mức 0) suốt quá trình truyền nhận dữ liệu Tuy nhiên,

Trang 31

cũng có ngoại lệ trong trường hợp này, đó là trong thời gian Card busy để xử lí dữ liệu ta có thể cho chân CS không tích cực để dành bus SPI xử lí các thiết bị khác có chung đường truyền SPI với Card Hình sau minh họa việc ghi một khối dữ liệu vào Card:

Hình 11 Cấu trúc ghi một khối dữ liệu

6.9 Ghi nhiều khối dữ liệu

Lệnh ghi nhiều khối dữ liệu CMD25 từ một địa chỉ sector bắt đầu Nếu số khối dữ liệu không được chỉ rõ trước khi dùng lệnh, việc ghi sẽ bắt đàu như một lệnh ghi nhiều khối dữ liệu mở đầu, lệnh ghi sẽ được dừng lệnh khi phát hiện byte Stop Tran Token Cờ báo bận sẽ xuất hiện sau một byte chèn vào giữa Busy và Stop Tran Hình sau minh hoạ việc ghi nhiều khối dữ liệu vào Card:

Hình 12 Cấu trúc ghi nhiều khối dữ liệu liên tiếp vào Card

7 Sơ lược về cấu trúc FAT

7.1 Giới thiệu FAT

FAT (File Allocation Table) tạm dịch là “Bảng cấp phát tập tin” được phát triển bởi Microsoft FAT được sử dụng rộng rãi trong những ổ cứng, ổ đĩa di động hay những thẻ nhớ ngày nay FAT có nhiều chuẩn như FAT12, FAT16 và FAT32 Trong phạm

vi luận văn này, ta tập trung nghiên cứu FAT32 bởi lẽ FAT32 có thể sử dụng cho những ổ cứng có dung lượng hàng trăm GBs ngày nay FAT12, FAT16 đã lỗi thời và

ít được sử dụng như FAT32 ngày nay

Trang 32

7.2 Giới thiệu Sector

Sector là một vùng bộ nhớ chứa trong ổ cứng Kích cỡ 1 sector thông thường là 512 bytes Một ổ cứng, thẻ nhớ chứa rất nhiều Sectors để dễ quản lí tập tin

7.3 Giới thiệu Cluster

Cluster là một tập hợp bao gồm nhiều Sectors Một Cluster có thể chứa 1,2,4,8,16,32,64,128 Sectors Dung lượng một Cluster có thể là 1KB, 2KB, 4KB, 8KB, 16KB hay 32KB Một Cluster có dung lượng 4KB được sử dụng phổ biến trước kia, ngày nay một Cluster có dung lượng 32KB được sử dụng rộng rãi

7.4 Bắt đầu hệ thống FAT32

Hệ thống FAT32 được bắt đầu bằng Sector 0 có địa chỉ 32 bit là 0x00000000 Thông thường người ta gọi vùng này là MBR (Master Boot Record) với địa chỉ bắt đầu LBA (Logic Block Address) = 0 Hình sau minh họa vùng nhớ của MBR (Sector 0 = 512 bytes):

Hình 13 Vùng MBR khởi động hệ thống ổ đĩa

Vùng địa chỉ 446 bytes là vùng để khởi động máy tính Theo sau là bảng gồm 64 bytes phân vùng (64-byte partition table) Mỗi phân vùng (partition) bao gồm 16 bytes Hai bytes cuối cùng của MBR luôn luôn có giá trị là 0x55 và 0xAA Do đó, ta cần kiểm tra đúng hai giá trị này để biết chắc rằng vùng MBR hoạt động tốt

Ta chỉ quan tâm đến Partition 1, bỏ qua Partition 2,3,4

Trang 33

Mỗi Partion bao gồm 16 bytes như sau:

Hình 14 Cấu trúc một Partition 16 byte

Để đơn giản ta chỉ quan tâm các byte như Type Code, LBA Begin

Byte thứ năm – Type Code cho biết loại tập tin hệ thống được hỗ trợ chứa trong phân vùng, thông thường byte này có giá trị là 0x0B hoặc 0x0C (hỗ trợ FAT32) Byte 9-12 cho biết vùng địa chỉ bắt đầu LBA, việc đọc LBA để biết được hệ thống tập tin

(filesystem) nằm trên ổ cứng

Vùng Number of Sectors có thể dùng để kiểm tra xem có ghi dữ liệu vượt ngoài phạm

vi phân vùng hay không Tuy nhiên, chính mỗi tập tin FAT32 lại có chứa thông số kích cỡ tập tin, do đó vùng Numbers of Sectors thì không cần thiết

Các bytes Boot Flag, CHS Begin và CHS End ta bỏ qua

Trang 34

Sau đây là địa chỉ Offset của những vùng trên:

Hình 16 Bảng Offset của các vùng trong Volume ID

Để rõ hơn, ta cần xem qua các vùng được sắp xếp trong hệ thống FAT32 như sau:

Hình 17 Sự sắp xếp các vùng trong hệ thống FAT32

Hình trên cho ta thấy đầu tiên là vùng Sector 0 (512 Bytes), kế đến là vùng dự trữ (Reserved), kích thước vùng dự trữ này được qui định tại Offset 0x0E trong vùng Sector 0 Theo sau vùng Reserved là vùng FAT, thông thường có 2 vùng FAT1 và

Trang 35

FAT2 Kích thước của vùng FAT này được qui định tại Offset 0x10 và 0x24 Kế đến

là các Cluster có kích thước có thể 512 Bytes, 1KB, 2KB …., 32KB tùy thuộc vào dung lượng của ổ cứng, thẻ nhớ đang dùng Nếu thẻ nhớ có dung lượng là 32MB, 64MB thì kích thước Cluster = Sector = 512 Bytes Nếu thẻ nhớ dung lượng lớn hơn thì kích thước Cluster sẽ lớn hơn

Để tính được địa chỉ bắt đầu mỗi vùng như vùng Reserved, vùng FAT, vùng các Cluster … ta có công thức sau:

Fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors

Cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors +

(Number_of_FATs * Sectors_Per_FAT)

Sectors_per_cluster = BPB_SecPerClus

root_dir_first_cluster = BPB_RootClus

Xác định vị trí tập tin trong hệ thống FAT32

Khi bắt đầu, ta chỉ biết được Cluster đầu tiên của thư mục gốc (Root Directory) Đọc thư mục gốc ta sẽ biết được tên và địa chỉ Cluster đầu tiên của những tập tin và thư mục con khác Ngoài thông tên tên và địa chỉ của tập tin, ta có thể biết được chiều dài, thời gian bổ sung tập tin (modification time), bit trạng thái … Nếu ta cần truy cập một tập tin có dung lượng nhỏ hơn kích thước của một Cluster (ví dụ 32KB) thì ta chỉ cần đọc tại thư mục chứa tập tin đó để biết được địa chỉ bắt đầu của tập tin đó Sau đó ta

sẽ nhảy đến vị trí bắt đầu của tập tin đó trong hệ thống mà truy câp dữ liệu Ngược lại, nếu dung lượng của tập tin lớn hơn kích thước của một Cluster thì ta phải cần dùng đến bảng FAT Bởi lẽ bảng FAT chứa những địa chỉ kế tiếp của những Cluster mà chứa tập tin có dung lượng lớn hơn một Cluster

Ta sẽ đề cập bảng FAT trong phần sau Bây giờ, giả sử ta cần truy cập một tập tin có dung lượng nhỏ hơn một Cluster

Dữ liệu thư mục được tổ chức bởi những vùng 32 bytes (32 byte records) Có 2 loại vùng thư mục 32 bytes:

- Normal record with short filename

- Long filename text

- Unused: Byte đầu tiên có giá trị 0xE5

- End of directory: Byte đầu tiên có giá trị 0x00

Những vùng thư mục không sử dụng (Unused directory records) là kết quả của việc

Trang 36

xóa tập tin, do đó byte đầu tiên sẽ có giá trị là 0xE5 Khi đó, nếu có một tập tin mới được tạo ra thì record này sẽ được sử dụng lại (byte đầu tiên sẽ có giá trị mới khác 0xE5) Nếu kết thúc một thư mục thì record sẽ có byte bắt đầu là 0x00 Những record

có giá trị của byte đầu tiên khác 0xE5 và 0x00 mới là dữ liệu thực sự Để đơn giản, ta chỉ quan tâm đến tập tin có tên dưới 8 kí tự (short file name = 8.3 filename format) Hình sau minh họa cấu trúc của một thư mục 32 byte, định dạng tên ngắn (32 byte Directory Structure, Short Filename Format):

Hình 18 Cấu trúc thư mục 32 bytes, định dạng tên ngắn

Bảng sau cho biết vị trí Offset của Short filename, Attrib byte, First High/Low Cluster

và File size trong thư mục 32 bytes:

Hình 19 Bảng vị trí Offset trong thư mục 32 bytes

11 bytes đầu tiên là tên tập tin Nếu tên tập tin ngắn hơn 8 kí tự (8 bytes) thì những byte còn lại sẽ được ghi giá trị là 0x20

Byte Attrib là byte thuộc tính thể hiện thuộc tính của tập tin Byte này chỉ sử dụng 6 bit thấp để xác định thuộc tính của tập tin:

Trang 37

Hình 20 Bảng thuộc tính của tập tin

Thông thường các phần mềm (firmware) đọc byte thuộc tính này để kiểm tra xem 32 bytes là một record bình thường (normal record) hay là record với tên dài, hoặc để kiểm tra xem đó là tập tin thông thường hay là thư mục con Những record có tên dài thì cả 4 bit thấp (bit 0 -3) được đặt lên 1 Ngược lại, nếu record có tên ngắn thì 4 bit thấp không được đặt lên 1

Địa chỉ bắt đầu Cluster gồm 2 số 16 bit (High Cluster + Low Cluster) với địa chỉ Offset xem trong bảng Offset 4 bytes cuối cho biết kích thước của tập tin Với High Cluster hoặc Low Cluster (16 bit = 2 byte) thì byte LSB là byte đầu tiên

7.5 Bảng FAT32

Thư mục sẽ cho ta biết địa chỉ Cluster đầu tiên của mỗi tập tin (thư mục) Như đã đề cập, nếu tập tin có dung lượng nhỏ hơn kích thước của một Cluster thì chỉ cần đọc thư mục chứa tập tin đó là biết được địa chỉ của tập tin đó Nhưng nếu dung lượng của tập tin lớn hơn kích thước của một Cluster thì phải cần dùng đến bảng FAT32 Bảng FAT32 thực chất chứa địa chỉ của chuỗi bao gồm nhiều Cluster (nếu một tập tin có dung lượng lớn được chứa bởi nhiều Cluster)

FAT32 là một mảng các số nguyên 32 bit, mỗi vị trí mảng tương ứng với một Cluster Giá trị lưu trong mảng đó cho biết vị trí của Cluster kế tiếp trong tập tin đó Trong 32 bit thì 7 bit đầu tiên (bit 0-6) sẽ biểu diễn vị trí của Cluster kế tiếp Bit 7-31 cho biết những Sector nào đọc từ bảng FAT Nếu tất cả 32 bit đều bằng 1 thì Cluster hiện hành

Trang 38

là Cluster cuối cùng

Để dễ hiểu hơn, sau đây là ví dụ FAT32 của 3 tập tin nhỏ và 1 thư mục gốc

Hình 21 Bảng FAT32 cho 3 tập tin dung lượng nhỏ và 1 thư mục gốc

Trong ví dụ trên, ta thấy thư mục gốc (Root Directory) bắt đầu tại Cluster 2 Tại Cluster 2 ta thấy có giá trị 0x00000009 có nghĩa là Cluster kế tiếp (Cluster 3) của tập tin đó sẽ bắt đầu tại vị trí Cluster thứ 9 Tương tự, những Cluster A,B và 11 chiếm phần còn lại của thư mục gốc Tại vị trí 11 có giá trị 0xFFFFFFFF cho biết đó là Cluster cuối cùng của thư mục gốc Tương tự cho tập tin File#1, File#2, File#3

8 Giới thiệu phần mềm chơi nhạc và tạo file MIDI

Hiện nay có rất nhiều phần mềm thông dụng cho phép việc tạo và biên soạn file MIDI như Winhex, Finale, Music time hoặc thậm chí có thể dùng chương trình Debug trong Dos Trong nội dung phần luận văn này, ta sử dụng phần mềm Keyboard Music Keyboard Music là chương trình cho phép ta chơi nhạc bằng bàn phím máy tính Mỗi phím nhấn biểu diễn cho một note nhạc khác nhau được qui ước bởi phần mềm Keyboard Music có thể hỗ trợ nhiều loại nhạc cụ khác nhau như Piano, Violon, Guitar

Trang 39

Ngoài ra, ta còn có thể tạo tập tin MIDI bằng Keyboard Music sau khi chơi một bản nhạc nào đó File MIDI được phần mềm tạo ra, ta có thể dùng chương trình chơi nhạc bất kì như Windows Media Player để phát lại Âm thanh mà ta nghe được từ file MIDI này sẽ là âm thanh mà ta chơi nhạc trên Keyboard Music lúc nãy

Ở đây, sau khi file MIDI, ta sẽ đọc nội dung file này bằng chương trình Visual Basic rồi sau đó sẽ gửi xuống Kit Spartan 3E thông qua cổng COM Sau đây là giao diện phần mềm:

Hình 22 Giao diện phần mềm Keyboard Music

Trang 40

9.2 Phần mềm tự thiết kế:

- Chương trình Visual Basic đọc file MIDI và chuyển dữ liệu ra cổng COM Giao diện chương trình như sau:

Hình 23 Giao diện chương trình Send MIDI to COM

- Click nút Open để mở cổng COM, các thông số cổng đã được thiết lập như tốc độ baud = 9600, 8 bit data, 1 bit start, 1 bit stop, No parity check bit

- Chọn file MIDI cần gửi, sau đó click Send MIDI thì dữ liệu sẽ được chuyển ra cổng COM từng byte một

Ngày đăng: 11/02/2021, 20:54

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w