MIDI2USB - ربطتنا الموسيقى

الروسية-الصينية-الأمريكية لتحويل MIDI USB.الشكل 1 محول MIDI روسي-صيني-أمريكي إلى USB. الصورة من قبل المؤلف.



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



صياغة المشكلة



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



حكاية في الموضوع
:

— , !

— , ?

— !


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



طرق صقل المحول الصيني



هناك العديد من المناقشات على الإنترنت حول كيفية تحسين أو تعديل المحول الصيني. في بعض إصدارات هذا المهايئ ، يتم توفير optocoupler ، ولكن ليس ملحومًا ، مما يوفر عزلًا كلفانيًا بين الكمبيوتر والمركب. للأسف ، في حالتي ، كانت المراجعة صعبة ، لأن بدلاً من optocoupler ، يتم تثبيت اثنين من الترانزستورات NPN. لاحظ أن معيار MIDI يحدد بشكل مباشر استخدام عازل بصري ، على سبيل المثال ، PC900V أو 6N138. تمتلك Optocouplers H11L1M (DIP-8) أو H11L1SM (SO-6) خصائص متشابهة. يمكن استخدام المكونات الأخرى ذات المعلمات المناسبة.



المحول الصيني في عملية التفكيك

الصورة 2. المحول الصيني في عملية التفكيك. الصورة من قبل المؤلف.



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



لكن لا يكفي توفير عزل بصري بين الآلة الموسيقية والكمبيوتر. مطلوب أيضًا مذبذب أو مرنان بلوري دقيق لضمان تسجيل UART التسلسلي وفقًا لمعيار MIDI. لا يفتقر المحول الصيني الذي اشتريته إلى جهاز optocoupler فحسب ، بل يفتقر أيضًا إلى مرنان الكوارتز. بالطبع ، هناك دوائر دقيقة يتم فيها معايرة وحدات تسجيل الوقت في المصنع ، لكن لا يوجد شيء من هذا القبيل. بشكل عام ، أداء هذا المنتج الصيني منخفض. هناك محولات مبنية على شريحة CH345 - محول USB إلى MIDI في حزمة SSOP-20 ، لكن هذه ليست حالتي. تحتوي الرقاقة الدقيقة CH345 على علامات USB للأجهزة معرّف البائع: 1a86 ، معرّف المنتج: 752d. ومع ذلك ، يمكن لأي دائرة كهربائية صغيرة "يسرى" (وهي كذلك) أن تعطي نفس المعرفات ويمكنها حتى "التظاهر" بأنها أي شيء.



آخر عيب صغير وجدته في المحول الصيني هو البرنامج (البرامج الثابتة). بتعبير أدق ، هذا حجم مخزن مؤقت صغير لنقاط النهاية (نقاط النهاية) ، 8 بايت فقط. هذا يكفي لنقل الملاحظات المضغوطة ، لأن رسالة MIDI عبر واجهة USB تتكون من 4 بايت (رقم الكابل ورقم الأمر و 2 بايت بيانات). لكن أي امتدادات ، على سبيل المثال SysEx ، يمكن أن تكون أكبر.



بعد فترة ، اشتريت كابل محول آخر ، والذي كان يسمى "Professional USB MIDI Interface". كان هذا المحول أكثر تكلفة بشكل ملحوظ وكان أداؤه أفضل بشكل ملحوظ ، ولكن لا يزال به أخطاء. تجلى ذلك في حقيقة أنه بعد بضع دقائق من تشغيل جهاز المزج ، بدأ فجأة يفوت ضربات المفاتيح ، أو العكس - لم يدرك إطلاق المفتاح. شعرت بخيبة أمل من نتائج المحولات الصينية وقررت اتباع النصيحة: "إذا كنت تريد أن تفعل شيئًا جيدًا ، فافعل ذلك بنفسك".



جزء الأجهزة



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





الشكل 3 محول USB-MIDI في العلبة ومع الكابلات.



في وقت كتابة هذا التقرير ، كنت أعرف عدة مشاريع مثيرة للاهتمام:



  1. رسم تخطيطي من وثائق رقاقة CH345 من Nanjing Qinheng Microelectronics.
  2. مشاريع قديمة على ميكروكنترولر Atmega مع تنفيذ برنامج بروتوكول USB. يستخدمون وضع السرعة المنخفضة ، والذي تم إهماله وغير مدعوم في Windows 7.
  3. مكتبة MIDIUSB للوحات Arduino مع دعم الأجهزة لواجهة USB (Atmega32u4 ، Cortex-M) ، وكذلك Maple ، إلخ.


