'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
); }