$ chuck 1. Simple Sine Wave.ck
Chuck มีชุดของ unitgenerators ซึ่งส่งเสียงดัง Unitgenerator แรกที่เราจะสำรวจเรียกว่า Sinosc นี่คือคลื่นไซน์ที่เรียบง่ายที่ปล่อยความถี่พื้นฐานเดียวที่ 440 Hertz ที่ระดับครึ่งปริมาตร Sinosc คือ 'chucked' ไปยังวัตถุ DAC โดยใช้ตัวดำเนินการ => วัตถุ DAC หรือตัวแปลงเสียงดิจิตอลคือการเชื่อมต่อคอมพิวเตอร์กับลำโพงภายนอกหรือการ์ดเสียงของคุณ คิดว่าตัวดำเนินการ => เป็นสายเคเบิลแพทช์หรือปลั๊กที่เชื่อมต่อเอาต์พุตเสียงของ sinewave เข้ากับลำโพง
SinOsc s => dac;
s.gain(0.5);
s.freq(440);
รหัสนี้เพียงอย่างเดียวจะไม่สร้างเสียง ในการสร้างเสียงเราต้องบอกโปรแกรมว่าเสียงจะอยู่ได้นานแค่ไหน Chuck ใช้หน่วยเวลากับวัตถุตอนนี้ ตอนนี้แสดงถึงเวลาปัจจุบันรวมถึงเวลาเพิ่มเติม 'chucked' ถึงตอนนี้ ในตัวอย่างนี้เราต้องการประมวลผลเสียงเป็นเวลาหนึ่งวินาทีเท่านั้น ดังนั้นเรา 'ชัค' 1 วินาทีถึงตอนนี้
1::second => now;
การรันโปรแกรมเต็มรูปแบบสร้างโทนที่ราบรื่นที่ 440Hz, ครึ่งปริมาตรเป็นเวลา 1 วินาที ลองเล่นกับการตั้งค่า เปลี่ยนเสียงปริมาตรหรือเวลาเพื่อสร้างรูปแบบใหม่ของเสียง ปรึกษาเอกสารชัคและเปลี่ยนคลื่นไซน์เป็นคลื่นหรือคลื่นสี่เหลี่ยม เสียงเหล่านี้แตกต่างกันอย่างไร?
มาทำเพลงกันเถอะ! สำหรับบทเรียนนี้เราจะใช้รูปแบบพื้นฐานพื้นฐานบทที่ 1 และจัดเรียงลำดับของโน้ตเพื่อทำท่วงทำนองง่ายๆ
เพลงในรูปแบบพื้นฐานที่สุดคือลำดับของเหตุการณ์เสียงที่เล่นในโทนเสียงระยะเวลาและช่วงเวลาที่แตกต่างกัน ในตัวอย่างนี้เราจะเล่นในช่วงเวลาเดียวกันเป็นระยะเวลา 1/4 วินาที สำหรับแต่ละเหตุการณ์เราจะเล่นน้ำเสียงง่ายๆ
การบรรลุเป้าหมายนี้ไม่ใช่เรื่องยาก สิ่งที่เราต้องทำคือคัดลอกและวางรหัสของเราจากบทที่ 1 และจัดโครงสร้างลำดับ 4 โน้ตของเหตุการณ์โน้ต ณ จุดนี้เราสามารถเปลี่ยนความถี่สำหรับแต่ละเหตุการณ์โน้ตและสร้างรูปแบบของเหตุการณ์ที่เกือบจะฟังดูดี ที่นี่เราเพียงแค่แบ่งโน้ตที่สองเป็นครึ่งหนึ่งคูณโน้ตที่สามด้วย 2 จากนั้นคูณโน้ตสุดท้ายด้วย 2.5
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(440);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(220);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(880);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(1100);
// Process program for a duration of 1/4 second
0.25::second => now;
เรียกใช้โปรแกรมสองสามครั้งและดูว่าคุณสามารถเปลี่ยนลำดับเป็นลำดับที่คุณต้องการได้หรือไม่ คุณสามารถทำซ้ำหนึ่งในเพลงโปรดของคุณได้หรือไม่? คุณจะแปลง Hertz เป็นโน้ตดนตรีได้อย่างไร? การเรียงลำดับเพลงเช่นนี้รู้สึกอึดอัดหรือไม่? อะไรจะทำให้เรื่องนี้ง่ายขึ้น?
ในบทที่ 2 เราสร้างทำนองเพลงแรกของเราได้สำเร็จ นี่ไม่ใช่ความสำเร็จเล็กน้อย! คอมพิวเตอร์ดีมากในการดำเนินการตามลำดับของคำแนะนำ เมื่อพิจารณาจากสิ่งที่เรารู้อยู่แล้วทำนองเพลงหรือเพลงใด ๆ สามารถทำซ้ำโน้ตได้โดยโน้ตผ่านการคัดลอกและวาง หลังจากผ่านไปครู่หนึ่งการสร้างเพลงในลักษณะนี้กลายเป็นเรื่องน่าเบื่อและไม่น่าสนใจ จะต้องมีวิธีที่ง่ายกว่า
ท่วงทำนองทางดนตรีมักจะทำซ้ำหลายครั้งในเพลงในสิ่งที่เรียกว่าวลี วลีเป็นลูปเป็นหลัก เลเยอร์เพลงอิเล็กทรอนิกส์และฮิปฮอปลูปเพื่อสร้างพื้นผิว polyrhythmic ที่ลูปโต้ตอบและเล่นกัน โชคดีสำหรับเรามีโครงสร้างการควบคุมที่สมบูรณ์แบบในการเขียนโปรแกรมเพื่อทำซ้ำพฤติกรรมนี้ - ในขณะที่ลูป
แทนที่จะคัดลอกและวางโน้ตแต่ละรายการคำแนะนำสามารถทำซ้ำเพื่อสร้างวลีดนตรี ในชัคในขณะที่ลูปถูกสร้างขึ้นด้วยคำหลักในขณะที่และวงเล็บหยิกเพื่อให้มีลำดับของคำแนะนำที่จะทำซ้ำ ในตัวอย่างนี้เราจะทำซ้ำคำแนะนำอย่างไม่มีที่สิ้นสุดหรือจนกว่าโปรแกรมจะถูกยกเลิก
// Loop Repeats while true is true (aka forever!)
while(true) {
//instructions go here
}
ตามปกติแล้วเราจะไม่เขียนโปรแกรมคอมพิวเตอร์ที่มีลูปไม่สิ้นสุด! นี่คือสิ่งที่มักจะหลีกเลี่ยงในการเขียนโปรแกรมเพราะมันจะแขวนโปรแกรมและป้องกันไม่ให้โปรแกรมดำเนินการส่วนอื่น ๆ หรือรหัสและจะทำงานตลอดไป ในชัคในขณะที่เราจะค้นพบในไม่ช้ามีวิธีการยกเลิกอัลกอริทึมและเริ่มโปรแกรม ในดนตรีเราอาจต้องการโพล่งออกมาและปล่อยให้วงไม่มีที่สิ้นสุดสร้างร่องในช่วงระยะเวลาหนึ่ง
เพื่อให้การวนรอบน่าสนใจยิ่งขึ้นเราจะแนะนำห้องสมุดใหม่สองแห่งคือ STD และคณิตศาสตร์ STD ย่อมาจากห้องสมุดมาตรฐานและเป็นชุดของวิธีการยูทิลิตี้ที่มีประโยชน์ที่สามารถใช้ในโปรแกรมของเรา STD มีวิธีการที่เรียกว่า 'MTOF' หรือ 'MIDI ถึงความถี่' ในเพลงคอมพิวเตอร์สเกล 12 โน้ตบนเปียโนจะแสดงเป็นสนามจากน้อยไปหามากระหว่าง 0 - 127 อ็อกเทฟคือ 12 โน้ตและมี 10 อ็อกเทฟ Middle C บนเปียโนมีการแสดงที่ 60 อย่ากังวลถ้าคุณไม่มีความรู้ทางดนตรี! การใช้ค่าใด ๆ ระหว่าง 0 - 127 จะให้การปรับแต่งแบบตะวันตกมาตรฐานโดยอัตโนมัติ MIDI Notes นั้นง่ายกว่ามากในการทำงานและเหตุผลเกี่ยวกับ
MTOF เป็นวิธีที่ใช้อินพุตและส่งคืนค่า เราจะป้อนค่า MIDI Note, 60 ตัวอย่างเช่นและ MTOF จะส่งคืนค่าที่สอดคล้องกันใน Hertz เราสามารถสังเกตสิ่งนี้ได้โดยการเขียนโปรแกรมขนาดเล็กที่พิมพ์ผลลัพธ์ของ std.mtof (60) Chuck ใช้สัญลักษณ์ <<< >>> เพื่อพิมพ์ค่าส่งคืนเพื่อการดีบัก
<<< Std.mtof(60) >>>;
261.625565 :(float)
อย่างที่คุณเห็นการแต่งเพลงในเฮิร์ตซ์เริ่มยากขึ้นเมื่อเราพยายามรวมโน้ตดนตรีตะวันตกลงในท่วงทำนองของเรา เพื่อให้สิ่งต่าง ๆ ง่ายยิ่งขึ้นเราจะสร้างโน้ตสุ่มบางส่วนโดยใช้ไลบรารีคณิตศาสตร์ คณิตศาสตร์มีฟังก์ชั่นที่เรียกว่าการสุ่ม 2 ที่ใช้อินพุตของ 2 ตัวเลข ตัวเลข 2 ตัวแสดงช่วงระหว่างตัวเลขแรกและหมายเลขที่สอง
เราสามารถสุ่มอ็อกเทฟบันทึกที่เกิดขึ้นได้ 12 บันทึกโดยการสุ่มระหว่างชุดตัวเลขและการคูณด้วย 12 เมื่อเราแปลงโน้ตเป็นความถี่ Sinosc สามารถใช้ความถี่เป็นอินพุตและสร้างเสียง!
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
การรวมทุกอย่างเข้าด้วยกันเราสามารถห่ออัลกอริทึมของเราไว้ในขณะที่วนรอบ นี่เป็นหนึ่งในข้อดีของการทำงานกับเพลงด้วยรหัส เมื่อเราก้าวหน้าไปสู่โปรแกรมที่ซับซ้อนมากขึ้นเราสามารถเริ่มสร้างเพลงที่สามารถทำได้ด้วยการเขียนโปรแกรมคอมพิวเตอร์เท่านั้น สิ่งนี้เรียกว่าองค์ประกอบอัลกอริทึม
// Sine Wave connected to audio out
SinOsc s => dac;
while(true) {
// Set midi musical note
// with randomly selected octaves
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
// Play for 1/4 of a second
0.25::second => now;
}
ลองเปลี่ยนความเร็วของลำดับ จะเกิดอะไรขึ้นเมื่อคุณเปลี่ยนโน้ต C กลางเป็นโน้ตอื่น? เสียง 12 หรือ 24 บันทึกลงได้อย่างไร? เพลงนี้กลายเป็นดนตรีมากหรือน้อยหรือไม่ถ้าคุณเปลี่ยนค่าหลายค่า? หมดอายุและกด CTRL-C บนแป้นพิมพ์ของคุณเมื่อคุณได้ยินเพียงพอ!
เร็วๆ นี้!
เร็วๆ นี้!
เร็วๆ นี้!
เร็วๆ นี้!