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