$ chuck 1. Simple Sine Wave.ck
Chuck لديه مجموعة من unitgenerators التي تحدث ضوضاء. يسمى أول وحدة يوحنا نستكشفها Sinosc. هذه موجة جيبية بسيطة تنبعث منها تردد أساسي واحد عند 440 هيرتز في نصف حجم. يتم "Sinosc" إلى كائن DAC باستخدام عامل التشغيل =>. كائن DAC أو محول الصوت الرقمي هو اتصال الكمبيوتر بمكبرات الصوت الخارجية أو بطاقة الصوت. فكر في المشغل => ككابل تصحيح أو توصيل يربط الإخراج الصوتي للموجة الجانبية في السماعة.
SinOsc s => dac;
s.gain(0.5);
s.freq(440);
هذا الرمز وحده لن ينتج الصوت. لإنتاج الصوت ، علينا أن نقول للبرنامج كم من الوقت سيستمر الصوت. يطبق Chuck وحدات الوقت على الكائن الآن. يمثل الآن الوقت الحالي بالإضافة إلى الوقت الإضافي "الذي تم صقله" حتى الآن. في هذا المثال ، نريد فقط معالجة الصوت لثانية واحدة. لذلك نحن "تشاك" 1 ثانية حتى الآن.
1::second => now;
يولد تشغيل البرنامج الكامل لهجة سلسة عند 440 هرتز ، نصف الصوت ، لمدة ثانية واحدة. حاول اللعب مع الإعدادات. قم بتغيير النغمة أو الصوت أو التوقيت لإنشاء اختلافات جديدة من الصوت. راجع وثائق تشاك وقم بتغيير الموجة الجيبية إلى منشور أو موجة مربعة. كيف تختلف هذه الأصوات؟
دعنا نصنع بعض الموسيقى الآن! لهذا الدرس ، سنأخذ نموذج الأساسيات الأساسية الفصل 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;
قم بتشغيل البرنامج عدة مرات ومعرفة ما إذا كان يمكنك تغيير التسلسل إلى تسلسل تفضله. هل يمكنك تكرار إحدى أغانيك المفضلة؟ كيف يمكنك تحويل هيرتز إلى الملاحظات الموسيقية؟ هل تسلسل الموسيقى مثل هذا يشعر بالحرج؟ ما الذي سيجعل هذا أسهل؟
في الفصل 2 ، أنشأنا بنجاح أول لحن لدينا. لم يكن هذا إنجازًا صغيرًا! أجهزة الكمبيوتر جيدة جدًا في اتخاذ الإجراءات بناءً على سلسلة من التعليمات. بالنظر إلى ما نعرفه بالفعل ، يمكن إعادة إنتاج أي لحن أو أغنية بالملاحظة عبر النسخ واللصق. بعد فترة من الوقت ، يصبح إنشاء الموسيقى بهذه الطريقة مملة وغير ملهمة. يجب أن يكون هناك طريقة أسهل.
غالبًا ما تتكرر الألحان الموسيقية عدة مرات على أغنية في ما يعرف باسم العبارة. العبارات هي الحلقات بشكل أساسي. حلقات طبقة الموسيقى الإلكترونية والهيب هوب لإنشاء قوام polyrhythmic حيث تتفاعل الحلقات واللعب مع بعضها البعض. لحسن الحظ بالنسبة لنا ، هناك بنية تحكم مثالية في البرمجة لتكرار هذا السلوك - حلقة بينما.
بدلاً من نسخ كل ملاحظة ولصقها ، يمكن تكرار التعليمات لإنشاء عبارات موسيقية. في Chuck ، يتم إنشاء حلقة بينما الكلمة الرئيسية والأساسيات المجعدة لاحتواء تسلسل الإرشادات التي سيتم تكرارها. في هذا المثال ، سنكرر التعليمات بلا حدود أو حتى يتم إنهاء البرنامج.
// Loop Repeats while true is true (aka forever!)
while(true) {
//instructions go here
}
عادة لن نكتب برامج الكمبيوتر مع حلقات لا حصر لها! هذا شيء يتم تجنبه عادة في البرمجة لأنه سيعلق البرنامج ومنع البرنامج من تنفيذ أجزاء أخرى أو الكود وسيتم تشغيله إلى الأبد. في Chuck ، كما سنكتشف قريبًا ، هناك طرق لإنهاء البرامج وبدء تشغيلها. في الموسيقى ، قد نرغب في الارتجال والسماح لحلقة لا حصر لها بناء الأخدود على مدى فترة من الزمن.
لجعل الحلقة أكثر إثارة للاهتمام ، سنقدم مكتبتين جديدتين - الأمراض المنقولة جنسياً والرياضيات. STD تعني المكتبة القياسية وهي مجموعة من أساليب المنفعة المفيدة التي يمكن استخدامها في برامجنا. تتميز STD بطريقة تسمى "MTOF" أو "MIDI إلى التردد". في موسيقى الكمبيوتر ، يتم تمثيل مقياس 12 ملاحظة على البيانو كملاعب تصاعدية بين 0 - 127. الأوكتاف هو 12 ملاحظة وهناك 10 أوكتافات متوفرة. يتم تمثيل Middle C On The Piano في 60 عامًا. لا تقلق إذا لم تقتصر على أي معرفة موسيقية! إن استخدام أي من القيم بين 0 - 127 سيعطينا تلقائيًا ضبطًا غربيًا قياسيًا. من المؤكد أن ملاحظات MIDI أسهل كثيرًا في العمل والعقل.
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 على لوحة المفاتيح عندما تكون قد سمعت بما فيه الكفاية!
قريباً!
قريباً!
قريباً!
قريباً!