ChucK-programming

ChucK คืออะไร

มารู้จัก​ “​ชัก​” ​กัน​ก่อนนะครับ​ ​สั้นๆ​ ​ได้​ใจ​ความ​ ​(​แล้ว​วันหลัง​ ​มาลอง​ “​ชัก​” ​กัน​เห็นๆ​)
​มา​แวะดู​เว็บไซต์ของ​ ChucK ​ได้​เลย

ChucK logo

ชักคือ​:

  • ภาษา​เขียนโปรแกรม​ ​สำ​หรับด้าน​ ​เสียง​ (audio programming language) ​สำ​หรับการ​ ​สังเคราะห์​ (synthesis), ​แต่งเพลง​ (composition), ​และ​แสดง​ (performance) ​แบบสดๆ​ (real-time)
  • สามารถ​ทำ​การแก้​ไข​ ​เปลี่ยนแปลง​ ​หรือ​เพิ่มโปรแกรม​ได้​ใน​ขณะที่กำ​ลังแสดงสด​อยู่​ได้​เลย​ (on-the-fly programming)
  • ภาษานี้​ ​ปฏิบัติภารกิจต่างๆ​ตามเวลาที่กำ​หนด​ ​อย่างแม่นยำ​ (strongly-timed)
  • เรา​สามารถ​มี​โปรแกรมภาษานี้​ ​หลายๆ​ตัว​ (threads) ​ทำ​งานไป​ด้วย​กัน​ ​พร้อม​กัน​ ​หรือ​ร่วมมือ​กัน​ได้​ (concurrent)
  • สามารถ​ติดต่อ​และ​ใช้​งาน​กับ​ MIDI, OSC, HID ​ได้

OSC: Introduction to OSC ​เป็น​โปรโตคอล​ ​ใน​การที่​เครื่องคอมพิวเตอร์ต่างๆ​ ​หรือ​โปรแกรมต่างๆ​ ​จะ​สามารถ​ติดต่อ​กัน​ได้​ ​สำ​หรับการทำ​งานร่วม​กัน​ด้าน​ Multimedia (เช่น​ ​ภาพ​, ​เสียง​.. ​โดย​เฉพาะ​ ​เสียง) ​โดย​ผ่านทางเทคโนโลยีด้าน​ network

HID: Human Interface Device ​เป็น​อุปกรณ์ที่ทำ​การติดต่อ​ (รับ​ - ​แสดงผล) ​กับ​เหล่า​ผู้​ใช้​คอมพิวเตอร์​ ​เช่น​ Keyboard, Mouse, Trackpad, Tablet (แถบที่​ใช้​ปากกาจิ้มวาด​ได้)​, Joystick, ​จอยสำ​หรับเล่นเกม​ ​ฯลฯ

  • ​เป็น​ภาษาที่​สามารถ​อ่าน​ ​เข้า​ใจ​ ​ได้​ง่ายสำ​หรับนักดนตรี​ทั่ว​ไป​ ​ทำ​ให้​สามารถ​เข้า​ใจ​และ​พิมพ์​แก้​ไข​ได้​สะดวก​ใน​ขณะที่กำ​ลัง​ใช้​สดจริงๆ
  • กำ​ลัง​อยู่​ใน​ขั้นพัฒนา​ (อาจ​จะ​มีบั๊ก​ ​หรือ​ล่ม​ได้​บ้าง​ ​แต่ว่า​ ​กำ​ลังมี​ความ​สามารถ​เพิ่มเติมอย่างต่อ​เนื่อง)
  • สร้างขึ้นมา​โดย​ ​หลากหลายทีมงาน​ ​เริ่มต้น​จาก​ Ge Wang ​และ​ Perry Cook ​และทีมงานอีกหลายท่าน

การติดตั้ง​:

