2007/Jul/03

คราวที่แล้ว ได้ทดลองการต่อ Sine Wave Oscillator (SinOsc) กับ dac (ให้เสียงออกที่ soundcard)
กำหนดให้โปรแกรม "รอเวลาให้ผ่านไป" ได้โดยการ ชักระยะเวลา (duration) ใส่ now
และแสดงผลการคำนวณ หรือค่าต่างๆ

วันนี้ เรามาทำความรู้จักกับ SinOsc กันมากขึ้นดีกว่า!

ทำอย่างไรกับ SinOsc ได้บ้าง?

ถ้าสงสัยอย่างนี้ ก็จะบอกให้เลยว่า เราสามารถอ่านได้จากเว็บของ ChucK โดยตรง โดยดูที่เอกสารเกี่ยวกับ Unit Generator ต่างๆ ลองกดดูที่ SinOsc ครับ เขาขึ้นมาว่า

[ugen]: SinOsc

(control parameters)

  • .freq - ( float , READ/WRITE ) - oscillator frequency (Hz), phase-matched

  • .sfreq - ( float , READ/WRITE ) - oscillator frequency (Hz)

  • .phase - ( float , READ/WRITE ) - current phase

  • .sync - ( int , READ/WRITE ) - (0) sync frequency to input, (1) sync phase to input, (2) fm synth

โหๆ อันนี้สำหรับพวกเรานี่ถือว่า สั้นๆ ได้ใจความแล้วล่ะนะเนี่ย
เรามาทำความรู้จัก คลาส (Class) ชนิดหนึ่งในภาษา ChucK กัน

จาก wikipedia ภาษาไทย: คลาส (Class) - ​ประ​เภทของวัตถุ​ ​เป็น​การกำ​หนดว่า​ ​วัตถุ​ ​จะ​ประกอบไป​ด้วย​ ข้อมูล (data) ​หรือ​คุณสมบัต ิ​(property) ​และ​ พฤติกรรม(behavior)​ หรือ​การกระทำ ​(method) ​อะ​ไรบ้าง​ ​ซึ่ง​ ​คลาส​ ​เป็น​โครงสร้างพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ

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

ยกตัวอย่าง สมมติ เรามีคลาสของ มีด มีดข้อมูลเช่น.. ผลิตที่ไหน วัสดุอะไร.. มีคุณสมบัติเช่น คมมากขนาดไหน มีกี่คม ปลายแหลมไหม.. มีพฤติกรรม หรือการกระทำ เช่น สามารถตัดได้ บาดได้ แทงได้ ฟันได้

คลาสก็สามารถจะมี คลาสย่อย (sub-class) ลงไปได้เหมือนกัน เช่น เรากำหนดว่า ปังตอ เป็นมีด ชนิดหนึ่ง ถ้าเราสร้างวัตถุ ที่เป็นปังตอ วัตถุนั้น ก็จะมีลักษณะต่างๆ ของ มีด มาเช่นเดียวกัน

งั้นมารู้จัก class สำคัญมากๆของภาษา ChucK อย่างหนึ่ง ก็คือ unit-generator หรือเขียนว่า UGen

unit-generator นี่เหมือนกับเป็น หน่วยที่เอาไว้ สังเคราะห์สัญญาณขึ้นมา ตัวมันเอง มีหน้าที่ของมันก็คือ "สร้างสัญญาณ" ซึ่งสัญญาณนั้น อาจจะเป็นเสียง หรือสัญญาณควบคุม หรืออะไรอื่นๆก็ตาม UGen ทั้งหลายล้วนสร้างสัญญาณทั้งนั้น

และ UGen ยังมี input, output อีกด้วย เช่น เราสามารถต่อสายจากวัตถุประเภท SinOsc เพื่อเอาเสียงจากมัน ไปส่งเข้ากับวัตถุอีกอย่าง

อย่างเช่น dac ก็เป็นวัตถุพิเศษอีกอย่างเช่นกัน ก็สามารถรับค่าจาก UGen อื่นๆได้
- - -

คราวนี้ พอเราอ่านข้างบน จะเห็นเครื่อง . (จุด) ตามด้วย คำต่างๆ เช่น .freq .phase

ไอ้ จุด นี่ ถ้าแปลเป็นคำไทยง่ายๆก็คือ "ของ" เช่น s.freq แปลว่า ความถี่ของ s (freq ย่อมาจาก frequency หรือความถี่นี่เอง)
อย่างนี้ สมมติว่าเราสร้าง Sine Wave Oscillator ชื่อ s ด้วย SinOsc s ไปแล้ว
หลังจากนั้น เราก็สามารถ เปลี่ยนค่าของ s.freq ได้ด้วย เพื่อให้ Oscillator นั้น มีความถี่เท่ากับค่าที่กำหนด

ลองพิมพ์โปรแกรมนี้เข้าไปในที่พิมพ์โค้ดโล่งๆใน miniAudicle เลยครับ
(ก่อนที่จะพิมพ์ เตรียมตัวไว้ก่อนได้เลย กด "Start Virtual Machine" ในหน้าต่าง Virtual Machine ได้เลย)

// connect SinOsc to dac
SinOsc s => dac;
// set frequency then wait 1 second each time
440.0 => s.freq;
second => now;
550.0 => s.freq;
second => now;
660.0 => s.freq;
second => now;
770.0 => s.freq;
second => now;
880.0 => s.freq;
second => now;

