การแปลงไฟล์
หน้านี้กำหนดว่าตัวแปลงที่สอดคล้องมาตรฐานเปลี่ยนเอกสาร ThaiMusicXML เป็นรูปแบบอื่นอย่างไร
v1.0 ครอบคลุมปลายทางสองแบบคือ MusicXML และ MIDI ส่วนการนำเข้าไม่ว่าทิศทางใดไม่ได้กล่าวถึงในที่นี้ ไม่มีอะไรในหน้านี้ใช้กับตัวแสดงผล ตัวตรวจสอบ หรือตัวเล่นที่ไม่ได้สร้างไฟล์รูปแบบอื่น และไม่มีอะไรเปลี่ยนว่าเอกสาร ThaiMusicXML คืออะไรหรือถูกต้องหรือไม่ เรื่องนั้นดู การสอดคล้องมาตรฐาน
ปลายทางทั้งสองต้องรับกริดช่องโน้ตอัตราคงที่ที่ไม่มีการค้างเสียงในโน้ต เข้าไปในแบบจำลองที่สร้างบนจุดเริ่มเสียงและความยาว ทั้งสองแบบจำลองไม่ผิด เพียงอธิบายเสียงเดียวกันคนละอย่าง ทุกหัวข้อด้านล่างคือจุดที่การสวมกันไม่พอดีและต้องเลือก ตัวเลือกของตัวแปลง รวบรวมทุกทางเลือกพร้อมค่าเริ่มต้นที่หน้านี้กำหนด การส่งออก MusicXML และ MIDI ใช้แบบจำลองเวลาภายในร่วมกัน ซึ่งอธิบายไว้ก่อน เพื่อให้ระดับเสียงและความยาวที่แก้ไขแล้วของโน้ตคำนวณครั้งเดียว ต่างกันเฉพาะการเข้ารหัสขั้นสุดท้ายตามปลายทาง
ตัวเลือกของตัวแปลง
หัวข้อที่มีชื่อว่า “ตัวเลือกของตัวแปลง”| ทางเลือก | ค่าเริ่มต้น | ที่ใด |
|---|---|---|
ระดับเสียงอ้างอิงเมื่อไม่มี <tuning> |
c-major |
ระดับเสียง |
ระดับเสียงอ้างอิงเมื่อมี <tuning> |
ใช้ reference ที่ประกาศไว้ ตัวเลือกบรรทัดคำสั่งบังคับค่าอื่นได้ |
ระดับเสียง |
| โน้ตยืดผ่านตัวหยุดที่ตามมาไกลแค่ไหน | ถึงท้ายห้องของตัวเอง ไม่โยงข้ามไปห้องถัดไป และในแถวที่อยู่ใน stack ยังหยุดที่การตีครั้งถัดไปของแถวพี่น้องด้วย | ตัวหยุด |
| ความแม่นของระดับเสียงใน MIDI | ปัดเข้า 12-TET ระดับเสียงเดียวกับที่โน้ตได้ในการส่งออก MusicXML | MIDI: ระดับเสียง |
| แพตช์ MIDI ของพาร์ตที่มีระดับเสียง | ค้นจาก instrument-name เทียบตารางชื่อที่รู้จัก ถ้าไม่ตรงใช้แพตช์กลาง |
MIDI: แพตช์เครื่องดนตรี |
โน้ต MIDI ของรหัส sound ที่ไม่มีระดับเสียง |
กำหนดอัตโนมัติจากโน้ตเครื่องกระทบ General MIDI ตามลำดับที่ปรากฏครั้งแรก ตั้งค่าเองได้ | MIDI: เครื่องกระทบ |
| เครื่องหมายประจำจังหวะ (MusicXML) | 2/4 หนึ่งห้องต่อหนึ่งบาร์ และหนึ่งช่องโน้ตต่อโน้ตตัวที่แปดในห้องสี่จังหวะ | MusicXML: จังหวะ |
| ห้องที่จำนวนจังหวะหารบาร์ 2/4 ไม่ลงตัว (MusicXML) | ส่งออกที่หนึ่งตัวที่แปดต่อช่อง ซึ่งล้นบาร์ พร้อมคำเตือน การเขียนเป็น tuplet ครอบทั้งห้องไม่มีใน v1.0 | MusicXML: จังหวะ |
| ห้องที่จำนวนจังหวะไม่ใช่สี่ (MIDI) | ปรับจังหวะเวลาเฉพาะห้องนั้น เพื่อให้ยังยาวสองจังหวะ bpm | MIDI: จังหวะและความเร็ว |
| ความเงียบในห้องของ MusicXML | หนึ่งตัวหยุดต่อหนึ่งช่วงความเงียบ ตัดที่ตำแหน่งจังหวะ ห้องที่ไม่มีเสียงเลยได้ตัวหยุดเต็มห้องหนึ่งตัว | MusicXML: จังหวะ |
| ตำแหน่งที่จังหวะนับของห้องไทยตกลง (MusicXML) | ตกที่จังหวะแรกของห้องถัดไป ดนตรีเลื่อนไปหนึ่งช่องโน้ต เส้นกั้นห้องอยู่ที่เดิม ตัวเลือกบรรทัดคำสั่งคงตำแหน่งตามต้นฉบับ | MusicXML: จังหวะที่นับ |
| ห้องว่างที่หัวเพลงซึ่งไม่มีพาร์ตใดเล่น (MusicXML) | เก็บไว้ ตัวเลือกบรรทัดคำสั่งตัดออก | MusicXML: ห้องว่างที่หัวเพลง |
ทิศทางคันชัก (in/out) ใน MusicXML |
ตัดทิ้ง เหลือเฉพาะเส้นโยงเอง | MusicXML: การสีคันชัก |
<repeat>, <line-repeat>, <ending> ใน MusicXML |
ใช้เส้นซ้ำและวงเล็บ ending ของ MusicXML เอง ถอยไปคลี่เมื่อ <repeat> ครอบมากกว่าหนึ่งท่อน |
MusicXML: การซ้ำและ ending |
<repeat>, <line-repeat>, <ending> ใน MIDI |
คลี่เป็นลำดับเหตุการณ์เส้นตรงชุดเดียว | MIDI: การซ้ำและ ending |
| แถวของเครื่องดนตรีที่อยู่ใน stack | รวมกัน: หนึ่งพาร์ต MusicXML ที่มีหนึ่งบรรทัดโน้ตต่อแถว หนึ่งแทร็ก/ช่อง MIDI ต่อทั้ง stack ตัวเลือกบรรทัดคำสั่งแยกแต่ละแถวออก | เครื่องดนตรีที่อยู่ใน stack |
<parenthesis> (ช่วงที่คอยอยู่) ใน MIDI |
มีเสียงตามค่าเริ่มต้น mute="true" ทำให้เงียบ |
MIDI: ช่วงที่คอยอยู่ |
<link> (เส้นโค้งท่าทาง) |
ตัดทิ้งทั้งสองรูปแบบ เพราะทำเครื่องหมายบนหน้ากระดาษ ไม่ใช่บนเสียง | การสีคันชัก |
ค่า pitch/sound ที่ไม่ตรงกับ type ที่พาร์ตประกาศ |
แปลงเป็นตัวหยุดพร้อมคำเตือน แทนที่จะให้เสียงผิดชนิดช่องหรือผิดชนิดหัวโน้ต | พาร์ตไม่มีระดับเสียงและพาร์ตเนื้อเพลง |
| การจับคู่พาร์ตเนื้อเพลงกับพาร์ตที่มีโน้ต (เฉพาะ MusicXML) | พาร์ตเนื้อเพลงตัวแรกตามลำดับใน ensemble จับคู่กับพาร์ตหรือ stack ที่มีโน้ตตัวแรก ตัวเลือกบรรทัดคำสั่งระบุการจับคู่เอง หรือปิดการส่งออกเนื้อเพลงทั้งหมด | พาร์ตไม่มีระดับเสียงและพาร์ตเนื้อเพลง |
ระดับเสียง
หัวข้อที่มีชื่อว่า “ระดับเสียง”ค่า pitch ระบุขั้นของบันไดเสียงไทย ไม่ใช่ความถี่ ดู <tuning> ปลายทางทั้งสองต้องมีค่าอ้างอิงสัมบูรณ์ก่อนจึงเขียนระดับเสียงได้ และการจับคู่เป็นแบบไดอาโทนิกที่แม่นเท่าที่ <tuning> ผูกไว้แล้วเท่านั้น: ด/1/D → C, ร/2/R → D, ม/3/M → E, ฟ/4/F → F, ซ/5/S → G, ล/6/L → A, ท/7/T → B พร้อมค่า octave ที่โน้ตนั้นมี reference="bb-major" เลื่อนการจับคู่ชุดเดิมลงหนึ่งเสียงเต็ม ค่า reference อื่นไม่มีการจับคู่ที่กำหนดไว้ใน v1.0 ตัวแปลงที่พบค่าเช่นนั้นควรถอยไปใช้ c-major และเตือน
โน้ตที่ไม่มี <tuning> แปลงเป็น c-major เพราะ <tuning> เป็นทางเลือกและโน้ตส่วนใหญ่ละไว้ ตัวแปลงควรเตือนเมื่อทำเช่นนั้น เพราะกุญแจเสียงที่ได้เป็นการเดา ไม่ใช่สิ่งที่ไฟล์ระบุ ตัวเลือกบรรทัดคำสั่งบังคับค่าอ้างอิงเฉพาะได้ไม่ว่าไฟล์จะประกาศหรือละไว้ สำหรับสร้างพาร์ตที่ย้ายกุญแจเสียงจากต้นฉบับเดียวกัน
การตั้งเสียงไทยแบ่งคู่แปดเป็นเจ็ดขั้นเกือบเท่ากัน ไม่มีกุญแจเสียงตะวันตกใดตรงพอดี และการจับคู่นี้ก็ไม่ได้พยายามให้ตรง แต่เลือกค่าที่ใกล้ที่สุดในทางปฏิบัติ เหมือนที่ <tuning> เองทำ ทั้งสำหรับระดับเสียงที่พิมพ์ใน MusicXML และหมายเลขโน้ต MIDI ที่เล่นจริง
ตัวหยุด
หัวข้อที่มีชื่อว่า “ตัวหยุด”<rest> หมายถึงไม่มีการตีใหม่ ไม่ใช่ความเงียบ เสียงโน้ตตัวก่อนยังกังวานอยู่ ตัวแปลงจึงยืดความยาวของโน้ตตัวก่อนผ่านตัวหยุดที่ต่อเนื่องกันเพื่อสื่อสิ่งนั้น แทนที่จะถือว่าตัวหยุดเป็นเหตุการณ์เงียบอิสระ
การยืดหยุดที่ท้ายห้องของโน้ตตัวนั้น โน้ตไม่เคยยืดข้ามไปห้องถัดไปเพื่อครอบตัวหยุด ไม่ว่าจะมีตัวหยุดตามมากี่ตัวก็ตาม เส้นกั้นห้องคือจุดที่การกังวานตามที่เขียนไว้สิ้นสุด ไม่ว่าเครื่องดนตรีจริงจะยังดังอยู่หรือไม่ <rest> ที่อยู่ก่อนโน้ตตัวแรกของพาร์ต หรือ <rest> ที่ยังไม่มีเสียงใดเกิดขึ้นก่อนหน้า แปลงเป็นความเงียบจริง
เมื่อโน้ตที่กำลังยืดอยู่ในแถวที่เป็นส่วนของ stack การยืดยังหยุดที่การตีครั้งถัดไปในแถวอื่นของ stack นั้นด้วย ไม่ใช่เฉพาะแถวของตัวเอง stack คือเครื่องดนตรีชิ้นเดียว เสียงที่กำลังกังวานจึงหมดความสำคัญทันทีที่มืออีกข้างตีลงไป กฎนี้ย่นเฉพาะการยืดที่แถวของตัวเองปล่อยค้างไว้เท่านั้น คือกลืนตัวหยุดไป หรือแถวนั้นไม่มีอะไรเขียนต่อในห้องนั้นแล้ว และไม่เคยลบล้างโน้ตที่แถวของตัวเองมีโน้ตตัวถัดไปต่อทันทีโดยไม่มีช่องว่าง ระยะนั้นเป็นการเลือกของผู้เรียบเรียงโดยตรง และแถวพี่น้องที่เล่นอยู่ข้างล่างหรือข้างบนไม่เปลี่ยนมัน นี่คือเหตุผลที่ช่วงเร็วในแถวหนึ่งของ stack ไม่บังคับให้เสียงยาวในอีกแถวถูกตัดสั้นตาม ขณะที่โน้ตกังวานยาวซึ่งแถวของตัวเองไม่มีอะไรเขียนต่อ จะหยุดตรงที่โน้ตตัวถัดไปของอีกแถวตกลงมาจริง
ความยาวที่แก้ไขแล้วนี้ คือระดับเสียงบวกจุดเริ่มบวกความยาวเป็นช่องโน้ต เป็นหน่วยร่วมที่ปลายทางทั้งสองเข้ารหัส: MusicXML เป็นโน้ตที่โยงหรือยืดออก (ดู จังหวะ) ส่วน MIDI เป็น note-on ครั้งเดียวที่ค้างไว้ตลอดความยาวนั้นก่อน note-off (ดู MIDI: จังหวะและความเร็ว)
เครื่องดนตรีที่อยู่ใน stack
หัวข้อที่มีชื่อว่า “เครื่องดนตรีที่อยู่ใน stack”stack คือเครื่องดนตรีชิ้นเดียวที่ผู้เล่นคนเดียวเล่นข้ามหลายแถว ไม่ใช่ผู้เล่นหลายคน ตัวแปลงรวมแถวของ stack เข้าด้วยกันแทนที่จะให้แต่ละแถวมีพาร์ตหรือแทร็กของตัวเอง: MusicXML ได้หนึ่งพาร์ตที่มีบรรทัดโน้ตหนึ่งบรรทัดต่อแถว เรียงตามลำดับ row เหมือนที่สองมือของเปียโนใช้พาร์ตเดียวกันบนสองบรรทัด ส่วน MIDI ได้หนึ่งแทร็กและหนึ่งช่องสำหรับทั้ง stack เพราะช่อง MIDI รองรับหลายเสียงพร้อมกันอยู่แล้ว และแถวเหล่านั้นเป็นผลลัพธ์ที่เกิดพร้อมกันจริงจากเครื่องดนตรีชิ้นเดียว การแยกให้ละเอียดกว่านั้นเป็นการเลือกเรื่องการมิกซ์ ไม่ใช่ความแม่นยำที่มากขึ้น
การเป็นเครื่องดนตรีชิ้นเดียวยังหมายความว่าแถวไม่ได้ถูกแก้ไขแยกกัน ดู ตัวหยุด ว่าการยืดที่ค้างอยู่ในแถวหนึ่งถูกจำกัดด้วยการตีของแถวอื่นอย่างไร
ตัวเลือกบรรทัดคำสั่งแยกแถวของ stack เป็นพาร์ตหรือแทร็กแยกกันแทน สำหรับผู้ใช้ที่ต้องการกำหนดเส้นทางเสียงหรือปิดเสียงแต่ละแถวอิสระจากกันใน DAW หรือโปรแกรมเขียนโน้ต
การส่งออก MusicXML
หัวข้อที่มีชื่อว่า “การส่งออก MusicXML”ทุกห้องแปลงเป็นเครื่องหมายประจำจังหวะ 2/4 ซึ่งเท่ากับหนึ่งห้องของจังหวะ <bpm>: จังหวะ bpm คือครึ่งห้อง หนึ่งห้องจึงเท่ากับโน้ตตัวดำสองตัว ในห้องสี่จังหวะที่พบทั่วไป หนึ่งช่องโน้ตจึงตกเป็นโน้ตตัวที่แปดหนึ่งตัว
ห้องที่มีจำนวนจังหวะอื่นก็ยังเต็มบาร์ 2/4 ของตัวเอง เพราะความยาวของห้องไม่ขึ้นกับว่าซอยละเอียดแค่ไหน เมื่อจำนวนนั้นหารบาร์ลงตัว เช่นสองจังหวะต่อตัวดำ หรือแปดจังหวะต่อตัวที่สิบหก ช่องโน้ตแปลงเป็นค่าเหล่านั้นตรง ๆ เมื่อไม่ลงตัว บาร์นั้นต้องใช้ tuplet ครอบทั้งห้อง ซึ่งตัวแปลงของ v1.0 ไม่เขียนให้ มันส่งออกห้องนั้นที่หนึ่งตัวที่แปดต่อช่อง ทำให้บาร์นั้นยาวกว่า 2/4 และเพลงยาวกว่าต้นฉบับ พร้อมเตือน โน้ตที่ทุกห้องมีจำนวนจังหวะเท่ากัน ซึ่งเป็นเกือบทั้งหมด ไม่เจอกรณีนี้
ความยาวของโน้ตที่แปลงแล้วยืดถึงการตีครั้งถัดไปเสมอ ไม่ใช่ส่วนแบ่งตายตัวของจังหวะตัวเอง ตัวหยุด ต้องการกฎนี้อยู่แล้วเพื่อกลืนความเงียบของเครื่องที่กำลังกังวานเข้ากับโน้ตตัวก่อน และ <group> ต้องการกฎเดียวกันด้วยเหตุผลอื่น: จังหวะมาถึงที่ช่องสุดท้าย ลูกตัวสุดท้ายของกลุ่มจึงตกตรงตำแหน่งเดียวกับที่โน้ตธรรมดาของจังหวะนั้นจะตก ซึ่งเป็นตำแหน่งเดียวกับที่ตัวแสดงผลจัดให้บนหน้ากระดาษ ส่วนลูกตัวก่อน ๆ นำเข้าหามัน โดยดึงเวลามาจากสิ่งที่อยู่ก่อนกลุ่ม ไม่ใช่จากส่วนแบ่งเท่า ๆ กันของจังหวะกลุ่มเอง กลุ่มที่มีลูก k ตัวจึงแปลงเป็นโน้ต k ตัวที่ความยาวไม่เท่ากัน ไม่ใช่ tuplet แบบตะวันตกที่มี k ตัวเท่ากัน: ลูกก่อนตัวสุดท้ายสั้น ห่างกันตัวละ 1/k ของจังหวะ ส่วนตัวสุดท้ายกังวานไปจนกว่าจะมีการตีอื่น ซึ่งอาจเป็นหนึ่งจังหวะเต็มหรือมากกว่า
ทุกห้องเขียนให้เต็ม ความเงียบที่เหลือหลังโน้ตในห้อง ไม่ว่าจะอยู่ก่อนโน้ตตัวแรกของพาร์ต อยู่ตรงที่การกังวานถูกตัดสั้นโดยแถวอื่นของ stack เดียวกัน หรือตรงที่ <rest> ที่เขียนไว้ไม่มีอะไรอยู่ก่อนให้ยืด กลายเป็นตัวหยุด เพื่อให้เนื้อหาของห้องรวมกันได้เท่ากับความยาวของห้องเอง ความเงียบหนึ่งช่วงเป็นตัวหยุดหนึ่งตัวที่ยาวเท่าช่วงนั้น ไม่ใช่ตัวหยุดหนึ่งตัวต่อหนึ่งช่อง กริดช่องโน้ตคือวิธีที่ต้นฉบับนับเวลา ไม่ใช่วิธีเขียนตัวหยุด จุดเดียวที่ช่วงหนึ่งถูกตัดคือตรงที่จังหวะของปลายทางตกลง เพราะตัวหยุดที่คร่อมสองจังหวะบังตำแหน่งที่จังหวะที่สองเริ่ม ความเงียบสามช่องที่เริ่มบนตัวที่แปดตัวที่สองของบาร์คือตัวหยุดตัวที่แปดแล้วตามด้วยตัวหยุดตัวดำ ไม่ใช่ตัวหยุดตัวดำประจุดตัวเดียว ห้องที่ไม่มีเสียงใดเลยเขียนเป็นตัวหยุดเต็มห้องหนึ่งตัว ตามที่บาร์ว่างถูกเขียนกันตามปกติ แทนที่จะเขียนตามค่าโน้ตที่ความยาวของมันบังเอิญแตกออกมา
โน้ตไม่ได้ถูกตัดที่จังหวะแบบที่ตัวหยุดถูกตัด: โน้ตเขียนเป็นค่าเดียวที่พอดีกับมันเมื่อมีค่านั้นอยู่ ประจุดเมื่อช่วยได้ และโยงเฉพาะเมื่อไม่มีค่าเดียวใดพอ หรือเมื่อมันข้ามเส้นกั้นห้อง ซึ่งการเลื่อนจังหวะที่นับอาจทำให้เกิดกับโน้ตที่อยู่ในห้องพอดีอยู่แล้วในต้นฉบับ
จังหวะที่นับ
หัวข้อที่มีชื่อว่า “จังหวะที่นับ”ดนตรีไทยนับไปหาจังหวะสุดท้ายของห้อง โน้ตตะวันตกนับจากจังหวะแรก วรรคเดียวกันจึงวางบนหน้ากระดาษต่างกันในสองระบบ และการถอดห้องต่อห้องตรง ๆ ทำให้จังหวะที่นักดนตรีไทยได้ยินเป็นจุดตกไปอยู่บนตำแหน่งที่อ่อนที่สุดของบาร์ตะวันตก
ตัวแปลงเลื่อนดนตรีไปช้าลงหนึ่งช่องโน้ตเพื่อแก้เรื่องนี้ จังหวะสุดท้ายของแต่ละห้องจึงกลายเป็นจังหวะแรกของห้องตะวันตกถัดไป เส้นกั้นห้องไม่ขยับ ทุกอย่างที่เขียนอยู่ระหว่างเส้นขยับ ผลตามมาสามข้อ: ห้องแรกเปิดด้วยตัวหยุดตัวที่แปดตรงที่การเลื่อนย้ายดนตรีออกไป โน้ตที่เดิมชนเส้นกั้นห้องของตัวเองในต้นฉบับตอนนี้ข้ามเส้น จึงเขียนเป็นโน้ตโยงสองข้าง และจังหวะที่นับตัวสุดท้ายของเพลงต้องมีอีกหนึ่งห้องให้ตกลง ห้องพิเศษนั้นเกิดขึ้นเฉพาะเมื่อมีการตีโน้ตบนจังหวะนั้นจริง โน้ตที่ยังกังวานข้ามเส้นกั้นห้องสุดท้ายถูกตัดตรงนั้นแทน เหมือนที่การกังวานถูกตัดที่เส้นกั้นห้องอื่นอยู่แล้ว (ดู ตัวหยุด) แทนที่จะซื้อทั้งห้องไว้ให้เสียงโยงที่ไม่มีใครเล่น
ค่านี้เปิดเป็นค่าเริ่มต้น เพราะโน้ตตะวันตกที่พิมพ์ออกมาคือสิ่งที่การส่งออกนี้มีไว้ให้ ตัวเลือกบรรทัดคำสั่ง (--no-downbeat-shift) เขียนดนตรีไว้ตรงที่ต้นฉบับวางไว้ สำหรับอ่านไฟล์ที่ส่งออกเทียบกับต้นฉบับห้องต่อห้อง หรือสำหรับเพลงที่โน้ตนับแบบตะวันตกอยู่แล้ว
ห้องว่างที่หัวเพลง
หัวข้อที่มีชื่อว่า “ห้องว่างที่หัวเพลง”ห้องที่หัวเพลงซึ่งไม่มีพาร์ตใดเล่นโน้ตเลยถูกเก็บไว้ เพราะมันอยู่ในต้นฉบับและอาจตั้งใจไว้จริง เช่นการนับเข้า หรือการจัดให้ตรงกับโน้ตฉบับอื่น ตัวเลือกบรรทัดคำสั่ง (--trim-leading-empty-measures) ตัดออก
การนับทำข้ามทั้งวง ไม่ใช่ทีละพาร์ต คือช่วงห้องที่หัวเพลงซึ่งไม่มีอะไรที่ไหนเลยดัง ทุกพาร์ตจึงเสียห้องชุดเดียวกันและยังตรงกัน ซึ่งเป็นสิ่งที่ทำให้ทำแบบนี้ได้อย่างปลอดภัย พาร์ตที่หยุดแปดห้องแรกขณะที่อีกพาร์ตเล่นผ่านช่วงนั้นเก็บครบทุกห้อง กระทบเฉพาะหัวเพลงเท่านั้น ห้องว่างที่อื่นเป็นส่วนหนึ่งของดนตรี
การสีคันชัก
หัวข้อที่มีชื่อว่า “การสีคันชัก”ช่วง <bow> กลายเป็น slur ของ MusicXML ครอบโน้ตชุดเดียวกัน direction (in/out) ไม่มีธรรมเนียมตายตัวว่าตรงกับคันชักขึ้นหรือลงสำหรับเครื่องดนตรีที่เครื่องหมายคันชักของ ThaiMusicXML ใช้ ตัวแปลงจึงตัดทิ้งแทนที่จะกำหนดขึ้นเอง
ช่วง <parenthesis> กลายเป็นชุดโน้ต cue ของ MusicXML dim และ mute เป็นคำแนะนำด้านการแสดงผลและการเล่นที่ไม่มีสิ่งเทียบเท่าใน MusicXML จึงถูกตัดทิ้ง
ช่วง <link> ถูกตัดทิ้งทั้งสองรูปแบบ มันบอกว่าโน้ตใต้เส้นเป็นท่าทางเดียว ซึ่งเป็นคำกล่าวเกี่ยวกับหน้ากระดาษมากกว่าเกี่ยวกับเสียง ไม่มีอะไรในนั้นเปลี่ยนระดับเสียง จุดเริ่ม หรือความยาว การแปลงเป็น slur จะกลายเป็นการอ้างวรรคตอนที่ต้นฉบับไม่เคยบอก และตัวโน้ตเองก็สื่อท่าทางนั้นอยู่แล้ว
ข้อมูลกำกับ
หัวข้อที่มีชื่อว่า “ข้อมูลกำกับ”<chan> และ <nathap> ไม่ได้บอกเวลาด้วยตัวเอง ดู ทำอะไร และแปลงเป็นข้อความ ไม่ใช่สิ่งที่เปลี่ยนความยาว ส่วน <annotation> แปลงเป็น direction ของ MusicXML ที่บรรจุข้อความเดียวกันในตำแหน่งเดียวกัน
การซ้ำและ ending
หัวข้อที่มีชื่อว่า “การซ้ำและ ending”<repeat>, <line-repeat>, และ <ending> แปลงเป็นเส้นกั้นห้องแบบซ้ำและวงเล็บ ending (volta) ของ MusicXML แทนที่จะคลี่เป็นรอบเดียวเรียงตรง <repeat times="n"> หรือ <line-repeat first last times> กลายเป็นคู่เส้นซ้ำหน้า/หลังครอบห้องที่มันครอบ พร้อมจำนวน times ที่ตรงกัน ส่วนรายการ pass บน <ending> กลายเป็นวงเล็บ volta เหนือหมายเลขชุดเดียวกัน วิธีนี้ทำให้โน้ตที่แปลงแล้วยังหน้าตาเหมือนต้นฉบับแทนที่จะเป็นบันทึกที่คลี่แบน โดยแลกกับการต้องแก้ช่วงต่าง ๆ (รวมถึง <bow> และ <parenthesis>) เทียบกับรอบที่มันตกอยู่ ซึ่งเป็นการแก้แบบเดียวกับที่ตัวองค์ประกอบเองต้องการอยู่แล้ว
การเข้ารหัสแบบดั้งเดิมนี้แทนได้เฉพาะโครงสร้างที่ <repeat> ครอบท่อนเดียวพอดี ไม่ว่าจะซ้อนลึกแค่ไหน: ตัวอย่างใน จำนวนรอบทั้งหมด ของ <repeat> ซ้อนท่อนไว้ในสอง times="2" และยุบลงเป็นคู่เส้นซ้ำเดียวที่ times="4" ส่วน <repeat> ที่ครอบมากกว่าหนึ่งท่อนเป็นพี่น้องกันอาจเล่นในลำดับที่คู่เส้นซ้ำเดียวแสดงไม่ได้: repeat×2{ repeat×2{A}, B } เล่น A A B A A B ซึ่งเส้นซ้ำ times="4" ครอบเฉพาะ A จะสื่อผิดโดยเล่น A สี่ครั้งติดกัน ตัวแปลงถอยไปคลี่ขอบเขตของ repeat นั้นเป็นห้องธรรมดาทั้งหมดในกรณีเช่นนี้ พร้อมคำเตือน แทนที่จะเข้ารหัสลำดับที่เส้นซ้ำสร้างไม่ได้จริง
พาร์ตไม่มีระดับเสียงและพาร์ตเนื้อเพลง
หัวข้อที่มีชื่อว่า “พาร์ตไม่มีระดับเสียงและพาร์ตเนื้อเพลง”ค่า sound บน <note> ที่ไม่มีระดับเสียงเป็นค่าเฉพาะเครื่องดนตรีและไม่มีการจับคู่ที่กำหนดไว้กับหัวโน้ตของ MusicXML ตัวแปลงเขียนหัวโน้ตไม่มีระดับเสียงหนึ่งแบบต่อหนึ่งรหัสที่ต่างกันซึ่งปรากฏในพาร์ต และนำ <annotation> ที่อธิบายรหัสเหล่านั้นไปเป็นคำอธิบายสัญลักษณ์
ค่า pitch หรือ sound ที่ไม่ตรงกับ type ที่พาร์ตประกาศ เช่นโน้ตที่มี sound ในพาร์ตที่ไม่ได้ประกาศ type="unpitched" หรือกลับกัน ไม่ถูกต้องตาม การสอดคล้องมาตรฐานของ <note> แต่ตัวแปลงก็ยังต้องทำอะไรสักอย่างกับมันแทนที่จะทิ้งทั้งเอกสาร มันไม่มีความหมายในการอ่านทั้งสองแบบ: ไม่ใช่ระดับเสียงจริง และไม่ใช่รหัสเครื่องกระทบบนเครื่องดนตรีที่ไม่มีใครประกาศว่าไม่มีระดับเสียง ตัวแปลงจึงแปลงเป็นตัวหยุดแทน พร้อมคำเตือน เหมือนการจัดการการฝ่าฝืนแบบอ่อนที่รูปแบบนี้ใช้ในที่อื่น
พาร์ตเนื้อเพลง แปลงเป็นองค์ประกอบ <lyric> ของ MusicXML ที่ผูกกับพาร์ตที่มีโน้ตซึ่งจับคู่ไว้ ThaiMusicXML เก็บเนื้อร้องเป็นพาร์ตอิสระแทนที่จะผูกกับพาร์ตใด ตัวรูปแบบเองจึงไม่ระบุการจับคู่ ตัวแปลงต้องเลือกเอง แต่ละพยางค์ผูกกับโน้ตที่กำลังดังอยู่ ณ ตำแหน่งนั้นก่อน ไม่จำเป็นต้องเป็นโน้ตที่เริ่มตรงนั้นพอดี เพราะโน้ตที่กำลังกังวานอาจยังดังอยู่ (ดู ตัวหยุด) ถ้าไม่ได้ (พยางค์ตกบนความเงียบจริง) ก็ผูกกับโน้ตที่ใกล้ที่สุดก่อนหน้าแทน ด้วยเหตุผลเดียวกับตัวหยุดที่เขียนไว้: คำเป็นของสิ่งที่เล่นล่าสุด ถ้ายังไม่ได้อีก (ยังไม่มีอะไรเล่นเลย) ก็ถอยไปใช้โน้ตที่ใกล้ที่สุดหลังจากนั้น มีเพียงพาร์ตปลายทางที่ไม่มีโน้ตเลยเท่านั้นที่ทำให้พยางค์ไม่มีอะไรให้ผูก และถูกตัดทิ้งพร้อมคำเตือน
การจับคู่ เมื่อไม่มีข้อมูลเพิ่มเติม พาร์ตเนื้อเพลงตัวแรกตามลำดับใน ensemble จับคู่กับพาร์ตหรือ stack ที่มีโน้ตตัวแรก พาร์ตเนื้อเพลงตัวถัดไปถูกตัดทิ้งพร้อมคำเตือน เพราะการเดาการจับคู่ที่สองไม่มีหลักดีไปกว่าการเดาครั้งแรก ตัวเลือกบรรทัดคำสั่ง (--lyrics-map) ระบุการจับคู่เองแทน โดยระบุ id ของพาร์ต หรือระบุ id ของแถวใดแถวหนึ่งสำหรับ stack ที่จับคู่ไว้ และแทนที่การเดาเริ่มต้นทั้งหมดแทนที่จะเพิ่มเข้าไป --no-lyrics ปิดการส่งออกเนื้อร้อง ทั้งหมดนี้ใช้กับ MusicXML เท่านั้น การส่งออก MIDI ไม่นำเนื้อร้องไปด้วยใน v1.0
เวลา ตำแหน่งของพยางค์ภายในห้องเป็นไปตาม กฎการนับของ <syllable>: ตัวที่ i จากทั้งหมด n ตกที่ จำนวนจังหวะ × i ÷ n ซึ่งเท่ากับจังหวะที่ i พอดีเมื่อจำนวนตัวเท่ากับจำนวนจังหวะ และกระจายตัวเท่า ๆ กันทั่วห้องเมื่อไม่เท่า เพราะต้องมีเวลาที่กำหนดไว้ไม่ทางใดก็ทางหนึ่งจึงจะมีอะไรให้ผูก <lyric> เข้าไปได้ แม้ห้องต้นฉบับจะเขียนไว้อย่างไม่อิงกริดจังหวะก็ตาม <rest> ในห้องเนื้อเพลง (เอื้อน: เสียงสระที่ร้องอยู่แล้วดำเนินต่อไป) ยังกินช่องหนึ่งช่องในการจัดระยะนั้น แต่ไม่สร้างองค์ประกอบ <lyric> ของตัวเอง
การส่งออก MIDI
หัวข้อที่มีชื่อว่า “การส่งออก MIDI”ระดับเสียง
หัวข้อที่มีชื่อว่า “ระดับเสียง”การส่งออก MIDI ใช้การจับคู่ขั้นบันไดเสียงกับระดับเสียงชุดเดียวกับ MusicXML: ทุกโน้ตปัดเข้าหาระดับเสียงที่ใกล้ที่สุดในระบบสิบสองเสียงเท่ากัน แทนที่จะเป็นขั้นบันไดเสียงไทยจริงราว 171 เซนต์ ตัวแปลงอาจรักษาการตั้งเสียงไทยไว้ตรงตัวด้วย pitch bend รายโน้ต แต่ bend เป็นคุณสมบัติรายช่องของ MIDI ซึ่งจะบังคับให้ต้องใช้หนึ่งช่องต่อหนึ่งเสียงที่ดังพร้อมกัน และตัวเล่นกับซินธ์ส่วนใหญ่ก็สมมติ 12-TET อยู่แล้ว การปัดทำให้ไฟล์ MIDI เล่นได้ในซินธ์ General MIDI ใดก็ได้ และเสียงอยู่ในกุญแจเดียวกับการส่งออก MusicXML ของโน้ตฉบับเดียวกัน โดยแลกกับสำเนียงเสียงไทยที่แท้จริง
แพตช์เครื่องดนตรี
หัวข้อที่มีชื่อว่า “แพตช์เครื่องดนตรี”instrument-name เป็นข้อความอิสระ ตัวแปลงจึงเทียบกับตารางชื่อเครื่องดนตรีไทยที่รู้จักเพื่อหาแพตช์ General MIDI พาร์ตที่ชื่อไม่ตรงกับอะไรในตารางได้แพตช์กลางตัวเดียวที่กำหนดไว้ พร้อมคำเตือน แทนที่จะเดาโดยไม่มีหลัก ตารางนี้คาดว่าจะขยายเมื่อมีการเพิ่มชื่อเครื่องดนตรีเข้าไป ชื่อที่เทียบไม่ได้เป็นช่องว่างในตาราง ไม่ใช่ความผิดของเอกสาร
| เครื่องดนตรี | แพตช์ General MIDI |
|---|---|
| ระนาดเอก | Xylophone |
| ฆ้องวงใหญ่ | Vibraphone |
| ขิม | Dulcimer |
| จะเข้ | Koto |
| ซอด้วง | Violin |
| ซออู้ | Cello |
| ชื่อที่เทียบไม่ได้ | Xylophone พร้อมคำเตือน |
เครื่องกระทบ
หัวข้อที่มีชื่อว่า “เครื่องกระทบ”รหัส sound ของพาร์ตที่ไม่มีระดับเสียงเป็นค่าเฉพาะเครื่องดนตรีและไม่มีการจับคู่ที่กำหนดไว้กับโน้ตเครื่องกระทบของ General MIDI ตัวแปลงจึงกำหนดโน้ตเครื่องกระทบให้แต่ละรหัสที่ต่างกันซึ่งปรากฏในพาร์ตโดยอัตโนมัติ ตามลำดับที่รหัสปรากฏครั้งแรก วนไปตาม Acoustic Snare, Hand Clap, Closed Hi-Hat, Open Hi-Hat, Low Tom, High Tom, Cowbell, และ Claves ไฟล์ตั้งค่ากำหนดการจับคู่เฉพาะรายการทับได้ วิธีนี้ให้ไฟล์ที่เล่นได้ทันทีโดยไม่ต้องตั้งค่า โดยแลกกับการเลือกโน้ตตามอำเภอใจจนกว่าจะมีคนกำหนดทับ
ช่วงที่คอยอยู่
หัวข้อที่มีชื่อว่า “ช่วงที่คอยอยู่”ช่วง <parenthesis> มีเสียงตามปกติเป็นค่าเริ่มต้น แม้จะเป็นเครื่องหมายบอกว่าพาร์ตนี้เพียงคอยอยู่ขณะที่เครื่องดนตรีอื่นเล่นช่วงนั้นจริง เพราะโน้ตส่วนใหญ่ไม่เคยตั้ง mute และการตั้งค่าเริ่มต้นให้เงียบจะทำให้ช่วงเหล่านั้นหายไปจากไฟล์ MIDI แทนที่จะซ้อนกัน mute="true" ทำให้ช่วงนั้นเงียบสำหรับไฟล์ที่ต้องการการอ่านตามตัวอักษรมากกว่า ส่วน mute="false" ระบุค่าเริ่มต้นที่มีเสียงอย่างชัดเจน dim ไม่มีสิ่งเทียบเท่าใน MIDI จึงถูกตัดทิ้ง
จังหวะและความเร็ว
หัวข้อที่มีชื่อว่า “จังหวะและความเร็ว”<bpm> ตั้งความเร็ว MIDI (set-tempo meta event) หนึ่งจังหวะ bpm คือโน้ตตัวดำในกรอบ 2/4 เดียวกับที่การส่งออก MusicXML ใช้ ห้องสี่จังหวะตามปกติจึงใช้ค่าตัวเลขนั้นได้ตรง ๆ เมื่อห้องมีจำนวนจังหวะต่างจากสี่ ช่องโน้ตของมันต้องบรรจุลงในสองจังหวะ bpm เท่ากับห้องอื่น และ MIDI ไม่มีความเร็วที่อ้างอิงกับห้องให้บอกเรื่องนี้ ตัวแปลงจึงปรับค่าไมโครวินาทีต่อตัวดำเฉพาะห้องนั้นแทน คือ 240000000 / (bpm × จำนวนจังหวะ) แล้วตั้งกลับหลังจากนั้น ห้องจึงยาวเท่ากันตามที่ <bpm> กำหนด และไม่ต้องใช้ tuplet เพราะไม่ได้กำลังเขียนโน้ตลงกระดาษ โน้ตที่แก้ไขแล้วแต่ละตัว (ดู ตัวหยุด) กลายเป็น note-on หนึ่งครั้งตามด้วย note-off หลังความยาวเต็มของมันเป็นช่องโน้ต แทนที่จะเป็นการตีสั้น ๆ แล้วปล่อยให้ซินธ์กังวานเอง เพราะแพตช์ General MIDI แต่ละตัวกังวานยาวไม่เท่ากันมาก
การซ้ำและ ending
หัวข้อที่มีชื่อว่า “การซ้ำและ ending”MIDI มาตรฐานไม่มีแนวคิดเส้นซ้ำหรือ ending ในตัว <repeat>, <line-repeat>, และ <ending> จึงถูกคลี่ออก: ตัวแปลงเดินผ่านทุกรอบที่ท่อนเล่นจริงและเขียนโน้ตของแต่ละรอบเป็นชุดเหตุการณ์ของตัวเอง แทนที่จะเป็นเหตุการณ์ชุดเดียวที่ให้ซีเควนเซอร์เล่นซ้ำ นี่ตรงข้ามกับแนวทางของ MusicXML และเป็นผลจากสิ่งที่รูปแบบปลายทางแสดงได้ ไม่ใช่จากความชอบว่าโน้ตแบบใดดีกว่า
ข้อมูลกำกับ
หัวข้อที่มีชื่อว่า “ข้อมูลกำกับ”<chan>, <nathap>, และ <annotation> ไม่ได้บอกเวลา และแปลงเป็น text หรือ marker meta event ของ MIDI ในตำแหน่งเดียวกัน เพื่อให้โปรแกรมแก้ไขแสดงได้ ตัวเล่นที่ไม่สนใจ meta event ก็ยังเล่นไฟล์ได้ถูกต้อง
v1.0 กำหนดการแปลงจาก ThaiMusicXML เป็น MusicXML และจาก ThaiMusicXML เป็น MIDI ส่วนการนำเข้าไม่ว่าทิศทางใดไม่ได้กล่าวถึงในที่นี้