8 เดือนกับโปรเจคจบของฉัน [EP1] — Interactive Music Composer
สวัสดีครับ แนะนำตัวก่อนเลย ผมเรียนวิศวกรรมคอมพิวเตอร์ เพิ่งจบมาไม่นานนี้เอง ผมตั้งใจว่าจะเขียนบทความนี้มาสักพักแล้ว แต่ก็ไม่มีเวลา(เป็นข้ออ้าง 555) ตั้งใจว่าบทความนี้จะเป็นแนวทางสำหรับคนที่ทำโปรเจคแนวนี้ต่อๆไป
โปรเจคทำไรดีหว่า?
คำถามที่ลำบากใจที่สุดของมนุษย์โปรเจคจบ คิดแล้วคิดอีกสองสามสี่ห้าตลบ พอคิดได้ จะทำก็มีข้อจำกัดมากมาย ก็เปลี่ยนแนวอีก 5555
สำหรับโปรเจคของผมเริ่มมาจากสิ่งที่ตัวเองชอบ คือดนตรี แต่เรียนมา 4 ปี ก็ไม่มีโอกาสได้ทำโปรเจคเกี่ยวกับดนตรีเลย เลยจับมือ(อร้ายย)กับเพื่อนอีกคนที่เล่นดนตรีเหมือนกัน สร้างมันขึ้นมา โปรเจคของเราจะทำถุงมือที่สามารถ Interact กับดนตรีได้ โดยใช้ Application บนมือถือเป็นตัวชูโรง
ระบบดนตรีคือหัวใจหลักของแอพนี้ อธิบายคร่าวๆก็คือ ก่อนที่จะใช้งานถุงมือ จะมีเครื่องดนตรีให้ user จะสามารถเลือก template ของหลายๆเครื่องดนตรีมาเล่นรวมกันให้เป็นเพลง จะคล้ายๆสิ่งที่เรียกว่า Music Sequencer นั่นเอง หลังจากนั้นก็ถึงจะเอาถุงมือมาเล่นดนตรีได้
หลังจากหาข้อมูลในช่วงแรก เครื่องไม้เครื่องมือที่พอจะเป็นไปได้สำหรับการทำแอพก็คือตัวนี้…!
โปรแกรมสำหรับทำดนตรีสไตล์ Developer โดยใช้หลักการเขียนโปรแกรม + หลักการคณิตศาสตร์ + ความรู้ทางด้านดนตรี การเขียนโปรแกรมในนี้จะอยู่ในรูปแบบของ Visual Programming หรือที่จับลากวาง (จริงๆก็มีแบบเขียนโค้ดเป็นบรรทัดนะ แต่ลองแล้วมึนกว่า 5555+) เรียกได้ว่า geek ไปอีกขั้นนึงเลยทีเดียว

หลังจากลองหยิบมาเล่นได้พักนึง เออมันก็พอทำเป็นเพลงได้นะ ก็เลยหาวิธี import มาใช้ในแอพของเราโดยจะผ่านไลบรารี่ที่ชื่อว่า libpd ซึ่งทำมาจากภาษา C++ เราจะต้องใช้ Android NDK ในการแปลงโค้ดมาเป็นภาษา Java อีกทีครับ
Pure Data — https://puredata.info/
LibPD — https://github.com/libpd/pd-for-android
หลังจากที่ import มาใช้งาน ตัว library ก็จะสามารถสั่ง input เพื่อเข้าไปเล่นไฟล์ Pure Data ที่เราเขียนโปรแกรมไว้ ซึ่งถือว่าดีมากสำหรับการสั่งให้แอพเล่นจังหวะกลองง่ายๆได้ โดยใช้ samples (ไฟล์เสียง) ที่เป็นเสียง kick, snare, hi-hat, cymbal ฯลฯ มาต่อกันให้เป็นจังหวะ
แต่ถ้าอยากได้ดนตรีอย่างอื่นมาด้วย ต้องทำไงบ้าง? ตอนนี้มีจังหวะกลองแล้ว อยากได้เบสอ่ะ? ใน PURE DATA ของเราจะมีฟังก์ชัน SINE ที่จะใช้สังเคราะห์เสียงออกมาในความถี่ที่เราต้องการได้ เมื่อเอามาต่อกับ DAC (Digital to Analog Converter) ก็จะได้เสียง ตู้ดดดดดด! (ให้นึกถึงเสียงตอนโทรออก) ออกมา แต่คราวนี้ เสียงมันไม่เหมือนเบสเอาซะเลย เพราะโดยธรรมชาติเสียงของดนตรีประเภทเครื่องสายนั้น จะมีการเกิดเสียงและดับไป (เหมือนดีดสายกีตาร์ 1 สาย) แต่เสียง SINE ของเรายังคงตู้ดดดด.. ค้างอยู่เรื่อยไปอย่างนั้น เสียงสังเคราะห์ทั้งหลายจึงต้องพึ่งเทคนิคที่เรียกว่า “ADSR” (Attack Decay Sustain Release) เพื่อให้เสียงที่เกิดดูเป็นธรรมชาติขึ้นมาได้บ้าง

กราฟนี้คือ ระดับเสียง (Amplitude) อ้างอิงตามเส้นเวลา ตอนแรกจะสูงขึ้น (Attack) และหลังจากนั้นจึงค่อยๆลดลงอย่างรวดเร็ว (Decay) แล้วให้เสียงลากยาว (Sustain) จนดับไป (Release) ซึ่งค่า ADSR เหล่านี้สามารถปรับตามความต้องการได้ เพื่อให้ได้เสียงที่เป็นธรรมชาติที่สุด

ตัวอย่างที่ทำง่ายที่สุดก็คือ ตัดกราฟให้เหลือแค่ Attack กับ Release (AR) หลักการก็คือ สุมมติว่าระดับเสียง Amplitude ที่ดังที่สุดคือ 10 ใน Pure Data เราก็สร้างปุ่มมา เมื่อกดปุ่มแล้วก็จะให้ค่า Amplitude เป็น 10 หลังจากนั้นก็ให้โปรแกรมลดระดับไปเรื่อยๆ (อาจจะลดค่าทีละ 0.1) จนเหลือ 0 (เสียงดับ) แล้วค่าที่ได้ก็นำไป multiply กับเสียง SINE (ตู้ดดดด) ที่เพิ่งสร้างไปก่อนหน้านี้ คราาวนี้ก็จะได้เสียงที่ฟังแล้วเหมือนเบสขึ้นมาละครับ
ในส่วนของการเขียนโปรแกรม Pure Data นั้น เดี๋ยวค่อยเอามาเล่าสู่กันฟัง สำหรับวันนี้ก็ฝากโปรแกรม AR ที่บ่นๆมาไว้ตรงนี้เลย


ใน pd armodule เราสามารถเขียนโปรแกรมยัดเข้าไปไว้ในกล่องนั้นได้อีก ดังนั้นข้างในกล่องก็จะเป็นไปตามรูป armodule ซึ่งเป็นฟังก์ชันที่จะ Attack Release เมื่อมีการกดปุ่มเข้ามา
เหมือนที่อธิบายไว้ osc~ คือฟังก์ชัน SINE ที่เอาไว้สำหรับทำเสียงแล้วก็นำไป multiply กับ ar module เพียงเท่านี้ก็จะได้เสียง ดนตรีที่ดูเป็นธรรมชาติมากขึ้น