สำ​หรับที่ผมแนะนำ​ผู้​ใช้​ที่​จะ​ทำ​ความ​รู้จัก​กับ​ ChucK ​นั้น​ ​ยัง​ไม่​แนะนำ​การ​ใช้​งาน​ ChucK ​ที่​เป็น​แบบ​ command-line (พิมพ์ข้อ​ความ​สังเอา​ทั้ง​หมด​ใน​ terminal) ​โดย​ตรง​ ​แต่​จะ​แนะนำ​ miniAudicle ​ซึ่ง​เป็น​โปรแกรมที่​เอา​ไว้​ ​แก้​ไข​ (พิมพ์​, ​โหลด​, ​เซฟ​, ​รัน) ​โปรแกรมภาษาชัก​ ​ได้​สะดวก​ ​และ​ใช้​กับ​ระบบปฏิบัติการต่างๆ​ได้​อย่างสะดวก​ ​ดังนี้

Mac OS X ​(​ความ​สามารถ​มากสุด), Windows ​(​ความ​สามารถ​ปานกลาง), Linux ​(​ความ​สามารถ​ไม่​เท่า​ Mac ​แต่ก็สูงกว่า​ Windows) ​อ่านวิธีการติดตั้ง​ ​(​ต้อง​ compile ​เอา​จาก​ source) ​ได้​จาก​บท​ความ​ใน​บล็อกของผม​ ที่นี่

ไว้​ติดตาม​ได้​ต่อไปครับ​ ​ใน​เจอเน่า​ (journal) ​นี้ของผมที่มีขื่อว่า​ “​เมื่อผมหัดชัก​”

คราวที่แล้ว ก็ได้แนะนำให้รู้จัก ภาษาเขียนโปรแกรม ที่ชื่อว่า ChucK กันไปแล้วนะครับ แล้วก็ แนะนำโปรแกรมที่สำหรับจะเอาไว้ แก้โค้ด save-load รัน และทำงานภาษา ChucK อย่างสะดวกสบายแล้ว ก็คือ โปรแกรม miniAudicle นี่เอง
(เจอเน่า คราวที่แล้ว ติดตามอ่านได้ ที่นี่ เลย)

หลังจาก install เรียบร้อยแล้ว
(ในกรณีคนที่เล่น windows ก็สร้าง Folder สำหรับไว้โปรแกรมที่ ไว้ที่ไหนก็ได้ตามสะดวกไว้ก่อน.. สำหรับ Mac OS X ลากใส่ Application และ Dash Board ได้เลย.. สำหรับ Linux ถ้าจะรันสะดวกๆ ลากใส่ /usr/bin)
ลองรันมันขึ้นมาเลยดีกว่า ก็จะเห็นหน้าตาตามนี้



ก็คือ จะแบ่งเป็น Windows ทั้งหมด 3 หน้าต่างด้วยกัน
  1. miniAudicle ในส่วนโปรแกรมหลัก ที่มีเมนูสำหรับทำงานต่างๆ และใช้เขียนโค้ดภาษา ChucK ได้
    สามารถจัดการกับโค้ดต่างๆ ได้ด้วยการ File -> Load, Save ฯลฯ ได้เหมือนโปรแกรมพิมพ์ข้อความทั่วไป
  2. Virtual Machine เป็นส่วนกลาง ที่เอาไว้รันโปรแกรมที่เขียนด้วย ChucK
  3. Console Monitor เป็นส่วนที่เอาไว้แสดงผลต่างๆ และช่วยรายงานเวลาเกิดความผิดพลาด หรือเกิดบั๊กในโปรแกรม
ไหนๆก็เปิดขึ้นมาแล้ว เราก็จะมาทดลองใช้กันดูเลยดีกว่า!

ก็จะเล่าให้ฟังก่อน ว่าหลักการการทำงานของภาษา ชัก นั้น มันเป็นอย่างไร
เรื่องก็มีอยู่ว่า ภาษานี้ จะมี "ส่วนกลาง" ที่ทำหน้าที่ประมวลผล ซึ่งเราสามารถส่งเอาโปรแกรมที่เราเขียน ไปประมวล หรือรัน กับส่วนกลางได้
เราสามารถส่งโปรแกรมไปรันได้ทีละหลายๆโปรแกรมพร้อมกัน โดยโปรแกรมเหล่านั้น อาจจะทำงานแยกกัน หรือร่วมกันได้ด้วย
สิ่งที่เป็นส่วนกลางนี่ ก็จะเรียกว่า Virtual Machine (ย่อสั้นๆว่า VM) เราสามารถเปิด ปิด Virtual Machine ได้ เมื่อจะเริ่มใช้งาน ภาษา ChucK ก็เช่นกัน เราก็ต้องเปิดให้ Virtual Machine ทำงานก่อน

