Files
Phoenix/www/index.html
T

1946 lines
113 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Audio Analyzer RTW Look (dBFS)</title>
<link rel="stylesheet" href="./styles.css">
</head>
<body>
<canvas id="spectroCanvas" class="spectrogram-layer"></canvas>
<canvas id="waveformCanvas" class="waveform-layer"></canvas>
<canvas id="cv"></canvas>
<div class="hud">
<label for="styleSel">Sicht</label>
<select id="styleSel" style="width:220px">
<option value="realtime">Real Time Analyzer</option>
<option value="peak-history">Peak History</option>
<option value="spectrogram">Spectrogram</option>
<option value="waveform">Waveform</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="_divider1" disabled>------------------</option>
<option value="recorder">Recorder</option>
<option value="clock">Studio Clock</option>
<option value="split-view">Split-View</option>
<option value="quad-view">Quad-View</option>
<option value="_divider2" disabled>------------------</option>
<option value="options-panel">Optionen</option>
</select>
<!-- Slot-Dropdowns Real Time:1, Goniometer:3, Panel:5 -->
<div id="slotWrap" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<label id="slotLabel" style="margin-left:16px">Slots</label>
<select id="slotSel1" style="width:120px"></select>
<select id="slotSel2" style="display:none;width:120px"></select>
<select id="slotSel3" style="display:none;width:120px"></select>
<select id="slotSel4" style="display:none;width:120px"></select>
<select id="slotSel5" style="display:none;width:120px"></select>
<div id="peakHistScrollWrap" style="display:none;align-items:center;gap:6px;margin-left:10px">
<label for="peakHistScrollSel">Geschwindigkeit</label>
<select id="peakHistScrollSel" style="width:140px">
<option value="0.5">Langsam (½x)</option>
<option value="1" selected>Normal (1x)</option>
<option value="2">Schnell (2x)</option>
<option value="4">Turbo (4x)</option>
<option value="6">Max (6x)</option>
</select>
</div>
<label id="goniAgcToggle" class="row" style="display:none;align-items:center;gap:6px;margin-left:12px">
<input type="checkbox" id="goniAgcChk">
AGC
</label>
<label id="phaseTrailToggle" class="row" style="display:none;align-items:center;gap:6px;margin-left:12px">
<input type="checkbox" id="phaseTrailChk">
Trail
</label>
<div id="spectroLegendWrap" style="display:none;align-items:center;gap:6px;padding-left:8px">
<label>Skala</label>
<canvas id="spectroLegend" width="300" height="34" style="width:300px;height:34px;background:transparent"></canvas>
</div>
<div id="waveWindowWrap" style="display:none;align-items:center;gap:6px">
<label for="waveWindowSel">Fenster</label>
<select id="waveWindowSel" style="width:120px"></select>
</div>
<div id="waveModeWrap" style="display:none;align-items:center;gap:6px">
<label for="waveModeSel">Ansicht</label>
<select id="waveModeSel" style="width:140px"></select>
</div>
<div id="rtaBpoWrap" style="display:none;align-items:center;gap:6px">
<label for="rtaBpoSel">Oktaven</label>
<select id="rtaBpoSel" style="width:140px"></select>
</div>
<div id="gainWrap" style="display:none;align-items:center;gap:6px">
<label for="gainSel">Gain</label>
<select id="gainSel" style="width:110px"></select>
<button id="resetPeakBtn" class="btn" style="display:none;padding:6px 10px;">Reset Peak</button>
</div>
</div>
<div id="splitViewWrap" style="display:none;gap:8px;align-items:center;flex-wrap:wrap">
<label style="margin-left:16px">Split:</label>
<select id="splitLeftSel" style="width:150px"></select>
<span style="opacity:0.75">|</span>
<select id="splitRightSel" style="width:150px"></select>
<span id="splitMeterBtnWrap" style="display:none;align-items:center;gap:6px">
<label for="splitMeterBtn">Slot:</label>
<button id="splitMeterBtn" class="btn" type="button" style="padding:6px 10px;min-width:110px;white-space:nowrap;text-align:center">Zuordnen</button>
</span>
</div>
<div id="quadViewWrap" style="display:none;gap:8px;align-items:center;flex-wrap:wrap">
<label style="margin-left:16px">Quad:</label>
<button id="quadPlotBtn" class="btn" type="button" style="padding:6px 10px;min-width:100px;white-space:nowrap;text-align:center">Plots…</button>
<span id="quadMeterBtnWrap" style="display:none;align-items:center;gap:6px">
<label for="quadMeterBtn">Slot:</label>
<button id="quadMeterBtn" class="btn" type="button" style="padding:6px 10px;min-width:110px;white-space:nowrap;text-align:center">Zuordnen</button>
</span>
</div>
</div>
<div id="splitMeterPopup" class="split-popup" style="display:none">
<div class="split-popup__box">
<div class="split-popup__head">
<strong id="splitMeterPopupTitle">Slots</strong>
<button id="splitMeterPopupClose" class="btn" type="button" style="padding:6px 10px">Schließen</button>
</div>
<div id="splitMeterRow1" class="split-popup__row">
<label for="splitMeterSel1" style="min-width:70px">Slot 1</label>
<select id="splitMeterSel1" style="width:220px"></select>
</div>
<div id="splitMeterRow2" class="split-popup__row">
<label for="splitMeterSel2" style="min-width:70px">Slot 2</label>
<select id="splitMeterSel2" style="width:220px"></select>
</div>
<div id="splitMeterRow3" class="split-popup__row">
<label for="splitMeterSel3" style="min-width:70px">Slot 3</label>
<select id="splitMeterSel3" style="width:220px"></select>
</div>
</div>
</div>
<div id="quadPlotPopup" class="split-popup" style="display:none">
<div class="split-popup__box">
<div class="split-popup__head">
<strong>Quad-View Plots</strong>
<button id="quadPlotPopupClose" class="btn" type="button" style="padding:6px 10px">Schließen</button>
</div>
<div class="split-popup__row">
<label for="quadPlotSelTL" style="min-width:70px">Oben Links</label>
<select id="quadPlotSelTL" style="width:220px"></select>
</div>
<div class="split-popup__row">
<label for="quadPlotSelTR" style="min-width:70px">Oben Rechts</label>
<select id="quadPlotSelTR" style="width:220px"></select>
</div>
<div class="split-popup__row">
<label for="quadPlotSelBL" style="min-width:70px">Unten Links</label>
<select id="quadPlotSelBL" style="width:220px"></select>
</div>
<div class="split-popup__row">
<label for="quadPlotSelBR" style="min-width:70px">Unten Rechts</label>
<select id="quadPlotSelBR" style="width:220px"></select>
</div>
</div>
</div>
<div id="optionsPanelNew" class="options" style="display:none">
<h2 style="text-decoration:underline;">Optionen</h2>
<details open>
<summary>Global</summary>
<div class="opt-group">
<div class="opt"><label>Input Offset (dB)</label>
<div class="offset-block">
<div class="offset-row">
<span class="ch">L</span>
<input id="opt_inputOffsetDbL" type="range" min="-10" max="10" step="0.1">
<span class="offset-val" id="val_inputOffsetDbL"></span>
</div>
<div class="offset-row">
<span class="ch">R</span>
<input id="opt_inputOffsetDbR" type="range" min="-10" max="10" step="0.1">
<span class="offset-val" id="val_inputOffsetDbR"></span>
</div>
</div>
<div class="offset-notes">
<small>Hardware-Korrektur pro Kanal (Stereo)</small>
<small>Hinweis: Beim Behringer UCA202 entspricht ein Input von 1 dB dem Referenzpegel 0 dB.</small>
</div>
</div>
<div class="opt">
<label>Slots</label>
<button id="opt_resetSlots" class="btn" type="button">Alle Slots auf Standard</button>
<small>Setzt alle Slot-Belegungen (alle Views) auf die Default-Werte zurück.</small>
</div>
<div class="opt"><label>FFT Size</label>
<select id="opt_fft" style="width:140px">
<option>2048</option><option>4096</option><option>8192</option><option>16384</option>
</select>
<small>Basis-FFT für alle Analyser</small>
</div>
<div class="opt">
<label>
<input id="opt_alMarkers" type="checkbox" checked>
Alignment-Marker anzeigen
</label>
<small>Globale 0-dB Linien</small>
</div>
<div class="opt"><label>Meter Bar Breite (Faktor)</label>
<input id="opt_barThin" type="range" min="0.35" max="0.9" step="0.01"><span id="val_barThin"></span>
<small>Balkenbreite für Meter</small>
</div>
<div class="opt">
<label for="opt_headerTextColor">Header Textfarbe</label>
<input id="opt_headerTextColor" type="color" style="width:120px">
<small>Globale Farbe für Header-Text und Header-Zahlen der Meter.</small>
</div>
<div class="opt"><label>Felder-Trennlinien anzeigen</label>
<label class="row"><input id="opt_panelDividers" type="checkbox"></label>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_monoInput" type="checkbox">
Mono-Eingang
</label>
<small>Mischt L+R direkt am Audioeingang zu einem Monosignal</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_lrFracDelayEnabled" type="checkbox">
Fraktionale L/R-Laufzeitkorrektur (Allpass)
</label>
<small>Verzögert den linken Kanal per Allpass um den gewählten Bruchteil eines Samples</small>
</div>
<div class="opt">
<label for="opt_lrFracDelaySamples">Fraktionaler Delay (Samples)</label>
<input id="opt_lrFracDelaySamples" type="text" inputmode="decimal" spellcheck="false" style="width:120px">
<span id="val_lrFracDelaySamples"></span>
<small>Gemessene Korrektur in Samples; negative Werte verzögern den rechten, positive den linken Kanal.</small>
</div>
<div class="opt">
<label for="opt_phoenixBaseUrl">Phoenix URL</label>
<input id="opt_phoenixBaseUrl" type="text" spellcheck="false" style="width:220px" placeholder="http://127.0.0.1:8789">
<small>Basis-URL des Phoenix-Dienstes. Nach Änderung wird Audio neu verbunden.</small>
</div>
</div>
</details>
<details>
<summary>Bildschirmschoner</summary>
<div class="opt-group">
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_screensaverEnabled" type="checkbox">
Bildschirmschoner aktiv
</label>
</div>
<div class="opt">
<label>Screensaver Stil</label>
<select id="opt_screensaverMode" style="width:160px">
<option value="dvd">DVD Logo</option>
<option value="starfield">Sternenfeld</option>
<option value="clock">Clock</option>
<option value="black">Schwarz</option>
</select>
</div>
<div class="opt">
<label class="row" style="gap:8px;align-items:center">
<input id="opt_screensaverGlow" type="checkbox" checked>
LED-Glow
</label>
<small>Gilt fuer Clock- und DVD-Screensaver.</small>
</div>
<div class="opt">
<label for="opt_screensaverColor">LED Farbe</label>
<input id="opt_screensaverColor" type="color" style="width:120px">
<small>Farbe fuer Clock- und DVD-Screensaver.</small>
</div>
<div class="opt">
<label for="opt_screensaverIdleMin">Wartezeit (min)</label>
<input id="opt_screensaverIdleMin" type="number" min="0" max="120" step="0.5" style="width:120px">
<span id="val_screensaverIdleMin"></span>
<small>Legt fest, wie lange der Pegel unter der Schwelle sein muss (0 = sofort bei Schalter-Aus)</small>
</div>
<div class="opt">
<label for="opt_screensaverActivityDb">Aktivitätsschwelle (dBFS)</label>
<input id="opt_screensaverActivityDb" type="number" min="-120" max="0" step="1" style="width:120px">
<span id="val_screensaverActivityDb"></span>
<small>Pegel über dieser Schwelle halten den Schoner wach</small>
</div>
<div class="opt">
<button id="opt_screensaverTest" class="btn btn-compact" type="button">Vorschau</button>
</div>
</div>
</details>
<details>
<summary>Real Time Analyzer</summary>
<div class="opt-group">
<div class="opt">
<label>Darstellung</label>
<select id="opt_rtRenderMode" style="width:150px">
<option value="bars" selected>Balken</option>
<option value="line">Linie</option>
</select>
<small>Anzeigeform (Balken vs. Linie)</small>
</div>
<div class="opt"><label>Real Time Hold (ms)</label>
<input id="opt_rtHold" type="number" min="100" max="5000" step="50" style="width:110px">
<small>Peak hold Zeit</small>
</div>
<div class="opt"><label>Real Time Decay (dB/s)</label>
<input id="opt_rtDecay" type="number" min="1" max="60" step="1" style="width:110px">
<small>Decay pro Sekunde</small>
</div>
<div class="opt">
<label>Engine</label>
<select id="opt_rtaEngine" style="width:150px">
<option value="fft">FFT</option>
<option value="iir" selected>IIR (Filterbank)</option>
</select>
<small>FFT (fix) oder IIR-Filterbank</small>
</div>
<div class="opt">
<label>IIR-Filtercharakteristik</label>
<select id="opt_rtaFilterbank" style="width:230px">
<option value="legacy" selected>Legacy (Phoenix/RTW-Vergleich)</option>
<option value="butterworth">Butterworth 6. Ordnung</option>
</select>
<small>Beide Varianten sind IIR. Legacy bildet die bisherige Anzeige nach; Butterworth ist die neue mathematische Konstruktion.</small>
</div>
<div class="opt">
<label>Bänder pro Oktave</label>
<select id="opt_rtaBpo" style="width:150px">
<option value="1_3">1/3 Oktave</option>
<option value="1_6">1/6 Oktave</option>
<option value="1_12">1/12 Oktave</option>
</select>
<small>Im RTW-Profil stehen 1/3, 1/6 und 1/12 Oktave mit der IIR-Filterbank zur Verfügung.</small>
</div>
<div class="opt"><label>IIR Ordnung</label>
<input id="opt_rtaOrder" type="number" min="2" max="8" step="2" style="width:110px">
<small>Filtergüte Ordnung des IIR-Filters</small>
</div>
<div class="opt"><label>IIR Fast τ (s)</label>
<input id="opt_rtaTauFast" type="number" value="0.125" style="width:110px" disabled>
<small>Feste Standardreaktion: 125 ms</small>
</div>
<div class="opt"><label>IIR Slow τ (s)</label>
<input id="opt_rtaTauSlow" type="number" value="1.0" style="width:110px" disabled>
<small>Feste Standardreaktion: 1 Sekunde</small>
</div>
<div class="opt"><label>Frequenzbereich</label>
<select id="opt_rtaFreq" style="width:150px">
<option value="norm" selected>20 Hz 20 kHz</option>
<option value="lf">5 Hz 5 kHz</option>
</select>
<small>Messband</small>
</div>
<div class="opt"><label>Layout</label>
<select id="opt_rtaLayout" style="width:150px">
<option value="iec" selected>IEC (Bandbreite)</option>
<option value="rtw">RTW-Style (fix)</option>
</select>
<small>Balkenanordnung</small>
</div>
<div class="opt">
<label for="opt_rtaBarBaseColor">Balken Grundfarbe</label>
<input id="opt_rtaBarBaseColor" type="color" style="width:120px">
<small>Grundfarbe der Balken; Peak-Bereiche bleiben rot</small>
</div>
<div class="opt"><label>Bewertung</label>
<select id="opt_rtaWeighting" style="width:150px">
<option value="z" selected>Linear (Z)</option>
<option value="a">A-bewertet</option>
<option value="c">C-bewertet</option>
</select>
<small>Pegelgewichtung</small>
</div>
<div class="opt"><label>RTA-Detektor</label>
<select id="opt_rtaDetector" style="width:180px">
<option value="average" selected>Average (RMS)</option>
<option value="peak">Peak (10 ms)</option>
</select>
<small>RTW-Detektortyp: RMS mit gewählter Response oder feste 10-ms-Peakintegration</small>
</div>
<div class="opt"><label>Response</label>
<select id="opt_rtaIntegration" style="width:150px">
<option value="impulse">Impulse</option>
<option value="fast" selected>Fast</option>
<option value="medium">Medium</option>
<option value="slow">Slow</option>
</select>
<small>Average-Ballistik: Impulse 35 ms/1,5 s, Fast 125 ms, Medium 500 ms oder Slow 1 s</small>
</div>
<div class="opt"><label>RTA-Anzeige</label>
<select id="opt_rtaBallistics" style="width:200px">
<option value="average" selected>Detektorwert</option>
<option value="peak">Peak Hold</option>
<option value="both">Detektorwert + Peak Hold</option>
</select>
<small>Auswahl der angezeigten Mess- und Hold-Kurven</small>
</div>
<div class="opt"><label>Hold Mode</label>
<select id="opt_rtaHoldMode" style="width:150px">
<option value="off">Aus</option>
<option value="auto" selected>Auto</option>
<option value="manual">Manuell</option>
</select>
<small>Auto gibt den Peak nach 2,5 oder 4 Sekunden direkt auf den aktuellen Messwert frei; Manuell hält bis zum Reset.</small>
</div>
<div class="opt"><label>Hold Time (s)</label>
<input id="opt_rtaHoldTime" type="number" min="0" max="30" step="0.5" style="width:110px">
<small>Dauer der Hold-Anzeige</small>
</div>
<div class="opt"><label>Display Hold (s)</label>
<input id="opt_rtaDisplayHold" type="number" min="0" max="5" step="0.1" style="width:110px">
<small>Zusatzhalt für Anzeige</small>
</div>
<div class="opt"><label>Display Gain FFT (dB) -25…+25</label>
<input id="opt_rtaDisplayGainFft" type="range" min="-25" max="25" step="1"><span id="val_rtaDisplayGainFft"></span>
<small>0 dB entspricht +12 dB Offset</small>
</div>
<div class="opt"><label>Display Gain IIR (dB) -25…+25</label>
<input id="opt_rtaDisplayGainIir" type="range" min="-25" max="25" step="1"><span id="val_rtaDisplayGainIir"></span>
<small>0 dB entspricht 6 dB Offset</small>
</div>
</div>
</details>
<details>
<summary>Spectrogram</summary>
<div class="opt-group">
<div class="opt">
<label>Spectrogram Gamma</label>
<input id="opt_spectroGamma" type="range" min="0.3" max="1.2" step="0.05">
<span id="val_spectroGamma"></span>
<small>Kontrast/Farbspreizung (höher = mehr Fokus auf hohe Pegel)</small>
</div>
<div class="opt">
<label>Scroll-Geschwindigkeit</label>
<select id="opt_spectroScroll" style="width:180px">
<option value="0.5">Langsam (½x)</option>
<option value="1" selected>Normal (1x)</option>
<option value="2">Schnell (2x)</option>
<option value="4">Turbo (4x)</option>
<option value="6">Max (6x)</option>
</select>
<small>Bestimmt, wie schnell die Zeitachse nach links scrollt</small>
</div>
</div>
</details>
<details>
<summary>Peak History</summary>
<div class="opt-group">
<div class="opt">
<label>Scroll-Geschwindigkeit</label>
<select id="opt_peakHistScroll" style="width:180px">
<option value="0.5">Langsam (½x)</option>
<option value="1" selected>Normal (1x)</option>
<option value="2">Schnell (2x)</option>
<option value="4">Turbo (4x)</option>
<option value="6">Max (6x)</option>
</select>
<small>Bestimmt, wie schnell die Verlaufslinie nach links läuft</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_peakHistFill" type="checkbox">
Fläche unter Verlauf einfärben
</label>
<small>Füllt den Bereich unter der Verlaufslinie in deren Farbe</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_peakHistFillInvert" type="checkbox">
Fläche über der Linie füllen (invertieren)
</label>
<small>Tauscht die Füllrichtung: füllt oberhalb der Linie statt darunter</small>
</div>
</div>
</details>
<details>
<summary>Waveform</summary>
<div class="opt-group">
<div class="opt">
<label>Ansicht</label>
<select id="opt_waveMode" style="width:150px">
<option value="stacked" selected>Gestapelt</option>
<option value="overlay">Überlagert</option>
<option value="diff">Differenz (LR)</option>
</select>
<small>Darstellung der Kanäle: getrennt, überlagert oder Differenz</small>
</div>
<div class="opt">
<label>Fenster (s)</label>
<select id="opt_waveWindow" style="width:150px">
<option value="0.05">0.05</option>
<option value="0.1">0.1</option>
<option value="0.5">0.5</option>
<option value="1" selected>1.0</option>
<option value="2">2.0</option>
<option value="5">5.0</option>
<option value="10">10.0</option>
<option value="15">15.0</option>
</select>
<small>Längeres Fenster zeigt mehr Verlauf, kostet aber mehr CPU</small>
</div>
<div class="opt"><label>Farben</label>
<span>L</span><input id="opt_waveColorL" type="color">
<span>R</span><input id="opt_waveColorR" type="color">
<span>Δ</span><input id="opt_waveColorDiff" type="color">
<small>Farben für Links, Rechts und Differenz</small>
</div>
</div>
</details>
<details>
<summary>XY-Display</summary>
<div class="opt-group">
<div class="opt"><label>XY Punkte</label>
<select id="opt_xyPoints">
<option>128</option><option>256</option><option>512</option><option selected>1024</option><option>2048</option>
</select>
<small>Mehr Punkte = feinere Darstellung (kann etwas mehr CPU brauchen)</small>
</div>
<div class="opt"><label>XY Stil</label>
<select id="opt_xyStyle">
<option value="points">Punkte</option>
<option value="lines">Linien</option>
</select>
<small>Punkte sind schneller, Linien wirken „analog“</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_xySilenceGate" type="checkbox" checked>
Silence-Gate aktivieren (RMS-basiert)
</label>
<small>Blendet nur die Goniometer-Spur bei Stille aus; die Korrelation wird unabhängig kontinuierlich gemessen.</small>
</div>
<div class="opt">
<label>Silence-Threshold [dBFS RMS]</label>
<input id="opt_xySilenceThr" type="number" min="-90" max="-40" step="1" style="width:120px">
<small>Default: -75 dBFS RMS (Mono)</small>
</div>
<div class="opt"><label>Korrelation Ansprechzeit</label>
<select id="opt_corrResponse">
<option value="1">1,0 s</option>
<option value="2.5">2,5 s</option>
</select>
<small>Kontinuierliche DSP-Integration; unabhängig von Bildrate und ALSA-Periode.</small>
</div>
<div class="opt"><label>Korrelations-Negativmarker</label>
<select id="opt_corrNegativeMarkerMode">
<option value="memory">Memory</option>
<option value="hold">Hold (4 Sekunden)</option>
<option value="off">Off</option>
</select>
<small>Memory bleibt bis zum Zurücksetzen stehen; Hold speichert die negativste Anzeige vier Sekunden.</small>
</div>
<div class="opt">
<button id="opt_corrResetPeak" type="button">Negativspitze zurücksetzen</button>
<small>Setzt den gespeicherten Negativmarker zurück. Im Modus Off bleibt der Marker ausgeblendet.</small>
</div>
<div class="opt"><label>Goniometer Display Gain (dB)</label>
<input id="opt_goniGain" type="range" min="-35" max="35" step="5"><span id="val_goniGain"></span>
<small>Skalierung des XY-Bildes</small>
</div>
<div class="opt"><label class="row"><input id="opt_goniAgc" type="checkbox"> Automatic Gain Control (AGC)</label>
<small>Attack 1&nbsp;ms, Release 10&nbsp;dB/s</small>
</div>
<div class="opt"><label>Gap Meter (Goniometer)</label>
<input id="opt_goniGap" type="range" min="2" max="24" step="1"><span id="val_goniGap"></span>
<small>Abstand zwischen den XY-Meter-Slots</small>
</div>
<div class="opt"><label>Goniometer-Persistenz</label>
<select id="opt_goniPersistence">
<option value="fast">Fast (50 ms)</option>
<option value="medium">Medium (150 ms)</option>
<option value="slow">Slow (300 ms)</option>
<option value="custom">Phoenix frei</option>
</select>
<small>Fast/Medium/Slow sind reproduzierbare Profile; die endgültige RTW-Abstimmung erfolgt am Referenzgerät.</small>
</div>
<div class="opt"><label>Freies Fade-Out</label>
<input id="opt_goniFade" type="range" min="0" max="600" step="10"><span id="val_goniFade"></span>
<small>Wird beim Verschieben automatisch als Phoenix-Profil aktiviert.</small>
</div>
</div>
</details>
<details>
<summary>Phase Wheel</summary>
<div class="opt-group">
<div class="opt"><label>Phase Display Gain (dB)</label>
<input id="opt_phaseGain" type="range" min="-35" max="35" step="5"><span id="val_phaseGain"></span>
<small>Skalierung des Phase-Wheel-Vektors</small>
</div>
<div class="opt"><label class="row"><input id="opt_phaseAgc" type="checkbox"> Automatic Gain Control (AGC)</label>
<small>Passt Zeiger-Länge automatisch an</small>
</div>
<div class="opt">
<label>Amplitude</label>
<select id="opt_phaseAmpMode" style="width:220px">
<option value="bandpass">Bandpass (wie Phase)</option>
<option value="ppm-din">PPM DIN (Fullband)</option>
</select>
<small>Phase bleibt Bandpass; nur die Zeiger-Länge wird umgestellt.</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_phaseTrail" type="checkbox">
Trail anzeigen
</label>
<small>Trail zeigt Bewegung/Verlauf des Vektors</small>
</div>
</div>
</details>
<details>
<summary>Split-View</summary>
<div class="opt-group">
<div class="opt">
<label>Plot Klick</label>
<select id="opt_splitTapAction" style="width:220px">
<option value="switch">Direkt in View wechseln</option>
<option value="popup">View als Popup (Tap schließt)</option>
</select>
</div>
<div class="opt">
<label>Plot Links</label>
<select id="opt_splitLeftPlot" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
<small>Linke Seite: nur Plot (ohne Slots des Views)</small>
</div>
<div class="opt">
<label>Plot Rechts</label>
<select id="opt_splitRightPlot" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
<small>Rechte Seite: nur Plot (ohne Slots des Views)</small>
</div>
<div class="opt">
<label>Meter Slots</label>
<select id="opt_splitMeterCount" style="width:120px">
<option value="0">Aus</option>
<option value="1">1 Slot</option>
<option value="2">2 Slots</option>
<option value="3">3 Slots</option>
</select>
<small>Bis zu drei unabhängige Slots, Position frei wählbar (links / mitte / rechts).</small>
</div>
<div class="opt">
<label>Slot 1</label>
<select id="opt_splitMeter1" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 1 Position</label>
<select id="opt_splitMeter1Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
<div class="opt">
<label>Slot 2</label>
<select id="opt_splitMeter2" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 2 Position</label>
<select id="opt_splitMeter2Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
<div class="opt">
<label>Slot 3</label>
<select id="opt_splitMeter3" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 3 Position</label>
<select id="opt_splitMeter3Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
</div>
</details>
<details>
<summary>Quad-View</summary>
<div class="opt-group">
<div class="opt">
<label>Quadrant Klick</label>
<select id="opt_quadTapAction" style="width:220px">
<option value="switch">Direkt in View wechseln</option>
<option value="popup">View als Popup (Tap außerhalb schließt)</option>
</select>
</div>
<div class="opt">
<label>Plot Oben Links</label>
<select id="opt_quadPlotTL" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
</div>
<div class="opt">
<label>Plot Oben Rechts</label>
<select id="opt_quadPlotTR" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
</div>
<div class="opt">
<label>Plot Unten Links</label>
<select id="opt_quadPlotBL" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
</div>
<div class="opt">
<label>Plot Unten Rechts</label>
<select id="opt_quadPlotBR" style="width:220px">
<option value="none">(leer)</option>
<option value="phase-wheel">Phase Wheel</option>
<option value="realtime">Real Time Analyzer</option>
<option value="goniometer-rtw">XY-Display</option>
<option value="peak-history">Peak History</option>
<option value="classic-needles">Classic Needles</option>
<option value="panel">Meters</option>
<option value="clock">Studio Clock</option>
<option value="waveform">Waveform</option>
<option value="spectrogram">Spectrogram</option>
</select>
</div>
<div class="opt">
<label>Meter Slots</label>
<select id="opt_quadMeterCount" style="width:120px">
<option value="0">Aus</option>
<option value="1">1 Slot</option>
<option value="2">2 Slots</option>
<option value="3">3 Slots</option>
</select>
</div>
<div class="opt">
<label>Slot 1</label>
<select id="opt_quadMeter1" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 1 Position</label>
<select id="opt_quadMeter1Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
<div class="opt">
<label>Slot 2</label>
<select id="opt_quadMeter2" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 2 Position</label>
<select id="opt_quadMeter2Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
<div class="opt">
<label>Slot 3</label>
<select id="opt_quadMeter3" style="width:220px">
<option value="vu">VU</option>
<option value="ppm-ebu">PPM (EBU Type IIb)</option>
<option value="ppm-din">PPM (DIN Type I)</option>
<option value="tp">True Peak</option>
<option value="rms">True RMS</option>
<option value="lufs">LUFS (EBU R128)</option>
<option value="stopwatch">Stoppuhr</option>
<option value="none">(leer)</option>
</select>
</div>
<div class="opt">
<label>Slot 3 Position</label>
<select id="opt_quadMeter3Pos" style="width:140px">
<option value="left">Links</option>
<option value="center">Mitte</option>
<option value="right" selected>Rechts</option>
</select>
</div>
</div>
</details>
<details>
<summary>Recorder</summary>
<div class="opt-group">
<div class="opt">
<label>Speicherort</label>
<select id="recTargetSel" style="width:220px"></select>
<small>Lädt lokal auf diesem Rechner herunter oder speichert direkt auf Phoenix/Pi.</small>
</div>
<div class="opt">
<label>Recorder-Format</label>
<select id="opt_recFormat" style="width:220px">
<option value="wav">WAV (verlustfrei, groß)</option>
<option value="mp3">MP3 (kompakt)</option>
<option value="webm">WebM/Opus (kleiner)</option>
</select>
<small>Phoenix unterstützt WAV, MP3 und WebM/Opus.</small>
</div>
<div class="opt" id="opt_recMp3BitrateWrap">
<label>MP3-Bitrate</label>
<select id="opt_recMp3Bitrate" style="width:220px">
<option value="64">64 kbit/s</option>
<option value="128">128 kbit/s</option>
<option value="192">192 kbit/s</option>
<option value="256">256 kbit/s</option>
<option value="320">320 kbit/s</option>
</select>
<small>Wird nur für MP3 verwendet.</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_recAutoDownload" type="checkbox">
Auto-Speichern
</label>
<small>Lädt neue Takes automatisch herunter, sobald sie in der Liste erscheinen.</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_recShowAb" type="checkbox">
Recorder A/B anzeigen
</label>
<small>Blendet links oben die aktiven Recorder-Kennungen A und B ein.</small>
</div>
<div class="opt">
<label>Auto-Split Gap</label>
<input id="opt_recAutoGap" type="range" min="0.5" max="3" step="0.5">
<span id="val_recAutoGap"></span>
<small>Nach dieser Ruhezeit wird im Auto-Modus ein neuer Titel begonnen.</small>
</div>
<div class="opt">
<label>Auto-Split Threshold (dBFS)</label>
<input id="opt_recThreshDbfs" type="number" min="-120" max="20" step="0.1" style="width:120px">
<small>Schwelle für Signal/Ruhe im Recorder-Auto-Modus in dBFS.</small>
</div>
<div class="opt">
<label>Auto-Split Threshold (PPM DIN)</label>
<input id="opt_recThreshPpmDin" type="number" min="-120" max="20" step="0.1" style="width:120px">
<small>Alternative Eingabe in PPM DIN; beide Felder bleiben gekoppelt.</small>
</div>
</div>
</details>
<details>
<summary>Studio Clock</summary>
<div class="opt-group">
<div class="opt">
<label for="opt_clockStyle">Stil</label>
<select id="opt_clockStyle" style="width:240px">
<option value="analog">Analog (Ring)</option>
<option value="analog-ppm">Analog + PPM</option>
<option value="digital">Digital</option>
<option value="digital-ppm">Digital + PPM</option>
</select>
<small>Darstellung der Studio Clock</small>
</div>
<div class="opt">
<label for="opt_clockColor">LED Farbe</label>
<input id="opt_clockColor" type="color" style="width:120px">
<small>Farbe der Punkte und des Rings</small>
</div>
<div class="opt">
<label class="row" style="gap:8px;align-items:center">
<input id="opt_clockGlow" type="checkbox" checked>
LED-Glow für Punkte
</label>
<small>Simuliert leuchtende LEDs für Ringe und Ziffern</small>
</div>
<div class="opt">
<label class="row" style="gap:8px;align-items:center">
<input id="opt_clockPpmLed" type="checkbox">
PPM als LED-Band
</label>
<small>Zeigt das PPM unter der Uhr als Punkte statt durchgehender Balken</small>
</div>
</div>
</details>
<details>
<summary>Presets</summary>
<div class="opt-group">
<div class="opt">
<label for="opt_softwarePreset">Software-Preset</label>
<div class="row" style="gap:8px;align-items:center;flex-wrap:wrap">
<select id="opt_softwarePreset" style="width:180px">
<option value="default">Default</option>
<option value="claus">Claus</option>
<option value="michael">Michael</option>
</select>
<button id="btnSoftwarePresetLoad" class="btn btn-compact" type="button">Laden</button>
<button id="btnSoftwarePresetSave" class="btn btn-compact" type="button">Speichern</button>
<button id="btnSoftwarePresetExport" class="btn btn-compact" type="button">Export</button>
<label for="impSoftwarePreset" class="btn btn-compact" id="btnSoftwarePresetImport" style="cursor:pointer">Import</label>
<input id="impSoftwarePreset" type="file" accept="application/json" style="display:none">
</div>
<small>Default lädt den Werkstand. Claus und Michael können als komplette Benutzer-Presets extern gespeichert und später wieder geladen werden.</small>
</div>
<div class="opt">
<label for="opt_layoutPreset">Layout-Slot</label>
<div class="row" style="gap:8px;align-items:center;flex-wrap:wrap">
<select id="opt_layoutPreset" style="width:120px">
<option value="1">Layout 1</option>
<option value="2">Layout 2</option>
<option value="3">Layout 3</option>
<option value="4">Layout 4</option>
</select>
<button id="btnLayoutPresetSave" class="btn btn-compact" type="button">Speichern</button>
</div>
<div class="row" style="gap:8px;align-items:center;flex-wrap:wrap; margin-top:8px">
<button id="btnLayoutPresetLoad1" class="btn btn-compact" type="button">Layout 1 aktivieren</button>
<button id="btnLayoutPresetLoad2" class="btn btn-compact" type="button">Layout 2 aktivieren</button>
<button id="btnLayoutPresetLoad3" class="btn btn-compact" type="button">Layout 3 aktivieren</button>
<button id="btnLayoutPresetLoad4" class="btn btn-compact" type="button">Layout 4 aktivieren</button>
</div>
<small>Speichert nur Ansicht und Layout. Layouts können per URL, z. B. <code>?layout=1</code>, oder über die Aktivieren-Tasten geladen werden.</small>
</div>
</div>
</details>
<details>
<summary>Meters</summary>
<div class="opt-group">
<details style="margin-left:12px">
<summary>VU-Meter</summary>
<div class="opt-group">
<div class="opt">
<label class="row">
<input id="opt_vu_plus4" type="checkbox" checked>
VU: 0VU = +4dBu (statt 0dBu)
</label>
<small>Deaktiviert: 0VU liegt direkt auf 0dBu (Digital-Referenz).</small>
</div>
<div class="opt"><label>0 VU Referenz (dBFS)</label>
<input id="opt_vuRef" type="number" min="-30" max="-6" step="0.1" style="width:120px"><small>typ. -18</small>
</div>
<div class="opt"><label>VU Offset (dB) Anzeige</label>
<input id="opt_vuOff" type="number" min="-20" max="+20" step="0.1" style="width:120px"><small>addiert auf VU</small>
</div>
<div class="opt"><label>VU Hold (ms)</label>
<input id="opt_vuHold" type="number" min="100" max="5000" step="50" style="width:110px">
<small>Peak-Hold Zeit</small>
</div>
<div class="opt"><label>VU Decay (dB/s)</label>
<input id="opt_vuDecay" type="number" min="5" max="60" step="1" style="width:110px">
<small>Abfall pro Sekunde</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_vuHeaderValue" type="checkbox">
Header: Pegel statt Name
</label>
<small>Blendet „Volume Units“ aus und zeigt oben den aktuellen Wert</small>
</div>
<div class="opt"><label>VU: Rot ab (VU)</label>
<input id="opt_vuRedThr" type="number" min="-20" max="+12" step="0.5" style="width:110px">
<label class="row"><input id="opt_vuRedBarOnly" type="checkbox"> nur roter Teil</label>
</div>
<div class="opt"><label>VU Farben</label>
<span>Normal</span><input id="opt_vuColNorm" type="color">
<span>Warn</span><input id="opt_vuColWarn" type="color">
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>PPM DIN</summary>
<div class="opt-group">
<div class="opt">
<label class="row">
<input id="opt_din_al_minus6" type="checkbox">
DINPPM: 0dBu → 6dB (statt 9dB)
</label>
<small>DokumentVariante (PML=+6dBu; AL=0dBu → 6dB). Deaktiviert: AL → 9dB.</small>
</div>
<div class="opt">
<label class="row">
<input id="opt_ppmDinFastAttack" type="checkbox">
PPM DIN: FastAttack (sofort, nicht normgerecht)
</label>
<small>Umgeht die feste 10-ms-Normintegration und zeigt Sample-Peaks sofort an (kann gefühltes Anzeige-Lag reduzieren).</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_ppmDinHeaderValue" type="checkbox">
Header: Pegel statt Name
</label>
<small>Blendet „PPM (DIN)“ aus und zeigt oben den aktuellen Wert</small>
</div>
<div class="opt"><label>PPM Farben</label>
<span>Normal</span><input id="opt_ppmDinColNorm" type="color">
<span>Warn</span><input id="opt_ppmDinColWarn" type="color">
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_ppmDinLoudnessBox" type="checkbox">
Historische „RTW-Loudness“
</label>
<small>RTW-artige Momentary-Loudness: 400 ms Integration, K-gewichtet, pro Kanal. Historische Zusatzanzeige, nicht als normierte EBU-R128-Anzeige zu verstehen.</small>
</div>
<div class="opt"><label>RTW-Loudness Offset (dB)</label>
<input id="opt_ppmDinLoudOff" type="range" min="-7" max="7" step="0.1"><span id="val_ppmDinLoudOff"></span>
<small>Addiert auf die RTW-Loudness-Box</small>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>PPM EBU</summary>
<div class="opt-group">
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_ppmEbuHeaderValue" type="checkbox">
Header: Pegel statt Name
</label>
<small>Blendet „PPM (EBU)“ aus und zeigt oben den aktuellen Wert</small>
</div>
<div class="opt"><label>PPM Farben</label>
<span>Normal</span><input id="opt_ppmEbuColNorm" type="color">
<span>Warn</span><input id="opt_ppmEbuColWarn" type="color">
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>True Peak</summary>
<div class="opt-group">
<div class="opt"><label>TruePeak Offset (dB)</label>
<input id="opt_tpOff" type="number" min="-20" max="+20" step="0.1" style="width:120px">
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_tpHeaderValue" type="checkbox">
Header: Pegel statt Name
</label>
<small>Blendet „True Peak“ aus und zeigt oben den aktuellen Wert</small>
</div>
<div class="opt"><label>TruePeak: Rot ab (dBFS)</label>
<input id="opt_tpRedThr" type="number" min="-20" max="+6" step="0.5" style="width:110px">
<label class="row"><input id="opt_tpRedBarOnly" type="checkbox"> nur roter Teil</label>
</div>
<div class="opt"><label>TruePeak Farben</label>
<span>Normal</span><input id="opt_tpColNorm" type="color">
<span>Warn</span><input id="opt_tpColWarn" type="color">
</div>
<div class="opt"><label>TruePeak Hold (ms)</label>
<input id="opt_tpHold" type="number" min="0" max="5000" step="50" style="width:110px">
</div>
<div class="opt"><label>TruePeak Decay (dB/s)</label>
<input id="opt_tpDecay" type="number" min="1" max="60" step="0.1" style="width:110px">
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>HiFi Peak</summary>
<div class="opt-group">
<div class="opt">
<label>Alignment</label>
<select id="opt_hifiAlign" style="width:220px">
<option value="ppm_din_minus5" selected>PPM DIN -5 dB = HiFi 0 dB</option>
<option value="ppm_din_zero">PPM DIN 0 dB = HiFi 0 dB</option>
</select>
<small>Legt fest, worauf sich 0 dB auf dem HiFi-Peak-Meter bezieht.</small>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>RMS</summary>
<div class="opt-group">
<div class="opt"><label>RMS Modus</label>
<select id="opt_rmsMode">
<option value="dbu">dBu (Studio)</option>
<option value="dbfs">dBFS</option>
</select>
</div>
<div class="opt"><label>RMS Referenz (dBFS @ 0 dBu)</label>
<input id="opt_rmsRefDbfs" type="number" min="-60" max="0" step="0.1" style="width:120px">
</div>
<div class="opt"><label>RMS Referenz (dBu)</label>
<input id="opt_rmsRefDbu" type="number" min="-20" max="+24" step="0.1" style="width:120px">
</div>
<div class="opt"><label>RMS Offset (dB)</label>
<input id="opt_rmsOff" type="number" min="-20" max="+20" step="0.1" style="width:120px">
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_rmsHeaderValue" type="checkbox">
Header: Pegel statt Name
</label>
<small>Blendet „RMS …“ aus und zeigt oben den aktuellen Wert</small>
</div>
<div class="opt"><label>RMS: Rot ab (dBFS)</label>
<input id="opt_rmsRedThr" type="number" min="-40" max="0" step="0.5" style="width:110px">
<label class="row"><input id="opt_rmsRedBarOnly" type="checkbox"> nur roter Teil</label>
</div>
<div class="opt"><label>RMS Farben</label>
<span>Normal</span><input id="opt_rmsColNorm" type="color">
<span>Warn</span><input id="opt_rmsColWarn" type="color">
</div>
<div class="opt"><label>RMS Zeitkonstante</label>
<select id="opt_rmsTc" style="width:170px">
<option value="fast">Fast (125 ms)</option>
<option value="slow">Slow (1000 ms)</option>
<option value="impulse">Impulse (35 ms)</option>
<option value="none">Keine (instant)</option>
</select>
<small>IEC 60268: Impulse 35 ms, Fast 125 ms, Slow 1000 ms</small>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>LUFS</summary>
<div class="opt-group">
<div class="opt"><label>LUFS: Rot ab (LUFS)</label>
<input id="opt_lufsRedThr" type="number" min="-10" max="+0" step="0.1" style="width:110px">
<small>typ. -1.0</small>
</div>
<div class="opt"><label>LUFS: Gelb ab (LUFS)</label>
<input id="opt_lufsYellowThr" type="number" min="-10" max="+0" step="0.1" style="width:110px">
<small>typ. -2.0</small>
</div>
<div class="opt"><label>LUFS: Grün bis (LUFS)</label>
<input id="opt_lufsGreenThr" type="number" min="-10" max="+0" step="0.1" style="width:110px">
<small>typ. -5.0</small>
</div>
<div class="opt"><label>LUFS Farbe I</label>
<input id="opt_lufsColI" type="color">
</div>
<div class="opt"><label>LUFS Farbe M</label>
<input id="opt_lufsColM" type="color">
</div>
<div class="opt"><label>LUFS Farbe S</label>
<input id="opt_lufsColS" type="color">
</div>
<div class="opt"><label>LUFS Skala-Zahlen</label>
<input id="opt_lufsScaleCol" type="color">
<small>Farbe der Skalenwerte (z.B. 23/18/10)</small>
</div>
<div class="opt"><label>LUFS I: Zeitfenster (min)</label>
<input id="opt_lufsIWindowMin" type="range" min="1" max="10" step="1"><span id="val_lufsIWindowMin"></span>
<small>Rollierendes Fenster für „I (Integrated)“ in 1MinutenSchritten.</small>
</div>
<div class="opt">
<label class="row" style="align-items:center;gap:8px">
<input id="opt_lufsINorm" type="checkbox">
LUFS I: Normgerecht (seit Reset)
</label>
<small>Misst Integrated über die gesamte Laufzeit (seit Aktivierung/Reset) und deaktiviert das rollierende Fenster.</small>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>Stoppuhr</summary>
<div class="opt-group">
<div class="opt"><label>Anzeige</label>
<select id="opt_stopwatchDisplay" style="width:220px">
<option value="mono">Standard (Monospace)</option>
<option value="seven">7Segment</option>
</select>
<small>Gilt für das SlotMeter „Stoppuhr“.</small>
</div>
<div class="opt">
<label>Auto-Threshold (dBFS)</label>
<input id="opt_stopwatchThreshDbfs" type="number" min="-120" max="20" step="0.1" style="width:120px">
<small>Schwelle für automatisches Start/Stop der Stoppuhr in dBFS.</small>
</div>
<div class="opt">
<label>Auto-Threshold (PPM DIN)</label>
<input id="opt_stopwatchThreshPpmDin" type="number" min="-120" max="20" step="0.1" style="width:120px">
<small>Alternative Eingabe in PPM DIN; beide Felder bleiben gekoppelt.</small>
</div>
</div>
</details>
</div>
</details>
<div style="margin:16px 0 0 0; display:flex; gap:12px; flex-wrap:wrap; padding:0 4px;">
<button id="btnOnlineUpdate" class="btn">Online Update</button>
<button id="btnReloadAudio" class="btn">Audio neu initialisieren</button>
<button id="btnReset" class="btn">Werkseinstellungen</button>
</div>
<p style="margin:6px 4px 0 4px; color:#b2c7d9; font-size:12px;">
Hinweis: Online Update ist nur für die reine Analyzer-Installation gedacht. In der Volumio-Variante bitte per Snapshot bzw. manuell aktualisieren.
</p>
<details style="margin:20px 0 0 5px">
<summary>Version / Änderungen</summary>
<div class="opt-group">
<details style="margin-left:12px" open>
<summary>3.8 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 21.07.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li><strong>Analysegrundlage:</strong> Die tiefgehende Code- und DSP-Prüfung, durch die die nachfolgenden Fehler und Verbesserungsmöglichkeiten gefunden werden konnten, wurde durch den Umstieg auf das LLM-Modell GPT-5.6 SOL ermöglicht.</li>
<li><strong>Echtzeit-Datenweg:</strong> WebSocket-Verarbeitung auf „latest value wins“ umgestellt. Messwerte, Spektrogramm sowie Goniometer/Waveform verwenden getrennte, begrenzte Datenwege; alte Frames können keine anwachsende Anzeigeverzögerung mehr bilden.</li>
<li><strong>Browserlast:</strong> Single-Slot-Puffer und Sequenzprüfung für Mess-, Spektrogramm- und Visualisierungsdaten ergänzt. Große Rohsamplefelder werden nicht mehr in jedem JSON-Messpaket wiederholt.</li>
<li><strong>Spektrogramm:</strong> Langzeitstillstand und stotterndes Nachholen beseitigt. Inkrementelles Spaltenzeichnen, Worker-ACK, Watchdog/Neustart und begrenztes Überspringen veralteter Spalten ergänzt. 0,5×, 1×, 2×, 4× und 6× besitzen nun eine feste, FFT- und DPI-unabhängige Zeitbasis.</li>
<li><strong>DIN-/EBU-PPM:</strong> Blockunabhängige Quasi-Peak-Detektoren mit bandbegrenzter Interpolation, korrekter Attack- und Rücklaufballistik sowie automatischen Tonburst-, Frequenzgang- und Polaritätstests implementiert. Eine zweite Browser-Anstiegsballistik wurde entfernt.</li>
<li><strong>RTW-RTA:</strong> RTW-Profil verbindlich auf die IIR-Oktavteilband-Filterbank festgelegt. Bis zur Vergleichsmessung am realen RTW-Gerät sind die bisherige Phoenix/RTW-Charakteristik und vollständige Butterworth-Bandpässe sechster Ordnung getrennt auswählbar.</li>
<li><strong>RTA-Detektor und Reaktionszeit:</strong> Average (RMS) und Peak (gleitendes 10-ms-Maximum) sind nun getrennt von Fast, Medium, Slow und Impulse wählbar. Fast wurde auf 125 ms korrigiert; Impulse verwendet 35 ms Anstieg und 1,5 s Rücklauf. Die IIR-Detektoren arbeiten samplegenau und unabhängig von der ALSA-Periodengröße. Alte Einstellungen werden automatisch migriert.</li>
<li><strong>RTA-Auflösung:</strong> Umschaltung zwischen 1/3, 1/6 und 1/12 repariert. Alle drei Auflösungen bleiben im RTW-Profil aktiv und verwenden dessen IIR-Filterbank, Darstellung und Ballistik.</li>
<li><strong>Hardwareparameter:</strong> Tatsächlich von ALSA ausgehandelte Samplerate, Perioden- und Puffergröße werden nun durch DSP, Aufnahme, Status und Browser verwendet; die feste 48-kHz-Annahme wurde entfernt.</li>
<li><strong>Goniometer:</strong> Nur neue XY-Samplepaare werden mit einer periodengrößenunabhängigen mittleren Rate von 60 Hz übertragen. Punktbegrenzung wirkt bereits auf den Transport; begrenzte und wiederverwendbare Spurpuffer reduzieren Speicher- und Zeichenlast.</li>
<li><strong>Goniometer-Persistenz:</strong> Reproduzierbare Fast-, Medium- und Slow-Profile sowie ein freies Phoenix-Fade ergänzt. Künstliche Bézier-Verformung der Messspur entfernt; AGC und Silence-Gate arbeiten zeit- beziehungsweise fensterbasiert.</li>
<li><strong>Korrelation:</strong> Kontinuierliche DSP-Messung aus L², R² und L·R mit wählbaren 1,0/2,5 Sekunden ergänzt. Bildratenabhängige Doppelglättung entfernt; Negative-Peak-Memory, Marker und manueller Reset hinzugefügt.</li>
<li><strong>True Peak, RMS und VU:</strong> True-Peak-Interpolation läuft nun lückenlos über Capture-Blockgrenzen; ein festes gleitendes 300-ms-Leistungsfenster ersetzt das periodengrößenabhängige Block-RMS. VU verwendet statt Rechteckmittelung ein Moving-Coil-Modell mit 300-ms-Sprungantwort und 1 bis 1,5 % Überschwingen.</li>
<li><strong>Qualitätssicherung:</strong> Automatische Regressionstests für PPM, RTA, A/C/Z, mehrere Sampleraten, Korrelationssignale, Goniometertaktung, Binärprotokolle sowie Spektrogramm-Zeitbasis und Langlauf ergänzt.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.3.5 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 28.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Stoppuhr: Löschfunktion verbessert. Die X-Buttons neben den einzelnen Zeiten lassen sich jetzt über einen separaten X-Button ein- und ausblenden; Reset und Löschmodus sind optisch getrennt.</li>
<li>Online Update: Hinweis ergänzt, dass die Funktion nur für die reine Analyzer-Installation gedacht ist; Volumio-Systeme sollen per Snapshot bzw. manuell aktualisiert werden.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.3.4 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 24.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Studio-Clock und Clock-Screensaver beim Sekundenblinken angepasst: Der Doppelpunkt läuft jetzt mit exakt 50 % Duty Cycle und schaltet auf der Sekunde an sowie in der zweiten Halbsekunde wieder aus.</li>
<li>Online Update robuster gemacht: Update-Skripte laufen jetzt mit sicherer Fallback-Locale, damit fehlendes de_DE.UTF-8 auf Volumio keine bash-setlocale-Warnung mehr als Fehler anzeigt.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.3.2 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 21.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>INFO: Ein extern beobachtetes Start-/WebSocket-Problem in älteren Safari-Versionen lag nicht an Phoenix selbst, sondern an einem Safari-/WebKit-Bug; nach Safari-Update funktionierte der Analyzer wieder normal.</li>
<li>Recorder-Liste auf große Browserfenster verbessert: Die sichtbare Listenhöhe passt sich jetzt dynamisch an die tatsächlich verfügbare Fläche an, statt früh auf eine starre Anzahl sichtbarer Einträge zu begrenzen.</li>
<li>Recorder-Layout unten entschärft: Vor Timer und Buttons bleibt nun mehr Reserve, damit der letzte sichtbare Eintrag nicht in den Button-Bereich hineinragt, bevor gescrollt werden muss.</li>
<li>Stoppuhr-Liste ebenfalls dynamisiert: Die Anzahl sichtbarer Zeiten wird jetzt direkt aus der verfügbaren Meter-Höhe berechnet und reagiert sauberer auf unterschiedlich große Browserfenster.</li>
<li>Stoppuhr-Layout bei kleiner Höhe geglättet: Die unteren Start-/Reset-/Auto-Buttons schrumpfen bei knapper Höhe mit, damit die Liste beim Verkleinern nicht mehr schlagartig verschwindet.</li>
<li>Phoenix-Metrics-Stream robuster gemacht: Bei kurzzeitigem Rückstau werden verpasste Frames jetzt verworfen, ohne den WebSocket sofort zu beenden; zusätzlich wurde der interne Metrics-Puffer vergrößert.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.3.1 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 20.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Layout- und Preset-System weiter ausgebaut: Presets wurden im Optionen-Menü auf eine eigene Ebene gehoben und die Layout-Slots lassen sich zusätzlich direkt aktivieren.</li>
<li>Layout-Boot per URL stabilisiert: Toolbar, aktiver View und geladene Ansicht bleiben bei <code>?layout=1</code> und den übrigen Layout-Slots jetzt konsistenter synchron.</li>
<li>Layout-Speicherung korrigiert: Die Slot-Belegungen der Views werden beim Speichern eines Layout-Slots jetzt zuverlässig mitgesichert und beim Laden wiederhergestellt.</li>
<li>INFO: Ein zwischenzeitlich beobachtetes externes Start-/WebSocket-Problem in älteren Safari-Versionen lag nicht an Phoenix selbst, sondern an einem Safari-/WebKit-Bug; nach einem Safari-Update funktionierte der Analyzer wieder normal.</li>
<li>Weitere Anzeigeoptionen globalisiert: RTA-Oktaven, Peak-History-Optionen, Phase-Wheel-Optionen, Classic-Needles-Quelle, historische RTW-Loudness sowie die konfigurierbaren Farben laufen nun browserübergreifend über die globale Phoenix-Konfiguration.</li>
<li>Quad-/Registry-Pfad korrigiert: Peak History bleibt auch im Quad-View mit gültigen Live-Daten versorgt und fällt dort nicht mehr scheinbar auf 0 zurück.</li>
<li>Online-Update ergänzt: Phoenix kann eine feste Update-ZIP laden, in einen Stage-Ordner vorbereiten und beim Neustart mit Backup, Health-Check und automatischem Rollback auf den alten Stand umschalten.</li>
<li>Online-Update weiter gehärtet: Vor dem Neustart der Kiosk-Browser werden nur die Asset-Caches geleert, damit nach einem Update zuverlässig der neue Web-Stand geladen wird, ohne die eigentlichen Einstellungen zu verlieren.</li>
<li>Online-Update-Logging ergänzt: Download-, Entpack-, Stage-, Neustart- und Rollback-Schritte werden jetzt in eine gemeinsame Update-Logdatei geschrieben und können zusätzlich über einen Phoenix-Endpunkt direkt abgefragt werden.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.3 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 20.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Software-Presets weiter ausgebaut: Default, Claus und Michael lassen sich jetzt robuster speichern, laden, exportieren und importieren.</li>
<li>Preset-Speicherung bleibt aus Sicherheitsgründen auf den Analyzer direkt beschränkt; externe Browser dürfen Presets laden, aber nicht überschreiben.</li>
<li>Phoenix-URL-/Host-Pfad für Presets gehärtet: Wenn eine gespeicherte Loopback-URL für den aktuellen Browser nicht passt, wird sauber auf den aktuellen Analyzer-Host zurückgefallen.</li>
<li>Preset-Ladepfad stabilisiert: Benutzer-Presets übernehmen jetzt auch den getrennt gehaltenen UI-/View-Zustand zuverlässiger und laden nach Profil-/Cache-Reset wieder nachvollziehbar.</li>
<li>Neue Layout-Slots ergänzt: Vier separate Layout-Presets speichern reine Ansichts-/Fensterbelegungen, unabhängig von globalen Software-Presets.</li>
<li>Layout-Slots werden außerhalb des Browser-Profils serverseitig gespeichert und können per URL-Parameter wie <code>?layout=1</code> direkt in einem Fenster geladen werden.</li>
<li>Options-Menü neu geordnet: Unter <code>Meters → Presets</code> liegen jetzt sowohl die Software-Presets als auch die neuen Layout-Slots gebündelt an einer Stelle.</li>
<li>Erststart-Dialog überarbeitet: statt des alten Kalibrierhinweises erscheint nun eine neutrale Willkommensmeldung zum Phoenix Analyzer.</li>
<li>Header-Farbpfad vereinheitlicht: Header-Text/-Zahlen entkoppelt von Balkenfarben und zusätzlich über eine globale Header-Textfarbe einstellbar.</li>
<li>Waveform-Farben reagieren jetzt wieder korrekt auf Änderungen in den Optionen, auch im Worker-Pfad.</li>
<li>Split-/Quad-Views erweitert: Waveform und Spectrogram können dort als Plot verwendet werden; eingebettete Geometrie und Darstellung wurden dafür nachgezogen.</li>
<li>Weitere UI-/Detailkorrekturen: Peak-History-Geometrie, RTA-/Meter-Beschriftungen, PPM-DIN-%-Skala, Recorder-/Stoppuhr-Header sowie diverse kleinere Konsistenzfehler wurden bereinigt.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.1 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 18.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>GUI-Performance systematisch überarbeitet: statische Layer werden projektweit gecacht statt pro Frame neu gezeichnet.</li>
<li>Renderloop bereinigt: Hintergrund-Layer gecacht und Zeichenpfad stärker auf echte Audio-/UI-Änderungen ausgerichtet.</li>
<li>Spectrogram deutlich entlastet: Phoenix liefert Spectro-Spalten nur noch bei echten neuen FFT-Schritten, Worker-Takt reduziert und interne Renderauflösung angepasst.</li>
<li>Waveform deutlich entlastet: Worker-Takt reduziert, interne Renderauflösung angepasst und Grid-Layer gecacht.</li>
<li>Peak History deutlich entlastet: Grid, Rahmen und Zeit-/Werteskalen werden gecacht; Verlauf und Live-Meter bleiben dynamisch.</li>
<li>Peak History in der Geometrie nachkorrigiert: `now` rechts sichtbar, linke Endzeit wird explizit gesetzt, Füllung läuft bis zum unteren Rahmen, Verlauf kann unter den letzten Tick weiterlaufen und der Plot beginnt links ohne künstliche Rahmenlücke.</li>
<li>Meter-Views weiter entschlackt: feste Skalen, Ticks, Referenzlinien und Labels von VU, PPM DIN, PPM EBU, RMS, TP und LUFS werden nicht mehr jedes Frame neu gerastert.</li>
<li>Phase Wheel entlastet: tote Trace-Berechnung entfernt und Phase-Trail intern ausgedünnt.</li>
<li>Goniometer/XY weiter bereinigt: RTW-Look beibehalten, Alpha-/Trail-Dichte entschlackt und echte XY-History in Phoenix so angepasst, dass `XY Punkte` wieder sinnvoll wirkt.</li>
<li>Split- und Quad-View bereinigt: statische Containerteile, leere Plots und Meterhüllen werden gecacht statt pro Frame neu aufgebaut.</li>
<li>Recorder- und Classic-Needles-View weiter entschlackt: statische Bühnen, Rahmen und Instrumentenkörper gecacht; beim Recorder zusätzlich unnötige HUD-Layout-Schreiberei reduziert.</li>
<li>RTA/Realtime entlastet: Plot-Grid, Rahmen und rechte Meterhülle werden gecacht, während Balken/Line und Hold/Peak live bleiben.</li>
<li>Projektweit weiterer Cleanup: tote Frontend-Restlogik entfernt, Referenz-Configs für Analyzer/Volumio ergänzt und Doku zu Analyzer-vs.-Volumio-Pfaden/Ports nachgezogen.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.0.1 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 18.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>PPM/VU/RMS-Alignment korrigiert: PPM DIN, PPM EBU, VU und RMS liegen bei den vorgesehenen Referenzpegeln wieder konsistent zueinander.</li>
<li>RTW-Loudness-Boxen auf dokumentierbaren Momentary-Pfad umgestellt: 400 ms Integration, K-gewichtete Signalbasis, pro Kanal; keine freie ungefilterte Hauskurve mehr.</li>
<li>RTW-Loudness-Offset global gemacht: Der Offset wird jetzt in Phoenix gespeichert und zwischen verbundenen Browsern synchron gehalten.</li>
<li>RTW-Oktavwahl lokalisiert: Die sichtbare RTW-Auflösung 1/3, 1/6 und 1/12 ist jetzt browserlokal und schaltet andere Sessions nicht mehr um.</li>
<li>Fehler in der lokalen 1/6-Oktavdarstellung behoben: Center-Frequenzen und Bandwerte laufen wieder sauber synchron.</li>
<li>Goniometer weiter auf klassische RTW-Anmutung geschärft: dichtere Spur, dickere Linien, geglättete Kurven; dieser Stil ist jetzt fest der Standard.</li>
<li>Volumio-/Raspberry-Pi-Startpfad robuster gemacht: Toolchain-, Netzwerk-, Build- und Session-Handling wurden für frische Geräte und getrennte Volumio-Services nachgezogen.</li>
<li>Build-Kompatibilität für ältere Zielsysteme nachgezogen: Lockfile-/Toolchain-Themen, ALSA-/pkg-config-Abhängigkeiten und plattformspezifische ALSA-Frame-Typen abgefangen.</li>
<li>Volumio-Pfad weiter bereinigt: Analyzer-GUI läuft dort getrennt auf eigenem Port, `toggle-ext` liegt im Phoenix-Baum und der Tab-Umschalter zeigt wieder auf die richtigen Ziele.</li>
<li>Projektlayout weiter bereinigt: `toggle-ext` und die Volumio-spezifischen Startdateien liegen jetzt konsistent im Phoenix-Baum.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>3.0 (Phoenix 1.0)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 18.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Kompletter Architektur-Umbau: Der Analyzer läuft jetzt nativ auf Phoenix statt auf WebAudio/AudioWorklet im Browser.</li>
<li>Phoenix ist neue Single Source of Truth für Audio, Analyse und globale Gerätekonfiguration; die Web-GUI dient nur noch als Anzeige- und Bedienoberfläche.</li>
<li>Audio-Pfad vollständig in Rust/ALSA verlagert: Browser greift nicht mehr selbst auf Audio-Hardware zu.</li>
<li>Analysepfade nach Phoenix übertragen: Meter, RMS, VU, PPM DIN/EBU, True Peak, LUFS/LRA, RTW-Loudness-Boxen, RTA, Spectrogram, Waveform, XY und Phase Wheel werden jetzt nativ im Backend erzeugt.</li>
<li>Recorder komplett auf Phoenix umgestellt: native Aufnahme in WAV, MP3 und WebM/Opus ohne Browser-Chunking oder nachträgliches Zusammensetzen im Frontend.</li>
<li>Direktes Speichern über Phoenix ergänzt: Aufnahmen können ohne Chrome-Download direkt auf dem Gerät im Dateisystem abgelegt werden.</li>
<li>Globale Optionen in Phoenix verankert: geräterelevante Parameter wie Kalibrierung, LUFS-/PPM-Verhalten, Recorder-Defaults und Screensaver-Verhalten werden zentral gespeichert und an verbundene Browser synchronisiert.</li>
<li>Waveform- und XY-Datenpfad auf native Phoenix-Frames umgestellt; Browser verarbeitet keine eigenen Audio-Samples mehr.</li>
<li>Normnähe der Messpfade überarbeitet: True Peak, LUFS, VU sowie mehrere Ballistik- und Bewertungswege rechnerisch an die relevanten Standards angenähert.</li>
<li>Komplette Bereinigung des alten WebAudio-Stacks: Browser-Recorder, MediaRecorder-/Chunk-Logik, AudioWorklet-Altpfade und nicht mehr benötigte Umschaltlogik wurden entfernt.</li>
<li>Deployment/Boot für Raspberry Pi neu strukturiert: separater Webservice, Kiosk-Startskripte, automatischer Phoenix-Build bei Quellcode-Änderungen sowie Build-Logging beim Start.</li>
<li>Projektstruktur auf Phoenix konsolidiert: Runtime-Skripte, `www` und systemd-Units liegen jetzt gemeinsam unter dem Phoenix-Baum.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.9</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 09.04.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Recorder: Auto-Split-Threshold jetzt als gekoppelte Zahlenfelder in dBFS und PPM DIN einstellbar.</li>
<li>Stoppuhr: Auto-Threshold jetzt ebenfalls als gekoppelte Zahlenfelder in dBFS und PPM DIN einstellbar.</li>
<li>Optionen: Zusätzlichen Scroll-Puffer im Optionen-Menü ergänzt, damit untere Eingabefelder trotz On-Screen-Tastatur weiter nach oben gezogen werden können.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.8 (HOTFIX)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.03.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Audio/Timing: Zusätzlichen Display-/Interpolationspuffer entfernt; Anzeigen werden wieder direkt aus dem AudioWorklet gespeist.</li>
<li>Low Latency: Worklet-UI-Intervall auf 8 ms reduziert und Renderpfad auf 60 FPS gestellt.</li>
<li>Performance: Audio- und Analysepfade berechnen nur noch, was im aktuellen View und in den sichtbaren Slots wirklich benötigt wird.</li>
<li>Cold Start: XY-, RTA-, Waveform- und Meter-Zustände werden beim Umschalten sauber zurückgesetzt, damit keine alten Daten kurz wieder auftauchen.</li>
<li>Performance: FFT- sowie LUFS-/Box-Analyser laufen nur noch bei tatsächlichem Sichtbarkeitsbedarf.</li>
<li>RTA: Neue Option für die Balken-Grundfarbe; Peak-Bereiche bleiben weiterhin rot.</li>
<li>RTA: „Real Time Hold“ und „Real Time Decay“ wirken jetzt tatsächlich auf die Balkenanzeige; höherer Decay lässt die Balken schneller zurückfallen.</li>
<li>UI: Zahlenfelder committen jetzt sauber per Change/Blur/Enter; Eingaben über On-Screen-Keyboard und VNC springen nicht mehr vorzeitig auf Min-/Max-Werte.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.5</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 22.03.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Fix: Classic Needles im Quad-View werden nun korrekt angezeigt.</li>
<li>Audio/Timing: Umstellung auf Audio-Zeitstempel und frame-synchron berechnete Display-Pakete zur Glättung der Anzeige und Reduktion von Drift/Jitter.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3.7</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 04.02.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Fix: Audio-Pfad bleibt zuverlässig aktiv und verhindert „Stall“ nach langem Idle/Screensaver.</li>
<li>Fix: Auto-Recovery bei „Audio lost“ nach Screensaver-Wake und User-Activity.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3.6</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 04.02.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Fix: Loudness/LUFS rechter Kanal korrekt normalisiert.</li>
<li>Optimierung: LRA/Loudness ohne wiederholte Array-Allokationen (Ringpuffer + Scratch-Buffer) für weniger GC/CPU-Spikes.</li>
<li>Fix: Config-Load ist jetzt idempotent (verhindert doppeltes Laden beim Start/Options-Init).</li>
<li>PPM DIN: Peak-Hold implementiert (rein visuell), steuerbar über PPM_DIN_HOLD_MS und PPM_DIN_HOLD_DECAY_DB_PER_S.</li>
<li>Peak History: Historie als Ringpuffer statt copyWithin-Shift (weniger CPU, stabilere Darstellung).</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3.4</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 04.03.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>PPM DIN: Neue Option „FastAttack“ (sofortes Anlaufen, nicht normgerecht) inkl. HinweisPopup beim Aktivieren; Ballistik wird live aktualisiert.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3.2</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 02.02.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Peak History: Nach dem Beenden des Bildschirmschoners wird die History nicht mehr in einem Frame mit einem Wert „aufgefüllt“ (kein Backfill nach Pause); nutzt nur frische Audiodaten.</li>
<li>XY / Korrelation: Neue Option „Sofortige Nullstellung wenn kein Pegel“ (setzt den Würfel bei Stille sofort auf 0, ohne Hold/Drift).</li>
<li>Stoppuhr (SlotMeter): Fix für CanvasState/FontLeak, der nach Aktivierung die SkalenSchrift in anderen Views riesig gemacht hat.</li>
<li>Audio/Timing: Anzeige-Update-Intervall reduziert und an die effektive RenderFPS gekoppelt (verringert Jitter/Drift, verhindert MessageBacklogs).</li>
<li>Default: FFT_SIZE auf 4096 reduziert (weniger CPU; betrifft v.a. Spectrogram/LUFS/FFTRTA).</li>
<li>Performance: Keine FFTBerechnung mehr, wenn kein Spectrogram aktiv ist und der Real Time Analyzer auf IIR läuft.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3.1</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 30.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>XY / Korrelation: Nach dem Beenden des Bildschirmschoners wird die Anzeige sauber zurückgesetzt und nur mit frischen Audiodaten berechnet (kein Sprung auf +1 ohne Signal).</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.3</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 26.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>QuadView: KlickVerhalten wählbar (direkt wechseln oder PopupAnsicht).</li>
<li>QuadView: PopupAnsicht rendert exakt wie die EinzelView (Layout/Skalen identisch); Tap/ESC schließt.</li>
<li>SplitView: KlickVerhalten wählbar (direkt wechseln oder PopupAnsicht).</li>
<li>SplitView: PopupAnsicht rendert exakt wie die EinzelView; Tap/ESC schließt.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.1</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 26.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>SplitView: kompaktere HUDBedienung (schmalere PlotDropdowns, Trennzeichen „|“).</li>
<li>SplitView: SlotZuordnung über Button + Popup (zeigt nur aktive Slots).</li>
<li>SplitView: Popup schließt per Klick außerhalb oder ESC.</li>
<li>SplitView: „Slot:“ wird nur angezeigt, wenn mindestens ein Slot aktiv ist.</li>
<li>Neu: QuadView (4 unabhängige Plots im 2×2Raster).</li>
<li>QuadView: PlotAuswahl über Popup; eigene SlotKonfiguration (unabhängig vom SplitView).</li>
<li>Phase Wheel: PhaseBox im SplitView korrekt positioniert (stabil am PlotPanel, mit Abstand; Box kleiner).</li>
<li>Bildschirmschoner: RecorderUI/Modals sowie SlotPopup werden zuverlässig ausgeblendet.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>2.0</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 22.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Neu: SplitView (zwei Plots nebeneinander, Links/Rechts wählbar).</li>
<li>SplitView: optionale MeterSlots (03) mit frei wählbarer Position (links/mitte/rechts).</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.8</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 17.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>LUFS (Integrated): IZeitfenster wird korrekt gespeichert und angewendet.</li>
<li>LUFS (Integrated): I bleibt bei Stille (unter 70 LUFS Gate) stehen und fällt nicht weiter ab.</li>
<li>Phasenrad: Zahlenanzeige folgt dem Zeiger besser (ruhiger, ohne Nachkommastelle).</li>
<li>Neu: Stoppuhr als auswählbarer Slot (Start/Stop/Reset/Auto, optional 7SegmentAnzeige).</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.7.8</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 16.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>LUFS (Integrated): Zeitfenster per Slider (110 min) einstellbar.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.7.7</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 09.01.2026</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Input-Offset: kanalgetrennte Einstellung (L/R).</li>
<li>LUFS: Lesbarkeit der Skala angepasst.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.7.5</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 31.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Phase Wheel: Phasenrad gespiegelt (z.B. +90° liegt rechts).</li>
<li>PPM DIN: Ballistik im eigenen AudioWorklet; Anzeige/Ballistik nach IEC 60268-10 Type I (DIN) korrigiert.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.7.3</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 29.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Neuerungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>LUFS: Skalen-Zahlen &amp; Skalen-Striche in eigener Farbe einstellbar.</li>
<li>Phase Wheel: Phasenanzeige (Box links oben) größer und weiter links; Zahl zusätzlich geglättet und Update-Rate begrenzt (max. 10×/s) für bessere Lesbarkeit.</li>
<li>PPM DIN: RTW-Loudness-Offset als Schieberegler (7 … +7 dB).</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.7 (Auslieferungsversion)</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 21.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Neuerungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Slots können auf „(leer)“ gesetzt werden: der Slot wird ausgeblendet und die verbleibenden Anzeigen rücken nach (z.B. nutzt der Real Time Analyzer dann die volle Breite).</li>
<li>Peak History und Classic Needles benötigen einen belegten Slot; dort ist „(leer)“ deaktiviert.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.6</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 19.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Neuerungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Neuer View: „Classic Needles“.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.5.5</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 08.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Neuerungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Silence-Gate für Goniometer &amp; Korrelation (RMS-basiert, Threshold einstellbar im XY-Menü).</li>
<li>Header-Werte pro Kanal: sauber zentriert über den Balken, Farbumschlag pro Kanal erst ab Rot-Schwelle.</li>
<li>Anzeige der vollen Pegel (auch unterhalb der Skala) mit sanfter Glättung der Zahlen.</li>
<li>RMS-Meter: hält jetzt den letzten gültigen Wert, kein kurzer Drop mehr auf den Floor bei sporadisch fehlenden RMS-Paketen.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px" open>
<summary>1.5</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 05.12.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Peak History Neu hinzugefügt:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Neuer „Peak History“-View: verlaufende Pegelanzeige mit Meter rechts daneben.</li>
<li>Konfigurierbare Scroll-Geschwindigkeit (½×, 1×, 2×, 4×, 6×) wie beim Spectrogram.</li>
<li>Farbgenaue Linie: Rot erst ab Warnschwelle (z.B. PPM_DIN_RED_START), Segment-Splitting genau auf der Schwelle.</li>
<li>Optionale Flächenfüllung unter/über der Linie in Linienfarbe; invertierbar.</li>
<li>Zeitskala passt sich der Scroll-Geschwindigkeit an (länger bei ½×, kürzer bei 2×/4×/6×).</li>
<li>Peak-History-Optionen im Menü: Scroll-Speed, Fläche füllen, Fläche invertieren.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.2</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 28.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Studio Clock: neue Stile „Analog + PPM“ und „Digital + PPM“; optional LED-Band für PPM.</li>
<li>PPM in der Clock nutzt DIN-Skala, Offsets und Ballistik identisch zum PPM-DIN-Meter.</li>
<li>PPM-Skalenfarben vereinheitlicht (DIN-Orange), Warnfarbe nur oberhalb 0&nbsp;dB.</li>
<li>Neue Uhr-Funktion: Studio Clock mit Stilen „Analog“, „Digital“, „Analog + PPM“, „Digital + PPM“, optional LED-Band.</li>
<li>Neuer Bildschirmschoner: DVD/Starfield/Clock, Vorschau ignoriert Pegel (endet nur per Klick/Touch), Optionen gebündelt.</li>
<li>Clock- und Screensaver-Optionen sind unabhängig im Menü steuerbar.</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.4.1</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 26.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Goniometer-Korrelationswürfel: Clamping angepasst (bleibt sauber innerhalb des Balkens)</li>
<li>PPM DIN: Skala renormiert (Bottom sitzt am Balkenfuß), %-Label korrigiert</li>
<li>PPM DIN: Loudness-Boxen verlängerte Skala (bis 70 dB), sichtbarer Teil nur oberhalb 50 dB</li>
<li>Input-Offset: Slider auf 0,5-dB-Schritte gestellt</li>
<li>Recorder: Einmaliger Hinweis/Bestätigung bei Erstaufruf (WAV-Limit, WebM/Opus-Hinweis, Beta)</li>
<li>LUFS: Farben pro I/M/S separat einstellbar</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.4</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>XY-Optionen wiederhergestellt und zugeordnet (Punkte/Stil/Korrelation/Gain/Fade/Gap)</li>
<li>XY Default-Punkte auf 1024 gesetzt; Hinweise ergänzt</li>
<li>Spectrogram/Waveform/Phase Wheel: Beschreibungen ergänzt</li>
<li>Spectrogram: Worker stabilisiert (Ringpuffer, Draw-Loop-Fix)</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.3.2</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Fix: Spectrogram-Worker stabilisiert (kein Stoppen nach wenigen Sekunden)</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.3.1</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Fix: RTW-Loudness-Boxen im PPM DIN Meter (fehlendes Timestamp-Init behoben)</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.3</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Optionen-Überschrift umbenannt &amp; unterstrichen</li>
<li>RMS: IEC-Zeitkonstanten (Impulse/Fast/Slow) auswählbar, EWMA entfernt</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1.2</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Einführung: Changelog im Optionen-Menü</li>
<li>Korrektur: PPM DIN &amp; PPM EBU ohne doppelte Ballistik (UI-Glättung entfernt)</li>
<li>Korrektur: RMS-Anzeige ohne zusätzliche Glättung</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.1</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Veröffentlichung: 25.11.2025</p>
<p style="margin:4px 0 0 12px; color:#8fd3d4;">Änderungen:</p>
<ul style="margin:2px 0 0 24px; color:#b2c7d9;">
<li>Hinzugefügt: RTW-Style Loudnessanzeige auf PPM DIN Meter</li>
</ul>
</div>
</div>
</details>
<details style="margin-left:12px">
<summary>1.0</summary>
<div class="opt-group">
<div class="opt">
<p style="margin:0; color:#8fd3d4;">Erste Veröffentlichung: 21.11.2025</p>
</div>
</div>
</details>
</div>
</details>
</div>
<div id="recorderHud" style="display:none">
<span id="recLabel" class="rec-label rec-floating">Aufnahme</span>
<div id="recList" class="rec-list rec-floating"></div>
<span id="recTimer" class="rec-timer rec-floating">00:00:00:00</span>
<button id="recStartBtn" class="btn btn-lg btn-danger-border rec-floating">Aufnehmen</button>
<button id="recStopBtn" class="btn btn-lg rec-floating" disabled>Stop</button>
<button id="recAutoBtn" class="btn btn-lg rec-floating">Auto</button>
</div>
<div id="recProcessing" class="rec-processing" style="display:none">
<div class="rec-processing-box">
<div class="rec-spinner"></div>
<div class="rec-processing-text">Verarbeite…</div>
<div class="rec-processing-sub">Die Aufnahme wird zusammengefügt.</div>
</div>
</div>
<div id="calibrationNotice" class="calibration-modal" style="display:none">
<div class="calibration-box">
<h3>Willkommen zum Phoenix Analyzer</h3>
<p>Willkommen. Phoenix Analyzer ist bereit und startet mit den Werkseinstellungen.</p>
<p>Alle Ansichten, Farben, Meter-Slots und Optionen lassen sich jederzeit im laufenden Betrieb anpassen.</p>
<p>Wenn du eigene Einstellungen dauerhaft behalten willst, nutze die Software-Presets zum Speichern, Laden, Exportieren und Importieren.</p>
<button id="calibrationNoticeBtn" class="btn btn-lg" type="button">Los geht's</button>
</div>
</div>
<div id="recWarning" class="rec-warning" style="display:none">
<div class="rec-warning-box">
<h3>Hinweis</h3>
<p>Bei WAV-Aufnahmen wird empfohlen, nicht länger als ca. 1 Stunde aufzuzeichnen. Bei Datenverlust durch zu lange WAV-Aufnahmen wird keine Haftung übernommen.</p>
<p>Für sehr lange Aufnahmen kann in den Optionen auf WebM/Opus umgestellt werden, um Speicher zu sparen.</p>
<p>Grundsätzlich sollte die Recorder-Funktion als BETA betrachtet werden; Nutzung auf eigene Verantwortung.</p>
<label class="rec-warning-ack row">
<input id="recWarningAck" type="checkbox">
<span>Ich habe verstanden</span>
</label>
<button id="recWarningBtn" class="btn btn-lg" disabled>Weiter</button>
</div>
</div>
<div id="ppmDinFastWarn" class="rec-warning" style="display:none">
<div class="rec-warning-box">
<h3>PPM DIN FastAttack</h3>
<p>Dieser Sample-Peak-Sondermodus lässt das PPM DIN sofort ansteigen (ohne 10-ms-Normintegration).</p>
<p>Dadurch kann die Anzeige „schneller“ wirken, ist aber <b>nicht mehr normgerecht</b> (DIN 45406 / IEC 6026810).</p>
<p>Hinweis: Das ändert nur die AnzeigeBallistik und kompensiert keine echte AudioLatenz.</p>
<button id="ppmDinFastWarnBtn" class="btn btn-lg" type="button">Verstanden</button>
</div>
</div>
<div id="presetSaveRemoteNotice" class="rec-warning" style="display:none">
<div class="rec-warning-box">
<h3>Preset hier nicht speichern</h3>
<p>Presets sollen direkt am Analyzer über <strong>localhost</strong> gespeichert werden.</p>
<p>Wenn du von einer anderen Adresse zugreifst, würde sonst der Zustand dieses Browsers gespeichert werden.</p>
<div class="row" style="gap:10px">
<button id="presetSaveRemoteOkBtn" class="btn btn-lg" type="button">OK</button>
</div>
</div>
</div>
<div id="onlineUpdateReadyNotice" class="rec-warning" style="display:none">
<div class="rec-warning-box">
<h3>Online Update</h3>
<p>download beendet, es wird neu gestartet</p>
<div class="row" style="gap:10px">
<button id="onlineUpdateRestartBtn" class="btn btn-lg" type="button">Neustart</button>
</div>
</div>
</div>
<div id="factoryResetConfirm" class="rec-warning" style="display:none">
<div class="rec-warning-box">
<h3>Werkseinstellungen laden?</h3>
<p>Dadurch werden alle gespeicherten Einstellungen (inkl. Slots, letzter View, Presets, Offsets und Hinweise) gelöscht — Es erfolgt ein Neustart wie beim ersten Einschalten.</p>
<label class="rec-warning-ack row">
<input id="factoryResetAck" type="checkbox">
<span>Ich bin mir sicher</span>
</label>
<div class="row" style="gap:10px">
<button id="factoryResetCancelBtn" class="btn btn-lg" type="button">Abbrechen</button>
<button id="factoryResetConfirmBtn" class="btn btn-lg btn-danger-border" type="button" disabled>JA</button>
</div>
</div>
</div>
<div id="err" class="err"></div>
<script type="module" src="./main.js"></script>
</body>
</html>