import { NOTE_NAMES } from '../params'; import type { RenderResponse } from '../worker/renderWorker'; export default function DiagnosticsPanel({ result }: { result: RenderResponse }) { const d = result.diag; const modes = Array.from(result.modeF); const shown = modes.slice(0, 8); return (
{Array.from(result.noteIdx).map((idx, i) => ( ))}
{d.noteCount === 1 ? 'Note' : `Note ${i + 1}`} {NOTE_NAMES[idx - 1] ?? '?'} ·{' '} {result.fPlay[i] > 0 ? `played ${result.fPlay[i].toFixed(1)} Hz (${result.cents[i] >= 0 ? '+' : ''}${result.cents[i].toFixed(0)} cents of ${result.fTarget[i].toFixed(1)})` : 'did not speak'}
Bore modes {shown.map((f) => f.toFixed(0)).join(', ')} {modes.length > shown.length ? `, … (${modes.length} total)` : ''} Hz
Listener {(d.listenerDistM * 100).toFixed(0)} cm from the window
Peak pressure {d.peakPa.toFixed(3)} Pa ({d.peakSplDb.toFixed(1)} dB SPL)
Length {d.durationS.toFixed(2)} s · {result.quality} · oversample {d.oversample}
bore solve: {d.basisCached ? 'cached' : `${(d.basisMs / 1000).toFixed(2)} s`} · jet:{' '} {d.jetCached ? 'cached' : `${(d.jetMs / 1000).toFixed(2)} s`} · radiation:{' '} {(d.radiateMs / 1000).toFixed(2)} s
{d.warnings.map((w, i) => (
⚠ {w}
))}
); }