'use client';
import * as React from 'react';
import { Button } from '@/components/ui/Button';
import { Slider } from '@/components/ui/Slider';
import type { ChainEffect, EffectType } from '@/lib/audio/effects/chain';
import type {
PitchShifterParameters,
TimeStretchParameters,
DistortionParameters,
BitcrusherParameters,
} from '@/lib/audio/effects/advanced';
import type {
CompressorParameters,
LimiterParameters,
GateParameters,
} from '@/lib/audio/effects/dynamics';
import type {
DelayParameters,
ReverbParameters,
ChorusParameters,
FlangerParameters,
PhaserParameters,
} from '@/lib/audio/effects/time-based';
import type { FilterOptions } from '@/lib/audio/effects/filters';
export interface EffectParametersProps {
effect: ChainEffect;
onUpdateParameters?: (parameters: any) => void;
}
export function EffectParameters({ effect, onUpdateParameters }: EffectParametersProps) {
const params = effect.parameters || {};
const updateParam = (key: string, value: any) => {
if (onUpdateParameters) {
onUpdateParameters({ ...params, [key]: value });
}
};
// Filter effects
if (['lowpass', 'highpass', 'bandpass', 'notch', 'lowshelf', 'highshelf', 'peaking'].includes(effect.type)) {
const filterParams = params as FilterOptions;
return (
updateParam('frequency', value)}
min={20}
max={20000}
step={1}
/>
updateParam('Q', value)}
min={0.1}
max={20}
step={0.1}
/>
{['lowshelf', 'highshelf', 'peaking'].includes(effect.type) && (
updateParam('gain', value)}
min={-40}
max={40}
step={0.5}
/>
)}
);
}
// Compressor
if (effect.type === 'compressor') {
const compParams = params as CompressorParameters;
return (
updateParam('threshold', value)}
min={-60}
max={0}
step={0.5}
/>
updateParam('ratio', value)}
min={1}
max={20}
step={0.5}
/>
updateParam('knee', value)}
min={0}
max={40}
step={1}
/>
updateParam('attack', value)}
min={0.001}
max={1}
step={0.001}
/>
updateParam('release', value)}
min={0.01}
max={3}
step={0.01}
/>
);
}
// Limiter
if (effect.type === 'limiter') {
const limParams = params as LimiterParameters;
return (
updateParam('threshold', value)}
min={-30}
max={0}
step={0.5}
/>
updateParam('release', value)}
min={0.01}
max={1}
step={0.01}
/>
updateParam('makeupGain', value)}
min={0}
max={20}
step={0.5}
/>
);
}
// Gate
if (effect.type === 'gate') {
const gateParams = params as GateParameters;
return (
updateParam('threshold', value)}
min={-80}
max={0}
step={0.5}
/>
updateParam('ratio', value)}
min={1}
max={20}
step={0.5}
/>
updateParam('attack', value)}
min={0.0001}
max={0.5}
step={0.0001}
/>
updateParam('release', value)}
min={0.01}
max={3}
step={0.01}
/>
);
}
// Delay
if (effect.type === 'delay') {
const delayParams = params as DelayParameters;
return (
updateParam('time', value)}
min={0.001}
max={2}
step={0.001}
/>
updateParam('feedback', value)}
min={0}
max={0.9}
step={0.01}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Reverb
if (effect.type === 'reverb') {
const reverbParams = params as ReverbParameters;
return (
updateParam('roomSize', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('damping', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Chorus
if (effect.type === 'chorus') {
const chorusParams = params as ChorusParameters;
return (
updateParam('rate', value)}
min={0.1}
max={10}
step={0.1}
/>
updateParam('depth', value)}
min={0.0001}
max={0.01}
step={0.0001}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Flanger
if (effect.type === 'flanger') {
const flangerParams = params as FlangerParameters;
return (
updateParam('rate', value)}
min={0.1}
max={10}
step={0.1}
/>
updateParam('depth', value)}
min={0.0001}
max={0.01}
step={0.0001}
/>
updateParam('feedback', value)}
min={0}
max={0.95}
step={0.01}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Phaser
if (effect.type === 'phaser') {
const phaserParams = params as PhaserParameters;
return (
updateParam('rate', value)}
min={0.1}
max={10}
step={0.1}
/>
updateParam('depth', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('stages', Math.round(value))}
min={2}
max={12}
step={1}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Pitch Shifter
if (effect.type === 'pitch') {
const pitchParams = params as PitchShifterParameters;
return (
updateParam('semitones', Math.round(value))}
min={-12}
max={12}
step={1}
/>
updateParam('cents', Math.round(value))}
min={-100}
max={100}
step={1}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Time Stretch
if (effect.type === 'timestretch') {
const stretchParams = params as TimeStretchParameters;
return (
updateParam('rate', value)}
min={0.5}
max={2}
step={0.01}
/>
updateParam('preservePitch', e.target.checked)}
className="h-3 w-3 rounded border-border"
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Distortion
if (effect.type === 'distortion') {
const distParams = params as DistortionParameters;
return (
{(['soft', 'hard', 'tube'] as const).map((type) => (
))}
updateParam('drive', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('tone', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('output', value)}
min={0}
max={1}
step={0.01}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Bitcrusher
if (effect.type === 'bitcrusher') {
const crushParams = params as BitcrusherParameters;
return (
updateParam('bitDepth', Math.round(value))}
min={1}
max={16}
step={1}
/>
updateParam('sampleRate', Math.round(value))}
min={100}
max={48000}
step={100}
/>
updateParam('mix', value)}
min={0}
max={1}
step={0.01}
/>
);
}
// Fallback for unknown effects
return (
No parameters available
);
}