私はWebAudioAPIを試しています。私の目標は、各弦に弦を開いて演奏する実際のギターの初期音源があり、他のすべてのフレット位置の音を動的に生成するデジタルギターを作成することです。このテーマについて調査したところ(これは私にとってはまったく新しいことです)、ソースサウンドサンプルの周波数を変更することでこれが達成される可能性があるように思われました。
問題は、合成されたsin波を変更するための多くのアルゴリズムを見てきましたが、オーディオサンプルの周波数を変更するためのアルゴリズムは何もありません。これは、これをどのように実装しようとしているのかをよりよく理解するためのコードのサンプルです。
// 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...
}
}
これで完了です。サウンドは問題なく再生できますが、コードサンプルの周波数を変更して弦の別のフレット位置のように聞こえるchangeFrequency関数でコードを作成する場合、少し迷います。このコードに関するヘルプや、私がやろうとしていることが可能かどうかについての意見をいただければ幸いです。
ありがとう!