จะเห็นได้ว่า การทำงานเริ่มซับซ้อนขึ้น ฟังดีขึ้นเยอะ (แม้จะเสียงดังไปหน่อย)
สิ่งที่เกิดขึ้นก็คือ เราได้ทำการ ส่งเลขค่าความถี่เสียง ไปให้ "ความถี่ของ s"
หลังจากเวลาผ่านไปในแต่ละขั้น ก็จะมีการปรับความถี่ของเสียงใหม่ทุกๆครั้ง
หลังจากปรับเสร็จ ก็จะ "รอ 1 วินาที" โดย ประโยค second => now; นี่เอง

ค่าที่ส่งไปนี้ เป็นความถี่ในหน่วย Hertz (หรือย่อว่า Hz) นี่เอง

เป็นอย่างไรครับ ลองใช้เวลา ทดลองกับมันดู เช่น
เปลี่ยนตัวเลข

  • คำถามประจำวัน: เมื่อเพิ่มความถี่มากขึ้นเรื่อยๆๆๆๆ จนถึงขั้นหนึ่ง (เช่น เยอะกว่า 20,000 hz ขึ้นไป) เสียง Sine ที่ออกมา ฟังเป็นอย่างไร
คราวนี้ สมมติ เบื่อการหยุดรอทีละ 1 วินาทีแล้ว อยากรอเพียง 0.5 วินาที หรือ 500ms
ก็สามารถทำการเปลี่ยนจาก
second => now;

เป็น

0.5::second => now;
หรือ
500::ms => now;

แล้วลองฟังผลดูครับ
ใช่แล้ว เครื่องหมาย :: นี่เอง สำหรับใน ChucK นี่ก็สามารถระบุหน่วยเวลาได้ละเอียด ก็คือเอาไว้กำหนดเป็นจำนวนหน่วยของสิ่งนั้นๆ เช่น 2::second แปลว่า สองวินาที, 0.5::second แปลว่า ครึ่งวินาที,
500::ms ก็คือ 500 ของ มิลิวินาที (แต่ 1 วินาทีมี 1000 มิลิวินาที ดังนั้น 500 ก็เป็น ครึ่งวินาทีเช่นกัน)

เราสามารถ ให้มันรอเวลาเท่าไหร่ก็ได้ ตามที่คุณกำหนด ลองดูสิครับ
ลองเล่น ms, second, minute ดู

- - -

สรุปสิ่งต่างๆที่ให้เผลอสังเกตไปพร้อมกัน:

  • เมื่อโค้ดที่เราเขียนกำลังทำงานอยู่ ในหน้าต่าง Virtual Machine จะมี Shred นั้นๆขึ้น และทำงานอยู่ (มีเวลาของ now เป็นหน่วย วินาที ของ Shred นั้นๆด้วย)

  • เมื่อแต่ละ Shred ทำงานเสร็จแล้ว มันก็จะหายไป คือไม่ค้างอยู่ใน Virtual Machine

  • ไม่รู้ว่าเคยลองกันหรือเปล่าแต่ Shred เราสามารถให้มันพร้อมกันได้ทีละหลายๆ Shred

  • ตอนนี้เรารู้แล้วว่า วิธีการประกาศ ชื่อ ของวัตถุใหม่ ก็คือ “ชื่อคลาส ตามด้วย ชื่อวัตถุ” เช่น SinOsc s แปลว่า ประกาศวัตถุใหม่ชื่อ s อยู่ในคลาส SinOsc
    (
    บางอย่างที่ไม่ต้องประกาศขึ้นมาใหม่ แสดงว่าเป็นสิ่งที่มีอยู่แล้ว เช่น dac เป็นวัตถุชนิด UGen ที่ทำงานอยู่แล้ว ไม่ต้องประกาศใหม่

  • ประโยคที่จะทำงาน (expression ต่างๆ) เราสามารถจบได้โดยเครื่องหมาย ;

  • ซึ่งลักษณะของภาษาแบบนี้ จะสอดคล้องกับภาษา ตระกูล C++, Java นี่ล่ะครับ

Comment

Comment:

Tweet


•สามารถ​ทำ​การแก้​ไข​ ​เปลี่ยนแปลง​ ​หรือ​เพิ่มโปรแกรม​ได้​ใน​ขณะที่กำ​ลังแสดงสด​อยู่​ได้​เลย​
#5 by Toyota 4 Runner Power Steering Gearbox (122.168.56.248) At 2012-03-24 21:03,
ประเด็นของ การทำรูปเคารพ หรือพระเครื่อง คือ การที่คนคนหนึ่ง หรือคนกลุ่มหนึ่ง ได้ตั้งใจรวมตัวกันสร้าง "งานศิลปะ"
#4 by Buick Riviera AC Compressor (122.168.19.198) At 2012-02-09 14:44,
If you do want to get an academic success, you should present the properly done <a href="http://www.manyessays.com/essays/miscellaneous">miscellaneous essay paper</a>. An the superb essay could be a proper stuff for custom essay paper composing, I do guess.
#3 by WhitneyPage21 (91.212.226.136) At 2012-01-29 18:01,
http://www.okey-oyna.com

ไม่รู้ว่าเคยลองกันหรือเปล่าแต่ Shred เราสามารถให้มันพร้อมกันได้ทีละหลายๆ Shred
#2 by Okey Oyna (78.171.240.61) At 2011-04-13 02:30,
มาแอบอ่านหลายทีแล้ว สังเกตว่าคุณเจ้าของบล็อค
จะอัพเดทตอนเช้าๆ นะคะ
ตื่นเช้าหรือไม่ได้นอนหว่า

#1 by tifa_redeye At 2007-07-08 07:34,

กิจจาศักดิ์ ตริยานนท์
View full profile