คู่มือการใช้งานอ่านประมาณ 5 นาที

เจาะลึกโครงสร้างไฟล์ MIDI (.mid) และอัลกอริทึมการถอดรหัสสำหรับคาราโอเกะ

คู่มือทางเทคนิคเชิงลึกของไฟล์ Standard MIDI (SMF Type 0/1), การซ่อมแซม Magic Header, การอ่าน Delta-Times, Event Stream และการแกะข้อมูล KLyr XML

1. โครงสร้างไฟล์ Standard MIDI (SMF)

ไฟล์ Standard MIDI (.mid) ประกอบด้วยบล็อกข้อมูลไบนารี (Chunks) เริ่มต้นด้วย MThd Header Chunk ขนาด 14 ไบต์ และตามด้วย MTrk Track Chunks หนึ่งหรือหลายแทร็ก แต่ละบล็อกจะระบุชนิดไบนารี 4 ไบต์และขนาดความยาวไบนารีแบบ Big-Endian 32 บิต

เทคนิคการตรวจจับและซ่อมแซม Magic Header

2. การอ่านค่าเวลา Variable-Length Quantity (VLQ) และคำสั่ง MIDI Events

ภายในแทร็ก MTrk ระยะเวลาการเล่นโน้ตถูกบันทึกในรูปแบบ **Delta Times** ผ่านระบบรหัส Variable-Length Quantity (VLQ) บิตแรกสุด (MSB 0x80) ของแต่ละไบต์จะเป็นตัวบอกว่ามีไบต์ถัดไปหรือไม่ และนำ 7 บิตที่เหลือมารวมกันเป็นตัวเลขจำนวนเต็ม ผลรวมสะสมของ Delta Times จะถูกแปลงเป็น **Absolute Ticks** เพื่อใช้อ้างอิงตำแหน่งเวลาของโน้ตทุกตัวในเพลง

ประเภทคำสั่ง MIDI Events ที่ถูกประมวลผล

  1. 1
    Channel Events (0x80 - 0xEF): ควบคุมคำสั่ง Note On (0x90), Note Off (0x80), Program Change (0xC0 เปลี่ยนเครื่องดนตรี), Pitch Bend ปรับคีย์ และแทร็กช่อง 10 (Channel Index 9) สำหรับชุดกลอง
  2. 2
    Tempo Meta Events (0x51): บันทึกค่า Microseconds Per Quarter Note (MPQN) สำหรับคำนวณความเร็วเพลง BPM ด้วยสูตร: BPM = 60,000,000 / MPQN
  3. 3
    Time Signature Meta Events (0x58): กำหนดอัตราจังหวะของห้องเพลง (เช่น 4/4, 3/4)
  4. 4
    Marker 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. 1
    สแกนหา Meta Event 0x01 ที่มีคำขึ้นต้น KLyrHdr1
  2. 2
    ดึงสายอักขระ Base64 ออกมาและถอดรหัสเป็นไฟล์ไบนารี Uint8Array
  3. 3

    คลายการบีบอัดข้อมูลด้วยอัลกอริทึม zlib / pako inflation

  4. 4

    แปลงไบต์ที่คลายแล้วด้วยรหัสอักขระ Windows-874 / TIS-620 ออกมาเป็น XML UTF-8

  5. 5
    ถอดรหัส XML อ่านแท็ก <INFO> (ชื่อเพลง, ศิลปิน, คีย์) และแท็กเวลารายคำ <WORD>