قبل بضع سنوات ، قمت بإعداد منبه على متحكم ATmega8 ، حيث قمت بتنفيذ جهاز لحن بسيط (صوت واحد). هناك العديد من المقالات على الإنترنت للمبتدئين حول هذا الموضوع. كقاعدة عامة ، يتم استخدام جهاز ضبط الوقت 16 بت لإنشاء التردد (الملاحظات) ، الذي تم تكوينه بطريقة معينة ، مما يفرض على مستوى الجهاز لإصدار إشارة في شكل متعرج في دبوس معين من MC. يتم استخدام الموقت الثاني (8 بت) لتنفيذ مدة ملاحظة أو توقف مؤقت. تتم مقارنة الملاحظات وفقًا للصيغ المعروفة جيدًا بالترددات ، وهي بدورها تُقارن مع بعض الأرقام ذات 16 بت والتي تتناسب عكسياً مع الترددات التي تحدد فترات حساب المؤقت.
في تصميمي ، قدمت ثلاثة ألحان مكتوبة بنفس المفتاح والمقياس. وبالتالي ، كان لا بد لي من استخدام عدد محدود ومعين من الملاحظات ، مما جعل النمذجة أسهل. بالإضافة إلى ذلك ، لعبت جميع الألحان الثلاثة بنفس الوتيرة. ملاحظة رمز ورمز مدته بسهولة تناسب بايت واحد. وكان العيب الوحيد لهذا النموذج هو عدم وجود تنوع ، والقدرة على تحرير اللحن أو استبداله أو تكميله بسرعة. لتسجيل اللحن ، قمت أولاً برسمه في محرر موسيقي على جهاز كمبيوتر ، ثم قمت بنسخ الملاحظات ومدتها ، مع ترقيم قررت مسبقًا ، ثم قمت بتكوين البايتات الناتجة. قمت بعمليات الماضي باستخدام برنامج Excel.
في المستقبل ، أردت التخلص من العيب المذكور أعلاه ، وخيانة التصميم لعالمية معينة وتقليل الوقت لتنفيذ اللحن. كانت هناك فكرة أن برنامج MK يقرأ بايت أحد تنسيقات الموسيقى الشهيرة. الأكثر شعبية وشائعة هو تنسيق MIDI. وبشكل أكثر حرفيًا ، هذا ليس شكلًا مثل "العلم" بأكمله الذي يمكن قراءته على الإنترنت. تحدد مواصفات MIDI البروتوكول الخاص بنقل الرسائل في الوقت الفعلي عبر الواجهة الفعلية المقابلة وتصف كيفية ترتيب ملفات midi التي يمكن تخزين هذه الرسائل بها. تنسيق midi موجه للموسيقى ، لذلك يجد التطبيق في الحقل ذي الصلة. هذا تحكم متزامن لمعدات الصوت ، الموسيقى الملونة ، المزج الموسيقي والروبوتات ، إلخ. في المجال المحلي ، تمت مواجهة تنسيق midi في عصر بداية تطور الهواتف المحمولة. في هذه الحالة ، يتم تسجيل الرسائل المتعلقة بإدراج أو إلغاء تنشيط ملاحظة معينة ، ومعلومات حول آلة موسيقية ، وحجم الملاحظات الصوتية وما إلى ذلك في ملف midi. يحتوي الهاتف المحمول الذي يشغل مثل هذا الملف على جهاز توليف يفسر رسائل midi في هذا الملف في الوقت الفعلي ويقوم بتشغيل اللحن. في المراحل المبكرة ، كانت الهواتف قادرة فقط على لعب الألحان أحادية اللون. مع مرور الوقت ، ظهر ما يسمى تعدد الأصوات.
على الإنترنت ، التقيت بمقالات حول تنفيذ أداة توليف الأصوات المجسمة على MK ، والتي تقرأ ملفات midi. في هذه الحالة ، على الأقل ، يتم استخدام "جدول موجة" مُشكل مسبقًا (قائمة أشكال الموجة الصوتية) لكل آلة موسيقية مخزنة في ذاكرة MK. وفي حالتي الخاصة ، سوف نركز على تنفيذ نموذج أبسط: جهاز توليف أحادي الصوت (صوت واحد).
بادئ ذي بدء ، درست بعناية بنية ملف midi ، وتوصلت إلى أنه ، بالإضافة إلى المعلومات الضرورية حول الملاحظات ، فإنه يحتوي على معلومات إضافية زائدة عن الحاجة. لذلك ، تقرر كتابة برنامج بسيط لتحويل ملف midi إلى تنسيقه الخاص. البرنامج ، الذي يعمل مع العديد من ملفات MIDI ، لا يحول التنسيقات فحسب ، بل ينظمها أيضًا بطريقة معينة. مقدمًا ، قررت تنظيم تخزين العديد من الألحان في ذاكرة ROM (EEPROM 24XX512). من أجل راحة التصور في محرر HEX ، تأكدت من أن كل لحن يبدأ من بداية القطاع. بخلاف بطاقة SD (على سبيل المثال) ، لا ينطبق مفهوم القطاع على ذاكرة القراءة فقط (ROM) المستخدمة ، ولذا فإنني أعبر عن نفسي بشروط. حجم القطاع 512 بايت. والقطاع الأول من ROM مخصص لعناوين قطاعات بدايات كل لحن. من المفترض أن اللحن قد يستغرق عدة قطاعات.
وصف كامل لتنسيق ملف ميدي ، بطبيعة الحال ، لا يستحق القيام به هنا. سأتطرق فقط إلى النقاط الأكثر ضرورة وضرورية. يحتوي ملف midi على 16 قناة ، وكقاعدة عامة ، تتوافق غالبًا مع آلة موسيقية أو أخرى. في حالتنا ، لا يهم أي نوع من الأدوات هو ، وهناك حاجة إلى قناة واحدة فقط. يتم وضع محتوى كل قناة ، إلى جانب الرأس ، في ملف midi وفقًا لمبدأ مشابه جدًا لتنظيم تخزين مقاطع الفيديو والصوت في حاوية AVI. كتبت عن الأخير في وقت سابق في أحد مقالاتي. رأس ملف midi هو مجموعة من بعض المعلمات. هذه المعلمة هي دقة الوقت. يتم التعبير عنها في عدد "علامات التجزئة" (نوع من البكسل) في كل ربع (PPQN). الربع عبارة عن فترة زمنية يتم خلالها تشغيل ملاحظة ربع سنوية. اعتمادا على وتيرة اللحن ، قد تكون مدة الربع مختلفة. لذلك ، تعتمد مدة "بكسل" واحدة (فترة أخذ العينات) على الإيقاع و PPQN. يتم تحديد جميع المعلومات حول وقت الحدث بدقة مع هذه المدة.
بالإضافة إلى ذلك ، يحتوي الرأس على نوع ملف MIDI (النوع 0 أو النوع 1) وعدد القنوات. دون الدخول في التفاصيل ، سنعمل مع النوع 1 ، عدد القنوات 2. يحتوي ملف midi ذو اللحن أحادي اللون ، منطقياً ، على قناة واحدة. ولكن في ملف midi "type 1" ، يوجد جانب آخر ، قناة "غير موسيقية" تُسجّل فيها معلومات إضافية لا تحتوي على ملاحظات. هذا هو ما يسمى البيانات الوصفية. ليست هناك حاجة أيضًا إلى الدخول في التفاصيل. المعلومات الوحيدة التي نحتاجها هناك هي وجود معلومات حول الوتيرة وبتنسيق غير معتاد: ميكروثانية كل ربع سنة. في المستقبل ، سيتم عرض كيفية استخدام هذه المعلومات ، جنبًا إلى جنب مع PPQN ، لتكوين مؤقت MK ، المسؤول عن الإيقاع.
في كتلة القناة الرئيسية التي تحتوي على ملاحظات ، نحن مهتمون فقط بمعلومات حول أحداث تشغيل الملاحظات وإيقافها. يحتوي حدث تمكين الملاحظة على معلمتين: رقم الملاحظة وحجم الصوت. في المجموع ، يتم توفير 128 الملاحظات و 128 مستويات الصوت. نحن مهتمون فقط بالمعلمة الأولى ، لأنه لا يهم حجم المذكرة: ستظهر جميع الملاحظات عند تشغيل لحن MK على نفس الحجم. وبطبيعة الحال ، لا ينبغي أن يحتوي اللحن على ملاحظات "مفرطة في الكتابة" ، أي في أي وقت ، يجب ألا يبدو أكثر من ملاحظة واحدة في نفس الوقت. رمز حدث أخذ (تشغيل) الملاحظات هو 0x90. ملاحظة الحدث رمز الخروج 0x80. ومع ذلك ، على الأقل لا يستخدم محرر Cakewalk Pro Audio 9 الحدث برمز 0x80 عند تصدير التكوين إلى تنسيق midi. بدلاً من ذلك ، يتم إجراء الحدث 0x90 في جميع أنحاء الجزء الموسيقي بأكمله ، وتكون الملاحظة التي تم إيقاف تشغيلها هي حجمها صفر. بمعنى أن حدث "إيقاف تشغيل الملاحظة" مكافئ لحدث "تشغيل الملاحظة بدون مستوى صوت". ربما يتم ذلك لأسباب الاقتصاد. وفقًا للمواصفات ، لا يمكن إعادة كتابة رمز الحدث في حالة تكرار هذا الحدث. بين الأحداث ، يتم تسجيل المعلومات حول الفاصل الزمني بتنسيق طول متغير. هذه هي القيم الصحيحة لعدد "العلامات" المذكورة أعلاه. في معظم الأحيان ، بايت واحد يكفي لتسجيل الفاصل الزمني. إذا تبع حدثان واحد تلو الآخر ، فمن الواضح أن الفاصل الزمني بينهما يساوي الصفر. يؤدي هذا ، على سبيل المثال ، إلى تعطيل الملاحظة الأولى وإدراج الملاحظة الثانية التي تليها ، إذا لم يكن هناك توقف مؤقت (مسافة) بينهما.
دعونا نحاول كتابة سلسلة من الملاحظات باستخدام برنامج "Cakewalk Pro Audio 9". هناك العديد من المحررين ، لكنني استقرت على أول محرر صادف.