คราวนี้ ภาษา ชัก ด้วยความที่เป็นภาษาที่มีจุดเด่นด้านเสียง ดังนั้น หลักๆแล้ว Virtual Machine สิ่งที่มันต้องการก็คือ การติดต่อกับ Soundcard ของพวกเรานี่เอง
เพื่อที่จะ รับเสียงเข้ามา หรือเล่นเสียงออกไป
(แต่ถ้าไม่ใช้ Soundcard ก็สามารถให้โปรแกรมทำงานได้โดยไม่เล่นเสียงออกมา โดยใช้ silent mode นี่เอง)

งั้นมาลองดูว่า miniAudicle จะสามารถติดต่อกับ soundcard ใดของเราได้บ้าง
ดูที่หน้าต่าง miniAudicle -> เมนู Edit -> Preferences ->
ลองดูที่ Audio Input กับ Output ในนั้น จะทำการเลือก Soundcard ได้
และยังเลือกได้ด้วยว่า Soundcard นั้นๆ มี input, output กี่อัน
สำหรับกรณีปกติ เลือกเป็น 2 ไว้ก่อนก็ได้ (output มี 2 อัน สำหรับการใช้งานแบบ stereo ปกติ)

ส่วน Sample Rate นี่คือ ความถี่ในการคิดคำนวณ และเล่นเสียงออกมา ผ่านทาง soundcard นั้นๆ
ก็คงจะรู้กันมาบ้างไม่มากก็น้อย ว่ามาตรฐาน Sample Rate ของการฟังเพลง ทั่วไป โดยเฉพาะกับคอมพิวเตอร์บ้านๆนี่
ก็จะเป็น 44100 hz
ยิ่งถ้าพูดถึง เพลงที่เราฟังจาก CD พวกนี้นี่ Sample Rate = 44100 hz เลย
ดังนั้น ถ้ายังไง ก็ขอแนะนำให้เริ่มจาก 44100 ก่อน
น่าจะเป็นค่าที่ ซัพพอร์ทกับ soundcard ทั่วไปได้ดีที่สุด
(ยิ่ง sample rate สูง ความละเอียดของการคำนวณก็จะดีขึ้น
สามารถสร้างเสียงที่ เนียน ได้มากขึ้น)


หลังจากเซ็ตเรียบร้อยแล้ว (ถ้าใช้คอม บ้านๆ ธรรมดา เป็นไปได้ว่า ไม่จำเป็นต้องเซ็ตอะไรเลย)
กด OK ได้เลย!

งั้น ไหนๆก็จะมาเริ่มแล้ว รีรออะไรอยู่เล่า? มาเปิดการทำงานของ Virtual Machine เลยดีกว่า!
โดยการกดในหน้าต่าง Virtual Machine ที่ปุ่ม Start Virtual Machine
(สามารถทำการปิดได้โดยกดที่ปุ่มเดิ่ม = Stop Virtual Machine: แต่ความสามารถนี้เป็นไปได้ว่า ยังไม่มีใน Windows, ถ้าจะปิดใน Windows ก็อาศัยการปิดโปรแกรม miniAudicle ที่หน้าต่าง miniAudicle ไปเลยแล้วกัน)


ถ้าการติดต่อกับ Soundcard สามารถเป็นไปอย่างราบรื่น
ก็จะขึ้นข้อความประมาณข้างบนนี้ ก็คือ ติดต่อได้สำเร็จอย่างไร ได้ Sample Rate เท่าไหร่ มีกี่ input, output อะไรทำนองนั้น..

แล้วตอนนี้แหละ เราก็จะสามารถเริ่มเขียนโปรแกรมภาษา ChucK แล้วลองรันดู
เพื่อความตื่นเต้น ก็จะขอแสดงให้ดูให้เห็นๆไปเลยว่า นี่มันเป็นโปรแกรมด้านเสียง
ก็มาลองฟังเสียงกันเลยดีกว่า!


