Thursday, January 1, 2015

Processing กับเสียง

มีโครงงานอันนึงทำด้วย Processing ต้องการเพิ่มเสียงเข้าไป ทั้ง Background music และ Event sound ก็เลยต้องหาวิธีการเล่นไฟล์เสียง

ก่อนอื่นก็ต้องไปหาไฟล์เสียงก่อน เน้นของฟรี (Royalty-free) ซึ่งหาดูแล้วมีมากมายครับ เช่น http://www.playonloop.com/music-loops-category/videogame/

แต่ก่อนจะดาวน์โหลด ให้อ่านดูดีๆนะครับว่าเค้ามี license แบบไหน เช่น Creative Commons ก็สามารถนำไปใช้ได้ฟรีทั้งแจกจ่ายและแก้ไข รวมถึงเพื่อการค้า แต่ต้อง You must give appropriate credit, provide a link to the license, and indicate if changes were made.

เมื่อได้ไฟล์เสียงที่ต้องการแล้ว อาจจะเป็นไฟล์ wav หรือ mp3 ก็ได้ ก็ให้ย้ายไปยัง Sketch folder (เปิด Processing สร้างโปรเจคแล้วเซฟไว้ แล้วเลือกเมนู Sketch/Show Sketch folder หรือ Ctrl+K จากนั้นคัดลอกไฟล์ไปไว้ยังโฟลเดอร์ data ในโปรเจคที่เปิดอยู่) ในที่นี้สมมติว่าไฟล์เสียงของเราชื่อ POL-icy-town-short.wav ครับ

ขั้นตอนต่อไปคือเลือกใช้ sound library สำหรับ Processing แล้วจะมีหลายตัว ตัวที่เป็นตัวพื้นฐานของ Processing เองเลย คือ https://processing.org/reference/libraries/sound/index.html ซึ่งเท่าที่ลองอ่านดู จำเป็นต้องติดตั้งต่างหากเพิ่มเติม ซึ่งก็ไม่ยากอะไร เพียงเลือกเมนู Sketch/Import Library/Add Library แล้วเลือก Sound รอดาวน์โหลดแป้บนึงก็เรียบร้อย อย่างไรก็ตาม ณ ปัจจุบัน library ตัวนี้ยังสนับสนุนเฉพาะ OS แบบ 64 บิตเท่านั้น เครื่องผมเป็น 32 บิตเลยแห้วไป

เมื่อใช้ตัวปกติของ Processing ไม่ได้ ก็ต้องไปหา library ตัวใหม่ ผมพบว่าถ้าเป็น Processing 2 จะมี library ตัวนึงแถมมาให้เลย ชื่อ minim ไม่เข้าใจเหมือนกันว่าทำไม Processing 3 (ซึ่งปัจจุบันเป็นตัวเบต้าอยู่) ถอดออกไป และเลือกที่จะพัฒนาเอง

แต่ช่างมันเถอะครับ เลือกตัวที่เราใช้ได้ตอนนี้ดีกว่า ถ้าใครใช้ Processing 2 อยู่แล้วก็ไม่มีปัญหา ส่วนใครใช้ Processing 3 beta ก็ไปดาวน์โหลด minim ที่ http://code.compartmental.net/tools/minim/ จะได้ไฟล์ zip ออกมา แตกไฟล์ไปไว้ที่ sketchbook location เช่น C:\Users\user\Documents\Processing\libraries ได้เลย ข้างในโฟลเดอร์จะมีไฟล์มากมาย ซึ่งเราสามารถลบให้เหลือเฉพาะโฟลเดอร์ชื่อ library ได้

จากนั้นลองเริ่มเขียนโค้ดกันดู สมมติว่ามีไฟล์เสียงในโฟลเดอร์ data ของโปรเจคปัจจุบันแล้วนะครับ
import ddf.minim.*;

Minim minim;
AudioPlayer player;

void setup()
{
  size(200, 200);  
  minim = new Minim(this);
  //load music file
  player = minim.loadFile("POL-icy-town-short.wav");
  //play music
  player.play();
}

void draw(){
  background(0);
}

ลองรันดูครับ น่าจะได้ยินเสียงตามต้องการแล้ว

นอกจากนี้แล้ว ยังมีฟังก์ชันที่น่าสนใจอีกมากมาย เช่น
-ถ้าต้องการให้เล่นไฟล์แบบวนไปเรื่อยๆ ก็เปลี่ยนจาก player.play() เป็น player.loop() หรือถ้าต้องการให้วนกี่ครั้งก็ใช้ player.loop(num) เมื่อ num คือจำนวนครั้งที่ต้องการให้เล่นซ้ำครับ
-ถ้าต้องการหยุดชั่วคราว ใช้ฟังก์ชัน pause
-ถ้าต้องการปิด/เปิดเสียง ใช้ฟังก์ชัน mute/unmute

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

No comments:

Post a Comment