.wav

2012-02-06 15 views
11

पर ध्वनि रिकॉर्ड करने के लिए रूबी में पोर्टऑडियो डिपर का उपयोग करके मैं हाल ही में रूबी के साथ खेल रहा हूं, और मैंने एक रूबी स्क्रिप्ट लिखने के लिए एक सरल प्रोजेक्ट शुरू करने का निर्णय लिया जो .wav फ़ाइल में लाइन-इन ध्वनि रिकॉर्ड करता है। मैंने पाया कि रूबी हार्डवेयर उपकरणों (और शायद यह नहीं होना चाहिए) तक बहुत अच्छी पहुंच प्रदान नहीं करता है, लेकिन पोर्टऑडियो ऐसा करता है, और मैंने पीए here के लिए एक महान रैपर खोजा (यह एक मणि नहीं है, मुझे लगता है क्योंकि यह रूबी का उपयोग करता है PortAudio से जुड़ने के लिए ffi, और पीए लाइब्रेरी विभिन्न स्थानों में हो सकती है)। मैं पोर्टऑडियो के दस्तावेज और उदाहरणों के माध्यम से गड़बड़ कर रहा हूं कि यह पता लगाने के लिए कि पीए कैसे काम करता है। मैंने वर्षों में C लिखा या पढ़ा नहीं है।.wav

मैं सृजन के दौरान एक धारा में गुजरने वाले पैरामीटर के साथ कठिनाई में भाग रहा हूं, और सृजन के दौरान एक बफर। उदाहरण के लिए, frame वास्तव में क्या है, और यह channel और sample rate जैसे अन्य पैरामीटर से कैसे संबंधित है। मैं सामान्य रूप से ऑडियो प्रोग्रामिंग के लिए पूरी तरह से नया हूं, इसलिए अगर कोई मुझे कुछ सामान्य ट्यूटोरियल आदि पर इंगित कर सकता है, तो डिवाइस स्तर ऑडियो के बारे में, मैं इसकी सराहना करता हूं।

ruby-portaudio एक ऐसा उदाहरण प्रदान करता है जो एक स्ट्रीम और बफर बनाता है, बफर को पाप लहर लिखता है, फिर बफर को स्ट्रीम करने के लिए स्ट्रीम भेजता है। कुछ रूबी मुझे उदाहरण में विशेष रूप से लूप ब्लॉक में परेशानी हो रही है।

PortAudio.init 

    block_size = 1024 
    sr = 44100 
    step = 1.0/sr 
    time = 0.0 

    stream = PortAudio::Stream.open(
      :sample_rate => sr, 
      :frames => block_size, 
      :output => { 
       :device => PortAudio::Device.default_output, 
       :channels => 1, 
       :sample_format => :float32 
       }) 

    buffer = PortAudio::SampleBuffer.new(
      :format => :float32, 
      :channels => 1, 
      :frames => block_size) 

    playing = true 
    Signal.trap('INT') { playing = false } 
    puts "Ctrl-C to exit" 

    stream.start 

    loop do 
    stream << buffer.fill { |frame, channel| 
     time += step 
     Math.cos(time * 2 * Math::PI * 440.0) * Math.cos(time * 2 * Math::PI) 
    } 

    break unless playing 
    end 

    stream.stop 

अगर मैं जा रहा हूँ रिकॉर्ड कर रही है, मैं सही एक बफर में एक धारा को पढ़ने जाना चाहिए, तो वह बफर जोड़ तोड़ और इसे लिखने दायर करने के लिए?

इसके अलावा, अगर मैं यहां गलत पेड़ को भड़क रहा हूं, और ऐसा करने का एक आसान तरीका है (रूबी में), कुछ दिशा अच्छी होगी।

+0

यहां http: // stackoverflow से संबंधित (डुप्ली नहीं) प्रश्न होने लगता है।कॉम/प्रश्न/2716987/रिकॉर्डिंग-ऑडियो-थ्रू-आरटीएमपी-रेल –

उत्तर

3

