// export const doWorkerTask = async (
//   workerFunction,
//   input,
//   buffers,
// ) => {
//   // Create worker
//   let fnString =
//     "(" +
//     workerFunction.toString().replace('"use strict";', "") +
//     ")();";
//   let workerBlob = new Blob([fnString]);
//   let workerBlobURL = window.URL.createObjectURL(workerBlob);
//   let worker = new Worker(workerBlobURL);

//   // Run worker
//   return await new Promise(function (resolve, reject) {
//     worker.onmessage = function (e) {
//       resolve(e.data);
//     };
//     worker.postMessage(input, buffers);
//   });
// };

// export const giantRobotTransform = async (audioBuffer) => {
//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );

//   let source = ctx.createBufferSource();
//   source.buffer = audioBuffer;

//   let dee = new Jungle(ctx);
//   dee.setPitchOffset(-0.1);

//   let deep = new Jungle(ctx);
//   deep.setPitchOffset(-0.2);

//   let deeper = new Jungle(ctx);
//   deeper.setPitchOffset(-0.4);

//   let deeperer = new Jungle(ctx);
//   deeperer.setPitchOffset(-0.8);

//   let compressor = ctx.createDynamicsCompressor();

//   source.connect(dee.input);
//   source.connect(deep.input);
//   source.connect(deeper.input);
//   source.connect(deeperer.input);

//   dee.output.connect(compressor);
//   deep.output.connect(compressor);
//   deeper.output.connect(compressor);
//   deeperer.output.connect(compressor);

//   compressor.connect(ctx.destination);

//   source.start(0);
//   return await ctx.startRendering();
// };

// export const megaphoneTransform = async (audioBuffer) => {
//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );
//   let source = ctx.createBufferSource();
//   source.buffer = audioBuffer;

//   // Wave shaper
//   let waveShaper = ctx.createWaveShaper();
//   waveShaper.curve = makeDistortionCurve(30);
//   function makeDistortionCurve(amount) {
//     var k = typeof amount === "number" ? amount : 50;
//     var n_samples = 44100;
//     var curve = new Float32Array(n_samples);
//     var deg = Math.PI / 180;
//     var x;
//     for (let i = 0; i < n_samples; ++i) {
//       x = (i * 2) / n_samples - 1;
//       curve[i] =
//         ((3 + k) * x * 20 * deg) / (Math.PI + k * Math.abs(x));
//     }
//     return curve;
//   }

//   let lpf1 = ctx.createBiquadFilter();
//   lpf1.type = "lowpass";
//   lpf1.frequency.value = 2000.0;
//   let lpf2 = ctx.createBiquadFilter();
//   lpf2.type = "lowpass";
//   lpf2.frequency.value = 2000.0;
//   let hpf1 = ctx.createBiquadFilter();
//   hpf1.type = "highpass";
//   hpf1.frequency.value = 500.0;
//   let hpf2 = ctx.createBiquadFilter();
//   hpf2.type = "highpass";
//   hpf2.frequency.value = 500.0;
//   let compressor = ctx.createDynamicsCompressor();
//   lpf1.connect(lpf2);
//   lpf2.connect(hpf1);
//   hpf1.connect(hpf2);
//   hpf2.connect(waveShaper);
//   waveShaper.connect(compressor);
//   compressor.connect(ctx.destination);

//   source.connect(lpf1);

//   source.start(0);
//   return await ctx.startRendering();
// };

// export const reverseReverbTransform = async (audioBuffer) => {
//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );

//   let reversedAudioBuffer = createReversedAudioBuffer(audioBuffer);

//   let source = ctx.createBufferSource();
//   source.buffer = reversedAudioBuffer;

//   let convolver = ctx.createConvolver();
//   convolver.buffer = await ctx.decodeAudioData(
//     await (
//       await fetch(
//         "/audio/impulse-responses/voxengo/Parking Garage.wav",
//       )
//     ).arrayBuffer(),
//   );
//   // convolver.buffer = await ctx.decodeAudioData(await (await fetch("../audio/impulse-responses/church.wav")).arrayBuffer());

//   let outCompressor = ctx.createDynamicsCompressor();

//   source.connect(convolver);
//   convolver.connect(outCompressor);

//   //dry
//   let dryGain = ctx.createGain();
//   dryGain.gain.value = 0.5;
//   source.connect(dryGain);
//   dryGain.connect(outCompressor);
//   outCompressor.connect(ctx.destination);

//   source.start(0);
//   return createReversedAudioBuffer(await ctx.startRendering());

//   function createReversedAudioBuffer(audioBuffer) {
//     let ctx = new AudioContext();
//     // copy audiobuffer
//     let reversedAudioBuffer = ctx.createBuffer(
//       audioBuffer.numberOfChannels,
//       audioBuffer.length,
//       audioBuffer.sampleRate,
//     );
//     for (let i = 0; i < audioBuffer.numberOfChannels; i++) {
//       reversedAudioBuffer.copyToChannel(
//         audioBuffer.getChannelData(i),
//         i,
//       );
//     }