تحتاج أولاً إلى تكوين إعدادات المشروع. في هذا المحرر ، يمكنك ضبط الدقة في الوقت المناسب (PPQN). اخترت الحد الأدنى للقيمة المساوية لـ 48. القيمة كبيرة جدًا لا معنى لها ، حيث يتعين عليك العمل بأعداد كبيرة تتجاوز 1 بايت في الحجم. لكن الحد الأدنى للقيمة 48 مرضٍ تمامًا. في كل لحن تقريبًا ، لم يتم العثور على ملاحظات أقصر من 1/32. وإذا كان عدد "علامات التجزئة" في كل ربع عام هو 48 ، فستكون الملاحظة أو الإيقاف المؤقت 1/32 مدتها 48 / (32/4) = 6 "علامات". بمعنى أن هناك احتمال نظري لتقسيم 1/32 ملاحظة تمامًا على 2 وحتى 3. نترك المعلمات المتبقية في نافذة خصائص المشروع افتراضيًا.

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

يتم ضبط وتيرة اللحن في عدد الفصول في الدقيقة على شريط أدوات المحرر. القيمة الإيقاعية الافتراضية هي 100 نبضة في الدقيقة.
يحتوي المتحكم الدقيق على مؤقت 8 بت ، كما سبق ذكره ، سيتم استخدامه للتحكم في مدة ملاحظات السبر والإيقاف المؤقت. وقد تقرر أن الفاصل الزمني بين العمليات المجاورة (انقطاع) من مثل هذا الموقت يتوافق مع الفاصل الزمني "علامة" واحدة. اعتمادًا على وتيرة اللحن ، ستكون قيمة هذا الفاصل الزمني مختلفة. قررت استخدام مقاطعات مؤقت تجاوز السعة. واعتمادًا على معلمة تهيئة المؤقت الأولي ، من الممكن ضبط هذا الفاصل الزمني نفسه ، والذي يعتمد على وتيرة اللحن. الآن دعنا ننتقل إلى الحسابات.
كقاعدة عامة ، في الممارسة العملية ، يكمن معدل الأغاني في المتوسط في حدود 50 إلى 200. لقد قيل بالفعل أن الإيقاع في ملف midi محدد في ربع ميكروثانية. بالنسبة إلى الإيقاع 50 ، تبلغ هذه القيمة 60،000،000 / 50 = 1،200،000 ، والإيقاع 250 سيكون 240،000. بما أنه وفقًا للمشروع ، يحتوي الربع على 48 علامة ، وطول علامة الحد الأدنى للإيقاع سيكون 120000/48 = 25000 μs. وللحصول على أقصى سرعة ، إذا قمت بحساب بنفس الطريقة ، - 5000 μs. بالنسبة إلى MK بتردد الكوارتز البالغ 8 ميجاهرتز ومقسم مؤقت أولي أقصى يبلغ 1024 ، نحصل على ما يلي. للحصول على الحد الأدنى من السرعة ، يجب احتساب المؤقت 25000 / (1024/8) = 195 مرة. يتم تقريب النتيجة إلى أقرب قيمة عدد صحيح ، لا يؤثر خطأ التقريب عملياً على النتيجة. لأقصى سرعة - 5000 / (1024/8) = 39. هنا ، لا يؤثر خطأ التقريب بشكل أكبر ، حيث يتم الحصول على قيمة مدورة 39 لقيم الإيقاع المجاورة من 248 إلى 253. وفقًا لذلك ، يجب تهيئة المؤقت مع قيمة معكوسة: للحد الأدنى للإيقاع - (256-195) = 61 ، وللحد الأقصى - (256 -39) = 217. الحد الأدنى للسرعة التي سيتم بها توفير المؤقت في تكوين MK الحالي هو 39 نبضة في الدقيقة. مع هذه القيمة ، يجب حساب الموقت 250 مرة. وبقيمة 38 - بالفعل 257 ، والذي يتجاوز حدود الموقت. قررت أن تأخذ قيمة 40 نبضة في الدقيقة للوتيرة الدنيا ، و 240 للحد الأقصى.
لحساب عدد العلامات ، سيتم استخدام مؤقت افتراضي بناءً على ما تقدم. هو عدد العلامات التي تحدد مدة الملاحظة أو الإيقاف المؤقت ، كما سبق ذكره أعلاه.
لتنفيذ تشغيل الملاحظات ، يتم استخدام جهاز ضبط وقت ثاني 16 بت. وفقا لمواصفات MIDI ، يتم توفير ما مجموعه 128 الملاحظات. ولكن في الممارسة العملية يتم استخدامها أقل بكثير. علاوة على ذلك ، لن يتم إعادة إنتاج الملاحظات من أدنى (بترددات حوالي 50 هرتز) والأعلى (مع ترددات حوالي 8 كيلو هرتز) من قبل متحكم متناغم. لكن لكل هذا ، يغطي مؤقت 16 بت مع مقسم ثابت مجموعة كاملة من الملاحظات المقدمة من midi ، أي بدون الـ 35 الأولى. لكنني اخترت بداية الملاحظة بالرقم 37 (الكود هو 36 ، حيث أن الترميز يأتي من الصفر). يتم ذلك من أجل الراحة ، لأن هذا الرقم يتوافق مع الملاحظة "C" ، باعتبارها الملاحظة الأولى في المقياس التقليدي. يتوافق مع تردد 65.4 هرتز ، ونصف الدورة - 1 / 65.4 / 2 = 0.00764 ثانية. هذه الفترة الزمنية بتردد MK قدره 8 ميجاهرتز ومقسمة 1 (أي بدون مقسم) ستحسب الموقت ككل تقريبًا ككل 0.00764 / (1/8000000) = 61156 مرة. بالنسبة إلى الملاحظة 35 ، إذا عدت ، ستكون هذه القيمة 68645 ، وهو ما يتجاوز نطاق الموقت 16 بت. ولكن ، حتى لو كانت هناك حاجة إلى تشغيل الملاحظات دون الـ 36 ، فيمكنك إدخال أول مقسم مؤقت متاح ، يساوي 8. لكن لا توجد حاجة عملية لذلك ، تمامًا كما لا يوجد أي شيء حتى لتشغيل الملاحظات العليا. ومع ذلك ، بالنسبة إلى الملاحظة 128 العليا ، ملاحظة "G" بتردد قدره 12،543.85 هرتز ، يتم تحديد قيمة المؤقت ، إذا تم حسابها بشكل مشابه ، 319. يتم تحديد تفاصيل جميع الحسابات المذكورة أعلاه من خلال التكوين المحدد لوضع الموقت ، والذي سيظهر لاحقًا.
لدي الآن سؤال لا يقل أهمية: كيفية الحصول على العلاقة بين رقم الملاحظة ورمز المؤقت؟ هناك صيغة معروفة لحساب تواتر الملاحظة من خلال رقمها. ويتم حساب رمز المؤقت لتردد معروف بسهولة ، كما هو موضح أعلاه في الأمثلة. لكن جذر الدرجة الثانية عشرة يظهر في صيغة اعتماد التردد على الملاحظة ، وبشكل عام ، لا أرغب في تحميل وحدة التحكم بهذه الإجراءات الحسابية. من ناحية أخرى ، فإن إنشاء مجموعة من رموز المؤقت لجميع الملاحظات ليس منطقيًا أيضًا. وقررت أن أفعل ما يلي ، باختيار حل وسط. يكفي إنشاء مجموعة من رموز المؤقت لأول 12 ملاحظة ، وهي أوكتاف واحد. ويجب الحصول على ملاحظات الأوكتاف التالية عن طريق ضرب متتابع لترددات الأوكتاف الأول بمقدار 2. أو ، نفس الشيء ، بتقسيم قيم أكواد الموقت بالتتابع بالتتابع 2. والراحة الأخرى هي أن رقم الأوكتاف ، من قبيل الصدفة ، هو حجة في عملية التحول في اتجاه البت إلى اليمين ( ») ، والتي سيتم استخدامها كعملية للتقسيم بسلطة اثنين. لقد اخترت هذا العامل وليس عن طريق الصدفة ، لأن حجةها تعكس الأسس لقوة المقسوم عليها (عدد الأقسام بمقدار 2). وهذا هو رقم اوكتاف. بالنسبة لمجموعتي من الملاحظات ، يتم تضمين 8 أوكتافات (آخر أوكتاف غير مكتمل). يتم تشفير ملاحظة في ملف midi مع بايت واحد ، وبشكل أكثر دقة ، 7 بت. من أجل تشغيل الملاحظات في MK ، وفقًا للفكرة السابقة ، من الضروري أولاً حساب عدد أوكتاف ورقم الملاحظة في أوكتاف باستخدام رمز الملاحظة. يتم تنفيذ هذه العملية في مرحلة تحويل ملف midi إلى تنسيق مبسط. يمكن تشفير ثمانية أوكتات في ثلاث بتات ، ويمكن ترميز 12 ملاحظة في أوكتاف في أربعة. في المجموع ، اتضح أن الملاحظة مشفرة في البتات السبعة نفسها كما في ملف midi ، ولكن فقط في تمثيل مختلف مناسب لـ MK. بسبب حقيقة أنه يمكن ترميز 16 بت مع 4 بتات ، وملاحظات في أوكتاف من 12 ، هناك بايت غير المستخدمة.
يمكن استخدام بت الثامن الأخير كعلامة لتمكين أو تعطيل الملاحظات. في حالة عضو الكنيست ، وبسبب إجماع اللحن ، فإن المعلومات حول النغمة الصامتة ستكون زائدة عن الحاجة. مع التغيير المباشر للملاحظة في اللحن ، لا يوجد "إيقاف تشغيل" ، ولكن هناك "تبديل" للملاحظة. وفي حالة توقف مؤقت ، "يتم تشغيل الصمت" ، حيث يمكنك اختيار بايت خاص من مجموعة البايت غير المستخدمة ، وعدم استخدام المعلومات حول إيقاف تشغيل الملاحظة على الإطلاق. تعتبر هذه الفكرة جيدة من حيث أنها تحفظ حجم اللحن الناتج بعد التحويل ، ولكنها تعقد النموذج عمومًا. لم أتبع هذه الفكرة ، لأن هناك الكثير من الذاكرة بالفعل.
يتم تخزين معلومات حول ملاحظات اللحن في ملف midi في كتلة القناة المقابلة في عرض "الفاصل الزمني للحدث الفاصل ...". في التنسيق المحول ، يتم تطبيق نفس المبدأ تمامًا. لتسجيل حدث (تشغيل ملاحظة أو إيقاف تشغيلها) ، كما ذكر أعلاه ، يتم استخدام بايت واحد. بت الأولى (أهم بت 7) ترميز نوع الحدث. القيمة "1" هي الملاحظة على ، والقيمة "0" هي الملاحظة. ترمز البتات الثلاثة التالية إلى رقم أوكتاف ، بينما ترمز البتات الأربعة الأدنى إلى رقم الملاحظة في أوكتاف. يتم استخدام بايت واحد أيضًا لتسجيل الفاصل الزمني. في تنسيق midi الأصلي ، يتم استخدام تنسيق طول متغير لهذا الغرض. عيبه الصغير هو أن 7 بتات فقط تشفر الفاصل الزمني (عدد "القراد") ، والثمانية هي علامة على الاستمرار. وهذا هو ، مع بايت واحد ، في الواقع ، يمكنك ترميز فاصل زمني يصل إلى 128 علامة. ولكن بما أن الفواصل الزمنية بين الأحداث في الألحان الحقيقية والبسيطة تتجاوز أحيانًا 128 ، ولكن لا تتجاوز 256 تقريبًا ، فقد تخلت عن التنسيق ذي الطول المتغير وتمكنت من إدارته بواسطة بايت واحد. إنه يشفر فترة زمنية تصل إلى 256 علامة. نظرًا لأن المشروع يستخدم 48 علامة في الربع ، أو 48 * 4 = 192 علامة في كل دورة ، يمكن استخدام بايت واحد لترميز فاصل زمني قدره 256/192 = مدة واحدة (3) (دورة واحدة كاملة وثالثة) دورة ، والتي بما فيه الكفاية
بالتنسيق الأصلي الذي يتم تحويل ملف midi إليه ، قمت أيضًا بتطبيق رأس صغير ، بحجم 16 بايت. تحتوي وحدات البايت الأربعة عشر الأولى على اسم اللحن. بطبيعة الحال ، يجب ألا يتجاوز الاسم 14 حرفًا. ثم يأتي مساحة الصفر. البايت الأخير التالي يعكس وتيرة اللحن في طريقة عرض مريحة ل MK. يتم حساب هذه القيمة في مرحلة التحويل وتعمل على تهيئة جهاز ضبط وقت MK ، وهو المسؤول عن السرعة. كيف يتم حسابه وتناقش في بضع فقرات أعلاه.
بدءاً من البايت 17 ، تتبع محتويات اللحن. يتوافق كل بايت فردي مع فاصل زمني ، ويتوافق كل بايت فردي مع حدث (ملاحظة).
ستكون البايتة الأولى صفراً إذا بدأ اللحن مع ملاحظة ، من بداية ملف midi ، دون توقف مؤقت. علامة نهاية اللحن هو تسمية وحدتي بايت 0xFF. تتضمن المهمة التكاثر الدوري للحن بواسطة متحكم. لكي يبدو اللحن الموجود في الحلقة متناغمًا من وجهة نظر الإيقاع ، يجب أن يتم حلقته بشكل صحيح. للقيام بذلك ، إذا لزم الأمر ، بعد الملاحظة الأخيرة ، تحتاج إلى إيقاف طول معين ، عادةً حتى يتم ملء آخر قياس. ولهذا تحتاج إلى تحويل الحدث المقابل. لقد استخدمت بايت 0x0F ، والذي لا يستخدم في ترميز الملاحظات. يتوافق مع تعطيل الملاحظة 16 في أوكتاف الأول ، وهو أمر سخيف ، حيث لا يوجد سوى 12 ملاحظة في أوكتاف ، وقد ذكرنا أعلاه حول البايتات غير المستخدمة. وبالتالي ، فإن هذه البايتة تشفر "مذكرة صامتة" ،يمكن أن يكون الجزء المرتفع منه بمثابة علامة على التبديل أو إيقاف التشغيل ، على الرغم من كثرة المعلومات في هذه الحالة أيضًا. لتعيين هذه الملاحظة في محرر midi ، أخذت الملاحظة الأولى أو الثانية (أي منها). اسمحوا لي أن أذكركم بأن الـ 36 ملاحظة الأولى لا تُستخدم في النموذج. وبالتالي ، يتم استخدام الملاحظة الأولى (أو الثانية) عند الضرورة لإكمال اللحن بشكل صحيح ، بحيث لا يتم كسر الإيقاع عند تشغيله في حلقة.مواصلة العمل في محرر "Cakewalk Pro Audio 9" ، سنؤلف لحنًا تعسفيًا. توضح الأشكال أدناه ملاحظات اللحن التي أعيد كتابتها من إحدى الصور الموجودة على الإنترنت. يتم تقديم صور الملاحظات بأسلوبين: بأسلوب "بيانو رول" وبالأسلوب الكلاسيكي. الأول مناسب للغاية لكتابة وتحرير الألحان باستخدام فأرة الكمبيوتر. هذا هو ما أستخدمه.
كما ترى من الشكل ، في النهاية يتم تطبيق الملاحظة الأدنى (الأول) على علامة الصمت في الفاصل الزمني المناسب من أجل تنظيم النموذج الدوري بشكل صحيح. وفي بداية اللحن ، نظرًا لوجود لمسة ، توجد مسافة بادئة بمقدار الربع قبل الملاحظة الأولى.يوفر المحرر وضعًا لعرض الأحداث في نموذج جدول.
كما ترون من الشكل ، لا يوجد شيء لا لزوم له في قائمة الأحداث ، باستثناء تدوين الملاحظات ، كما يحدث في بعض الأحيان مع التلاعب غير الضرورية في مشروع موسيقي. مع ذلك ، إذا كانت الأحداث غير الضرورية غير المرتبطة بالملاحظات مدرجة في القائمة لسبب ما ، فيمكن حذفها بالضغط على مفتاح Del. على الرغم من أنه في مرحلة التحويل ، يتم تجاهل جميع الأحداث غير الضرورية ، ويتراكم وقت دلتا. بالمناسبة ، أضفت هذه الوظيفة إلى البرنامج في مرحلة تصحيح الأخطاء. كما قد تعتقد ، فإن الجدول يعكس في الوقت المحدد ومدة كل ملاحظة مع غيرها من الخصائص التي لا نحتاج إليها. هذا يعني أنه مع وجود سطر واحد في الجدول يتم التعبير عن حدثي midi مرة واحدة: تشغيل الملاحظات وإيقافها.احفظ اللحن بتنسيق "midi 1" ، كما هو موضح في الشكل.
افتح الملف المحفوظ في محرر HEX. تجدر الإشارة إلى أنه على عكس ملفات avi نفسها (كما كتبت سابقًا) ، لا يتم تقديم بايت من القيم العددية في ملف midi بترتيب عكسي ، ولكن وفقًا للأقدمية (endian الكبيرة).
في الشكل ، قمت بوضع علامات بالبايتات المرغوبة فقط. أولاً ، يحدد إطار أحمر غامق ثلاث مجموعات من وحدتي بايت في كل منهما. هذا ، على التوالي ، هو نوع تنسيق MIDI (1) ، وعدد القنوات (2) وعدد علامات التجزئة في كل ربع (48). هذه هي القيم التي يجب أن تمتلكها هذه الثوابت الثلاثة للعمل الإضافي لبرنامج التحويل. أقواس الأرجواني تمثل بداية كل من القناتين. في القناة الأولى ، تم وضع علامة على 6 بايتات بإطار رمادي ، حيث يتم تمييز البايتات الثلاث بإطار أزرق. تشير وحدات البايت الست هذه إلى حدث تعريف (علامة علامة 0xFF) برمز 0x51 وطول محتوى 0x03 بايت. ثلاث بايتات أخرى - محتويات الحدث. يعين هذا الحدث وتيرة اللحن مع هذه البايتات الثلاثة فقط في إطار أزرق. يمكن التخلص من آخر بايت منخفض بأمان ، لأن الدقة الفائقة ليست مهمة. لن أقدم وصفاً مفصلاً وشاملاً لجميع وحدات البايت في الملف.في المسار الثاني - في المسار مع الملاحظات - يتم تدوير قيم الفواصل الزمنية في إطار أزرق. بالمناسبة ، في هذا المثال بالذات ، لم يتجاوزوا بايت واحد ، باستثناء الحالة الوحيدة التي تحتوي على الملاحظة قبل الأخيرة. إنها الملاحظة قبل الأخيرة للنغمة (تحسب النغمة الزائفة الإضافية للنهاية) التي تدوم ثلاثة أرباع القياس ، وهي 48 * 3 = 144 علامة وتتجاوز 128. ومن أجل ذلك يجب عليك استخدام وحدتي بايت ، وفقًا لتنسيق الطول المتغير. ولتمثيل الفاصل الزمني في التنسيق المحول ، يتم ترميز القيمة 144 بسهولة مع بايت واحد. حلقت هذه الحالة الخاصة في إطار أزرق مزدوج. الملاحظات محاطة بدائرة في إطار أخضر ، أو بالأحرى رموزها. حجم كل ملاحظة دائري في إطار رمادي. كما ذكرنا من قبل ، فإن مستوى الصفر هو علامة على كتم الصوت (إصدار) من الملاحظة ، وفي جميع أنحاء التكوين كله يوجد حدث واحد:تشغيل الملاحظات. تم وضع رمز لهذا الحدث ، 0x90 ، باللون الأصفر. لم أحدد جميع الملاحظات حتى نهاية اللحن. الاستثناء الوحيد هو الإطار الأزرق المزدوج لفترة زمنية واحدة تتجاوز عتبة 128 علامة.مرة أخرى ، كما ذكر أعلاه ، فإن برنامج تحويل ملف midi إلى تنسيقه الخاص لـ MK يعمل في الواقع مع مجموعة من عدة ملفات midi ، وعند الإخراج يقوم بإنشاء ملف صورة لـ EEPROM. ضع في اعتبارك جزءًا من هذا الملف يتعلق بمحتويات اللحن المحول من المثال أعلاه. فتحته في محرر HEX آخر لإظهار الصورة حسب القطاعات والانتباه إليها. كل لحن جديد يبدأ بقطاع جديد.
البايت الأخير من السطر الأول (أول 16 بايت) ، محاط بدائرة في إطار أحمر ، يحدد وتيرة اللحن. وفقًا للحسابات ، تسقط القيمة 0xC1 (193) على الإيقاع 154 و 155 و 156. فقط في المشروع ، قمت بتعيين سرعة الإيقاع الليلي على 155 دورة في الدقيقة ، والتي شوهدت في إحدى لقطات الشاشة السابقة. تحدد البايتات الأولى (حتى الرابعة عشرة) المحاطة بإطار أزرق اسم التركيبة. في هذا المثال ، "كلاسيكي". بالنسبة إلى MK ، هذه المعلومات غير ضرورية ، فهي مطلوبة فقط للتوجيه في محرر HEX. على الرغم من أنه إذا قمت بإجراء مشروع أكثر تعقيدًا على MK باستخدام الشاشة ، يمكنك استخدام هذه المعلومات عن طريق عرض اسم اللحن الذي تم تشغيله.السطر الثاني (من البايت 17) يبدأ محتويات اللحن. كما هو الحال مع ملف midi الأصلي ، لم أرسم كل الملاحظات ، لكني رسمت جزءًا فقط. البايتات الفردية المميزة باللون الأزرق هي فترات زمنية. حتى البايتات المميزة بإطار أخضر هي ملاحظات مع علامات على تشغيل / إيقاف. على سبيل المثال ، تشير البايتان الأخريان الأولان ، 0xB4 و 0x34 ، إلى الملاحظة نفسها برمز 0x34 ، وتختلف البايتات في بت واحد فقط عالي الترتيب. في البايت 0xB4 (0b10110100) ، تكون البتة المرتفعة واحدة ، وهي علامة على تشغيل ملاحظة ، وفي البايت 0x34 (0b00110100) ، تكون البتة المرتفعة صفراً ، وهي علامة على إيقاف تشغيل ملاحظة. البايت 0x34 ترميز ملاحظة مع المعلمات التالية: رمز أوكتاف 0b011 ، ورمز الملاحظة في أوكتاف - 0b0100. أو ، في شكل عشري ، 3 و 4 ، على التوالي. إذا كنت لا تعول من الصفر ،اتضح أن النوتة الأولى في اللحن تنتمي إلى أوكتاف الرابع وهي الخامسة في اللحن. يتم اختيار ترقيم أوكتاف هنا بشكل تعسفي دون مراعاة الترقيم القياسي. الملاحظة المتفق عليها ، وفقًا لجدول حسابي الإضافي Excel ، هي الملاحظة التي تحتوي على الكود 76 (0x4C) لتنسيق midi ، أي الملاحظة E6 (الملاحظة "e" الخاصة بأوكتاف منتصف السادس). لذلك هو: يبدأ التكوين مع هذه المذكرة.تجدر الإشارة إلى حالة خاصة في التسلسل الموسيقي ، عندما تتكرر نفس الملاحظة دون توقف مؤقت. في مثالنا ، تختلف جميع الملاحظات المجاورة الخالية من الإيقاف المؤقت. ولكن هناك ألحان حيث تتكرر الملاحظة بدون توقف. بمعنى أن الفاصل الزمني بين إيقاف تشغيل واحد وتشغيل الملاحظة نفسها بالضبط هو صفر. نظرًا لخصوصية التوليف المعقد للموسيقى ، سيبدو هذا التسلسل مألوفًا في أي جهاز توليف. ولكن في حالة MK ، سوف يبدو متماسكًا لدرجة أنه سيكون من الصعب سماع الفرق بين ملاحظتين متطابقتين. في الممارسة العملية ، بالطبع ، لن يكون هناك اندماج واضح بسبب العمليات الحسابية الوسيطة التي تحدث في MC ، ولكن لا يزال ، من المحتمل أن تكون هذه الفترة الزمنية أقل بكثير من مدة حتى علامة واحدة. لمثل هذه الحالات الخاصة ، فإن البرنامج في مرحلة التحويل ،الصدم في مثل هذا الجمع ، يقدم وقفة بين الملاحظات من طول 1 علامة ويقلل من مدة الملاحظة إلى يسار الملاحظة في نفس الفترة الزمنية. الحد الأدنى من "الفجوة" من 1 علامة يكفي ، كما أظهرت الممارسة.في إطار أزرق مزدوج ، أقوم بدائرة بتدوير قيمة الفاصل الزمني (0x90) ، التي تتجاوز 128 ، وكان علي أن أقضي عليها بايتين في ملف midi ، وفقًا لتنسيق الطول المتغير. دوائر خضراء محاطة بدائرة من البايتات وتغلق على نفس المذكرة الزائفة لمحاذاة التكوين. برنامج MK ، عند رؤية هذه البايتات ، سوف يفسرهم على أنه تشغيل الصمت. أخيرًا ، تشير وحدتا بايت 0xFF المحاطتان بإطار أزرق غامق إلى نهاية اللحن. يمكن أن تكون قيم جميع البايتات التالية داخل قطاع الذاكرة الحالي أي ، يتم تجاهلها.النظر في القطاع الأول للغاية من ملف صورة EEPROM الإخراج. كما كتبت بالفعل ، فإنه بمثابة قائمة عناوين قطاعات بداية الألحان. قام البرنامج بنجاح بمسح 8 ألحان دون أخطاء (في وقت كتابة هذا التقرير ، قمت بتسجيل 8 ألحان). يتم تسجيل قيمة عدد الألحان في آخر 512 بايت من القطاع. ومن بداية القطاع ، تتم كتابة العناوين. بالنسبة إلى اللحن الأول ، يكون العنوان هو 0x01 ، والذي يتوافق مع القطاع الثاني (الأول ، إذا عدت من نقطة الصفر). تبين أن الألحان الثالثة والرابعة (اثنان من ثمانية) طويلة ولم تتناسب مع قطاع واحد. لذلك ، يتم ملاحظة الثغرات في تسلسل العنوان. إذا قمت بحساب 64 كيلو بايت من الذاكرة ، فلا يمكنك تسجيل أكثر من 127 أغنية ، لذلك يكفي قطاع واحد للتصدي.
جميع التقديرات الأولية والحسابات التي تنعكس في المقالة ، نفذت في Excel. تعرض لقطات الشاشة التالية لقطات شاشة للجداول الناتجة (في وضع النافذة المزدوجة).
من يهتم ، أسفل المفسد ، هو نص البرنامج C الذي يحول ملفات midi إلى ملف متحكم دقيق. من النص ، قمت بإزالة الأسطر الإضافية التي تم استخدامها لتصحيح الأخطاء. البرنامج ، حتى الآن ، يعمل ، لا يدعي أنه قابل للقراءة ومحو الأمية في كتابة التعليمات البرمجية.الملف الرئيسي#include <stdio.h> #include <windows.h> #include <string.h> #define SPACE 1 HANDLE openInputFile(const char * filename) { return CreateFile ( filename, // Open Two.txt. GENERIC_READ, // Open for writing 0, // Do not share NULL, // No security OPEN_ALWAYS, // Open or create FILE_ATTRIBUTE_NORMAL, // Normal file NULL); // No template file } HANDLE openOutputFile(const char * filename) { return CreateFile ( filename, // Open Two.txt. GENERIC_WRITE, // Open for writing 0, // Do not share NULL, // No security OPEN_ALWAYS, // Open or create FILE_ATTRIBUTE_NORMAL, // Normal file NULL); // No template file } void filepos(HANDLE f, unsigned int p){ LONG LPos; LPos = p; SetFilePointer (f, LPos, NULL, FILE_BEGIN); //FILE_CURRENT //https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-setfilepointer } DWORD wr; DWORD ww; unsigned long int read32(HANDLE f){ unsigned char b3,b2,b1,b0; ReadFile(f, &b3, 1, &wr, NULL); ReadFile(f, &b2, 1, &wr, NULL); ReadFile(f, &b1, 1, &wr, NULL); ReadFile(f, &b0, 1, &wr, NULL); return b3<<24|b2<<16|b1<<8|b0; } unsigned long int read24(HANDLE f){ unsigned char b2,b1,b0; ReadFile(f, &b2, 1, &wr, NULL); ReadFile(f, &b1, 1, &wr, NULL); ReadFile(f, &b0, 1, &wr, NULL); return b2<<16|b1<<8|b0; } unsigned int read16(HANDLE f){ unsigned char b1,b0; ReadFile(f, &b1, 1, &wr, NULL); ReadFile(f, &b0, 1, &wr, NULL); return b1<<8|b0; } unsigned char read8(HANDLE f){ unsigned char b0; ReadFile(f, &b0, 1, &wr, NULL); return b0; } void message(unsigned char e){ printf("Error %d: ",e); switch(e){ case 1: // - -; printf("In track0 event is not FF\n"); break; case 2: // - 127 printf("Len of FF >127\n"); break; case 3: // ; printf("Midi is incorrect\n"); break; case 4: // ; printf("Delta>255\n"); break; case 5: // RPN NRPN; printf("RPN or NRPN is detected\n"); break; case 6: // ; printf("Note in 1...35 range\n"); break; case 7: // ; printf("Long of name of midi file >18\n"); break; } system("PAUSE"); } int main(){ HANDLE in; HANDLE out; unsigned int i,j; unsigned int inpos; unsigned int outpos=0; unsigned char byte; // ; unsigned char byte1; // 1 ; unsigned char byte2; // 2 ; unsigned char status; //- ( ); unsigned char sz0; // -; unsigned long int bsz0; // -; unsigned short int format, ntrks, ppqn; // ; unsigned long int bsz1; // ; unsigned long int bpm; // ( . ); unsigned long int time=0; // ( ); unsigned char scale; // , ; unsigned char oct; // ; unsigned char nt; // ; unsigned char outnote; // ; unsigned char prnote=0; // ; unsigned char tdt; // () ; unsigned int dt; // ( ); unsigned int outdelta=0; // ( ); unsigned char prdelta=0; // ; char fullname[30]; // ; char name[16]; // ; WIN32_FIND_DATA fld; // mid; HANDLE hf; unsigned short int csz; // ; unsigned char nfile=0; // ; unsigned char adr[128]; // ; out=openOutputFile("IMAGE.out"); outpos=512; // ; filepos(out,outpos); hf=FindFirstFile(".\\midi\\*.mid",&fld); do{ printf("\n***** %s *****\n",fld.cFileName); if(strlen(fld.cFileName)>18){ // ; message(7); } sprintf(name,"%s",fld.cFileName); name[strlen(fld.cFileName)-4]=0; // ; sprintf(fullname,".\\midi\\%s",fld.cFileName); // ; WriteFile(out, name, strlen(name), &ww, NULL); // ; in=openInputFile(fullname); // ; #include "process.cpp" // ; outpos+=((csz/512)+1)*512; // ; adr[nfile]=(outpos/512)-((csz/512)+1); // () ; filepos(out,outpos); CloseHandle(in); nfile+=1; }while(FindNextFile(hf,&fld)); // , ; FindClose(hf); WriteFile(out, &outnote, 1, &ww, NULL); outpos=0; // ; filepos(out,outpos); WriteFile(out, adr, nfile, &ww, NULL); outpos=511; // ; filepos(out,outpos); WriteFile(out, &nfile, 1, &ww, NULL); CloseHandle(out); system("PAUSE"); return 0; }
الجزء الأساسي من برنامج MK ، في الواقع ، بسيط للغاية. النظر في واحد من الخيارات لتنفيذه ، على وجه التحديد ، الجزء الرئيسي.
تم تكوين المؤقت 1 ، المستخدم لإنشاء صوت الملاحظات ، على النحو التالي. لتمكين وتعطيل الملاحظات ، يتم استخدام البدائل التالية ، على التوالي.
#define ENT1 TCCR1B=0x09;TCCR1A=0x40 #define DIST1 TCCR1B=0x00;TCCR1A=0x00;PORTB.1=0
قبل بدء المؤقت ، تحتاج إلى تعيين OCR1A لتسجيل قيمة 16 بت تتوافق مع التردد الذي يتم تشغيله. هذا سيظهر لاحقا. عند تشغيل المؤقت ، يتم تعيين سجل TCCR1B على وضع إنشاء الموجة مع مقسم مؤقت من 1 ، ويتم تعيين سجل TCCR1A على Toggle OC1A على مقارنة التطابق. في هذه الحالة ، تتم إزالة الإشارة من الإخراج المعين خصيصًا لـ MK "OC1A". في ATmega8 في حزمة SMD ، هذا الرقم 13 ، وهو نفس PORTB.1. عند إيقاف تشغيل الموقت ، تتم إعادة ضبط كلا السجلين ، ويُفرض إخراج PORTB.1 على الصفر. يعد ذلك ضروريًا لمنع إخراج الجهد المستمر أثناء الصمت ، وهو أمر غير مرغوب فيه لإدخال ULF. رغم ذلك ، يمكنك وضع مكثف في الدائرة ، لكن يمكنك أيضًا تعطيل الإخراج برمجيًا. يمكن أن يحدث جهد ثابت على هذا الإخراج إذا تم إيقاف تشغيل الملاحظة في لحظة المرحلة المقابلة للإشارة ، وهذا في 50٪ من الحالات.
إنشاء مجموعة من القيم الموقت لمدة 12 الملاحظات من اوكتاف الأول جدا. تم حساب هذه القيم مقدما.
freq[]={61156,57724,54484,51426,48540,45815,43244,40817,38526,36364,34323,32396};
كما قلت ، سيتم الحصول على ملاحظات الأوكتاف الأخرى بقسمة على درجتين.
الموقت 0 التكوين هو أبسط. إنه يعمل باستمرار ، مع مقاطعة تجاوز السعة ، في كل مرة يتم تهيئتها من جديد مع القيمة التي تتوافق مع وتيرة اللحن. مقسم المؤقت هو 5: TCCR0 = 0x05. بناءً على هذا المؤقت ، يتم إنشاء مؤقت افتراضي يحسب التشنجات اللاإرادية (الأوقات) في اللحن. يتم وضع استجابة استجابة هذا المؤقت في دورة البرنامج الرئيسية.
وظيفة المقاطعة الموقت 0 هي كما يلي.
interrupt [TIM0_OVF] void timer0_ovf_isr(void){ if(ent01){ vt01+=1; } TCNT0=top0; }
هنا المتغير ent01 هو المسؤول عن تفعيل الموقت الظاهري. بواسطة هذا المتغير ، يمكن تشغيله أو إيقاف تشغيله إذا لزم الأمر. المتغير vt01 هو المتغير الأساسي القابل للعد في المؤقت الظاهري. يشير الخط TCNT0 = top0 إلى تهيئة المؤقت 0 إلى القيمة المرغوبة top0 ، والتي تتم قراءتها من عنوان اللحن قبل تشغيله.
يتوافق عدد اللحن المراد تشغيله مع متغير alm. كما أنه بمثابة علم بداية التكاثر. إنها تحتاج إلى تعيين عدد لحن في واحدة من الطرق ، وهذا يتوقف على المهمة. بعد ذلك ، ستصبح الكتلة التالية من الدورة الرئيسية نشطة.
if(alm){
يتم إجراء مزيد من التبديل من الملاحظة إلى الملاحظة في وحدة المعالجة الخاصة بالموقت الظاهري ، والتي يتم وضعها أيضًا في الحلقة الرئيسية.
if(vt01>=top01){
من التعليقات الموجودة في نص البرنامج ، يجب أن يكون كل شيء واضحًا ومفهومًا تمامًا.
لإيقاف اللحن ، استخدم الإدخال التالي للحلقة الرئيسية.
if(stop){
هناك ملاحظة صغيرة حول تنفيذ تشغيل اللحن. قبل أن تبدأ كل ملاحظة جديدة في الصوت ، يقضي المتحكم الدقيق مقدارًا صغيرًا من الوقت في تحويل بايت قراءة الملاحظة إلى قيمة مؤقت. هذه المرة ، كما اتضح في الممارسة العملية ، صغيرة نسبيًا ولا تؤثر على جودة التشغيل. لكن لدي شكوك في أن هذه العملية ستبقى غير مرئية. في هذه الحالة ، ستظهر توقفات إضافية قبل كل ملاحظة ، وسيتم كسر إيقاع اللحن. ولكن هذه المشكلة هي أيضا قابلة للحل. يكفي حساب قيم الموقت الخاصة بالملاحظة التالية مقدمًا بينما تسمع الملاحظة الحالية. يجب تنفيذ هذا الإجراء بشكل منفصل عن معالجة المؤقت الظاهري في حلقة البرنامج الرئيسية باستخدام إشارة مخصصة بشكل خاص. نظرًا لحقيقة أن وقت الحساب من غير المرجح أن يتجاوز وقت اللعب حتى أقصر ملاحظة ، فإن هذا الحل مناسب.
الآن دعنا ننتقل إلى اختبار البرنامج.
بالإضافة إلى مقتطفات الشفرة أعلاه ، أضفت وظائف معالجة الأزرار إلى برنامج MK ، والذي أتحكم فيه في تضمين أو إلغاء تنشيط لحن معين. EEPROM متصل بـ MK عبر ناقل I2C ، حيث يتم تنفيذ العمل على مستوى البرنامج. تم تنفيذ المشروع بمساعدة "CodeVisionAVR" مع "CodeWizardAVR". أخرج عضو الكنيست من الرقم 13 إلى بطاقة صوت الكمبيوتر الشخصي من خلال الفاصل وسجل صوت اللحن في محرر الصوت. لقد تومض ذاكرة EEPROM بمساعدة البرامج الثابتة ، التي كتبت عنها في إحدى المقالات السابقة. نظرًا لحقيقة أن جميع وحدات بايت ملف الصورة ليست مفيدة ، لا يمكن تنفيذ البرامج الثابتة الذاكرة إلا من خلال وحدات البايت المفيدة (حتى علامات نهاية الألحان) من أجل توفير وقت التسجيل ومورد الرقاقة. للقيام بذلك ، يمكنك إنشاء برنامج منفصل ، أو كتابة بايت على الشريحة مباشرة أثناء التحويل ، إضافة إلى البرنامج الرئيسي.
من بين الإيقاعات الثمانية ، هناك ثلاثة نغمات اختبار ، وسأقوم من خلالها بتقييم مدى التردد عن طريق الأذن ، وصوت دمج الملاحظات المتطابقة ، وصوت أقصر الملاحظات ، والانتقالات السريعة ، إلخ. واسمحوا لي أن أذكرك أن دمج نفس الملاحظات يبدو فعليًا مع إيقاف مؤقت لعلامة واحدة ، وأن الملاحظة الأولى في الدمج تدوم علامة واحدة أقل.
أحد نغمات الاختبار هي سلسلة من الملاحظات من الأول إلى الأخير مع مدة ملاحظة واحدة في ربع واحد وتيرة اللحن من 40 نبضة في الدقيقة.

في هذا السيناريو ، تبدو إحدى الملاحظات أكثر بقليل من ثانية واحدة ، وبالتالي يمكنك الاستماع بالتفصيل لكيفية ظهور مجموعة الملاحظات بالكامل. على الطيف الترددي في محرر الصوت "Adobe Audition" ، تتم ملاحظة مكونات التردد الرئيسية والتوافقيات العليا الخاصة بها بسبب شكل موجة مسننة. والعلاقة اللوغاريتمية بين رقم المذكرة والتردد مذهلة.

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

ويبلغ طول علامة واحدة بمتوسط سرعة لحن قدره 120 دورة في الدقيقة حوالي 10 مللي ثانية. ويترتب على ذلك ، من حيث المبدأ ، أنه من الممكن عدم إدخال نفس التصحيح في علامة واحدة ، عندما تسير ملاحظتان متطابقتان واحدة تلو الأخرى دون توقف. أعتقد أن الإدخال المنتظم لـ 3 مللي ثانية بين الملاحظات سيكون كافيًا جدًا. عند الاستماع إلى اللحن ، لا تكون هذه الإضافات المنتظمة ملحوظة على الإطلاق ، والأصوات تبدو متساوية. لذلك ، ليست هناك حاجة خاصة لحساب قيمة المؤقت للملاحظة التالية أثناء تشغيل الملاحظة الحالية.
لحن اختبار آخر مع وتيرة من 200 نبضة في الدقيقة يحتوي على التوالي نفس الملاحظات 1/32 من المدى المتوسط دون توقف. في هذه الحالة ، بعد المعالجة ، عند التشغيل بينهما ، هناك وقفة واحدة من علامة التجزئة ، في هذا الإيقاع السريع الذي يبلغ 310 عينات (حوالي 6 مللي ثانية) للإشارة المسجلة.

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