'use client'; import * as React from 'react'; export interface MasterMeterProps { /** Peak level (0-1) */ peakLevel: number; /** RMS level (0-1) */ rmsLevel: number; /** Whether clipping has occurred */ isClipping: boolean; /** Callback to reset clip indicator */ onResetClip?: () => void; } export function MasterMeter({ peakLevel, rmsLevel, isClipping, onResetClip, }: MasterMeterProps) { // Convert linear 0-1 to dB scale for display const linearToDb = (linear: number): number => { if (linear === 0) return -60; const db = 20 * Math.log10(linear); return Math.max(-60, Math.min(0, db)); }; const peakDb = linearToDb(peakLevel); const rmsDb = linearToDb(rmsLevel); // Calculate bar heights (0-100%) const peakHeight = ((peakDb + 60) / 60) * 100; const rmsHeight = ((rmsDb + 60) / 60) * 100; return (
{/* Clip Indicator */} {/* Meters */}
{/* Peak Meter (Left) */}
-3 ? 'bg-red-500' : peakDb > -6 ? 'bg-yellow-500' : 'bg-green-500' }`} />
{/* dB markers */}
{/* RMS Meter (Right) */}
-3 ? 'bg-red-400' : rmsDb > -6 ? 'bg-yellow-400' : 'bg-green-400' }`} />
{/* dB markers */}
{/* Labels and Values */}
PK: -3 ? 'text-red-500' : peakDb > -6 ? 'text-yellow-500' : 'text-green-500' }`}> {peakDb > -60 ? `${peakDb.toFixed(1)}` : '-∞'}
RM: -3 ? 'text-red-400' : rmsDb > -6 ? 'text-yellow-400' : 'text-green-400' }`}> {rmsDb > -60 ? `${rmsDb.toFixed(1)}` : '-∞'}
dB
); }