سؤال

لقد كتبت تطبيق وحدة التحكم MIDI بسيطة في C ++. هذا كل شيء:

#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void CALLBACK midiInputCallback(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
 switch (wMsg) {
  case MIM_MOREDATA:
  case MIM_DATA:
   cout << dwParam1 << " ";
   PlaySound("jingle.wav", NULL, SND_ASYNC | SND_FILENAME);
   break;
 }
}
int main() {
 unsigned int numDevs = midiInGetNumDevs();
 cout << numDevs << " MIDI devices connected:" << endl;
 MIDIINCAPS inputCapabilities;
 for (unsigned int i = 0; i < numDevs; i++) {
  midiInGetDevCaps(i, &inputCapabilities, sizeof(inputCapabilities));
  cout << "[" << i << "] " << inputCapabilities.szPname << endl;
 }
 int portID;
 cout << "Enter the port which you want to connect to: ";
 cin >> portID;
 cout << "Trying to connect with the device on port " << portID << "..." << endl;
 LPHMIDIIN device = new HMIDIIN[numDevs];
 int flag = midiInOpen(&device[portID], portID, (DWORD)&midiInputCallback, 0, CALLBACK_FUNCTION);
 if (flag != MMSYSERR_NOERROR) {
  cout << "Error opening MIDI port." << endl;
  return 1;
 } else {
  cout << "You are now connected to port " << portID << "!" << endl;
  midiInStart(device[portID]);
 }
 while (1) {}
}

يمكنك أن ترى أن هناك وظيفة رد اتصال للتعامل مع رسائل MIDI الواردة من الجهاز. هنا وصف هذه الوظيفة على MSDN. في تلك الصفحة يقولون إن معنى dwParam1 و dwParam2 يتم تحديدها إلى messageType (wMsg)، مثل MIM_DATA.

إذا بحثت عن وثائق MIM_DATA, ، أستطيع أن أرى أنها كلمة مزدوجة (DWORD؟) وأنها لها "كلمة عالية" و "كلمة منخفضة". كيف يمكنني الآن الحصول على بيانات مثل اسم عنصر التحكم على جهاز MIDI الذي أرسل البيانات وما هي القيمة التي يرسلها؟

سأكون ممتنًا إذا تمكن شخص ما من تصحيح الكود الخاص بي إذا كان يمكن القيام به بشكل أفضل.

شكرًا :)

هل كانت مفيدة؟

المحلول

للوصول إلى البيانات التي تحتاج إلى استخدامها dwParam1 و dwParam2 واتصل وحدات الماكرو HIWORD و LOWORD للحصول على الكلمة العالية والمنخفضة منهم. الاستخدام على التوالي HIBYTE و LOBYTE لإخراج البيانات من هذه الكلمات. في حالة MIM_DATA, ، لسوء الحظ ، هذه بيانات MIDI المشفرة ، لذلك يتعين عليك العثور على المعاني المحددة لهيئة -تم توثيقها هنا - رسائل MIDI.

ومع ذلك ، فإن الكود الخاص بك لديه مشكلة محتملة - كما نقرأ في صفحات MSDN:

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

وأنت تتصل بمسرحيات في رد الاتصال ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top