12

Web Audio API でカスタムAudioNodeを実装することは可能ですか?

他のいくつかのノード (ChannelSplitters および AnalyserNodes) を含むノードを構築したいと考えています。理想的には、他の AudioNode と同じように、このカスタム ノードに接続できるようにします。例えば、

var customNode = new CustomNode();
mediaStreamSource = context.createMediaStreamSource(userMedia);

// This will not work, as I need to know what to implement in CustomNode
mediaStreamSource.connect(customNode);
customNode.connect(context.destination);

MDN のドキュメントによると、AudioNode はEventTarget インターフェイスを実装しています。オーディオをシャッフルするために使用されるのはそれだけですか?もしそうなら、オーディオを処理する方法でこのインターフェイスをどのように実装できますか?

4

2 に答える 2

5

この記事には、探していることだけを行う方法があるようです。

基本的な前提:

function MyCustomNode(){
  this.input = audioContext.createGainNode();
  var output = audioContext.createGainNode();
  this.connect = function(target){
     output.connect(target);
  };
}

例:

function AudioBus(){
  this.input = audioContext.createGainNode();
  var output = audioContext.createGainNode();
  var custom = new MyCustomNode();

  this.input.connect(custom);
  custom.connect(output);

  this.connect = function(target){
     output.connect(target);
  };
}

//create some native oscillators and our custom audio bus
var bus = new AudioBus(),
    instrument1 = audioContext.createOscillator(),
    instrument2 = audioContext.createOscillator(),
    instrument3 = audioContext.createOscillator();

//connect our instruments to the same bus
instrument1.connect(bus.input);
instrument2.connect(bus.input);
instrument3.connect(bus.input);
bus.connect(audioContext.destination);

編集:この質問は、 Creating a custom echo node with web-audio の重複の可能性がありますが、探している答えは@MattDiamond のものだと思います。それは正確にはきれいな解決策ではありませんが、仕事を成し遂げているようです:

function FeedbackDelayNode(context, delay, feedback){
  this.delayTime.value = delay;
  this.gainNode = context.createGainNode();
  this.gainNode.gain.value = feedback;
  this.connect(this.gainNode);
  this.gainNode.connect(this);
}

function FeedbackDelayFactory(context, delayTime, feedback){
  var delay = context.createDelayNode(delayTime + 1);
  FeedbackDelayNode.call(delay, context, delayTime, feedback);
  return delay;
}

AudioContext.prototype.createFeedbackDelay = function(delay, feedback){
  return FeedbackDelayFactory(this, delay, feedback);
};
于 2013-11-11T22:30:08.017 に答える