เริ่มต้นจากการพิมพ์ในหน้า miniAudicle ที่ไฟล์ว่างๆที่เรามี (unnamed1)
ลองพิมพ์ข้อความตามนี้ลงไปเลยครับ

// connect SinOsc to dac
SinOsc s => dac;
// wait for 1 second
second => now;
เสร็จแล้ว ก็ลองมองดูในหน้า miniAudicle
จะเห็นเครื่องหมาย + เขียนไว้ว่า Add Shred (เพิ่ม เชร็ด?)
เอาเป็นว่า ลองกดกันเลย!

ถ้าสำเร็จ ใน Console Monitor จะขึ้นว่า
[chuck](VM): sporking incoming shred: 1 (unnamed1)...

อ๊ะ... เปิดลำโพงอยู่หรือเปล่า ได้ยินเสียงอะไรกัน
(ถ้าไม่สำเร็จ ลองเช็คดูนะครับว่าเขียนถูกต้องไหม เช่น // มีสองตัว, ปิดท้ายประโยคที่บอกด้วย ; เช็คตัวเล็กตัวใหญ่)
เสียงที่ว่านี่ คือเสียงของคลื่นเสียงชนิดไซน์ (Sine Wave) ลักษณะเสียงก็คือ กลม เป็นเสียงที่ถือเป็นองค์ประกอบสำคัญของเสียงต่างๆทั่วไป
ถ้าสังเกตดู (ลองกด Add Shred ฟังดูหลายๆทีก็ได้ ฮ่าๆ)
มันมีความยาว 1 วินาทีพอดี

เราจะลองมาแปลภาษา ChucK ที่พวกเราเพิ่งเขียนกันไปเมื่อกี๊
ด้วยความรู้อันน้อยนิด แต่ด้วยภาษาของเขาออกแบบมาง่ายสำหรับการเข้าใจ
ทำให้เข้าใจง่ายมาก

เครื่องหมาย // เป็นเหมือนกับ comment หรือ remark
เอาไว้เขียนอะไรก็ได้ สิ่งที่อยู่หลัง // นั้น เรามีอิสระที่จะเขียนอะไรก็ได้
เช่น เตือนความจำ หรือเขียนอธิบายส่วนต่างๆของโปรแกรม

เรามาดู สิ่งที่เป็นดาราในวันนี้กัน ก็คือเครื่องหมาย
=> นี่แหละ
มองเครื่องหมายนี้ ผ่านๆ อาจจะเหมือนกับรูปร่างของอะไรซักอย่าง
แถมยังตั้งชื่อภาษาว่า ชัก อีกซะนี่

ความหมายง่ายๆของมันก็คือ "ต่อสาย" หรือ "ส่งไปให้"

คราวนี้มาทำความรู้จักศัพท์อีกคำ คือคำว่า dac (Digital-to-Analog Converter)
ความหมายง่ายๆของมันก็คือ เครื่องที่เปลี่ยนจากสัญญาณดิจิตอล ที่คอมพิวเตอร์คำนวณออกมา เป็นสัญญาณไฟฟ้า เราเอาสัญญาณนี้มาต่อออกลำโพง ทำให้เกิด เสียงให้เราได้ฟังกัน
พูดง่ายๆ ก็เหมือนกับการต่อลำโพงนี่แหละ

SinOsc s => dac;
งั้นอันนี้แปลว่าอย่างนี้แล้วกัน: เอา เครื่องกำเนิดสัญญาณ Sine (Sine Wave Oscillator - ไซน์ เวฟ ออสซิลเลเตอร์) ที่ชื่อ s มาต่อเสียงออกลำโพง

จะขอเรียกว่า เอา Sine Wave Oscillator ชื่อ s มาชักใส่ ลำโพง ละกัน
หลังจากนี้ => นี่ผมจะเรียกว่า ชักใส่ ล่ะนะ

พอต่อสายแล้ว มันก็ไม่ได้เกิดอะไรขึ้น
ถ้าเราอยากฟังว่าผลของการต่อสายนั้นเป็นอย่างไร
ก็ต้อง "ปล่อยให้เวลาผ่านไป"

งั้นมารู้จักคำอีกคำกัน ก็คือคำว่า now
now เป็นวัตถุเกี่ยวกับ เวลา ที่สำคัญใน ChucK
คือ now มันเป็นเหมือนเวลาในปัจจุบัน และ มันก็เดินไปได้เรื่อยๆ
การที่เราเอา ระยะเวลา (duration) ไปชักใส่ now (ปัจจุบัน)
ความหมายง่ายๆของมันก็คือ ให้ "รอ" ในระยะเวลานั้นๆ

ถ้าเราลองเปลี่ยนจากคำว่า second เป็นอื่นๆเช่น
ms หรือ minute หรือ hour หรือ day หรือ week ก็จะเห็นว่า มันเล่นเสียงนั้น ยาว ตามเวลาที่กำหนด
ms หมายถึง millisecond หรือ เศษ 1 ส่วน 1,000 ของวินาที นี่เอง
minute ก็คือ นาที
day ก็คือ วัน
week ก็คือ อาทิตย์
เอ่อ.. แต่ผมว่า ถ้ารอฟังเสียงนี่ยาวซัก วันหนึ่ง
ผมก็ยอมรับในความอดทนนะ ฮ่าๆๆ


พอเห็นความสามารถในการสร้างเสียงสดๆ ของ ChucK แล้ว
ลองมาดูความสามารถอีกด้านบ้าง ก็คือ การแสดงค่า และการคำนวณค่า

การพิมพ์ค่าใดๆ ออกมานั้น
เราสามารถเขียนง่ายๆเป็นภาษาชัก ด้วยเครื่องหมาย เปิดปิดดังนี้ <<< >>>
สิ่งที่อยู่ตรงกลางของเครื่องหมายนี้ ก็จะถูกพิมพ์ออกมา
โดยมีลักษณะดังนี้:
ถ้าสิ่งที่อยู่ตรงกลาง มีสิ่งเดียว มันจะพิมพ์ออกมาให้ด้วยว่า สิ่งนั้น เป็นข้อมูล ชนิดใด
แต่ถ้ามีหลายสิ่งให้พิมพ์ (คั่นด้วยเครื่องหมาย คอมม่า คือ , นี่แหละ) มันจะพิมพ์ต่อกันให้

ลองใส่ประโยคเหล่านี้เข้าไปที่พื้นที่สำหรับพิมพ์โค้ดชักนี่แหละครับ
<<< 1 >>>;
<<< 0.1 >>>;
<<< second >>>;
<<< hour / minute >>>;
<<< "Hello, World!" >>>;
<<< "There are", week / second, "seconds in one week!" >>>;
<<< "You have started VM for", now / minute, "minutes." >>>;
<<< 3 * 4 + 5 * 6 >>>;
<<< pi * 2 >>>;

พิมพ์โค้ดตามนี้แล้ว เมื่อกด Add Shred ผมได้ผลออกมาตามนี้ (ดูใน Console Monitor กัน)
1 :(int)
0.100000 :(float)
44100.000000 :(dur)
60.000000 :(float)
"Hello, World!" : (string)
There are 604800.000000 seconds in one week!
You have started VM for 32.011852 minutes.
42 :(int)
6.283185 :(float)

จะเห็นว่า แค่นี้เราก็เริ่มรู้จักแล้วว่า ในชักนี่ มีชนิดของค่าต่างๆ หลายๆแบบ
ไม่ว่าจะเป็น int (integer คือ จำนวนเต็ม), float (คือเลขที่มีทศนิยม), dur (duration คือ ระยะเวลา), string (ข้อความ)

และแถมยังมีการนำมาคำนวณคิดเลขกันได้ เช่น บวก + คูณ * หาร /
เวลาที่เราอยากจะให้เครื่องแสดงอะไรออกมา ก็ใช้วิธีการนี้ ในการสั่งนี่เอง

เป็นอย่างไรครับ กับการเริ่มต้น? วันนี้ประมาณนี้ก่อนแล้วกันนะ เช้าแล้ว ผมไปนอนก่อนล่ะ ฮ่าๆๆ

- kij



คราวที่แล้ว ได้ทดลองการต่อ 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 นี่ล่ะครับ



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