تحتوي المخططات التخطيطية الكهربائية في جميع المشاريع على العديد من أجزاء العينات بناءً على توصيات معيار MIDI . لذلك ، بقي اختيار متحكم يدعم وضع USB Full Speed ​​، والعثور على optocoupler PC900V ومقبس DIN-5 (MIDI) للبيع.



تخطيط اللوحة
MIDI2USB Schematics




قلب محول MIDI2USB الخاص بي هو متحكم EFM8UB20F64G 8 بت من مختبرات السيليكون. أنا أحبها حقًا وأستخدمها أينما استطعت. وحدة التحكم هذه هي خليفة (بعد تغيير العلامة التجارية) لوحدة التحكم C8051F380 ، والتي حلت محل C8051F320 الأسطوري - وهو تطور ناجح من Cygnal ، والذي اشترته SiLabs في عام 2003.



سأدرج حججي لصالح متحكم EFM8UB20F64:



  • سهولة تطوير البرامج ، والتي يتم التعبير عنها في وجود GPIO و SPI و UART و USB و PCA سريع وسهل الاستخدام ؛
  • تحسين 8051 نواة (1-2 دورات لكل تعليمات ، 48MIPS) ، تغيير التردد "على الطاير" ؛
  • منظم الجهد المدمج ، التسامح الناتج إلى + 5V ، التيار حتى 100 مللي أمبير ؛
  • مولد ساعة دقيق مدمج مع معايرة من مضيف USB (± 0.25٪) ؛
  • توافر مكتبات USBXpress و VCPXpress و USB Device API وأمثلة لبدء التشغيل السريع ؛
  • الأخطاء النقية.


إنه لمن دواعي سروري برمجة وحدة التحكم هذه ، لأن هناك عدد قليل من السجلات ويمكنك التركيز على حل مشكلة تطبيقية. للأسف ، العمليات الحسابية (خاصة 32 بت) بطيئة ، لكن EFM8 جيدة بخلاف ذلك. تطوير البرامج لأجهزة USB ليس بالمهمة السهلة. وهنا تتمثل الميزة الرئيسية لوحدات تحكم SiLabs في مكتبات USBXpress و VCPXpress و USB Device API. حتى شركة Texas Instruments تستخدم وحدات التحكم C8051F320 في لوحات SmartRF الخاصة بها.



يعد optocoupler ثاني أهم مكون في المحول. قررت استخدام Sharp PC900V لأنه هو بالضبط ما هو مذكور في مخطط مواصفات MIDI الموصى به. تتميز خصوصية جهاز optocoupler هذا بسرعة تشغيله وإيقافه (1μs و 2μs) ، فضلاً عن وجود مخرج رقمي. ولكن هناك أيضًا عيوب - الحجم الكبير للدائرة الدقيقة (7 × 10 مم) والإرهاق بنسبة 50 ٪ بعد 5 سنوات من التشغيل. لا تسمح أبعاد optocoupler بتمييز جميع المكونات على جانب واحد من اللوحة. لم أرغب أيضًا في التخلي عن موصل MIDI ، الذي كان يشغل مساحة كبيرة.



الجانب الخلفي من اللوحة مع optocoupler و LEDs.

الشكل 4 الجانب الخلفي من اللوحة مع optocoupler PC900V ومصابيح LED. الصورة من قبل المؤلف.



يتم تجميع مرحلة الإخراج وفقًا للمخطط القياسي الموصى به على شريحة منطقية 74LVC2G04 ، تتكون من عاكسين. الغرض الرئيسي من هذا المكون هو تحويل مستويات الإشارة المنطقية من 3V => 5V وتوفير تيار خرج لا يقل عن 10 مللي أمبير.



حكاية أخرى
:

- , , , , , …

. :

— - ?

— , !


