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

ข้อกำหนดและสถาปัตยกรรม KMID / KLyr XML: เนื้อเพลงสอดไส้ในไฟล์ MIDI

คู่มือโครงสร้างทางเทคนิคเชิงลึกของ KMID / KLyr, การดึงข้อมูล Meta Event 0x01, การคลายการบีบอัด Base64/zlib และเจาะลึกโครงสร้าง XML (, , , )

1. ฟอร์แมต KMID / KLyr คืออะไร?

KMID (KAR / KLyr Embedded Format) คือข้อกำหนดไฟล์คาราโอเกะขั้นสูงที่ทำการสอดไส้ข้อมูลรายละเอียดเพลง (Metadata), คีย์เพลง และแทร็กเนื้อร้องพร้อมเวลาแบบลงลึกระดับคำในรูปแบบ XML เข้าไปไว้ภายในไฟล์ MIDI (.mid) ไฟล์เดียวโดยตรง ซึ่งแก้ปัญหาความยุ่งยากของระบบ NCN ยุคดั้งเดิมที่ต้องใช้ไฟล์แยกถึง 3 ไฟล์ (.mid + .lyr + .cur) หากขาดไฟล์ใดไฟล์หนึ่งเพลงจะเล่นไม่ได้หรือไม่มีเนื้อร้อง

2. กระบวนการสกัดและคลายการบีบอัดข้อมูลไบนารี

ภายในลำดับแทร็ก MIDI ข้อมูล KLyr จะถูกซ่อนไว้ใน Meta Text Event (Meta Type 0x01) โดยมีกระบวนการถอดรหัส 4 ขั้นตอนสำคัญดังนี้:

ขั้นตอนการสกัดข้อมูล KLyr จาก MIDI

  1. 1
    1. ตรวจหา Header Identifier: สแกนหาข้อความใน Meta Event Type 0x01 ที่ขึ้นต้นด้วย KLyrHdr1 (หรือ K1LyrHdr)
  2. 2
    2. ถอดรหัส Base64: ดึงข้อความต่อจาก Header และถอดรหัส Base64 ออกมาเป็นไบต์ Uint8Array
  3. 3
    3. คลายการบีบอัด zlib: คลายการบีบอัดข้อมูลด้วยอัลกอริทึม zlib Inflation (pako.inflate) เพื่อให้ได้ไฟล์ไบนารี XML บริสุทธิ์
  4. 4
    4. แปลงรหัสอักขระภาษาไทย (Windows-874): แปลงไบต์ XML ด้วยการถอดรหัสอักขระ Windows-874 / TIS-620 เพื่อให้แสดงผลสระและวรรณยุกต์ไทยได้อย่างถูกต้อง 100%

3. โครงสร้างผัง XML (XML Schema) ของ KLyr

เมื่อคลายการบีบอัดแล้ว โครงสร้างไฟล์ XML ของ KLyr จะแบ่งออกเป็น 2 โหนดหลัก ได้แก่ <INFO> สำหรับรายละเอียดเพลง และ <LYRIC> สำหรับแทร็กเวลาเนื้อร้อง:

ตัวอย่างโครงสร้างไฟล์ XML ของ KLyr

ตัวอย่างโครงสร้างไฟล์ XML ของ KLyr

terminal
<?xml version="1.0" encoding="TIS-620"?>
<SONG>
  <INFO>
    <VERSION>1.1</VERSION>
    <TITLE>ชื่อเพลง</TITLE>
    <ARTIST>ชื่อศิลปิน</ARTIST>
    <ARTIST_TYPE>M</ARTIST_TYPE> <!-- M: ชาย, F: หญิง, MF: ร้องคู่ -->
    <KEY>Cm</KEY>
    <TEMPO>120</TEMPO>
    <ALBUM>ชื่ออัลบั้ม</ALBUM>
    <AUTHOR>ผู้แต่งคำร้อง/ทำนอง</AUTHOR>
    <GENRE>Pop</GENRE>
    <RHYTHM>Disco</RHYTHM>
    <CREATOR>NEXT_SYSTEM</CREATOR>
    <COMPANY>ค่ายเพลง</COMPANY>
    <LANGUAGE>THAI</LANGUAGE>
    <YEAR>2026</YEAR>
    <VOCAL_CHANNEL>9</VOCAL_CHANNEL>
  </INFO>
  <LYRIC>
    <LINE>
      <WORD>
        <TIME>1920</TIME>
        <TEXT>เนื้อ</TEXT>
        <VOCAL>M</VOCAL>
      </WORD>
      <WORD>
        <TIME>2160</TIME>
        <TEXT>ร้อง</TEXT>
        <VOCAL>M</VOCAL>
      </WORD>
    </LINE>
  </LYRIC>
</SONG>

4. เจาะลึกความหมายของแต่ละแท็กและบล็อก XML

รายละเอียดคุณสมบัติและหน้าที่ของแท็กแต่ละตัวภายในบล็อก <INFO> และ <LYRIC>:

รายละเอียดองค์ประกอบในโหนด <INFO>

ข้อมูลเพลง
<TITLE> และ <ARTIST>

บันทึกชื่อเพลงและชื่อศิลปินผู้ร้อง รองรับภาษาไทยและภาษาอังกฤษสมบูรณ์

ทฤษฎีดนตรี
<KEY> และ <TEMPO>

ระบุคีย์ดนตรีเริ่มต้น (เช่น C, Cm, Dm, F#m) และค่าความเร็ว BPM เพื่อให้เครื่องเล่นปรับคีย์ขึ้นลงได้ถูกต้อง

ชนิดเสียงร้อง
<ARTIST_TYPE> และ <VOCAL_CHANNEL>

ARTISTTYPE ระบุเพศผู้ร้อง M (ชาย), F (หญิง), MF (คู่) ส่วน VOCALCHANNEL ระบุแทร็กเสียงร้องนำแนวทาง (เช่น 9 สำหรับ MIDI Channel 10)

ข้อกำหนดโหนด <LYRIC>, <LINE> และ <WORD>

  1. 1
    <LINE>: บล็อกรวบรวมพยางค์/คำในบรรทัดเนื้อร้อง 1 ท่อน
  2. 2
    <WORD> -> <TIME>: เวลาเริ่มต้นของพยางค์บนฐาน 24 PPQ นำมาแปลงเป็นเวลา MIDI Tick จริงด้วยสูตร: realTick = Math.round((time * ticksPerBeat) / 24)
  3. 3
    <WORD> -> <TEXT>: ข้อความพยางค์หรือคำร้องภาษาไทย/อังกฤษ (เช่น 'รัก', 'เธอ', ' Heart')
  4. 4
    <WORD> -> <VOCAL>: เพศผู้ร้องในระดับพยางค์ (M/F) ช่วยให้ระบบคาราโอเกะเปลี่ยนสีตัวอักษรปาดสีตามเพศผู้ร้อง (เช่น ชายสีฟ้า หญิงสีชมพู) ในเพลงร้องคู่ได้อย่างสมบูรณ์แบบ!