import { useState } from "react" import { useTranslation } from "react-i18next" import { Slider } from "@/components/ui/slider" import { cn } from "@/lib/utils" interface ReverbProps { onParameterChange?: (param: keyof ReverbSettings, value: number) => void className?: string } export interface ReverbSettings { roomSize: number // 0 to 100 (small to large) decay: number // 0.1 to 10 seconds damping: number // 0 to 100 (bright to dark) predelay: number // 0 to 200 ms wetLevel: number // 0 to 100 % dryLevel: number // 0 to 100 % earlyLevel: number // 0 to 100 % lateLevel: number // 0 to 100 % } const DEFAULT_SETTINGS: ReverbSettings = { roomSize: 50, decay: 2, damping: 50, predelay: 20, wetLevel: 30, dryLevel: 70, earlyLevel: 80, lateLevel: 80, } export function Reverb({ onParameterChange, className }: ReverbProps) { const { t } = useTranslation() const [settings, setSettings] = useState(DEFAULT_SETTINGS) const handleParameterChange = (param: keyof ReverbSettings, value: number) => { setSettings((prev) => ({ ...prev, [param]: value })) onParameterChange?.(param, value) } const reset = () => { setSettings(DEFAULT_SETTINGS) Object.entries(DEFAULT_SETTINGS).forEach(([param, value]) => { onParameterChange?.(param as keyof ReverbSettings, value) }) } return (

{t("fairlightAudio.effects.reverb.title")}

{/* Visual Display */}
{/* Early reflections */} {/* Late reflections (tail) */} {/* Gradient definition */} {/* Time markers */} 0 {settings.predelay.toFixed(0)}ms {(settings.decay * 1000).toFixed(0)}ms
{/* Main Controls */}
{/* Room Size */}
{t("fairlightAudio.effects.reverb.roomSize")} {settings.roomSize.toFixed(0)}%
handleParameterChange("roomSize", value)} min={0} max={100} step={1} className="w-full" />
{/* Decay Time */}
{t("fairlightAudio.effects.reverb.decay")} {settings.decay.toFixed(1)}s
handleParameterChange("decay", value)} min={0.1} max={10} step={0.1} className="w-full" />
{/* Damping */}
{t("fairlightAudio.effects.reverb.damping")} {settings.damping.toFixed(0)}%
handleParameterChange("damping", value)} min={0} max={100} step={1} className="w-full" />
{/* Pre-delay */}
{t("fairlightAudio.effects.reverb.preDelay")} {settings.predelay.toFixed(0)}ms
handleParameterChange("predelay", value)} min={0} max={200} step={1} className="w-full" />
{/* Mix Controls */}
{t("fairlightAudio.effects.reverb.mixLevels")}
{/* Dry Level */}
{t("fairlightAudio.effects.reverb.dry")} {settings.dryLevel.toFixed(0)}%
handleParameterChange("dryLevel", value)} min={0} max={100} step={1} className="w-full" />
{/* Wet Level */}
{t("fairlightAudio.effects.reverb.wet")} {settings.wetLevel.toFixed(0)}%
handleParameterChange("wetLevel", value)} min={0} max={100} step={1} className="w-full" />
{/* Early Reflections */}
{t("fairlightAudio.effects.reverb.early")} {settings.earlyLevel.toFixed(0)}%
handleParameterChange("earlyLevel", value)} min={0} max={100} step={1} className="w-full" />
{/* Late Reflections */}
{t("fairlightAudio.effects.reverb.late")} {settings.lateLevel.toFixed(0)}%
handleParameterChange("lateLevel", value)} min={0} max={100} step={1} className="w-full" />
{/* Presets */}
) function applyPreset(preset: string) { let newSettings: ReverbSettings switch (preset) { case "room": newSettings = { roomSize: 30, decay: 0.8, damping: 70, predelay: 10, wetLevel: 20, dryLevel: 80, earlyLevel: 90, lateLevel: 60, } break case "hall": newSettings = { roomSize: 70, decay: 2.5, damping: 50, predelay: 25, wetLevel: 35, dryLevel: 65, earlyLevel: 70, lateLevel: 90, } break case "plate": newSettings = { roomSize: 50, decay: 1.5, damping: 80, predelay: 0, wetLevel: 40, dryLevel: 60, earlyLevel: 50, lateLevel: 100, } break case "spring": newSettings = { roomSize: 20, decay: 2, damping: 30, predelay: 0, wetLevel: 30, dryLevel: 70, earlyLevel: 100, lateLevel: 80, } break case "cathedral": newSettings = { roomSize: 100, decay: 6, damping: 40, predelay: 50, wetLevel: 45, dryLevel: 55, earlyLevel: 60, lateLevel: 100, } break default: newSettings = DEFAULT_SETTINGS } setSettings(newSettings) Object.entries(newSettings).forEach(([param, value]) => { onParameterChange?.(param as keyof ReverbSettings, value) }) } } function generateReverbTail(settings: ReverbSettings): string { const startX = 40 + settings.predelay * 0.5 const width = Math.min(150, settings.decay * 30) const height = 30 return ` M ${startX} 40 L ${startX} ${40 - height} Q ${startX + width * 0.2} ${40 - height * 0.8} ${startX + width * 0.5} ${40 - height * 0.4} Q ${startX + width * 0.8} ${40 - height * 0.1} ${startX + width} 40 Z ` }