تؤدي بقية المكونات وظائف إضافية ولا تؤثر بشكل كبير على تشغيل الجهاز. يمكن استبدال المقاومات والمكثفات والصمامات الثنائية ومصابيح LED بشكل معقول. بدلاً من موصل USB صغير ، يمكنك وضع micro-USB أو عمل موصل دبوس لتلحيم الكابل ، كما يفعل الصينيون. يشغل موصل MIDI مساحة كبيرة ولا يتناسب مع العلبة ، لذلك يتم استخدامه فقط في إصدار المحول بدون غلاف. يتم توجيه إشارات MIDI-IN و MIDI-OUT إلى رأس الدبوس لأسلاك الكبل. بشكل عام ، يجب تعديل موقع المصابيح والموصلات من أجل وضعها الأمثل في العلبة.





الشكل 5 تصحيح الأخطاء والإصدارات المعبأة من محول MIDI2USB. الصورة من قبل المؤلف.



إجمالي الاستهلاك الحالي لا يتجاوز 50 مللي أمبير. تتكون من الأجزاء التالية:



  • متحكم ، 15mA ؛
  • ثلاثة مصابيح LED ، 15mA (3x5mA) ؛
  • دائرة كهربائية دقيقة 74LVC2G04 ، 10 مللي أمبير ؛
  • optocoupler PC900V ، 10 مللي أمبير.


تم تصنيع ثنائي الفينيل متعدد الكلور ثنائي الطبقات من قبل الأمريكيين في OSH Park ، بسمك 1.6 مم ، نحاس 0.035 مم ، مادة FR-4.



جزء البرنامج



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



عادةً ما أستخدم Keil uVision PK51 جنبًا إلى جنب مع Configuration Wizard 2 ، وأحيانًا IAR Embedded Workbench ، ونادرًا جدًا SiLabs Simplicity Studio. كل بيئة لها مزايا وعيوب. في هذا المشروع قررت استخدام IAR لأنني أردت الحصول على "C مع الفصول". بالإضافة إلى ذلك ، يوفر مترجم IAR الوصول إلى جميع وحدات بت من سجلات النظام. على سبيل المثال ، P2_bit.B0 = 1 ؛ أو PCA0MD_bit.WDTE = 0 ؛



ليست هناك حاجة لاستخدام "الثوابت السحرية" أو تعبيرات البت متعددة المستويات المليئة بـ CMSIS أو "SI_EFM8UB2_Register_Enums.h". للأسف ، تم الإعلان عن كل هذه الوظائف في ملف ioEFM8UB20F64G.h ، والذي تبين أنه غير متوافق مع مكتبات si_toolchain.h (على سبيل المثال ، الماكرو B0..B3). لم أقم بترجمة المشروع إلى Keil uVision PK51 ، لكنني كتبت ببساطة رمز C متوافقًا لجميع بيئات التطوير.



