मैं ओएस एक्स पर CoreMIDI के लिए एक रैपर के रूप में आरटीएमडीआई का उपयोग करके एक ऐप से एमआईडीआई संदेश भेजने वाले एक छोटे से हैक पर काम कर रहा हूं। मैं RtMidiOut::openVirtualPort("MyAwesomePort")
का उपयोग करता हूं, इसलिए मैं अपने ऐप को डीएडब्ल्यू में इनपुट स्रोत के रूप में चुन सकता हूं।MIDISourceCreate() से वर्चुअल MIDI स्रोत की विशिष्टता को आप कैसे बनाए रखते हैं?
हालांकि, यदि मेरा प्रोग्राम बंद हो जाता है और मैं इसे फिर से खोलता हूं, तो मेरा डीएडब्ल्यू उसी नाम के बावजूद इनपुट डिवाइस को उसी पोर्ट के रूप में नहीं पहचानता है।
मैं मूल रूप से पाइरमिटिडी का उपयोग कर रहा था, इसलिए सीटीएस में व्यवहार लेखन को सीधे आरटीएमडी के साथ चला गया और सत्यापित किया। इस मामले में "माई डीएडब्ल्यू" रीपर 4 है, लेकिन मैंने प्रो टूल्स, लॉजिक और मुलाब में व्यवहार को दोहराया है।
मुझे पता है कि वर्चुअल मिडी पोर्ट की कुछ विशिष्टता बरकरार रखना संभव है, क्योंकि MidiKeys व्यवहार करता है जैसा कि मैं अपने आवेदन को व्यवहार करना चाहता हूं: मेरे डीएडब्ल्यू इसे याद करते हैं, भले ही मिडीकी बंद हो जाए और फिर भी खुल जाए, जबकि मेरा डीएडब्ल्यू अभी भी चल रहा है ।
तो मैंने आरटीएमआईडीआई स्रोत में खोद दिया, और कोरमिडी रैपर काफी सरल लग रहा था। MIDISourceCreate
के लिए पूछता है कि एक स्ट्रिंग है। क्लाइंट पैरामीटर (जो दस्तावेज़ों को ब्राउज़ करने के बाद मुझे लगता है) मेरे आवेदन के लिए एक पहचानकर्ता है, यह CoreMIDI सेवाओं का एक ग्राहक है।
void RtMidiOut :: openVirtualPort(std::string portName)
{
CoreMidiData *data = static_cast<CoreMidiData *> (apiData_);
if (data->endpoint) {
errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!";
error(RtError::WARNING);
return;
}
// Create a virtual MIDI output source.
MIDIEndpointRef endpoint;
OSStatus result = MIDISourceCreate(data->client,
CFStringCreateWithCString(NULL, portName.c_str(), kCFStringEncodingASCII),
&endpoint);
if (result != noErr) {
errorString_ = "RtMidiOut::initialize: error creating OS-X virtual MIDI source.";
error(RtError::DRIVER_ERROR);
}
// Save our api-specific connection information.
data->endpoint = endpoint;
}
तो मैं MIDISourceCreate प्रलेखन को देखा है, और इस पढ़ें:
एक आभासी स्रोत बनाने के बाद, यह एक अच्छा विचार है यह निर्दिष्ट करने के लिए एक ही अद्वितीय ID पिछली बार आपके आवेदन यह बनाई गई थी। (हालांकि आपको टकराव की संभावना की स्थिति में असफल होने के लिए तैयार रहना चाहिए।) यह अन्य क्लाइंट को आपके वर्चुअल स्रोत पर लगातार संदर्भ बनाए रखने की अनुमति देगा।
ऐसा लगता है कि मैं वास्तव में क्या देख रहा हूं। सिवाय मुझे नहीं पता कि स्रोत को एक अद्वितीय आईडी कैसे असाइन करें। MIDISourceCreate
के लिए आउट पैरामीटर MIDIEndpointRef
है, जो दस्तावेज़ों के अनुसार लाइन के नीचे UInt32
पर टाइप किया गया है। तो मैंने अनुमान लगाया कि शायद मुझे इस UInt32 का ट्रैक रखना चाहिए, लेकिन यह एक बुरा विचार की तरह लगता है।
इस सब के माध्यम से खोदने के बाद मुझे लगता है कि मैं एक ईंट की दीवार को मार रहा हूं। मैं अपने एमआईडीआई बंदरगाह की विशिष्टता को अपने आवेदन के रनों के बीच कैसे बनाए रखूं?
आह, तो वह वही था। मैं इस सप्ताह के अंत में एक परीक्षा दे दूंगा। धन्यवाद! –