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

ภาพรวมฟอร์แมตไฟล์คาราโอเกะ: ชุด NCN Trio และแพ็กเกจไฟลเดี่ยว

คู่มือโครงสร้างทางเทคนิคและการทำงานร่วมกันของไฟล์ MIDI (.mid), เนื้อเพลง (.lyr/.lrc), เคอร์เซอร์จังหวะ (.cur) และแพ็กเกจรวม (.nkm/.nkmx)

ภาพรวมสถาปัตยกรรมฟอร์แมตไฟล์คาราโอเกะ

ในระบบคาราโอเกะ ข้อมูลเพลงจะถูกจัดเก็บเป็น 2 สถาปัตยกรรมหลัก ได้แก่ **ระบบไฟล์แยก 3 ไฟล์ยุคดั้งเดิม (NCN Format: .mid + .lyr + .cur)** และ **แพ็กเกจไฟล์รวมบีบอัดยุคใหม่ (.nkm และ .nkmx)** การเข้าใจโครงสร้างและอัลกอริทึมการถอดรหัสไฟล์เหล่านี้เป็นหัวใจสำคัญในการพัฒนาระบบประมวลผลสื่อ การแสดงผลตัวอักษรตามจังหวะ (Lyric Syncing) และการเล่นดนตรีสังเคราะห์บนเว็บบราวเซอร์

เปรียบเทียบคุณสมบัติของแต่ละฟอร์แมต

ดนตรีและโน้ตเพลง
ไฟล์ MIDI (.mid)

บรรจุข้อมูลโน้ตดนตรีหลายแทร็ก (Polyphonic), คีย์เพลง, ความดัง, ค่า Tempo BPM และข้อมูล Meta Event สอดไส้เนื้อเพลงแบบ XML

เนื้อเพลงและข้อมูล
ไฟล์ LYR (.lyr) / LRC (.lrc)

ไฟล์ข้อความบรรจุชื่อเพลง ศิลปิน คีย์เพลง และเนื้อร้องแต่ละท่อน เข้ารหัสอักขระแบบ Windows-874 (TIS-620) หรือ UTF-8

แทร็กจังหวะเคอร์เซอร์
ไฟล์ CUR (.cur)

ไฟล์ไบนารี 16-bit บันทึกตำแหน่งและจังหวะเคอร์เซอร์การปาดสีเนื้อเพลง อ้างอิงความละเอียด 24 PPQ เพื่อแปลงเป็น MIDI Ticks

กระบวนการแมปปิ้งเชื่อมโยง 3 ไฟล์ NCN (.mid + .lyr + .cur) เป็นเนื้อร้องพร้อมจังหวะเรียลไทม์

  1. 1
    1. ดึงค่า PPQ จาก MIDI (.mid): ถอดรหัสอ่านค่า ticksPerBeat (ความละเอียด PPQ) จากบล็อก MThd ของไฟล์ MIDI เพื่อใช้เป็นฐานอ้างอิงเวลา
  2. 2
    2. แปลงไฟล์เคอร์เซอร์ (.cur) เป็น MIDI Ticks: ถอดรหัสไฟล์ไบนารี 16-bit แบบ Little-Endian จนเจอ 0xFF แล้วนำค่าเคอร์เซอร์แต่ละตัวมาคำนวณแปลงเป็นเวลา MIDI Tick จริงด้วยสูตร tick = Math.round((cur * ticksPerBeat) / 24)
  3. 3
    3. อ่านและถอดรหัสเนื้อเพลง (.lyr): อ่านไฟล์ข้อความด้วยรหัสอักขระ Windows-874 / TIS-620 ตัดบรรทัด 0-2 (Header ชื่อเพลง/ศิลปิน/คีย์) ออก และใช้ข้อความตั้งแต่บรรทัด Index 3 เป็นต้นไปเป็นเนื้อร้อง
  4. 4
    4. แมปปิ้งตัวอักษรเข้ากับเวลาแบบ 1-ต่อ-1 (Sequential 1-to-1 Mapping): นำเนื้อร้องแต่ละบรรทัดมาแยกตัวอักษรทีละตัว (รวมสระ วรรณยุกต์ และช่องว่าง) แล้วนำตัวอักษรแต่ละตัวมาจับคู่กับอาร์เรย์เวลา MIDI Tick ตามลำดับอย่างแม่นยำ ได้เป็นวัตถุเนื้อร้อง LyricEvent { text: char, tick: ticks[i] }
  5. 5
    5. การเรนเดอร์ปาดสีตัวอักษรเรียลไทม์ (Real-Time Color Wiping): ขณะเพลงเล่นบน Web Audio Synth ระบบจะเปรียบเทียบเวลา currentTick >= event.tick เพื่อเปลี่ยนสีปาดหน้าตัวอักษรบนหน้าจอแบบเรียลไทม์