همام البهنسي

عن تطوير الألعاب... وبعض من الرياضيات والموسيقى

برمجة شرقية

أعود في هذه المدونة للحديث عن الموسيقى من خلال مشروع لطيف أحاول فيه برمجة كمبيوتر صخر (MSX) ليتمكن من عزف مقام شرقي.

بدأت فكرة المشروع عندما كنت أجرب بعض البرامج الموسيقية على جهاز صخر الحبيب الذي ما زال قادر على مفاجأتي بعد أكثر من ثلاثين سنة.

لا ينحصر تميز الجهاز موسيقياً فقط بالبرامج أو الإضافات كمحولات الـ MIDI والأورجات،... الخ ولكن هناك إصدار خاص من الجهاز موجه لمحترفي الموسيقى في فترة الثمانينات. هذا إعلان لجهاز MSX CX05 من شركة ياماها المتخصص في الموسيقى.

كما هو متوقع، جُل هذه الإمكانيات موجهة للموسيقى الغربية، لذلك كانت فكرة جعل الجهاز قادر على عزف مقام شرقي مغامرة برمجية تستحق المحاولة.

لتبسيط المشروع، سأحاول تنفيذه على البيسك ولكن قد نضطر للانتقال للـ Assembly إن استدعى الأمر.

كما يعلم البعض، البيسك يقدم تعليمة PLAY لعزف نغمات موسيقية من خلال طريقة شاعت في تلك الفترة وتحديداً على الأجهزة اليابانية تعرف بـ (Music Macro Language - MML) وهي طريقة مثيرة للاهتمام لأنها تسمح في التعامل مع العلامات بمسمياتها الموسيقية (...#A B C C) دون الحاجة للتعاطي مع قيم رقمية مبهمة، وأيضاً في نفس الوقت تسمح بإمكانية توليد مقطوعات برمجياً، لذلك شاعت هذه الطريقة في كتابة موسيقى بعض الألعاب في تلك الفترة. بالطبع لا أتوقع أن تقدم الـ MML دعم لسلم شرقي ذي ربع بعد. وللأسف لم أجد طريقة سهلة لإعادة تعريف أحد علامات السلم الغربي كربع بعد كما هو متبع في بعض الأورجات الشرقية. (أرجوا أن تشاركوني اقتراحاتكم إن كان هناك طريقة أسهل).

ما وجدته بعد البحث هو أمر آخر في البيسك SOUND يسمح بتعريف صوت أو نغمة من خلال التردد إضافة لعدد من الخيارات الأخرى. الملاحظ أن الأمر SOUND يعمل بشكل مشابه للأسمبلي، فهو يتيح التعامل مع سجلات registers الخاصة بذاكرة معالج الصوت (Programmable Sound Generator - PSG). بناء على وثائق البيسك، تردد النغمة يتم تحديده بشكل غير مباشر من خلال معادلة رياضية بسيطة تأخذ بعين الاعتبار تردد المعالج.

القيمة المطلوبة = تردد المعالج / (16 * تردد النغمة)

في حال الصخر تردد المعالج هو 1789772.5 Hz وتردد النغمة يمكن أن يأخذ أي قيمة بين 27 و 111960 Hz.

الخطة التي اتبعتها لتوفير الوقت والجهد، هي أخذ الترددات المحسوبة للسلم الغربي من الجدول المذكور في الوثائق، ثم محاولة تعديل أحدها ليصبح ربع علامة واستخدامه لعزف مقام شرقي. في هذا المشروع اخترت مقام الصبا، بالطبع نفس الأسلوب يمكن تطبيقه مع أي مقام آخر.

سلم المقام ابتداء من المفتاح دو (C) هو: C,C*,D#,E,G,G#,A#,B

انطلاقاً من الجدول، قيم البتات (ست عشرية) للعلامات هي 1AC,??,168,153,11D,10D,0F0,0E3 الآن نحن بحاجة حساب فقط العلامة C* ذات الربع بعد. والتي وجدت قيمتها (الست عشرية): 186 من خلال حسابها وبعض التجريب.

إليكم سرد لكود البيسك مع توثيق معظم الأوامر والخطوات الهامة لتوضيح سير البرنامج.

10 GOSUB 150 ' Reset PSG
20 ' Define frequency high and low bits data
30 DATA &HAC,&H86,&H68,&H53,&H1D,&H0D,&HF0,&HE3
40 DATA 1,1,1,1,1,1,0,0
50 ' Read data and store it in arrays
60 DIM CH(8),CL(8)
70 FOR I=0 TO 7:READ CH(I):NEXT I
80 FOR J=0 TO 7:READ CL(J):NEXT J
90 ' Play the scale up then down
100 FOR S=0 TO 7:GOSUB 200:NEXT S
110 FOR S=6 TO 0 STEP -1:GOSUB 200:NEXT S
120 GOSUB 150 ' Reset PSG
130 END
140 ' Reset PSG routine
150 FOR R=0 TO 13
160 IF R=7 THEN SOUND R,&B10111111 ELSE SOUND R,0
170 NEXT R
180 RETURN
190 ' Play note based on data in S
200 SOUND 0,CH(S):SOUND 1,CL(S) ' Frequency low and high bits
210 SOUND 8,&B1100 ' Channel A Volume
220 SOUND 7,&B10111110 ' Mixer settings
230 FOR D=0 TO 150 : NEXT D ' Note time
240 RETURN

هذا كل ما أنجزته في المشروع لحد الآن، أرجوا أن يكون قد امتعكم كما امتعني. وإلى لقاء قريب إن شاء الله...

أضف تعليقاً

Loading