نلعب موسيقى من ماريو على مكبر الصوت

ماريو  ملاحظات

مقدمة


مرحبا بالعالم!

بالفعل منذ حوالي 3 سنوات أريد أن أكتب شيئًا عن هبر ، ولكن لم يكن هناك أي موضوع يمكن نشر مشاركة فيه. كان ذلك حتى احتجت إلى معرفة القليل عن عمل مؤقت النظام ومكبر النظام للعمل المختبري. بعد أن جلست قليلاً على الإنترنت ، لم أجد شيئًا عمليًا: شيء ما مكتوب بلغة معقدة للغاية ، شيء ما ليس له معنى بشكل خاص. لقد حصلت على كتاب جيد طوال الليل وحاولت لعب الموضوع المعروف من لعبة Mario. الاستمرار تحت الخفض ، يبدو أنه لديك هنا.

تنصل


الرمز مكتوب كما هو مكتوب. المؤلف ليس عبقريًا في البرمجة ، ولكنه مجرد طالب ، ولكن مع ذلك ، حاول كتابة الشفرة الأكثر قراءة ومفهومة. تم كتابة كل شيء في Borland C وتم اختباره في DOSBox فقط لأنه لا يوجد دوس محدد ولا أريد حقاً أن أخفق مع ساعة الوقت الحقيقي.

مرة أخرى في عام 2012Loiqig كتب بالفعل نسخة أكثر برودة ، ولكن ، كما بدا لي ، لم يلقِ اهتمامًا كبيرًا بالنظرية.

أيضًا ، المؤلف (أي أنا) لديه 4 سنوات من التعليم الموسيقي وكان ضعيفًا في solfeggio (التدوين الموسيقي).

جزء من النظرية


منذ فترة طويلة ، عندما كان معالج Intel 8086 شائعًا ، ولم يثير IBM PC أي أسئلة ، تم استخدام Intel 8253 في نفس أجهزة الكمبيوتر الشخصية IBM وأجهزة الكمبيوتر المتوافقة - جهاز توقيت وعداد فاصل. في أجهزة الكمبيوتر الحديثة ، يتعامل الجسر الجنوبي مع هذا ( المصدر: ويكيبيديا ).

نموذج منطقي Intel 8253 PIT:

الرسم البياني المنطقي لإنتل 8253. الشكل.  1

الرسم البياني المنطقي لإنتل 8253. الشكل.  2

كما ترى في الصورة أعلاه ، الموقت متصل بخط IRQ0. يولد 8h مقاطعة 18.2 مرة في الثانية.

يتكون المؤقت من 3 عدادات (COUNTER0-2) ، تعمل بشكل مستقل عن بعضها البعض.

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

تحتوي كل قناة على 6 أوضاع تشغيل:

  • الوضع 0 - انقطاع الحساب الطرفي
  • الوضع 1 - جهاز الاستعداد المتعدد القابل للبرمجة
  • الوضع 2 - مولد تردد النبض
  • الوضع 3 - مولد التعرج
  • الوضع 4 - ستروب من البرامج
  • الوضع 5 - ستروب القائم على الأجهزة

دعونا ننكب على العمل


لذلك ، تعلمنا القليل من النظرية حول موقت النظام ، علمنا أن القناة الثالثة متصلة بمكبر الصوت النظام. يبدو أن كل شيء رائع. فقط كيفية استخدام هذا للعب موضوع من ماريو؟ ليس من الواضح بعد.

تتم برمجة كل عداد (قناة) بشكل منفصل. لقد قررنا بالفعل أنك بحاجة إلى استخدام الثالث. كما ترى في الصورة أعلاه ، فإن السماعة متصلة بمخرج OUT. في نفس الوقت ، إنه متصل بالمنفذ 61h ، والذي يمكننا من خلاله التحكم في مكبر الصوت. يتم توصيل البت الأول (الأقل أهمية) بإدخال Gate2 ويحدد ما إذا كان العداد يعمل أم لا. يبدأ البت الثاني مكبر الصوت.

استنادًا إلى هذه النظرية ، تصبح مقدمة العمل لتشغيل الصوت واضحة:

  • نقوم ببرمجة CLOCK2 على التردد الذي نحتاجه (المزيد عن ذلك لاحقًا)
  • استخدم أول بتين من 61 ساعة لتشغيل السماعة

نظرًا لأن مكبر الصوت الافتراضي للنظام يمكنه تشغيل أصوات ذات صوت واحد فقط (حسنًا ، كما كان الحال في الهواتف القديمة التي تعمل بأزرار الضغط ، حيث تم تشغيل ذراع التطويل) ، نحتاج إلى الحصول على تردد كل نغمة.

جدول نسب الملاحظات والترددات


, / , / 2.

