2013-03-07 6 views
8

मैं ध्वनि शुरू करने और रोकने की कोशिश कर रहा हूं। और वह काम करता है। लेकिन मैं फिर से आवाज शुरू नहीं कर सकता।वेब ऑडियो स्टार्ट और स्टॉप ऑसीलेटर फिर इसे फिर से शुरू करें

क्या मुझे वास्तव में फिर से एक और ऑसीलेटर बनाना है? यह बहुत ही सहज ज्ञान युक्त लगता है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। '

oscillator1.noteOn(0); 
oscillator1.noteOff(0); 

कॉलिंग noteOn फिर से नहीं करता है कुछ भी कर:

यह सब मेरे पास है कि काम करता है। क्यूं कर? मेरे बाहर है

मैंने वॉल्यूम को सेट करने की कोशिश की, या वेब ऑडियो लोगों के संदर्भ में, "लाभ", शून्य के बराबर। लेकिन किसी कारण से, शून्य का लाभ ध्वनि बनाता है। लाभ का क्या मूल्य कोई आवाज नहीं उठाएगा?

आदमी, मैं विश्वास नहीं कर सकता कि यह कैसे मुश्किल है:/

उत्तर

3

आप (जब तक कल्पना हाल ही में बदल गया है) .disconnect() विधि का उपयोग करने के लिए है।

मैं इस यहाँ लिखा है:

http://en.wikiaudio.org/Web_Audio_API:Toggle_oscillator_on_and_off

संपादित

यह प्रतिक्रिया पुराना है जब मैं सिर्फ जानने के लिए कैसे वेब ऑडियो API काम कोशिश कर रहा था। आपको डिस्कनेक्ट का उपयोग करने की आवश्यकता नहीं है।

+0

यह अधिक समझ में आता है कि ओसीलेटर को नष्ट करना! –

+0

मैंने 2 साल पहले लिखा था। आपको उन्हें शुरू करने और रोकने के लिए डिस्कनेक्ट करने की आवश्यकता नहीं है। – William

7

असल में, हाँ, आपको एक नया ऑसीलेटर नोड बनाना होगा। एपीआई को उस पैटर्न के साथ काम करने के लिए डिज़ाइन और अनुकूलित किया गया है।

ताओवादी के कोड में डिस्कनेक्ट पैटर्न मूल रूप से एक नया ऑसीलेटर बनाने का एक ठोस तरीका है (यह हर बार ओएससीओएन चलाया जाता है)। यह कभी भी पुराने ओसीलेटर पर नोटऑफ को स्पष्ट रूप से कॉल नहीं करता है, जो डिस्कनेक्ट हो जाता है, इसलिए यह पृष्ठभूमि में अभी भी चल रहा है (सुनिश्चित नहीं है कि वेब ऑडियो कैसे संभालता है) हालांकि यह ऑडियो श्रृंखला से डिस्कनेक्ट होने के बाद श्रव्य नहीं है। इसलिए यह संभावित रूप से पृष्ठभूमि में ऑसीलेटर को ढेर कर सकता है जो सीपीयू चला रहे हैं और निकाले जा रहे हैं।

यहां वही कोड है, हालांकि नोटऑफ() का सही उपयोग कर रहा है। http://codepen.io/Theodeus/pen/afgqk

यहाँ एक ही कोड हालांकि लाभ नोड का उपयोग कर दोलक को नियंत्रित करने के लिए अनुकूलित है और इस तरह केवल प्रत्येक नोट के लिए एक नया दोलक बनाने के लिए एक ही दोलक हर समय का उपयोग कर (हालांकि यह अनुशंसित नहीं है, बेहतर है, मैं लगता है) http://codepen.io/Theodeus/pen/aKFje

संपादित करें अप्रैल 2015
कोड नमूने के बाद से, साइबरस्पेस में खो दिया जा रहा है यहाँ एक ट्यूटोरियल मैं दोलन पर लिखा है कि कोड उदाहरण है कि दोलन की एक शॉट प्रकृति से पता चलता शामिल है। यह बिल्कुल वही कोड नहीं है जैसा ऊपर उल्लिखित है, लेकिन यह वही अवधारणा दिखाता है। http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - इसका सारांश यह है:

//This won't work. Can't call play twice. 
var context = new AudioContext(), 
    oscillator = context.createOscillator(); 

oscillator.connect(context.destination); 
oscillator.start(context.currentTime); 
oscillator.stop(context.currentTime + 0.5); 
oscillator.start(context.currentTime + 1); 
oscillator.stop(context.currentTime + 1.5); 


//this will work! 
var context = new AudioContext(), 
    oscillator; 

function playOscillator(startTime, endTime) { 
    oscillator = context.createOscillator(); 
    oscillator.connect(context.destination); 
    oscillator.start(startTime); 
    oscillator.stop(endTime); 
} 

playOscillator(context.currentTime, context.currentTime + 0.5); 
playOscillator(context.currentTime + 1, context.currentTime + 1.5); 
+0

और, बस बिंदु को साबित करने के लिए, डिस्कनेक्ट पैटर्न केवल एक ऑसीलेटर और डिस्कनेक्टिंग/रीकनेक्ट करने के लिए अनुकूलित किया गया है। http: // codepen।आईओ/थियोडस/पेन/bwoKn –

+0

और जब मैंने सोचा कि मुझे पता था कि मैं क्या कर रहा था। जोड़ने के लिए, नोटऑन() और नोटऑफ() को स्टार्ट() और स्टॉप() – William

+0

के पक्ष में बहिष्कृत कर दिया गया है, ताओवादी का मूल कोड थोड़ी देर के लिए ऑसीलेटर को रखेगा (और चल रहा है!), लेकिन एक बार जब आप एक और ऑसीलेटर बनाते थे (अगली बार जब आप ओएससीओएन()) कहते हैं, तो पिछले ऑसीलेटर का संदर्भ जारी किया जाता है, और यह कचरा इकट्ठा किया जाएगा। – cwilso

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