2011-05-12 14 views
6

के साथ सिंक्रनाइज़ेशन मैंने एक प्रोजेक्ट का एक स्टैंडअलोन ऐप संस्करण बनाया है जो अब तक केवल एक VST/audiounit था। मैं rtaudio के माध्यम से ऑडियो समर्थन प्रदान कर रहा हूं।रीयलटाइम मिडी इनपुट और ऑडियो

मैं rtmidi का उपयोग करके MIDI समर्थन जोड़ना चाहता हूं लेकिन यह मुझे स्पष्ट नहीं है कि ऑडियो और MIDI भागों को सिंक्रनाइज़ कैसे करें।

वीएसटी/ऑडिओटिट भूमि में, मुझे MIDI ईवेंट में उपयोग किया जाता है जिसमें ऑडियो ब्लॉक की शुरुआत से नमूनों में उनके ऑफसेट का संकेत मिलता है।

आरटीएमडीआई पिछले कार्यक्रम के बाद से सेकंड में डेल्टा समय प्रदान करता है, लेकिन मुझे यकीन नहीं है कि मुझे उन घटनाओं को कैसे पकड़ना चाहिए और मैं ऑडियो थ्रेड में वर्तमान नमूने के संबंध में अपना समय कैसे काम कर सकता हूं।

प्लगइन होस्ट यह कैसे करते हैं?

मैं समझ सकता हूं कि प्लेबैक पर ईवेंट कैसे नमूना सटीक हो सकते हैं, लेकिन यह स्पष्ट नहीं है कि रीयलटाइम इनपुट का उपयोग करते समय वे नमूना सटीक कैसे हो सकते हैं।

rtaudio मुझे कॉलबैक फ़ंक्शन देता है। मैं कम ब्लॉक आकार (32 नमूने) पर चलाऊंगा। मुझे लगता है कि मैं एक पॉइंटर को आरटीएमआईडीआई इंस्टेंस में कॉलबैक के उपयोगकर्ताडाटा भाग के रूप में पास कर दूंगा और फिर midiin-> getMessage (संदेश) पर कॉल करें; ऑडियो कॉलबैक के अंदर, लेकिन मुझे यकीन नहीं है कि यह धागा-समझदार है या नहीं।

बहुत धन्यवाद कोई सुझाव के लिए तुम मुझे

+0

MIDI कभी नमूना सटीक नहीं होगा, और न ही इसे होने की आवश्यकता है। MIDI डेटा अपेक्षाकृत धीमी है। – Brad

उत्तर

5

दे सकते हैं आपके मामले में, आप इसके बारे में चिंता करने की जरूरत नहीं है। आपके कार्यक्रम को MIDI ईवेंट को प्लगइन में भेजना चाहिए जैसे ही वे पहुंचते हैं शून्य के टाइमस्टैम्प के साथ। मुझे लगता है कि आपने शायद "नमूना सटीक" होने का क्या अर्थ है, इसके पीछे विचार को गलत समझा है।

जैसा कि @Brad ने आपके प्रश्न पर अपनी टिप्पणी में उल्लेख किया है, MIDI वास्तव में बहुत धीमी है। लेकिन यह समस्या का एकमात्र हिस्सा है ... जब आप ब्लॉक-आधारित वातावरण में काम कर रहे हैं, तो आने वाली एमआईडीआई घटनाओं को ब्लॉक की शुरुआत तक प्लगइन द्वारा संसाधित नहीं किया जा सकता है। जब कंप्यूटर धीमे थे और 512 (या भगवान forbid,> 1024) के ब्लॉक आकार सामान्य थे, इसने विलंबता की एक गैर-तुच्छ राशि प्रस्तुत की जिसके परिणामस्वरूप व्यवस्था "तंग" के रूप में नहीं लग रही थी। इसलिए अनुक्रमक इस समस्या को हल करने के लिए एक चालाक तरीके से आए। चूंकि MIDI ईवेंट पहले से ही पहले से ज्ञात हैं, इसलिए इन घटनाओं को नमूना फ्रेम में ऑफ़सेट के साथ उपकरण को एक ब्लॉक में भेजा जा सकता है। प्लगइन तब ब्लॉक की शुरुआत में इन घटनाओं को प्राप्त करता है, और जानता है कि N नमूने पास होने तक वास्तव में उन्हें प्रसंस्करण शुरू नहीं करना है। अनुक्रमकों में "नमूना सटीक" का अर्थ यही है।

हालांकि, यदि आप कीबोर्ड या किसी अन्य प्रकार के अन्य MIDI डिवाइस से लाइव इनपुट से निपट रहे हैं, तो इन घटनाओं को "शेड्यूल" करने का कोई तरीका नहीं है। असल में, जब तक आप उन्हें प्राप्त करते हैं, घड़ी पहले ही टिक रही है! इसलिए इन घटनाओं को सिर्फ अगले ब्लॉक की शुरूआत में प्लगइन पर भेजा जाना चाहिए। 0 के ऑफसेट के साथ सीक्वेंसर जैसे कि एबलेटन लाइव, जो प्लगइन को एक साथ अनुक्रमित और लाइव इवेंट दोनों प्राप्त करने की इजाजत देता है, बस किसी भी लाइव इवेंट भेजें 0 फ्रेम के ऑफसेट के साथ।

चूंकि आप बहुत छोटे ब्लॉक आकार का उपयोग कर रहे हैं, इसलिए सबसे खराब स्थिति परिदृश्य .7ms की विलम्ब है, जो बिल्कुल भी बुरा नहीं है। आरटीएमआईडीआई के मामले में, टाइमस्टैम्प एक ऑफसेट का प्रतिनिधित्व नहीं करता है जिसे आपको चारों ओर शेड्यूल करने की आवश्यकता होती है, बल्कि उस समय के दौरान जिस घटना को पकड़ा गया था। लेकिन चूंकि आप केवल लाइव इवेंट प्राप्त करने का इरादा रखते हैं (आप एक अनुक्रमक लिख रहे हैं, है ना?), आप बस किसी भी आने वाली MIDI को प्लगइन में पास कर सकते हैं।

+0

धन्यवाद निक, यह स्पष्ट बनाता है। मुझे यह काम मिल गया – olilarkin

संबंधित मुद्दे