لتعيين التردد المطلوب للعداد الخاص بنا ، تحتاج إلى استخدام صيغة معينة: 1193182 / N Hz ، حيث 1193182 هو تردد المؤقت (1.193182 ميغاهرتز إذا كان صحيحًا) ، N هو تردد الملاحظة التي قررت إخراجها إلى السماعة.

//   
// _freq —  
// _dur —  
// _del —    
void play_sound(int _freq, int _dur, int _del)
{
	outp(0x43, 0xb6); //     2 ()

	int timer_soundFreq = TIMER_FREQUENCY/_freq; //    
                                                    //.
                                                   // TIMER_FREQUENCY = 1193182

	//     
	outp(0x42, timer_delay & 0x00ff); //   
	outp(0x42, (timer_delay & 0xff00) >> 8); //  


	outp(0x61, inp(0x61) | 3); //  


	delay(_dur); //  ,     ,
		    //   

	outp(0x61, inp(0x61) & 0xfc); //  

	delay(_del); //     
}

الوظيفة الرئيسية بسيطة للغاية ، وبصراحة ، تم تحسينها بشكل سيئ ، لكنها لا تغير جوهر المسألة.

int main(int argc, char const *argv[])
{
	for (size_t i = 0; i < N; ++i) // N —  ,  
	{
		play_sound(FREQUENCY[i], DURATION[i], DELAY[i]);
	}
	return 0;
}

فماذا عن ماريو لدينا؟


تعلمنا العزف على الأصوات من خلال ديناميكيات النظام. غرامة! لكن كيف نلحن لحن من ماريو؟

باستخدام سحر googling نجد الملاحظات:

نغمات الموسيقى ورقة من ماريو
.

بعد ذلك ، سيتعين عليك تذكر مسار التدوين الموسيقي وكتابة كل ملاحظة:

الملاحظات المكتوبة وأبعادها:
2 — 1/4
2 — 1/4
2 — 1/8
2 — 1/8
2 — 1/4

2 — 1/4
— 1/4

2 — 1/4
— 1/4
— 1/4

— 1/4
— 1/4
() — 1/8
— 1/4

— 1/4
2 — 1/4
2 — 1/4
2 — 1/4
2 — 1/8
2 --1/8

2 — 1/4
2 — 1/8
2 — 1/8
— 1/8

2 — 1/4
()2 — 1/4
()2 — 1/8
()2 — 1/4
()2 — 1/8

() — 1/4
() — 1/4
2 — 1/4
— 1/4
2 — 1/4
2 — 1/4

2 — 1/4
()2 — 1/4
()2 — 1/8
2 — 1/4
2 — 1/4

3 — 1/4
3 — 1/8
3 — 1/4

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

مسلحين بصبر أكبر ، نقوم بترجمة كل ملاحظة إلى ترددات وجمع صفائف من الترددات والمدد:

// Mario -- 43
int FREQUENCY[] = {659.255, 659.255, 659.255, 523.251, 659.255, 783.991, 391.995, 523.251, 391.995, 329.628, 440, 493.883, 466.164, 440, 391.995, 659.255, 783.991, 880, 698.456, 783.991, 659.255, 523.251, 587.33, 987.767, 783.991, 680.255, 698.456, 622.254, 680.255, 415.305, 466.164, 523.251, 440, 523.251, 587.33, 783.991, 739.989, 729.989, 587.33, 659.255, 1046.502, 1046.502, 1046.502};

int DURATION[] = {300, 300, 160, 160, 300, 300, 300, 300, 300, 300, 300, 300, 160, 300, 300, 300, 300, 300, 160, 160, 300, 160, 160, 160, 300, 300, 160, 300, 160, 300, 300, 300, 300, 300, 300, 300, 300, 160, 300, 300, 300, 160, 300};

int DELAY[] = {35, 35, 50, 35, 35, 350, 200, 35, 35, 200, 35, 35, 35, 200, 35, 35, 35, 35, 35, 200, 35, 35, 35, 35, 35, 35, 35, 35, 200, 35, 35, 35, 35, 35, 200, 35, 35, 35, 35, 200, 35, 35, 0};

في هذا اللحن ، أحصيت 43 ملاحظة. ومن الجدير بالذكر أيضًا أنني اخترت التأخير بين نوتتين متجاورتين عن طريق الأذن. اتضح أبطأ قليلا مما كان عليه في الأصل.

استنتاج


في الختام ، أود أن أقول إن العمل مع الأجهزة أحيانًا يكون أكثر إثارة للاهتمام من كتابة مجموعة من التعليمات البرمجية عالية المستوى.

إذا أراد شخص ما فجأة تحسين اللحن أو كتابة شيء خاص به ، فأنت مدعو للتعليق.

ملاحظة


إذا قررت أنك تريد اللعب على ديناميكيات النظام ولا تعرف أساسيات الترميز الموسيقي ، فيمكنك العثور على تلميحات تحت المفسد.

تلميحات موسيقية
. .
.

All Articles