2016-05-04 5 views
0

Ich muss meine Quelle mit einigen Cross-Parameter (in Sekunden) loopen. Es wird großartig sein, Looping zu hören, ohne den Sample-Rahmen zu unterbrechen. AudioBufferSourceNode ist audioNode in meinem Code. Ich konfrontiert mit dem Problem der Unfähigkeit, den Puffer wieder zu verwenden, ist es möglich, dies zu umgehen?Wie kann ich AudioBufferSourceNode mit Überlappung (mit dem gleichen AudioBuffer) Looping

playNoteOn: function(indexNote){ 
     var attack = this.get('attack'), 
      release = this.get('release'), 
      volume = 1 + this.get('volume')/100, 
      reverb = _.clone(this.get('reverb')), 
      loop = this.get('loop'), cross; 

     //peace for Loop process 
     if (loop) { 
      //milli sec 
      attack = this.get('startLoop')*1000; 
      release = this.get('endLoop')*1000; 
      //sec 
      cross = this.get('crossLoop'); 
     } 

     //peace for ADSR process 
     var t0 = this.get('audioNode').context.currentTime, 
      spread = attack/1000 + release/1000, 
      attackSpread = t0 + attack/1000; 

     [this.get('schema').leftGain, this.get('schema').rightGain].forEach(function(gain, index){ 
      gain.gain.cancelScheduledValues(0); 
      gain.gain.setValueAtTime(0, t0); 
      gain.gain.linearRampToValueAtTime(volume, attackSpread); 
      // gain.gain.setValueAtTime(volume, decaySpread); 
      // gain.gain.linearRampToValueAtTime(0, releaseSpread); 
     }); 
     this.get('audioNode').connect(this.get('schema').splitter, 0, 0); 
     this.get('audioNode').connect(this.get('schema').leftGain); 
     this.get('audioNode').connect(this.get('schema').rightGain); 
     this.get('audioNode').connect(this.get('schema').reverb); 
     this.get('audioNode').connect(APP.Models.Synth.get('schema').reverb); 

     APP.Models.Synth.get('effects').where({active: false}).forEach(function(effect){ 
      effect.get('node').disconnect(); 
     }); 

     APP.Models.Synth.get('effects').where({active: true}).forEach(function(effect){ 
      effect.get('node').disconnect(); 
      effect.get('node').setParams(effect.toJSON()).getNode(this.get('audioNode'), [this.get('schema').leftGain, this.get('schema').rightGain]); 
     }, this); 

     if(loop){ 
      this.get('audioNode').loop = true; 
      this.get('audioNode').loopEnd = this.get('audioNode').buffer.duration - cross; 
     } 
     this.get('audioNode').start(t0); 
    }, 

Antwort

0

Sie können einen Puffer nicht wiederverwenden. Einmal gestoppt ist der Quellpuffer für immer verschwunden. Wo ist dein Audio-Node-Objekt? Aber das ist kein Problem. Wenn Sie aus einer Audiodatei dekodiert haben, können Sie den Puffer aus der Decodierung wieder verwenden. Erstellen Sie einfach mehr Pufferquellen. Sie können so viel erstellen, wie Sie möchten. Welche Sprache benutzt du überhaupt? Sagen Sie einige Hintergründe zu dem, was Sie tun und welche Frameworks Sie verwenden.

Beachten Sie den Unterschied zwischen Puffer von Decodierung und Pufferquelle. Ihr Audionode ist eine Pufferquelle, die von einem Puffer gespeist werden kann. Sie können den Puffer aber nicht die Pufferquelle wiederverwenden. Erstelle also die Pufferquelle in deinem Playnote-Code.