fix: add back butterchurn

This commit is contained in:
JellyBrick
2023-09-18 06:44:48 +09:00
parent 3f3a5483ed
commit d0d739e61f
6 changed files with 194 additions and 2 deletions

53
plugins/visualizer/butterchurn.d.ts vendored Normal file
View File

@ -0,0 +1,53 @@
declare module 'butterchurn' {
interface VisualizerOptions {
width?: number;
height?: number;
meshWidth?: number;
meshHeight?: number;
pixelRatio?: number;
textureRatio?: number;
outputFXAA?: boolean;
}
class Visualizer {
constructor(audioContext: AudioContext, canvas: HTMLCanvasElement, opts: ButterchurnOptions);
loseGLContext(): void;
connectAudio(audioNode: AudioNode): void;
disconnectAudio(audioNode: AudioNode): void;
static overrideDefaultVars(baseValsDefaults: unknown, baseVals: unknown): unknown;
createQVars(): Record<string, WebAssembly.Global>;
createTVars(): Record<string, WebAssembly.Global>;
createPerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
createPerPixelPool(baseVals: unknown): Record<string, WebAssembly.Global>;
createCustomShapePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
createCustomWavePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
static makeShapeResetPool(pool: Record<string, WebAssembly.Global>, variables: string[], idx: number): Record<string, WebAssembly.Global>;
static base64ToArrayBuffer(base64: string): ArrayBuffer;
loadPreset(presetMap: unknown, blendTime?: number): Promise<void>;
async loadWASMPreset(preset: unknown, blendTime: number): Promise<void>;
loadJSPreset(preset: unknown, blendTime: number): void;
loadExtraImages(imageData: unknown): void;
setRendererSize(width: number, height: number, opts?: VisualizerOptions): void;
setInternalMeshSize(width: number, height: number): void;
setOutputAA(useAA: boolean): void;
setCanvas(canvas: HTMLCanvasElement): void;
render(opts?: VisualizerOptions): unknown;
launchSongTitleAnim(text: string): void;
toDataURL(): string;
warpBufferToDataURL(): string;
}
interface ButterchurnOptions {
width?: number;
height?: number;
onlyUseWASM?: boolean;
}
export default class Butterchurn {
static createVisualizer(audioContext: AudioContext, canvas: HTMLCanvasElement, options?: ButterchurnOptions): Visualizer;
}
}
declare module 'butterchurn-presets' {
export function getPresets(): Record<string, unknown>;
}

View File

@ -2,6 +2,7 @@ import { Visualizer } from './visualizers/visualizer';
import vudio from './visualizers/vudio';
import wave from './visualizers/wave';
import butterchurn from './visualizers/butterchurn';
import defaultConfig from '../../config/defaults';
@ -15,7 +16,12 @@ export default (options: ConfigType<'visualizer'>) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let visualizerType: { new(...args: any[]): Visualizer<unknown> } = vudio;
if (optionsWithDefaults.type === 'wave') visualizerType = wave;
if (optionsWithDefaults.type === 'wave') {
visualizerType = wave;
} else if (optionsWithDefaults.type === 'butterchurn') {
visualizerType = butterchurn;
}
document.addEventListener(
'audioCanPlay',

View File

@ -0,0 +1,63 @@
import Butterchurn from 'butterchurn';
import ButterchurnPresets from 'butterchurn-presets';
import { Visualizer } from './visualizer';
import { ConfigType } from '../../../config/dynamic';
const presets = ButterchurnPresets.getPresets();
class ButterchurnVisualizer extends Visualizer<Butterchurn> {
visualizer: ReturnType<typeof Butterchurn.createVisualizer>;
private readonly renderingFrequencyInMs: number;
constructor(
audioContext: AudioContext,
audioSource: MediaElementAudioSourceNode,
visualizerContainer: HTMLElement,
canvas: HTMLCanvasElement,
audioNode: GainNode,
stream: MediaStream,
options: ConfigType<'visualizer'>,
) {
super(
audioContext,
audioSource,
visualizerContainer,
canvas,
audioNode,
stream,
options,
);
this.visualizer = Butterchurn.createVisualizer(
audioContext,
canvas,
{
width: canvas.width,
height: canvas.height,
}
);
const preset = presets[options.butterchurn.preset];
this.visualizer.loadPreset(preset, options.butterchurn.blendTimeInSeconds);
this.visualizer.connectAudio(audioNode);
this.renderingFrequencyInMs = options.butterchurn.renderingFrequencyInMs;
}
resize(width: number, height: number) {
this.visualizer.setRendererSize(width, height);
}
render() {
const renderVisualizer = () => {
requestAnimationFrame(renderVisualizer);
this.visualizer.render();
};
setTimeout(renderVisualizer, this.renderingFrequencyInMs);
}
}
export default ButterchurnVisualizer;