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}