Files
geograsim/App/sims/heli/docs/konzept-audio-schnitt-tool.md
T
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/
- 12 code-workspace-Files
- STATUS-*.md
- viele M/D/R-Änderungen an bereits getrackten Files
- .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-08 02:27:02 +02:00

277 lines
14 KiB
Markdown

# Audio-Schnitt-Tool — Konzept
Stand: 2026-06-01 · Atlas · Status: zum Review · KEIN CODE BIS THOMAS-OK
## Zweck
Tool-Seite (eigene URL, nicht Spiel) zum **Schneiden, Anordnen und Speichern** der Audio-Timeline pro Mission. Wie Cubase/DaVinci, aber speziell für unsere Heli-Missionen. Was im Tool definiert ist, **spielt das Spiel deterministisch ab** (Tool = Wahrheit, Engine folgt).
## Grundprinzipien
1. **Eine Timeline pro Mission** — horizontale Zeitachse, links→rechts, scrollbar, zoombar
2. **Pro Audio = ein Balken** auf der Timeline. Balken-Länge = echte MP3-Dauer (gemessen, gecacht). Verschieben per Drag&Drop.
3. **Niemals zwei Audios gleichzeitig** — Tool verhindert visuell und logisch Überlappungen
4. **Strecken sind variabel** — die Karten-Animations-Dauer im Spiel passt sich der Audio-Inhalts-Länge an, nicht umgekehrt. Lange Inhalte = langsamerer Flug zwischen den Wegpunkten.
5. **Phase-Gating im Spiel:** der nächste Wegpunkt wird erst sichtbar, wenn das aktuelle Audio fertig ist. Klick vorab erlaubt, Audio läuft trotzdem.
## Tool-UI
```
┌──────────────────────────────────────────────────────────────────────┐
│ ← M1 Damüls M2 ▶ [M1] [M2] [M3] ... [M25] │ ← Mission-Switcher
├──────────────────────────────────────────────────────────────────────┤
│ PLAN ▏ FLUG ▏ Abflug | Landung | Ende │ ← Phasen-Track
│ ───────────────────────────────────────────────────────────────── │
│ 0:00 0:30 1:00 1:30 2:00 2:30│ ← Zeitachse (sec)
│ ╿ │
│ ▌▌r_mission_intro_m1 (12s) ▌▌r_wp_geo_thueringen (7s) │ ← Audio-Track
│ ▌▌r_wp_geo_zwischenwasser (8s) │
│ ▌▌r_wp_geo_damuels │
│ ───────────────────────────────────────────────────────────────── │
│ 🚩Plan-Start 🟢WP1 thueringen 🟢WP2 zwischenwasser 🟢WP3 damuels │ ← Event-Marker
│ │
│ ┌─ Audio-Pool ────────────────────────────────────────────────┐ │ ← Audio-Pool unten,
│ │ 🔊 r_mission_intro_m1 12s Sarah/Tower │ │ Drag→Timeline
│ │ 🔊 r_wp_geo_thueringen 7s Briefing │ │
│ │ 🔊 r_wp_geo_zwischenwasser ... [Filter: alle / verwendet] │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ [💾 Speichern] [▶ Vorschau abspielen] [↩ Reset auf Default] │ ← Aktionen
└──────────────────────────────────────────────────────────────────────┘
```
### UI-Details
- **Mission-Switcher** oben: vor/zurück (Pfeile) + alle 25 Missionen als Tabs/Dropdown
- **Phasen-Track** zeigt Phasen-Sektionen (Plan, Flug, Abflug, Landung, Ende) in unterschiedlichen Farben/Schraffuren
- **Zeitachse** in Sekunden, zoombar via Mausrad/Buttons (z. B. 1 px = 0,1 s, 0,2 s, 0,5 s, 1 s …)
- **Audio-Track** zeigt Audio-Balken — Länge proportional zur Dauer. Klick auf Balken → markiert + zeigt Audio-ID + Text + Aktionen (löschen, verschieben, „Inhalt prüfen"). Drag verschiebt.
- **Event-Marker** als vertikale Linien mit kleinem Label (Wegpunkt erreicht, Phase-Wechsel, etc.). Werden teils automatisch gesetzt (z. B. pro Wegpunkt aus `mission.waypoints`), teils manuell.
- **Audio-Pool unten** als Liste/Tabelle mit Such-/Filterfunktion. Drag auf Timeline → fügt Balken hinzu. Audios die schon platziert sind, sind im Pool ausgegraut.
- **Speichern** → POST an PHP-Endpoint → schreibt `audio-timeline-m1.json` ins Verzeichnis
- **Vorschau** → spielt die Timeline im Browser ab (sequenziell, mit Events als Subtitel-Anzeige)
- **Reset** → lädt Default-Timeline aus dem Regelwerk (für leere Missionen)
### Sequenz-Garantie (Tool-Verhalten)
Wenn der User einen Balken so verschiebt, dass er einen anderen überlappt:
- **Tool springt automatisch hinter den vorherigen Balken** (+ konfigurierbarer Gap, z. B. 0,5 s)
- Visuelles Feedback (rote Outline beim Drag wenn Überlappung droht, snappt dann ein)
## Datenmodell
### Pro Mission: `App/sims/heli/data/audio-timeline-<mid>.json`
```json
{
"_doc": "Audio-Timeline fuer M1 Damüls. Wird von /heli-audio-editor gespeichert + vom Spiel deterministisch abgespielt.",
"missionId": "m1",
"version": 1,
"lastSaved": "2026-06-01T10:30:00",
"gap": 0.5,
"phases": [
{
"id": "plan",
"label": "Routenplanung",
"color": "#4a7c8a",
"events": [
{ "id": "ev-plan-start", "t": 0, "label": "Plan-Start" },
{ "id": "ev-wp1", "t": 14, "label": "Wegpunkt sichtbar: thueringen", "waypoint": "thueringen" },
{ "id": "ev-wp2", "t": 22, "label": "Wegpunkt sichtbar: zwischenwasser", "waypoint": "zwischenwasser" },
...
{ "id": "ev-plan-end", "t": 65, "label": "Plan fertig" }
],
"audios": [
{ "id": "a1", "audioId": "r_mission_intro_m1", "t": 0, "dur": 12.3 },
{ "id": "a2", "audioId": "r_wp_geo_thueringen", "t": 14, "dur": 7.1 },
{ "id": "a3", "audioId": "r_nav_plan_correct", "t": 22, "dur": 3.2 },
{ "id": "a4", "audioId": "r_wp_geo_zwischenwasser", "t": 26, "dur": 8.5 },
...
{ "id": "aN", "audioId": "r_nav_plan_done", "t": 60, "dur": 5.0 }
]
},
{
"id": "flug",
"label": "Kartenflug",
"color": "#5a8a5e",
"events": [ ... ],
"audios": [ ... ]
}
],
"_notes": "Editor erlaubt nur Plan + Flug. Abflug + Landung werden vom alten Engine-Pfad gespielt (separate Phase-Markierung im Tool als grauer Block, nicht editierbar)."
}
```
### Audio-Dauer-Cache: `App/sims/heli/data/audio-durations.json`
```json
{
"_doc": "Audio-Dauern in Sekunden. Tool laedt MP3s clientseitig und liest <audio>.duration. Bei neuen Files automatisch nachpflegen.",
"lastUpdated": "2026-06-01T10:30:00",
"durations": {
"r_mission_intro_m1": 12.3,
"r_nachtrag_a": 2.1,
"r_wp_geo_thueringen": 7.1,
...
}
}
```
Beim ersten Tool-Aufruf: für jeden Audio-Eintrag in `audio-texts.json`, der noch nicht im Cache ist, MP3 via `<audio>`-Element laden + duration abfragen + cachen. Cache wird beim Save aktualisiert.
## PHP-Save-Endpoint
`App/php/api/heli-timeline.php`:
- `POST /api/heli-timeline?mission=m1` → body JSON → schreibt in `data/audio-timeline-m1.json` (+Backup)
- `GET /api/heli-timeline?mission=m1` → liest Datei zurück
- `POST /api/heli-audio-durations` → schreibt/updated `data/audio-durations.json`
Sicherheit: nur internes Tool, kein Auth. (Wenn Production: hinter Lehrer-Login.)
## Spiel-Integration (Engine-Refactor)
### Heute (chaotisch)
- Plan-Audios werden in 4-5 verschiedenen Code-Stellen getriggert (initPlanPhase, showPlanInstruction, onPlanClick, …)
- Race-Conditions möglich (Mission-Intro + WP-Geo gleichzeitig)
- V1-Whitelist filtert teilweise
### Neu (Timeline-getrieben)
`audio-engine.js` (neue zentrale Datei):
- Lädt beim Mission-Start `audio-timeline-<mid>.json`
- Pro Phase eine **State-Machine**:
- `phaseStart(phaseId)` → spielt das erste Audio der Phase
- `audioEnded()` → fires `event` bei `t = ende-des-Audios`, schaltet nächsten Wegpunkt frei, spielt nächstes Audio
- **Game wartet auf Audio-Ende** bevor nächster Wegpunkt sichtbar wird
- **Klick-vor-Audio-Ende** → Klick wird angenommen, aber als „Pre-Click" markiert. Audio läuft trotzdem fertig.
- Strecken-Animation passt sich an Audio-Dauer an (Flugzeit-Berechnung wird dynamisch)
### Konkrete Code-Stellen die verschwinden
- `game.html:1056` (Mission-Intro setTimeout) → ersetzt durch Timeline-Trigger
- `game.html:1365` (r_wp_geo in showPlanInstruction) → ersetzt durch Timeline
- `game.html:1400` (r_nav_plan_correct/done in onPlanClick) → ersetzt durch Timeline
- `game.html:1552` (r_mission_geo in initFlightPhase) → ersetzt durch Timeline
### Plan + Flug = Engine-driven, Abflug + Landung = wie heute
Phase 3 + 5 (iframe-basiert) bleiben unangetastet. Wenn das später auch in die Timeline soll, müssen wir die iframes auf das gleiche Schema umbauen — aber das ist Phase 2 dieses Projekts.
## Implementierungs-Reihenfolge
| Schritt | Was | Aufwand |
|---|---|---|
| 1 | Konzept-Doc OK von Thomas | — |
| 2 | PHP-Endpoint `heli-timeline.php` (GET/POST + Datei-Backup) | 1 h |
| 3 | Audio-Dauer-Cache: Skript das alle MP3s clientseitig misst und in `audio-durations.json` schreibt (einmaliger Setup) | 2 h |
| 4 | Tool-UI Grundgerüst: Mission-Switch, Phasen-Track, Zeitachse, Audio-Track (read-only) | 3 h |
| 5 | Tool-UI Editor: Drag&Drop, Audio-Pool, Speichern | 3 h |
| 6 | **Default-Timeline-Generator: Atlas befüllt ALLE 25 Missionen vor** (siehe Sektion „Default-Befüllung") | 3 h |
| 7 | M1 als erste Mission gemeinsam durchgehen + tunen (Atlas lernt) | gemeinsam |
| 8 | Engine-Refactor: `audio-engine.js` lädt Timeline + spielt deterministisch (nur Plan + Flug) | 4 h |
| 9 | Test M1: Tool → Spiel → läuft korrekt + sequenziell + Klick-vorab funktioniert | gemeinsam |
| 10 | Restliche 24 Missionen im Tool durchschneiden | gemeinsam |
| **Total Atlas-Code** | ca. **15 h** | |
| **Total Thomas-Review** | ca. **3-4 h** gemeinsam | |
## Default-Befüllung (Atlas macht die Hauptarbeit)
**Thomas-Direktive:** „Du füllst das Tool gleich mit deinem Vorschlag … hoffentlich muss ich nicht alle selbst machen."
→ Atlas erzeugt pro Mission eine **komplette Default-Timeline**. Thomas reviewt + tunet, was nicht passt. Atlas lernt aus den Korrekturen für die nächsten Missionen.
### Generator-Regeln (Atlas befüllt automatisch)
Pro Mission liest der Generator:
- Mission-Daten aus `ALL_MISSIONS` (waypoints, base, theme, scenario, heliKey)
- Audio-Drehbuch-Regelwerk (welche Audios in welcher Phase, in welcher Reihenfolge)
- Audio-Dauern aus `audio-durations.json`
- Briefings aus `briefings.json` (Wetter-Trigger ja/nein)
Daraus baut er die Default-Timeline:
```
PLAN-Phase:
T=0.0 r_mission_intro_<mid> (dur aus Cache)
T=+gap r_wp_geo_<wp1> (erster Wegpunkt-Hint, Trigger für Wegpunkt-Sichtbar-Event)
T=+dur EVENT: WP1 sichtbar
T=+gap r_nav_plan_correct (wenn Schüler klickt, Audio spielt zu Ende)
T=+dur EVENT: WP1 erreicht
T=+gap r_wp_geo_<wp2>
...
T=... r_nav_plan_done (letzter Wegpunkt)
FLUG-Phase:
T=0.0 r_mission_geo_<mid> (das lange Region-Briefing)
T=+gap r_nav_heli_intro_<helikey> (Crew-Vorstellung)
T=+gap r_nav_altitude_mountain ODER _valley (je Theme)
T=+gap r_nav_fuel_half
T=+gap r_nav_weather_enter (NUR wenn briefings.wetter gesetzt)
T=+gap r_im_zielgebiet (kurz vor Landung)
```
Mit `gap = 0.5 s` (Default-Pause zwischen Audios, im Tool änderbar).
### Tool zeigt Generator-Status
Im UI-Header pro Mission:
- 🤖 **„Default von Atlas, ungeändert"** — du musst nichts tun, kannst direkt zur nächsten
- ✏️ **„Von dir bearbeitet"** — Diff-Anzeige (gelb markiert), zeigt was du verändert hast
- 💾 **„Gespeichert"** — letztes Save-Datum
### Atlas lernt (Memory)
Wenn du an einer Mission etwas änderst — z. B. `r_nav_fuel_half` rausnimmst weil es nicht passt — schreibt Atlas das in ein **Lern-Memo**:
`docs/audio-tool-lernkurve.md`:
```
2026-06-01: Thomas hat aus M1 r_nav_fuel_half entfernt (Begründung: zu früh, störender Hinweis)
→ Default-Generator: r_nav_fuel_half künftig nur bei Missionen mit >5 Wegpunkten einreihen.
2026-06-01: Thomas hat in M6 das Wetter-Audio vorgezogen (vor Mission-Geo)
→ Default-Generator: wenn briefings.wetter gesetzt, r_nav_weather_enter VOR r_mission_geo platzieren.
```
Bei der nächsten Mission-Befüllung berücksichtigt Atlas diese Lerneinträge. So musst du nicht für 25 Missionen das gleiche tunen — die Lern-Regel reicht.
### Workflow
```
[Atlas startet Tool] → 25 Default-Timelines werden vorgeneriert
[Thomas öffnet M1] → sieht 🤖-Default, hört Vorschau im Spiel
[Thomas tunet M1] → verschiebt 2 Audios, löscht 1
[Atlas merkt sich Begründung] → Memory-Eintrag
[Thomas M2] → Default ist schon besser dank gelernter Regel
[...iterativ M3...M25 — Aufwand sinkt pro Mission]
```
Realistische Schätzung pro Mission (nach Default):
- **Erste 5 Missionen**: ~10 min Review/Tunen (viel zu lernen)
- **Mittlere 10 Missionen**: ~3 min (kleine Anpassungen)
- **Letzte 10 Missionen**: ~1 min (meist nur Bestätigen)
Total: **~1.5 h gemeinsame Review-Zeit für alle 25 Missionen.**
## Was ich beim Bauen NICHT mache (wichtig)
- Keine weiteren Bug-Fixes an der alten Engine
- Keine neuen TTS-Runs bis das Tool steht (sonst Inhalts-Murks bevor Struktur sauber ist)
- Kein V3-Whitelist-Geraffel — die V1-Whitelist bleibt aktiv, nur die neue Engine umgeht sie sauber
- Kein Code-Anfassen ohne Konzept-OK
## Offene Frage(n)
Nur eine — alles andere ist konkret genug:
**Q1: Vorschau-Knopf im Tool — wirklich nötig?**
„▶ Vorschau abspielen" würde die ganze Timeline sequenziell durchspielen mit Subtitel-Anzeige. Kostet ~2 h Tool-Entwicklung. Alternative: du speicherst, öffnest `/heli-game?mission=m1` in neuem Tab und hörst dort die echte Engine. Spart Aufwand, ist authentischer.
**Mein Tipp:** Vorschau weglassen. Echtes Spiel ist der wahre Test.
---
Wenn das Konzept passt, fange ich mit Schritt 2 (PHP-Endpoint) an. Sag „los".