ऑडियो प्लगइन्स बनाना, भाग 4

श्रृंखला में सभी पोस्ट:
भाग 1. परिचय और सेटअप
भाग 2. कोड सीखना
भाग 3. वीएसटी और एयू
भाग 4. डिजिटल विरूपण
भाग 5. प्रीसेट और जीयूआई
भाग 6. सिग्नल संश्लेषण
भाग 7. मिडी संदेश प्राप्त करना
भाग 8. आभासी कीबोर्ड
भाग 9. लिफाफे
भाग 10. जीयूआई में सुधार
भाग 11. फ़िल्टर
भाग 12. कम आवृत्ति वाला थरथरानवाला
भाग 13. नया स्वरूप
भाग 14. पॉलीफोनी 1
भाग 15. पॉलीफोनी 2
भाग 16. एंटीलियासिंग



यह हमारा पहला प्लगइन लिखना शुरू करने का समय है। यह एक गंदे डिजिटल विरूपण होगा। अधिक विशेष रूप से, प्लगइन बस ऑडियो सिग्नल के आयाम में चोटियों को ट्रिम करेगा।

डिजिटल विरूपण



एक निश्चित सीमा से अधिक होने वाले सिग्नल मान सीमित होंगे ताकि वे इसके पार न जाएं:



"अधिक" कहने से मेरा मतलब है "एक निश्चित सकारात्मक सीमा से अधिक या एक निश्चित नकारात्मक सीमा से नीचे गिरना"।

अच्छी पुरानी duplicate स्क्रिप्ट का उपयोग करके, आप किसी भी प्रोजेक्ट को एक नया नाम देकर कॉपी कर सकते हैं। और हमें उन सभी परिवर्तनों को करने की ज़रूरत नहीं है जो मैंने प्रत्येक नई परियोजना के लिए पहले वर्णित किए थे।
एक टर्मिनल खोलें, इसमें IPlugExamples निर्देशिका पर जाएं और इसे दर्ज करें:

./duplicate.py MyFirstPlugin/ DigitalDistortion YourName

यदि आपने पिछली पोस्ट नहीं पढ़ी हैं, तो उनके परिणाम यहां से डाउनलोड किए जा सकते हैं । यदि आप एक मैक पर ऐसा करते हैं, तो सुनिश्चित करें कि Xcode में कोई अन्य परियोजनाएं नहीं हैं। हौसले से बनाई गई DigitalDistortion फ़ोल्डर में DigitalDistortion.xcodeproj फ़ाइल है। इसे खोलें, जांचें कि एपीपी लक्ष्य विधानसभा त्रुटियों के बिना शुरू होती है। स्कीमा संपादित करें जैसा कि मैंने पहले बताया था ताकि REAPER VST और AU के लिए चलता रहे। यह मत भूलो कि लॉन्च पर पास किए गए तर्क वांछित .rpp फ़ाइल को इंगित करें।

अब REAPER शुरू करते समय, यह MyFirstPlugin को लोड नहीं करता है, लेकिन DigitalDistomy । चमत्कार। ऐसा इसलिए है क्योंकि REAPER में प्रोजेक्ट फाइलें केवल संरचित पाठ फाइलें होती हैं जिसमें duplicate स्क्रिप्ट को सभी "MyFirstPlugin" को "DigitalDistortion" से बदल दिया जाता है।

पहले mGain के mGain पैरामीटर का नाम बदलें। DigitalDistortion.h खोलें और private चर का नाम बदलें:

 private: double mThreshold; 


अब DigitalDistortion.cpp में, Threshold साथ सामना किया गया (Cmd + Alt + F) बदलें। जब कोडांतरण, कोई त्रुटि पॉप अप नहीं होनी चाहिए निर्माणकर्ता में, पैरामीटर इनिशियलाइज़ेशन लाइन में, न्यूनतम मान के रूप में 0.01 और डिफ़ॉल्ट मान के रूप में 100.0 निर्दिष्ट करें:

 GetParam(kThreshold)->InitDouble("Threshold", 100.0, 0.01, 100.0, 0.01, "%"); 


