2012-11-09 5 views
10

ich mit dem Web Audio API bin experimentieren und mein Ziel ist es, eine digitale Gitarre zu schaffen, wo jeder String eine anfängliche Schallquelle einer tatsächlichen Gitarre der Zeichenfolge offen zu spielen und dann möchte ich alle anderen Bund Position Sounds dynamisch erzeugen. Nach einigen Nachforschungen über das Thema (das ist alles ziemlich neu für mich) klang es so, als könnte man das erreichen, indem man die Frequenz des Quell-Sound-Samples ändert.Wie verschieben/modulieren Audiopuffer Frequenz mit dem Web Audio API

Das Problem ist, ich habe zur Veränderung synthetisierten sin Wellen viele Algorithmen gesehen, aber nichts, um die Frequenz einer Audio-Probe zu ändern. Hier ist ein Beispiel von meinem Code eine bessere Vorstellung davon zu geben, wie ich versuche, diese zu implementieren:

// 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... 
    } 
} 

So dort haben Sie es - ich kann den Klang spielen ganz gut, aber bin ein bisschen eine lose wenn es darum geht, den Code in der changeFrequency Funktion zu erstellen, die die Akkordprobenfrequenz ändern würde, so klang es wie eine andere Bundposition auf der Schnur. Jede Hilfe mit diesem Code würde geschätzt oder Meinungen darüber, ob das, was ich versuche, sogar möglich ist.

Danke!

+1

Sie einen Sampler zu machen. Sie werden viel mehr Samples als eine einzelne Saite wollen. Sie benötigen mindestens zwei Samples pro Oktave, wenn Sie einen anständigen Sound wünschen. Selbst dann ist eine Gitarre ein sehr komplexes Instrument, das nur mit Samples nachgebaut werden kann. – Brad

Antwort

6

playbackRate wird die Tonhöhe des Klangs ändern, aber die Wiedergabezeit auch.

Wenn Sie nur die Tonhöhe ändern möchten, können Sie vielleicht einen Pitch Shifter verwenden. Überprüfen Sie mein Javascript Pitch Shifter Implementierung here und seine Verwendung mit einem JavascriptNode in this plugin

Verwandte Themen