درس Strudel الأول: أول لوب لك
كل لحن في Shawarma هو كود Strudel: لغة تسوّي فيها موسيقى بكتابة أنماط قصيرة. تكتب سطر، يشتغل في لوب، وتغيّره وهو شغّال. هذا الدرس يمشي معك من صوت طبل واحد إلى لحن قصير فيه طبول وباص وكوردات. كل مثال هنا يشتغل في Shawarma مثل ما هو.
الدورات: كيف يحسب الكود الوقت
الموسيقى مبنية من دورات. الدورة لفّة وحدة من اللوب، والنمط يملأ دورة وحدة إلا إذا قلت له غير كذا. الدورة تطول ثانيتين بشكل افتراضي. إذا عددت أربع ضربات في الدورة، يصير عندك 120 ضربة في الدقيقة (BPM).
هذي الفكرة الوحيدة اللي لازم تمسكها: كل ما زادت الخطوات في النمط، قصرت كل خطوة، لأنها كلها تتقاسم نفس الدورة.
أول لوب لك
s تشغّل الأصوات بأسمائها. bd طبل باص (كيك) و sd سنير:
s("bd sd")زِد خطوات وتصير أقصر. hh هاي هات مقفول:
s("bd hh sd hh")النص اللي بين علامات التنصيص اسمه mini-notation (الترميز المصغّر). هو لغة صغيرة للإيقاع، وأغلب الموسيقى تصير داخل هذي العلامات.
السكتات والتكرار والمجموعات
~ سكتة: الخطوة موجودة بس ساكتة.
s("bd ~ sd ~")* تكرر الخطوة داخل مساحتها. bd*2 تشغّل كيكين مكان الكيك الواحد:
s("bd*2 sd bd sd")الأقواس المربعة تضغط كذا خطوة في خطوة وحدة. هنا الخطوة الثانية والرابعة انقسمت كل وحدة إلى قسمين. oh هاي هات مفتوح:
s("bd [sd sd] hh [hh oh]")الأقواس الزاوية تشغّل عنصر واحد في كل دورة، بالدور. هذا يشغّل سنير في الدورة الأولى وتصفيقة (cp) في اللي بعدها:
s("bd <sd cp> bd <sd [cp cp]>")الطبقات
الفاصلة داخل علامات التنصيص تشغّل الأنماط مع بعض في نفس الوقت. ثلاث طبقات: كيك على كل ضربة، هاي هات بين الضربات، وسنير على الضربة الثانية والرابعة.
s("bd*4, [~ hh]*4, ~ sd ~ sd")نفس الشي بـ stack، اللي تخلّي كل طبقة في سطرها. أسهل في القراءة لما تطول الطبقات، وتقدر تعطي كل وحدة مؤثراتها الخاصة.
stack(
s("bd*4"),
s("[~ hh]*4"),
s("~ sd ~ sd"),
)النوتات والكوردات
note تشغّل النوتات. اكتب اسم النوتة، وبعدها # أو b إذا تبغى، ثم الأوكتاف: c4 هي دو الوسطى، و c3 الدو اللي تحتها. .s("piano") تختار الآلة؛ بدونها تسمع سينث بسيط بموجة مثلثية.
note("c3 e3 g3 b3") .s("piano")الأرقام تشتغل بعد. هي أرقام نوتات MIDI، و 60 هو دو الوسطى:
note("48 52 55 59") .s("piano")حط النوتات داخل أقواس وبينها فواصل عشان تعزف كورد. وداخل الأقواس الزاوية، يجيك كورد واحد في كل دورة:
note("<[c3,e3,g3] [a2,c3,e3] [f2,a2,c3] [g2,b2,d3]>") .s("piano")السلالم
مع n و scale تكتب درجات السلّم بدل أسماء النوتات. 0 أول نوتة في السلّم، و 2 الثالثة، و 4 الخامسة. أي درجة تبقى داخل السلّم، فصعب تعزف نوتة غلط.
n("0 2 4 <6 7>") .scale("C4:minor") .s("piano")اسم السلّم يجي بعد النوتة الأساسية والأوكتاف وبعد نقطتين: C4:major، A3:minor، D4:dorian، E3:phrygian، G4:pentatonic.
اختيار الأصوات
فيه كم سينث جاهز: sawtooth و square و triangle و sine. هذا يشغّل نفس خط الباص على كل واحد منها بالدور:
note("c2 c3 eb2 g2") .s("<sawtooth square triangle sine>")الآلات اللي اسمها gm_… تسجيلات General MIDI: جيتارات، وتريات، أورغن، نحاسيات وغيرها (الدليل المختصر يذكر بعضها).
note("d4 f4 a4 c5") .s("gm_acoustic_guitar_nylon")أغلب أصوات الطبول لها كذا تسجيل. الرقم بعد النقطتين يختار واحد منها، والعدّ يبدأ من 0:
s("hh hh:1 hh:2 hh:1")السرعة
setcpm تضبط السرعة بعدد الدورات في الدقيقة. مع أربع ضربات في الدورة، اقسم الـ BPM اللي تبغاه على 4. تقدر تكتب العملية وتخلّي الكود يحسبها:
setcpm(124/4) // 124 BPM, four beats to a cycle
s("bd*4, [~ hh]*4")المؤثرات
الدوال اللي بعد النقطة تغيّر صوت النمط، وتقدر تسلسل منها قد ما تبغى. lpf فلتر يقص الحدّة (كل ما صغر الرقم صار الصوت أغمق)، و gain مستوى الصوت، و room صدى القاعة (ريفيرب).
note("c2 c2 eb2 g1") .s("sawtooth")
.lpf(600)
.gain(.6)
.room(.4)المؤثر يقدر ياخذ نمط بعد. هنا الهاي هات ياخذ نمط مستوى صوت: عالي، واطي، متوسط، واطي، يتكرر مرتين في الدورة، وهذا يخلّي صف الهاي هات المستقيم يتمايل:
s("hh*8") .gain("[.9 .4 .6 .4]*2")الحركة والتغيير
sine قيمة تطلع وتنزل بنعومة. range تحدد قد إيش تتحرك، و slow(8) تخلّي الحركة الوحدة تاخذ ثمان دورات. لما تستخدمها على الفلتر، تفتح الصوت وتقفله مع الوقت:
note("c2*8") .s("sawtooth") .lpf(sine .range(300, 2000) .slow(8))lastOf تغيّر كل دورة رابعة (أو أي رقم تعطيها)، وهذي طريقة سريعة تجيب فيها «فِل» في آخر الجملة:
s("bd ~ sd ~") .lastOf(4, x => x .fast(2))نجمعها مع بعض
سمِّ كل جزء بـ const، وبعدين حطها فوق بعض. كذا مرتبة أغلب الألحان في Shawarma، عشان تلقى الجزء وتغيّره.
setcpm(30) // 120 BPM
const drums = s("bd*4, [~ cp]*2, [~ hh]*4") .gain(.8)
const bass = note("<[c2*4] [a1*4] [f1*4] [g1*4]>") .s("sawtooth") .lpf(600) .gain(.5)
const keys = note("<[c4,e4,g4] [c4,e4,a4] [c4,f4,a4] [b3,d4,g4]>")
.s("piano") .struct("~ x ~ x") .gain(.5)
stack(drums, bass, keys)من هنا، جرّب تغيّر شي واحد كل مرة: نوتة في الباص، الرقم في lpf، خطوة في الطبول. دليل أنماط الطبول يتعمق أكثر في الإيقاع، و الألحان النموذجية تعرض قطع أطول فيها مقدمة ومقاطع مبنية بـ arrange.
جرّبه في Shawarma
Shawarma محرر موسيقى كل لحن فيه كود. لحنك يشتغل ويعيد نفسه؛ اطلب من المساعد تغيير بكلام عادي، اسمعه، واحتفظ فيه بس إذا عجبك. أو عدّل الكود بنفسك، مثل ما في هذا الدليل. المحرر مجاني، مع 5 ردود من المساعد للتجربة؛ وPro يبدأ بـ7 أيام مجانًا.