1. โครงสร้างไฟล์ Standard MIDI (SMF)
ไฟล์ Standard MIDI (.mid) ประกอบด้วยบล็อกข้อมูลไบนารี (Chunks) เริ่มต้นด้วย MThd Header Chunk ขนาด 14 ไบต์ และตามด้วย MTrk Track Chunks หนึ่งหรือหลายแทร็ก แต่ละบล็อกจะระบุชนิดไบนารี 4 ไบต์และขนาดความยาวไบนารีแบบ Big-Endian 32 บิต
เทคนิคการตรวจจับและซ่อมแซม Magic Header
ไฟล์คาราโอเกะดั้งเดิมจากฐานข้อมูลเก่าๆ มักประสบปัญหา Magic Header สี่ไบต์แรกเสียหาย (ASCII MThd หรือค่า HEX 0x4D546864) ระบบประมวลผลจะตรวจสอบค่า 32-bit Uint32 ตำแหน่งแรกสุด หากไม่พบค่า MThd ระบบจะทำการซ่อมแซมและเขียนรหัส 0x4D546864 ทับลงใน DataView Buffer โดยอัตโนมัติเพื่อให้เครื่องเล่นอ่านโน้ตดนตรีได้อย่างแม่นยำ
2. การอ่านค่าเวลา Variable-Length Quantity (VLQ) และคำสั่ง MIDI Events
ภายในแทร็ก MTrk ระยะเวลาการเล่นโน้ตถูกบันทึกในรูปแบบ **Delta Times** ผ่านระบบรหัส Variable-Length Quantity (VLQ) บิตแรกสุด (MSB 0x80) ของแต่ละไบต์จะเป็นตัวบอกว่ามีไบต์ถัดไปหรือไม่ และนำ 7 บิตที่เหลือมารวมกันเป็นตัวเลขจำนวนเต็ม ผลรวมสะสมของ Delta Times จะถูกแปลงเป็น **Absolute Ticks** เพื่อใช้อ้างอิงตำแหน่งเวลาของโน้ตทุกตัวในเพลง
ประเภทคำสั่ง MIDI Events ที่ถูกประมวลผล
- 1Channel Events (0x80 - 0xEF): ควบคุมคำสั่ง Note On (0x90), Note Off (0x80), Program Change (0xC0 เปลี่ยนเครื่องดนตรี), Pitch Bend ปรับคีย์ และแทร็กช่อง 10 (Channel Index 9) สำหรับชุดกลอง
- 2Tempo Meta Events (0x51): บันทึกค่า Microseconds Per Quarter Note (MPQN) สำหรับคำนวณความเร็วเพลง BPM ด้วยสูตร:
BPM = 60,000,000 / MPQN - 3Time Signature Meta Events (0x58): กำหนดอัตราจังหวะของห้องเพลง (เช่น 4/4, 3/4)
- 4Marker Text Events (0x06): ข้อความระบุคอร์ดดนตรี (เช่น C, Am, F#m, G7) เพื่อแสดงผลบนหน้าจอคาราโอเกะ
3. การแกะข้อมูลเนื้อเพลงและ Meta สอดไส้ (Embedded KLyr XML)
ไฟล์ MIDI/KAR หลายประเภทในปัจจุบันมีการฝังข้อมูลรายละเอียดเพลงและแทร็กคำร้องพร้อมเวลาแบบลงลึกระดับตัวอักษรไว้ภายใน Meta Text Event (Meta Type 0x01) ที่ขึ้นต้นด้วยข้อความ KLyrHdr โดยมีกระบวนการแกะข้อมูลดังนี้:
ขั้นตอนการแกะข้อมูล KLyr จาก MIDI
- 1สแกนหา Meta Event 0x01 ที่มีคำขึ้นต้น
KLyrHdr1 - 2ดึงสายอักขระ Base64 ออกมาและถอดรหัสเป็นไฟล์ไบนารี
Uint8Array - 3
คลายการบีบอัดข้อมูลด้วยอัลกอริทึม zlib / pako inflation
- 4
แปลงไบต์ที่คลายแล้วด้วยรหัสอักขระ Windows-874 / TIS-620 ออกมาเป็น XML UTF-8
- 5ถอดรหัส XML อ่านแท็ก
<INFO>(ชื่อเพลง, ศิลปิน, คีย์) และแท็กเวลารายคำ<WORD>