2015-08-27 13 views
6

व्यवहार के बारे में मैं वर्णन करने के लिए क्रोम 44 में होता हूँ में एक से दूसरे आवृत्ति से बहने, लेकिन नहीं फ़ायरफ़ॉक्स 40.वेब ऑडियो दोलन अप्रत्याशित रूप से क्रोम

में भी हो आप एक दोलक बनाते हैं करता है, यह सेट 220 हर्ट्ज की आवृत्ति के लिए, और उसके बाद आवृत्ति को 440 हर्ट्ज में बदल दें, आप एक अलग पोर्टमैंटो प्रभाव सुन सकते हैं: 220 से 440 तक तुरंत बदलने के बजाय, ऑसीलेटर मूल आवृत्ति से नए आवृत्ति से ग्लाइड करता है।

नीचे कोड इस घटना दिखाता है:

var ac = new AudioContext(); 
 

 
var osc = ac.createOscillator(); 
 
osc.connect(ac.destination); 
 

 
osc.type = 'sawtooth'; 
 

 
osc.frequency.value = 220; 
 
osc.start(0); 
 

 
window.setTimeout(function() { 
 
    osc.frequency.value = 440; 
 
}, 1000); 
 

 
window.setTimeout(function() { 
 
    osc.stop(0); 
 
}, 2000);

मैं OscillatorNode वस्तु के लिये दस्तावेज की जांच की है, और इस व्यवहार का कोई उल्लेख नहीं है।

मैंने Google को भी खराब कर दिया है, और (आश्चर्य की बात है) मुझे इस घटना का कोई अन्य उल्लेख नहीं मिल रहा है।

क्या चल रहा है? यह उचित व्यवहार की तरह प्रतीत नहीं होता है। अगर मैं आवृत्ति ग्लाइड पर चाहता था, तो मैं linearRampToValueAtTime() विधि का उपयोग करूंगा। आवृत्ति को सीधे एक विशिष्ट मान पर सेट करना चाहिए ... ऐसा करें।

क्या यह सिर्फ एक बग है? मुझे पता है कि यह एपीआई अभी भी प्रवाह में है, लेकिन यह एक बग होने के लिए बहुत स्पष्ट लगता है - यह सबसे सरसरी परीक्षण पास नहीं करेगा। लेकिन मैं यह भी कल्पना नहीं कर सकता कि Google इसे जानबूझकर लागू करेगा।

सबसे महत्वपूर्ण बात यह है कि क्या कोई कामकाज है?

+0

यह फ़ायरफ़ॉक्स में "सही ढंग से" काम करता है, यह एक वेबकिट मुद्दा है, इसलिए यह ओपेरा और सफारी के साथ भी काम करता है। –

उत्तर

4

बहुत यकीन है कि यह एक बग है।

मुझे पर पर सीधे असाइनमेंट का कहना है कि किसी भी तरह का इंटरपोलेशन करना चाहिए।

यह संभव है कि यह अनजान हो गया क्योंकि आम तौर पर लोग स्वचालन विधियों का उपयोग करके मूल्य को संशोधित करते हैं। जो मुझे आपके कामकाज के प्रश्न पर लाता है ...

यदि आप वास्तव में एक स्पष्ट देरी चाहते थे, तो आप बस ऐसा कर सकते हैं (ध्यान दें कि setTimeout नहीं है)।

// change the value to 440Hz 1 second from now 
osc.frequency.setValueAtTime(440, ac.currentTime + 1); 

आप आवृत्ति को तुरंत बदल (जैसे कि, एक उपयोगकर्ता कार्रवाई के जवाब में) करने में सक्षम होना चाहते हैं, तो आप सिर्फ यह कर सकते हैं:

osc.frequency.setValueAtTime(440, 0); 

आशा है कि मदद करता है।

वैसे, आपको इस (https://code.google.com/p/chromium/issues/list) के लिए कोई समस्या दर्ज करने पर विचार करना चाहिए।

+1

धन्यवाद! यह कामकाज मेरे लिए काम करता है। मुझे शायद खुद के बारे में सोचना चाहिए था, लेकिन ... पता है। मैं कल एक बग रिपोर्ट फाइल करने के लिए याद रखने की कोशिश करूंगा। चीयर्स! – greenie2600

+0

कोई समस्या नहीं है। इसके लायक होने के लिए, क्रोम कैनरी में भी व्यवहार मौजूद है (क्रोम 47) - जो थोड़ा आश्चर्यजनक है। मैं आमतौर पर वेब ऑडियो बग को उस लंबे समय तक नहीं देखता। –

+0

वैसे, लोग आमतौर पर स्वचालन विधियों का उपयोग करके मूल्य को क्यों संशोधित करते हैं? क्या यह समय कसकर रखना है? (मुझे कल्पना है कि जब आवश्यक हो तो फायरिंग मैन्युअल रूप से बदलती है, यह निर्धारित/विश्वसनीय नहीं है क्योंकि उन्हें setValueAtTime() और इसी तरह से शेड्यूल करना है। लेकिन ऐसे मामलों में जहां आप उपयोगकर्ता इनपुट का जवाब दे रहे हैं - उदाहरण के लिए, आने वाली MIDI ईवेंट, या एक ब्राउज़र नियंत्रण के माध्यम से पैरामीटर परिवर्तन - आपके पास वास्तव में कोई विकल्प नहीं है।) – greenie2600

4

यह अंतर्निहित "डिज़ाइपरिंग" प्रभाव है, जो कार्यकारी समूह कई बार आगे चला गया है। जून तक, डब्ल्यूजी ने आखिरकार डिजिपरिंग को हटाने का फैसला किया (स्थिति: https://github.com/WebAudio/web-audio-api/issues/76)। तो हाँ, यह एक क्रोम "बग" है - https://code.google.com/p/chromium/issues/detail?id=496282)। जब तक यह तय नहीं हो जाता है, केविन के सुझाव के अनुसार, setValueAtTime() का उपयोग करें।

+1

स्पष्टीकरण के लिए धन्यवाद, क्रिस। मैं इस पर ध्यान देने के दौरान dezippering के एक उल्लेख में भाग गया, लेकिन केवल इसे GainNode के संदर्भ में इस्तेमाल किया जा सकता है - तो यह छलांग नहीं बनाना चाहता था कि शायद यह ऑसीलेटर के लिए भी इस्तेमाल किया गया था। –

+0

हाँ, यह वर्तमान में सभी ऑडियोपैम पर .value के लिए होता है। – cwilso

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