แนวคิดใหม่ (ใหม่สำหรับผม) สำหรับโปรแกรมเกี่ยวกับดนตรีไทย

ผมเคยมีแนวคิด (ผมไม่ใช่คนแรกที่คิด) ที่จะพัฒนาโปรแกรมที่สามารถช่วยงานนักดนตรีไทย ให้ประพันธ์เพลงไทยได้สะดวกขึ้นดังแสดงไว้ที่ ห้องทำงาน ในตอนนั้นความรู้ภาษาไพธอนก็มีนิดเดียว ความเข้าใจเรื่องเทคโนโลยีคอมพิวเตอร์ในงานดนตรีก็มีไม่มาก

หลังจากที่ได้รู้จักกับ Chuck ที่นำเสนอไว้ในบล๊อกก่อนหน้านี้ ก็พบว่าการเขียนโค้ดไพธอนใหม่เพื่อรับผิดชอบงานทั้งหมดตั้งแต่การเขียนเพลงไปจนถึงบรรเลงเพลงดูจะเป็นงานซ้ำซ้อน (Rebuilding the wheel) โดยเฉพาะการเขียนโค้ดไพธอนให้บรรเลงเพลงได้หลาย ๆ เสียงพร้อมกัน (Concerent Programming) ซึ่งเคยมีคนทำแล้วด้วยซ้ำโดยใช้ภาษาจาวา

เมื่อใตร่ตรองดูแล้วพบว่าปัจจุบันเรามีเทคโนโลยีที่จัดการเรื่องเหล่านี้อยู่แล้ว นั่นก็คือเทคโนโลยี MIDI หมายความว่า หากเราแปลงให้เพลงไทยที่จะประพันธ์โดยใช้โน้ตไทยให้กลายเป็นแฟ้ม MIDI ได้ เราสามารถมอบหมายให้ระบบสังเคราะห์เสียง MIDI รับผิดชอบการสร้างเสียงต่าง ๆ ไม่ว่าจะเป็นเสียงสั้น เสียงยาว เสียงพร้อมกันแบบใด ๆ ก็ตาม สิ่งที่ต้องทำก็คือการสร้างระบบสังเคราะห์เสียงดนตรีไทยในระบบ MIDI ขึ้นมานั่นเอง

ในส่วนของระบบสังเคราะห์เสียงดนตรีไทยในระบบ MIDI นั้นเข้าใจว่ามีคนทำเผยแพร่อยู่มากในรูปแบบของ Soundfont จะไม่กล่าวถึงในที่นี้ แต่จะกล่าวถึงการแปลงโน้ตเพลงไทยเป็นแฟ้ม MIDI โดยใช้ไพธอนแปลงให้อยู่ในรูปโน้ต ABC และแปลงจากโน้ต ABC เป็น MIDI ในที่สุดดังนี้

*.tmn => *.abc => *.mid

นามสกุล TMN นั้นย่อมาจาก Thai Music Notation ซึ่งจะเป็นแฟ้มข้อความธรรมดาแต่มีรูปแบบการบันทึกโน้ตตามมาตรฐานของนักดนตรีไทยดังรูป
 บรรทัดแรกคือชื่อเพลง โน้ตเพลงจะเป็นแบบ 2 บรรทัดโดยให้บรรทัดแรกเป็นโน้ตสำหรับมือซ้ายและบรรทัดที่สองเป็นโน้ตสำหรับมือขวาแต่ละบรรทัดเพลงจะมี 8 ห้อง แต่ละห้องคั่นด้วยเครื่องหมาย | และเว้นหนึ่งบรรทัดเมื่อจะขึ้นบรรทัดเพลงใหม่ บันทึกแฟ้มด้วยรหัส UTF-8

ส่วนแฟ้ม ABC ก็เป็นการบันทึกโน้ตเพลงด้วยตัวอักษรเช่นเดียวกัน แต่เป็นอักษรภาษาอังกฤษ โดยให้ C = เสียงโด D = เสียงเร เรียงกันไป ระบบนี้สามารถปรับความยาวเสียงได้ รองรับเสียง # และเสียง b และเทคนิคทางดนตรีสากลอื่น ๆ เกือบครบถ้วน รายละเอียดของระบบการบันทึกโน้ตเพลงด้วยตัวอักษร ABC นี้เรียกว่า ABC Notation ตัวอย่างของแฟ้ม ABC แสดงดังรูป
ในระบบ ABC สัญลักษณ์ | หมายถึงการกั้นห้องเช่นเดียวกัน สัญลักษณ์ z หมายถึงไม่มีเสียง หากมีตัวโน้ตสองตัวอยู่ในกรอบเดียวกันเช่น [AB] หมายความว่าให้บรรเลงโน้ต ลา และ ที พร้อม ๆ กัน

ระบบการจดบันทึกเสียงดนตรีไทยของเรามีความซับซ้อนน้อยกว่า คือไม่ระบุเทคนิคการบรรเลง (เบา - ดัง) ไม่มีครึ่งเสียง # หรือ b ความยาวเสียงของแต่ละโน้ตเท่ากันหมดคือเท่ากับหนึ่งโน้ตตัวดำ (1 จังหวะ) และแต่ละห้องจะมี 4 จังหวะตายตัวเสมอ หากมีการพลิกแพลงเป็นลูกเล่นแบบใด ๆ ลูกเล่นเหล่านี้นักดนตรีมักจะเรียนกับครูโดยตรง เรียกว่าต่อเพลง หรือไม่เช่นนั้นก็พัฒนาแนวทางของตนเองขึ้นมาแบบด้นสด (Improvise) แต่จะไม่มีระบบการจดบันทึกที่เป็นมาตรฐานเดียวกัน ดังนั้นการแปลงแฟ้ม TMN ไปเป็น ABC จึงทำได้ง่าย

