apphouse
Version:
Component library for React that uses observable state management and theme-able components.
322 lines (270 loc) • 9.34 kB
text/typescript
// 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 = {};