2012-11-09 14 views
10

का उपयोग कर ऑडियो बफर आवृत्ति को कैसे बदलें/संशोधित करें मैं वेब ऑडियो एपीआई के साथ प्रयोग कर रहा हूं और मेरा लक्ष्य डिजिटल गिटार बनाना है जहां प्रत्येक स्ट्रिंग में एक वास्तविक गिटार का प्रारंभिक ध्वनि स्रोत होता है जो स्ट्रिंग को खोलता है और तो मैं गतिशील रूप से सभी अन्य fret स्थिति ध्वनि उत्पन्न करना चाहता हूँ। इस विषय में कुछ शोध के बाद (यह मेरे लिए बिल्कुल नया है) ऐसा लगता है जैसे स्रोत ध्वनि नमूना की आवृत्ति को बदलकर इसे हासिल किया जा सकता है।वेब ऑडियो एपीआई

समस्या यह है कि मैंने संश्लेषित पाप तरंगों को बदलने के लिए बहुत सारे एल्गोरिदम देखे हैं लेकिन ऑडियो नमूना की आवृत्ति को बदलने के लिए कुछ भी नहीं है। यहाँ मेरी कोड का एक नमूना मैं कैसे इस लागू करने के लिए कोशिश कर रहा हूँ का एक बेहतर विचार दे रहा है: तो वहाँ तुम्हारे पास है

// Guitar chord buffer  
var chordBuffer = null; 

// Create audio context 
var context = new webkitAudioContext(); 

// Load sound sample 
var request = new XMLHttpRequest(); 
request.open('GET', 'chord.mp3', true); 
request.responseType = 'arraybuffer'; 
request.onload = loadChord; 
request.send(); 

// Handle guitar string "pluck" 
$('.string').mouseenter(function(e){ 
    e.preventDefault(); 

    var source = context.createBufferSource(); 
    source.buffer = chordBuffer; 

    // Create javaScriptNode so we can get at raw audio buffer 
    var jsnode = context.createJavaScriptNode(1024, 1, 1); 
    jsnode.onaudioprocess = changeFrequency; 

    // Connect nodes and play 
    source.connect(jsnode); 
    jsnode.connect(context.destination); 
    source.noteOn(0); 
}); 

function loadChord() { 
    context.decodeAudioData(
     request.response, 
     function(pBuffer) { chordBuffer = pBuffer; }, 
     function(pError) { console.error(pError); } 
    ); 
} 

function changeFrequency(e) { 
    var ib = e.inputBuffer.getChannelData(0); 
    var ob = e.outputBuffer.getChannelData(0); 
    var n = ib.length; 

    for (var i = 0; i < n; ++i) { 
     // Code needed... 
    } 
} 

- मैं ध्वनि चला सकता है ठीक है, लेकिन एक हार का एक सा पर हूँ में कोड बनाने के लिए कब आने के लिए फ़्रीक्वेंसी फ़ंक्शन जो तार नमूने आवृत्ति को बदल देगा, इसलिए यह स्ट्रिंग पर एक और फेट स्थिति की तरह लग रहा था। इस कोड के साथ किसी भी मदद की सराहना की जाएगी या इस बात पर राय होगी कि मैं जो भी करने का प्रयास कर रहा हूं वह भी संभव है।

धन्यवाद!

+1

के साथ इसका उपयोग जांचें आप एक नमूना बना रहे हैं। आप एक स्ट्रिंग की तुलना में कई और नमूने चाहते हैं। कम से कम, यदि आप सभ्य ध्वनि चाहते हैं तो आप प्रति आठ नमूने चाहते हैं। फिर भी, एक गिटार सिर्फ नमूने के साथ फिर से बनाने के लिए एक बहुत जटिल उपकरण है। – Brad

उत्तर

2

आप playbackRate सेट करके वांछित व्यवहार प्राप्त कर सकते हैं, लेकिन जैसा कि ब्रैड कहता है, आपको बहु-नमूनाकरण का उपयोग करना होगा। यह SO प्रश्न भी देखें: Setting playbackRate on audio element connected to web audio api

6

प्लेबैकरेट ध्वनि की पिच बदल देगा, लेकिन इसके प्लेबैक समय भी बदल जाएगा।

यदि आप केवल पिच बदलना चाहते हैं, तो शायद आप एक पिच शिफ्ट का उपयोग कर सकते हैं। मेरे जावास्क्रिप्ट पिच शिफ्टर कार्यान्वयन here और जावास्क्रिप्ट नोड in this plugin

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