//     // reverse new audiobuffer
//     for (let i = 0; i < reversedAudioBuffer.numberOfChannels; i++) {
//       reversedAudioBuffer.getChannelData(i).reverse();
//     }
//     return reversedAudioBuffer;
//   }
// };

// export const telephoneTransform = async (audioBuffer) => {
//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );
//   let source = ctx.createBufferSource();
//   source.buffer = audioBuffer;

//   let lpf1 = ctx.createBiquadFilter();
//   lpf1.type = "lowpass";
//   lpf1.frequency.value = 2000.0;
//   let lpf2 = ctx.createBiquadFilter();
//   lpf2.type = "lowpass";
//   lpf2.frequency.value = 2000.0;
//   let hpf1 = ctx.createBiquadFilter();
//   hpf1.type = "highpass";
//   hpf1.frequency.value = 500.0;
//   let hpf2 = ctx.createBiquadFilter();
//   hpf2.type = "highpass";
//   hpf2.frequency.value = 500.0;
//   let compressor = ctx.createDynamicsCompressor();
//   lpf1.connect(lpf2);
//   lpf2.connect(hpf1);
//   hpf1.connect(hpf2);
//   hpf2.connect(compressor);
//   compressor.connect(ctx.destination);

//   source.connect(lpf1);

//   source.start(0);
//   return await ctx.startRendering();
// };

// export const slowWobbleTransform = async (audioBuffer) => {
//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );

//   let source = ctx.createBufferSource();
//   source.buffer = audioBuffer;

//   let oscillator = ctx.createOscillator();
//   oscillator.frequency.value = 1;
//   oscillator.type = "sine";

//   let oscillatorGain = ctx.createGain();
//   oscillatorGain.gain.value = 0.05;

//   let delay = ctx.createDelay();
//   delay.delayTime.value = 0.05;

//   // source --> delay --> ctx.destination
//   // oscillator --> oscillatorGain --> delay.delayTime --> ctx.destination

//   source.connect(delay);
//   delay.connect(ctx.destination);

//   oscillator.connect(oscillatorGain);
//   oscillatorGain.connect(delay.delayTime);

//   oscillator.start();
//   source.start();

//   let outputAudioBuffer = await ctx.startRendering();
//   return outputAudioBuffer;
// };

// export const reverseTime = async (audioBuffer: AudioBuffer) => {
//   let ctx = new AudioContext();

//   // copy audiobuffer
//   let outputAudioBuffer = ctx.createBuffer(
//     audioBuffer.numberOfChannels,
//     audioBuffer.length,
//     audioBuffer.sampleRate,
//   );
//   for (let i = 0; i < audioBuffer.numberOfChannels; i++) {
//     outputAudioBuffer.copyToChannel(audioBuffer.getChannelData(i), i);
//   }

//   // reverse new audiobuffer
//   for (let i = 0; i < outputAudioBuffer.numberOfChannels; i++) {
//     outputAudioBuffer.getChannelData(i).reverse();
//   }

//   return outputAudioBuffer;
// };

// export const speedTransform = async (
//   audioBuffer: AudioBuffer,
//   speed: number,
// ) => {
//   let channels: any = [];
//   for (let i = 0; i < audioBuffer.numberOfChannels; i++) {
//     channels[i] = new Float32Array(audioBuffer.getChannelData(i));
//   }

//   // Run worker
//   let outputChannels = await doWorkerTask(
//     () => {
//       self.onmessage = function (e) {
//         let inputChannels = e.data.channels;
//         let speed = e.data.speed;
//         let outputChannels = [];
//         for (let i = 0; i < inputChannels.length; i++) {
//           outputChannels[i] = new Float32Array(
//             Math.floor(inputChannels[i].length / speed),
//           );
//           for (let j = 0; j < outputChannels[i].length; j++) {
//             outputChannels[i][j] =
//               inputChannels[i][Math.floor(j * speed)];
//           }
//         }

//         // self.postMessage(outputChannels, [
//         //   ...outputChannels.map((c) => c.buffer),
//         //   ...inputChannels.map((c) => c.buffer),
//         // ]);
//         self.close();
//       };
//     },
//     { channels, speed },
//     channels.map((c) => c.buffer),
//   );

//   let ctx = new OfflineAudioContext(
//     audioBuffer.numberOfChannels,
//     outputChannels[0].length,
//     audioBuffer.sampleRate,
//   );

//   let outputAudioBuffer = ctx.createBuffer(
//     outputChannels.length,
//     outputChannels[0].length,
//     audioBuffer.sampleRate,
//   );
//   for (let i = 0; i < outputChannels.length; i++) {
//     outputAudioBuffer.copyToChannel(outputChannels[i], i);
//   }

//   return outputAudioBuffer;
// };
export const filters = {};
