यकीन है कि आप कर सकते हैं, यह "अच्छा" लगने के लिए सिर्फ तुच्छ नहीं है।
मुझे नहीं पता कि लिनक्स में यह कैसे करना है, लेकिन अगर आप एक पीसीएम बफर खेल सकते हैं, तो आपको बस इतना करना होगा कि आप जो चाहें उसे भर दें।
तो मान लीजिए कि आपका बफर मोनोरल में खेलने के लिए सेट है, 16-बिट नमूनों पर हस्ताक्षर किए हैं, प्रति सेकंड 44100 नमूनों पर, शुद्ध (साइनसोइडल) A4 ध्वनि (440 हर्ट्ज) बनाना उतना ही सरल है
int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
float theta = ((float)i / sampling_ratio) * PI;
buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
हालांकि, यह ध्वनि संभवतः आपके हितों के लिए बहुत नीरस है, इसलिए आपको कुछ अधिक जटिल चीजें करनी होंगी। सामान्य तौर पर, ध्वनि संश्लेषण दो प्रकार के होते हैं: एडिटिव और सबट्रैक्टिव । कई अन्य हैं, लेकिन ये दोनों शायद सबसे सरल हैं। आज मैं सिर्फ योगात्मक संश्लेषण के बारे में बात करूंगा।
योगात्मक संश्लेषण के लिए, आप वही काम करते हैं जैसा मैंने अभी किया था, लेकिन एक आयाम में केवल एक आवृत्ति का उपयोग करने के बजाय, आप कई तरंगों को एक साथ जोड़ते हैं। यह एक ही समय में एक पियानो पर कई चाबियाँ दबाने की तरह है। तो आप इस तरह से कुछ देखने के लिए अपने कोड को संशोधित करते हैं:
void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
for (int i = 0; i < buffer_length; i++)
{
float theta = ((float)i / sampling_ratio) * M_PI;
// make sure to correct for overflows and underflows
buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
}
और फिर इसे इस तरह उपयोग करें:
int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);
वैसे, मैंने अपने आवृत्तियों हो रही है यहाँ (मैं उपयोग कर रहा हूँ बराबर स्वभाव है, लेकिन देखते हैं बहुत सारे के अन्य उपलब्ध समस्वरीकरण)।
ध्यान दें कि अब तक मैं केवल साइन तरंगों का उपयोग कर रहा हूं, लेकिन पुराने सिंथेसाइज़र भी वर्ग , त्रिकोणीय और आरा तरंगों का समर्थन करते हैं , प्रत्येक अपने स्वयं के दिलचस्प ध्वनि गुणों के साथ। इन्हें लागू करना बहुत सीधा है।
आपके द्वारा बनाई जा सकने वाली ध्वनियों की विविधता बढ़ाने के लिए आप अन्य चीजें कर सकते हैं:
- आयाम मॉडुलन : पूरे बफर में तरंग के आयाम को बदलना
- फ़्रिक्वेंसी मॉड्यूलेशन : पूरे बफर में तरंग की आवृत्ति को बदलना
- Reverb : बफर में अपने आकार और स्थिति को बदलकर एक नमूना दोहराएं। यह एक बहुत ही जटिल विषय है।
- लिफाफा : इसे और अधिक जीवन देने के लिए एक नमूने के आयाम को बदलना
यहाँ मुद्दा यह है कि तकनीकें स्वयं बहुत कठिन नहीं हैं, इसलिए आपको वास्तव में उन्हें आपके लिए सार करने के लिए एक पुस्तकालय की आवश्यकता नहीं है। यह उनका उपयोग करना है जो दिलचस्प लगता है कि मुश्किल क्या है।
एक अंतिम नोट। इस तरह से ध्वनि के साथ प्रयोग करने पर, अपने डेटा को WAV फ़ाइलों में सहेजने के लिए वास्तव में उपयोगी हो सकता है, और फिर उन्हें ऑडेसिटी के कुछ सॉफ़्टवेयर में विज़ुअलाइज़ किया जा सकता है। इस तरह आप देख सकते हैं कि आप और अधिक स्पष्ट रूप से क्या कर रहे हैं।