กรณีศึกษาไฟล์ Karaoke แบบ NCN

posted on 19 Dec 2010 03:28 by asuwannarat in JavaAndMe
จากรายละเอียดที่เผยแพร่เกี่ยวกับไฟล์ Nick Karaoke หรือ NCN เป็นไฟล์คาราโอเกะที่มีการแบ่งไฟล์ออกเป็นไฟล์ย่อย 3 ไฟล์คือ .mid, .cur, และ .lyr ซึ่งแต่ละไฟล์จะมีหน้าที่ดังต่อไปนี้
1. MIDI หรือ .mid เป็นไฟล์ที่ทำหน้าที่เก็บข้อมูลเพลงชนิด midi
2. Lyrics หรือ .lyr เป็นไฟล์ที่ทำหน้าที่เก็บเนื้อเพลง จากที่พบจะเป็น charactor ขนาด 1 byte windows format กล่าวคือมี carriage return และ new line อยู่ด้วย
3 Cursor หรือ .cur เป็นไฟล์ที่ทาง Nick Karaoke ออกแบบมา เป็นไฟล์ขนาด 2 bytes ซึ่งใช้สำหรับบอกเวลาในการแสดงตัวอักษรแต่ละตัวใน lyrics โดยมีสูตรคำนวนพอจะเขียนเป็นภาษา java ง่ายๆได้ว่า
 
InputStream min = new FileInputStream(midFile);
Sequence seq = MidiSystem.getSequence(min); // อ่านข้อมูล sequence จาก midi ไฟล์
InputStream cin = new FileInputStream(curFile);
InputStream lin = new FileInputStream(lyrFile);
 
// ตรวจสอบขนาดของไฟล์ทั้งคู่ว่ามีขนาดเท่ากันหรือไม่ ใช้ตัวที่มีค่าน้อยกว่า (size ของ lyr จะเล็กกว่า cur ประมาณเท่าตัว) ก่อนเช็คต้องตัดหัวของข้อมูล lyr ออกไปก่อน 4 บรรทัด (เป็นข้อมูลส่วนที่ไม่ต้องใช้ในการจับคู่กับ midi)
long lyrSize = lin.available();
... // สมมติว่า lyrSize ผ่านกระบวนการ ตัดข้อมูลออกไปแล้ว 4 บรรทัด
long curSize = cin.available();
long maxAvailable = lyrSize <= curSize / 2 ? lyrSize : curSize / 2; // หาขนาดที่สั้นกว่าในการจับคู่ข้อมูลระหว่าง lyr กับ cur
 
for(int i = 0; i < maxAvailable; i++) {
    byte b1 = cin.readByte();
    byte b2 = cin.readByte();
    Long charCursor = (b1 + (b2 << 8)) * sequence.getResolution() / 24;  // ใช้สูตรนี้แล้วจะได้ตำแหน่งของ Cursor ของตัวอักษรแต่ละตัว
/*
จากตรงนี้ จะได้ว่า ที่ตำแหน่ง i จะมี lyr[i] คู่กับ charCursor อยู่ 1 คู่ ซึ่งตรงนี้เราก็จะทำการ listen midi ว่าเล่นมาถึงตำแหน่งของ charCursor หรือยัง ถ้าถึงแล้วก็ทำการ แสดงผล lyr[i] ทันที
*/
}
 
ศึกษารายละเอียดเพิ่มเติมเรื่อง midi ใน java ได้ที่
http://www.jsresources.org/faq_midi.html
 

Comment

Comment:

Tweet

สูตรนี้ผมใช้อยู่ ถูกต้องครับ

#1 By wichan (118.173.186.186|118.173.186.186) on 2014-08-11 23:52