अब डिजिटल सिग्नल प्रोसेसिंग को सीधे लिखते हैं:

 void DigitalDistortion::ProcessDoubleReplacing( double** inputs, double** outputs, int nFrames) { // Mutex is already locked for us. int const channelCount = 2; for (int i = 0; i < channelCount; i++) { double* input = inputs[i]; double* output = outputs[i]; for (int s = 0; s < nFrames; ++s, ++input, ++output) { if(*input >= 0) { // Make sure positive values can't go above the threshold: *output = fmin(*input, mThreshold); } else { // Make sure negative values can't go below the threshold: *output = fmax(*input, -mThreshold); } } } } 


यदि कोई त्रुटि fmin कि fmin और fmax परिभाषित नहीं fmax , तो उन्हें केवल min और max करने का नाम बदलने का प्रयास करें। यदि यह मदद नहीं करता है, तो DigitalDistortion.cpp के हेडर में निम्नलिखित जोड़ें:

 #include <math.h> 


यदि यह समस्या हल नहीं करता है, तो इसे पिछली पंक्ति के बजाय जोड़ें:

 #include <algorithm> 


और fmin को std::min साथ बदलें, और fmax को std::max साथ बदलें।

इस तथ्य के बावजूद कि channelCount मान हार्ड-कोडेड है, हमने चैनलों पर पुनरावृति करने के लिए लूप के लिए बाहरी का उपयोग करके कुछ अतिरेक को हटा दिया। यही है, पहले प्लगइन एक चैनल से कई नमूनों को संसाधित करता है, और फिर दूसरे के नमूनों के साथ भी ऐसा ही करता है।
if साथ सशर्त एक दिलचस्प बिंदु है। आयाम के सकारात्मक मूल्यों के लिए, हम दो में से छोटे का चयन करते हैं: या तो इनपुट मूल्य या सीमा। नकारात्मक लोगों के लिए, इसके विपरीत, हम बड़े को चुनते हैं: या तो *input या एक नकारात्मक सीमा मूल्य। संक्षेप में, हम हमेशा उस मूल्य को चुनते हैं जो शून्य के करीब है।
REAPER में प्लगइन लॉन्च करें और इसे टेस्ट साउंड पर ड्राइव करें। जब घुंडी को दाईं ओर मोड़ दिया जाता है, तो एक स्पष्ट ध्वनि सुनाई देगी। जितना अधिक नॉब वामावर्त रूप से मुड़ता है, उतना ही विकृत संकेत बन जाता है।
जैसे ही विकृति बढ़ती है, सिग्नल शांत हो जाता है - यह इसलिए है क्योंकि हम थ्रेशोल्ड वैल्यू को करीब और शून्य के करीब ले जाते हैं, और, तदनुसार, कभी शांत मूल्यों के आयाम को काट देते हैं। इसकी भरपाई के लिए, इनपुट मूल्य को एक सीमा से विभाजित करें:

 if(*input >= 0) { *output = fmin(*input, mThreshold); } else { *output = fmax(*input, -mThreshold); } *output /= mThreshold; 


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

अब तक, मैं जानबूझकर डिजिटल सिग्नल प्रोसेसिंग के जंगल में नहीं जाने का प्रयास करता हूं। मेरी राय में, एक अच्छा प्लगइन सिर्फ सिग्नल प्रोसेसिंग एल्गोरिदम नहीं है। यह एक मिश्रण है जिसमें शामिल है



इसलिए अगली पोस्ट में ध्वनि प्रसंस्करण एल्गोरिदम में गोता लगाने से पहले हम प्रीसेट और एक अधिक सुखद इंटरफ़ेस जोड़ते हैं।

मूल लेख:
martin-finke.de/blog/articles/audio-plugins-005-digital-distortion

Source: https://habr.com/ru/post/In225751/


All Articles