आइए सबसे पहले उन शब्दों को स्पष्ट करें जिन्हें आप पूछ रहे थे। इस उद्देश्य के लिए मैं एक सरल तरीके से ऑडियो पाइपलाइन को समझाने की कोशिश करूंगा। जब आप अपने उदाहरण के रूप में ध्वनि उत्पन्न कर रहे हैं, तो आपका साउंड कार्ड समय-समय पर आपके कोड से फ्रेम (= बफर = ब्लॉक) का अनुरोध करता है, जिसे आप अपने नमूने से भरते हैं। नमूना दर परिभाषित करती है कि आप एक सेकंड के भीतर कितने नमूने प्रदान करते हैं और इस प्रकार वह गति जिसके साथ आपके नमूने वापस खेले जाते हैं। फ्रेम आकार (= बफर आकार = ब्लॉक आकार) यह निर्धारित करता है कि आप ध्वनि कार्ड से एक अनुरोध में कितने नमूने प्रदान करते हैं। एक बफर आमतौर पर काफी छोटा होता है, क्योंकि बफर आकार सीधे विलंबता (बड़े बफर => उच्च विलंबता) को प्रभावित करता है और बड़े सरणी धीमी हो सकती हैं (विशेष रूप से रूबी सरणी धीमी होती है)।

इसी तरह की चीजें होती हैं जब आप अपने साउंड कार्ड से ध्वनि रिकॉर्ड कर रहे होते हैं। आपका फ़ंक्शन हर समय और फिर कहा जाता है, और माइक्रोफ़ोन के नमूने आमतौर पर फ़ंक्शन के लिए तर्क के रूप में पारित होते हैं (या यहां तक ​​कि केवल ऐसे बफर का संदर्भ)। तब आप इन नमूनों को संसाधित करने की उम्मीद कर रहे हैं, उदा। उन्हें डिस्क पर लिखकर।

मुझे पता है कि "रूबी में सब कुछ करने" का विचार काफी मोहक है, क्योंकि यह एक सुंदर भाषा है। जब आप वास्तविक समय में ऑडियो प्रोसेसिंग करने की योजना बना रहे हैं, तो मैं एक संकलित भाषा (सी, सी ++, ओबीजे-सी, ...) पर स्विच करने की सलाह दूंगा। ये ऑडियो को बेहतर तरीके से संभाल सकते हैं, क्योंकि वे रूबी की तुलना में हार्डवेयर के बहुत करीब हैं और इस प्रकार आमतौर पर तेज़, जो ऑडियो प्रोसेसिंग में काफी समस्या हो सकती है। शायद यही वजह है कि रूबी ऑडियो लाइब्रेरी इतने कम हैं कि शायद रूबी नौकरी के लिए सही उपकरण नहीं है।

वैसे, मैंने रूबी-पोर्टौडियो, एफएफआई-पोर्टौडियो और साथ ही रूबी-ऑडियो की कोशिश की और उनमें से कोई भी मेरी मैकबुक (साइन साइन उत्पन्न करने की कोशिश की) पर ठीक से काम नहीं कर रहा था, जो दुख की बात है कि कैसे रूबी है इस सामान को संभालने में सक्षम नहीं है (अभी तक?)।

+0

यदि आप एक गुई के माध्यम से ऑडियो के साथ गड़बड़ कर सकते हैं, तो आप इसे एक स्क्रिप्टिंग भाषा के माध्यम से गड़बड़ कर सकते हैं। उदाहरण के लिए, शुद्ध डेटा एक मजेदार ग्राफिकल ऑडियो प्रोग्रामिंग भाषा है, जो निश्चित रूप से पर्याप्त है, कम से कम एक व्यक्ति रूबी के साथ ड्राइव करने की कोशिश कर रहा है (http://matschaffer.com/2010/11/ruby-midi-pure-data/)। मुझे यकीन है कि [अन्य ऑडियो संश्लेषण वातावरण] के साथ समान प्रयास हैं (http://en.wikipedia.org/wiki/Comparison_of_audio_synthesis_environments)। – mgamba

+0

लेकिन यह केवल एक प्रदर्शन ट्यूनेड लाइब्रेरी के आसपास एक रैपर होगा जो वास्तविक संश्लेषण को सही करता है, है ना? मैं बल्कि शुद्ध रूबी दृष्टिकोण का जिक्र कर रहा था। –

+0

यहां कुछ रूबी कोड है .wav: https://github.com/cohena/RAFL/blob/master/RAFL_wav.rb – mgamba

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