ينقسم كود المشروع إلى عدة أجزاء وظيفية



  1. يحتوي الملف "main.c" على نقطة الإدخال ، وإعلانات المتغيرات العامة ، واستدعاء لتهيئة الأجهزة الطرفية ، وحلقة البرنامج الرئيسية.
  2. يحتوي الملف "init.c" على إعدادات تسجيل الوقت والمنافذ و UART والمقاطعات الخاصة به.
  3. يحتوي الملف descriptors.c على واصفات USB لجهاز فئة الصوت.
  4. يحتوي ملف "midi.c" على وظيفتين لتحويل رسائل MIDI إلى أحداث USB والعكس صحيح. يتم استخدام آلة الدولة.
  5. يحتوي الملف "usbconfig.h" على وحدات ماكرو وتعريفات (#define) لتكوين أوضاع تشغيل مكتبة USB Device API.


دعنا نلقي نظرة على الدالة main () مع المنافذ والأجهزة الطرفية والحلقة الرئيسية.



int main( void )
{
	WDT_Init();                             // Disable WDTimer (not used)
	PORT_Init();                            // Initialize ports (UART, LEDs)
	SYSCLK_Init();                          // Set system clock to 48MHz
	UART0_Init();                           // Initialize UART0 @31250, 8-N-1
	USBD_Init( &usbInitStruct );            // Initialize USB, clock calibrate
	LED_IN  = 1;                            // Blink LED
	LED_OUT = 1;                            // Blink LED
	IE_EA   = 1;                            // Global enable IRQ

	while(1)
	{
		//--- MIDI => USB
		if( nMidiCount > 0 )
		{
			IE_EA  = 0;                     // Begin: Critical section
			if( USB_STATUS_OK==USBD_Write(EP1IN,aMidiBuffer,nMidiCount,false) )
			{
				nMidiCount = 0;             // Reset MIDI data byte counter
			}
			IE_EA  = 1;                     // End of: Critical section
			LED_IN = 0;                     // Turn off input LED
		}

		//--- USB => MIDI
		if( nUsbCount )
		{
			uint8_t i;
			LED_OUT = 1;                    // Turn on Led on New packet
			for(i = 0; i < nUsbCount; i++)  // Process every data byte
			{
				USB2MIDI( aUsbBuffer[i] );  // Convert USB packet into MIDI
			}
			nUsbCount = 0;                  // Reset counter
			USBD_Read(EP2OUT, aUsbBuffer, sizeof(aUsbBuffer), true);
			LED_OUT = 0;                    // Turn off Led, when done
		}
	}
}


تتكون مكتبة SiLabs لأجهزة USB من مجموعة من الإجراءات الفرعية التي تم تجميعها وتضمينها في المشروع اعتمادًا على الإعدادات الموجودة في ملف “usbconfig.h”. هذا مشابه جدًا لمكتبة "libusb، V-USB" الموجودة في رمز المتحكمات الدقيقة من Atmel (الآن Microchip). وتجدر الإشارة إلى أن SiLabs بها مكتبة جيدة ومريحة من وجهة نظر المبرمج.



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



كود مع الواصفات
SI_SEGMENT_VARIABLE
(usbDeviceDesc[], const USB_DeviceDescriptor_TypeDef, SI_SEG_CODE) =
{
	USB_DEVICE_DESCSIZE,               // bLength, 18 bytes
	USB_DEVICE_DESCRIPTOR,             // bDescriptorType, 1
	htole16(0x0110),                   // bcdUSB Ver, 1.10
	0x00,                              // bDeviceClass, 0 for Audio
	0x00,                              // bDeviceSubClass, 0 for Audio
	0x00,                              // bDeviceProtocol, 0 for Audio
	SLAB_USB_EP1IN_MAX_PACKET_SIZE,    // bMaxPacketSize0, 64 bytes
	htole16(0x1209),                   // idVendor, Free GPL (SiLabs 0x10C4)
	htole16(0x7522),                   // idProduct
	htole16(0x0100),                   // bcdDevice, 1.00
	0x01,                              // iManufacturer string
	0x02,                              // iProduct string
	0x03,                              // iSerialNumber (no serial string)
	0x01                               // bNumConfigurations
};


جميع الواصفات والطوبولوجيا والمصطلحات موصوفة بالتفصيل وبالتفصيل في معيار "Universal Serial Bus Device Class Definition for MIDI Devices" . وللبداية السريعة والانغماس في الموضوع ، يكفي دراسة المعلومات التي توفرها برامج "usbview.exe" من Windows Driver Kit 7600 أو "USB Descriptor Dumper" . شيء يمكنك حتى نسخه إلى برنامجك.





الشكل 6 معلومات حول الواصفات في برنامج "usbview.exe" الواصفات



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



انتبه إلى حقلي Vendor_ID و Product_ID في بنية واصف الجهاز. هذا زوج من الأرقام لتعريف جهاز USB بشكل فريد. للحصول على هذا الرقم لجهازك ، تحتاج إلى دفع أموال إلى مؤسسة USB-IF أو إرسال طلب إلى مالك Vendor_ID الحالي (الشركة المصنعة لوحدة التحكم الدقيقة) والحصول على Product_ID. ويمكنك ، على سبيل المثال ، مثل الصينيين استخدام VID و PID الأكثر ملاءمة للآخرين. بالنسبة للمشاريع مفتوحة المصدر ، هناك خيار للحصول على Product_ID مجانية .



هناك نقطة أخرى يجب الانتباه إليها عند تطوير أجهزة USB لفئة صوت MIDI المتدفقة وهي الموصلات (Jack). الموصلات عبارة عن كيانات وهمية (افتراضية) لوصف الهيكل والوصلات بين الجهاز والمضيف. هم المدخلات (In Jack) والإخراج (Out Jack) والداخلي (Embedded) والخارجي (الخارجي). كل موصل له Jack_Id فريد (رقم من 0 إلى 15). تحتوي موصلات الإخراج على رقم معرف المصدر ، أي رقم الموصل للاتصال. أخيرًا ، تعمل نقاط النهاية الصوتية (EP) أعلى القنوات المشكلة (تدفقات الإدخال والإخراج). هذه EPs مجمعة عادية تحتوي على معلومات ربط الموصل في واصفاتها.



الرافعات المدمجة والخارجية

الشكل: 7 مقابس وتيارات افتراضية إلى USB (فئة MIDI).



واصفات MIDI جاك
	// EMB:  IN Jack #1 <-----> EXT: OUT Jack #4
	// EMB: OUT Jack #3 <-----> EXT:  IN Jack #2

	//--- Class-Specific MS Interface Header Descriptor, p.40
	USB_MIDI_INTERFACE_DESCSIZE,       // bLength, 7 bytes
	USB_CS_INTERFACE_DESCRIPTOR,       // bDescriptorType, 0x24
	MIDI_CS_IF_HEADER,                 // bDescriptorSubtype, 0x01
	0x00,                              // bcdADC(LSB)
	0x01,                              // bcdADC(MSB), 0x0100 (version)
	0x41,                              // wTotalLength(LSB), 65 bytes
	0x00,                              // wTotalLength(MSB)

	//--- MIDI IN JACK EMB(it connects to the USB OUT Endpoint), p.40
	USB_IN_JACK_DESCSIZE,              // bLength, 6 bytes
	USB_CS_INTERFACE_DESCRIPTOR,       // bDescriptorType, 0x24
	MIDI_CS_IF_IN_JACK,                // bDescriptorSubtype, 0x02
	MIDI_JACK_TYPE_EMB,                // bJackType, 0x01 (embedded)
	1,                                 // bJackID, #1
	0,                                 // Jack string descriptor, unused
	//--- MIDI IN JACK EXT, p.40
	USB_IN_JACK_DESCSIZE,              // bLength, 6 bytes
	USB_CS_INTERFACE_DESCRIPTOR,       // bDescriptorType, 0x24
	MIDI_CS_IF_IN_JACK,                // bDescriptorSubtype, 0x02
	MIDI_JACK_TYPE_EXT,                // bJackType, 0x02 (external)
	2,                                 // bJackID, #2
	0,                                 // Jack string descriptor, unused

	//--- MIDI OUT JACK EMB (connects to IN Endpoint), p.41
	USB_OUT_JACK_DESCSIZE,             // bLength, 9 bytes
	USB_CS_INTERFACE_DESCRIPTOR,       // bDescriptorType, 0x24
	MIDI_CS_IF_OUT_JACK,               // bDescriptorSubtype, 0x03
	MIDI_JACK_TYPE_EMB,                // bJackType, 0x01
	3,                                 // bJackID
	1,                                 // bNrInputPins
	2,                                 // baSourceID, this <=> Jack #2
	1,                                 // baSourcePin
	0,                                 // iJack, unused
	//--- MIDI OUT JACK EXT, p.41
	USB_OUT_JACK_DESCSIZE,             // bLength, 9 bytes
	USB_CS_INTERFACE_DESCRIPTOR,       // bDescriptorType, 0x24
	MIDI_CS_IF_OUT_JACK,               // bDescriptorSubtype, 0x03
	MIDI_JACK_TYPE_EXT,                // bJackType, 0x02
	4,                                 // bJackID
	1,                                 // bNrInputPins
	1,                                 // baSourceID, this <=> Jack #1
	1,                                 // baSourcePin
	0,                                 // iJack, unused




يتكون تبادل البيانات في جهاز صوتي من فئة USB MIDI من إرسال حزم 32 بت (حزمة أحداث USB-MIDI). يتم استلام رسائل بحجم 1 أو 2 أو 3 بايت من جهاز MIDI. عند النقل عبر USB ، تتم إضافة بايت رأس برقم كبل ورمز أمر إلى هذه البايتات. إذا كانت الحزمة أقل من 4 بايت ، فستكون مبطن بـ 0. في إصدار البرنامج الثابت الحالي ، لا أقوم بتعبئة الأصفار حتى حد 32 بت. إنها تعمل. السؤال لا يزال مفتوحا.



على سبيل المثال ، في الكبل رقم 1 ، يتم تحويل الأمر بالضغط على مفتاح "ملاحظة عند التشغيل" (وقت الإرسال 960us) إلى الحزمة التالية:

MIDI: 0x90 0x60 0x7f => USB: 0x19 0x90 0x60 0x7f


حزمة حدث USB-MIDI

الشكل 8 مخطط حزمة أحداث USB-MIDI من مواصفات USB.



typedef union
{
	struct PACKET
	{
		uint8_t  cable : 4;            // Cable Number (we use #0)
		uint8_t  cin   : 4;            // Code Index Number (cmd: 0x08)
		uint8_t  cmd;                  // MIDI command (status byte)
		uint8_t  data1;                // MIDI data byte #1
		uint8_t  data2;                // MIDI data byte #2
	};
	uint8_t buffer[sizeof(struct PACKET)];
} MIDI_EVENT_PACKET;


يتم إجراء التحويل المباشر والعكسي بواسطة وظائف MIDI2USB () و USB2MIDI () . في هذه الوظائف ، يتم استخدام آلة الحالة ، عندما تنتقل الوظيفة ، مع وصول بيانات الإدخال ، من حالة الخمول (IDLE) إلى حالة تلقي الأوامر (STATUS) ، ثم إلى حالة استقبال البيانات (DATA) ، وأخيراً إرسال البيانات مع العودة إلى حالتها الأصلية التوقعات.



في بروتوكول MIDI ، تكون وحدات بايت البيانات بشكل أساسي 7 بت (0. 127). لديهم دائمًا أهم 8 بتات مضبوطة على 0. الأوامر (بايت الحالة) ، على العكس من ذلك ، تأتي دائمًا مع مجموعة البت الأكثر أهمية على 1 ، أي لها قيم من 128 إلى 255.



أنواع بايت MIDI

الشكل. 9 أنواع البايت في بروتوكول MIDI.



نكتة حول سعة الأرقام للأرقام
:

— , ?

— H, .

— , 11-22-33?

— H, 11-22-34.

— H ! , !


جميع المخططات ورموز المصدر ، بالإضافة إلى البرامج الثابتة النهائية موجودة في مستودع git الخاص بي . رخصة MIT.



البرمجيات



بعد تثبيت اللوحة ، يجب برمجة المتحكم الدقيق. للقيام بذلك ، يمكنك استخدام إما محول تصحيح الأخطاء SiLabs C2 الخاص / نسخة ، أو J-Link v10 + (مع دعم EFM8) ، أو أداة تحميل التشغيل التي تومض في المصنع (مراجعة Rev-B) ، أو أخيرًا ، Arduino مع برنامج نصي مناسب. لفحص وتصحيح رسائل MIDI ، تعد MIDI-OX مساعدة كبيرة .



MIDI-OX

الشكل 10 واجهة برنامج MIDI-OX.



إذا كنت تعمل مع Cubase ، فيجب عليك تثبيت برامج تشغيل Asio ، لأنه عند استخدام DirectSound و DirectInput ، هناك تأخير بين الضغط على مفتاح وتشغيل الملاحظة. لا يرتبط وقت الاستجابة بالأجهزة وهو ميزة لتطبيق نظام التشغيل. بشكل عام ، يؤدي الجهاز وظائفه بشكل مثالي باستخدام أداة Casio CDP-100.



تكوين Cubase MIDI

الشكل 11 واجهة Cubase 5.



أنتج البرنامج الثابت التجريبي أكبر تدفق ممكن من الملاحظات وأوامر MIDI الأخرى. كان النشاز رهيبًا ، لكن كل شيء سار على النحو المنشود. ومع MuseScore 3.2 يمكنك تسجيل وتشغيل ملفات منتصف.



النكتة الأخيرة
1990-. . — . . :

— , !

— , ! — !

— ! !

— … . !

— ! !

. . , , , … . , . :

— , , ?


نتائج العمل



المحول يعمل! يبدو أنني تمكنت من إنشاء محول MIDI جيد إلى USB. بالنسبة لجهازي ، استخدمت علبة وبعض الأجزاء والكابلات من محول صيني. انتهى موصل USB الصغير بعمق في العلبة واضطررت إلى إعادة كبل USB والعمل مع ملف. المصابيح ، وإن كانت بزاوية ، تتناسب بإحكام مع الثقوب. يجب تعديل اللوحة للحالة الصينية.



كابل USB صغير

الشكل: 12. قابس USB صغير مفكك مضغوط.



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



روابط مفيدة





شكرآ لك على أهتمامك.



All Articles