1import reverbGen from './reverbGen.mjs'; 2import { clamp } from './util.mjs'; 3 4if (typeof AudioContext !== 'undefined') { 5 BaseAudioContext.prototype.adjustLength = function (duration, buffer, speed = 1, offsetAmount = 0) { 6 const sampleOffset = Math.floor(clamp(offsetAmount, 0, 1) * buffer.length); 7 const newLength = buffer.sampleRate * duration; 8 const newBuffer = this.createBuffer(buffer.numberOfChannels, buffer.length, buffer.sampleRate); 9 for (let channel = 0; channel < buffer.numberOfChannels; channel++) { 10 let oldData = buffer.getChannelData(channel); 11 let newData = newBuffer.getChannelData(channel); 12 13 for (let i = 0; i < newLength; i++) { 14 // loop the buffer around to prevent 15 let position = (sampleOffset + i * Math.abs(speed)) % oldData.length; 16 if (speed < 1) { 17 position = position * -1; 18 } 19 20 newData[i] = oldData.at(position) || 0; 21 } 22 } 23 return newBuffer; 24 }; 25 26 BaseAudioContext.prototype.createReverb = function (duration, fade, lp, dim, ir, irspeed, irbegin) { 27 const convolver = this.createConvolver(); 28 convolver.generate = (d = 2, fade = 0.1, lp = 15000, dim = 1000, ir, irspeed, irbegin) => { 29 convolver.duration = d; 30 convolver.fade = fade; 31 convolver.lp = lp; 32 convolver.dim = dim; 33 convolver.ir = ir; 34 convolver.irspeed = irspeed; 35 convolver.irbegin = irbegin; 36 if (ir) { 37 convolver.buffer = this.adjustLength(d, ir, irspeed, irbegin); 38 } else { 39 reverbGen.generateReverb( 40 { 41 audioContext: this, 42 numChannels: 2, 43 decayTime: d, 44 fadeInTime: fade, 45 lpFreqStart: lp, 46 lpFreqEnd: dim, 47 }, 48 (buffer) => { 49 convolver.buffer = buffer; 50 }, 51 ); 52 } 53 }; 54 convolver.generate(duration, fade, lp, dim, ir, irspeed, irbegin); 55 return convolver; 56 }; 57}