พื้นฐานที่ใช้คือสร้าง Empty List ขึ้นมา แล้วให้ไพธอนอ่านแฟ้ม TMN ไปทีละบรรทัด ในแต่ละบรรทัดเมื่อพบตัวอักษรก็เทียบอักษรไทยเข้ากับอักษรอังกฤษ เช่นเทียบ "ด" เป็น "C" เป็นต้น ถ้าหากตัวอักษรมีตัวเปลี่ยนขั้นเสียง เช่น ดํ จะให้หมายถึงเสียง โดสูง หรือ "c" ในระบบ ABC และ ดฺ จะให้หมายถึงเสียง โดต่ำ หรือ "C," ในระบบ ABC ดำเนินการเช่นเดียวกันกับโน้ตเพลงบรรทัดที่สอง

L1 = [];
for i in range(len(line1)):
if line1[i]=='|':
L1.append('|');

if line1[i]==':':
L1.append(':');

if line1[i]=='-':
L1.append('z');

if line1[i]==u'ด':
if line1[i+1]==u'\u0e4d':
L1.append('c');
elif line1[i+1]==u'\u0e3a':
L1.append('C,');
else:
L1.append('C'); 

เมื่อได้ List L1 สำหรับบรรทัดที่หนึ่งและ L2 สำหรับบรรทัดที่สองมาแล้วก็นำ List ทั้งสองมาเทียบกัน หากในจังหวะเสียงเดียวกันมีโน้ตทั้งสองบรรทัด ก็ให้บรรเลงโน้ตทั้งสองตัวพร้อมกัน ถ้ามีเพียงโน้ตตัวเดียวก็บรรเลงตัวเดียว ถ้าไม่มีโน้ตทั้งคู่ ก็ให้เงียบเสีย

L = [];
for i in range(len(L1)):
if L1[i]=='|':
L.append('|');
elif L1[i]==':':
L.append(':');
elif L1[i]=='z' and L2[i]=='z':
L.append('z');
elif L1[i]=='z' or L2[i]=='z':
if L1[i]=='z':
L.append(L2[i]);
else:
L.append(L1[i]);

else:
L.append('['+L1[i]+L2[i]+']');



นี่คือการแปลงโน้ตอักษรไทยไปเป็นโน้ตอักษรภาษาอังกฤษในระบบ ABC ผมตั้งชื่อโปรแกรมนี้ว่า tmn2abc (Thai Music Notation to ABC) เรียกใช้ดังนึ้

# python tmn2abc test.tmn test.abc

หลังจากนี้เราสามารถใช้เครื่องมือที่มีอยู่แล้วคือโปรแกรม abc2midi แปลงจากแฟ้ม ABC นี้ให้เป็น MIDI ได้ทันที

# abc2midi test.abc -o test.mid

สิ่งที่ต้องการจะทำเพิ่มเติมคือ
  1. รองรับระบบโน้ตบรรทัดเดียว สำหรับโน้ตซอ โน้ตขลุ่ย ฯลฯ
  2. เพิ่มการระบุชั้นเพลง คือ หนึ่งชั้น สองชั้น สามชั้น
  3. เพิ่มส่วนกำหนดเครื่องดนตรี แต่เรื่องนี้ต้องศึกษามาตรฐาน MIDI เกี่ยวกับการกำหนดช่องสัญญาณและโปรแกรมเพิ่มเติม
ก่อนหน้านี้เคยเขียนโปรแกรมนี้ไว้แล้ว แต่ตอนสำรองข้อมูลก่อนลงระบบใหม่เมื่อตอนทดสอบ Ubuntu ไม่สมบูรณ์ โปรแกรมทั้งชุดจึงหายไปหมด ตอนนี้เขียนใหม่แล้วเลยอัพโหลดไว้เสียเลย ท่านใดสนใจสามารถดูต้นฉบับโปรแกรมได้ sourceforge.net ครับ หากมีปัญหาหรือข้อแนะนำใด ๆ หากจะทิ้ง Comment ไว้ที่ Blog นี้ได้ก็จะขอขอบคุณล่วงหน้าครับ

ความคิดเห็น

  1. อยากจะได้โปรแกรมไปศึกษา ควรจะทำยังไงค่ะ

    ตอบลบ
  2. อยากติดต่อเจ้าของบล็อกจัง ต้องการศึกษาเรื่องนี้อย่างแรง!!

    ตอบลบ
  3. ถ้าต้องการจะติดต่อกับเจ้าของบล็อกควรทำยังไง

    ตอบลบ
  4. ขอโทษที่ไม่ได้อัพโหลดโปรแกรมไว้ครับ ขอให้เมล์มาถามรายละเอียดได้ที่ jarkmeesawat แอท gmail จุด com ครับ

    ตอบลบ

แสดงความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเขียนวิทยานิพนธ์ ม.ข. ด้วย LaTeX - การสร้างหน้าปกและปกใน

การเขียนบันทึกข้อความ (หนังสือราชการภายใน) โดยใช้ Latex (เพิ่มเติม)

การเขียนบันทึกข้อความ (หนังสือราชการภายใน) โดยใช้ LaTeX ตอนที่ 3