|
|
# CLAUDE.md – Musubi
|
|
|
|
|
|
Du arbeitest an **Musubi**, einer nativen macOS-App von Zielke Studio für kleine Live-Übertragungen. Lies vor jeder Aufgabe die relevanten Dateien in `docs/`. Der Fahrplan in `docs/04-fahrplan.md` ist verbindlich: Ein Meilenstein gilt erst als fertig, wenn sein Abnahmetest bestanden ist.
|
|
|
|
|
|
## Kontext in drei Sätzen
|
|
|
|
|
|
Ein ATEM steht im OP, die Regie sitzt im Saal, dazwischen liegt eine einzige Netzwerkleitung. Zwei ZowieBoxen schicken Multiview und PGM als NDI|HX3 ins Netz. Musubi läuft auf dem MacBook (Regie) und dem Mac mini (Bühne), zeigt die NDI-Bilder auf Bildschirmen, legt Ton auf Kanäle des MOTU M2 und stellt später ein Intercom fürs Handy bereit.
|
|
|
|
|
|
## Technische Leitplanken
|
|
|
|
|
|
- **Plattform:** macOS, Deployment Target **macOS 14**, **Universal Build** (arm64 + x86_64). Der Mac mini 2018 (Intel, macOS 15 Sequoia) ist Zielgerät und muss jede Version flüssig ausführen.
|
|
|
- **Sprache:** Swift 6, SwiftUI für die Oberfläche, AppKit wo nötig (Vollbildfenster auf bestimmten `NSScreen`, Anzeigemodi).
|
|
|
- **Abhängigkeiten:** Keine Drittanbieter-Pakete ohne Rückfrage. Erlaubt ohne Rückfrage: Apple-Frameworks, das NDI SDK (C-Bibliothek, via Modulemap/Bridging), später das Blackmagic ATEM SDK.
|
|
|
- **NDI SDK:** liegt lokal in `Vendor/NDI/` und wird nie eingecheckt. Fehlt es, brich nicht ab, sondern erkläre, was zu tun ist (`Vendor/README.md`).
|
|
|
- **Module** (lokale Swift Packages oder Gruppen, siehe `docs/02-architektur.md`):
|
|
|
- `MusubiCore` – Modelle, Szenen, Einstellungen (reine Logik, testbar)
|
|
|
- `NDIKit` – dünner Swift-Wrapper ums NDI SDK (Finder, Receiver, Audio-only)
|
|
|
- `VideoOutput` – Darstellung per Metal bzw. `AVSampleBufferDisplayLayer`, Vollbild je Bildschirm, 50 Hz
|
|
|
- `AudioMatrix` – Core Audio / `AVAudioEngine`, Quelle → Ausgangskanal
|
|
|
- `Remote` – Regie steuert Knoten per Bonjour (ab Meilenstein 3)
|
|
|
- `Intercom` – HTTPS + WebRTC, nur an die Klinik-Schnittstelle gebunden (ab Meilenstein 4)
|
|
|
- `Tally` – ATEM-Status (ab Meilenstein 6)
|
|
|
- **Echtzeit:** Nie Video- oder Audioarbeit auf dem Main Thread. Keine Allokationen im Audio-Render-Callback.
|
|
|
- **Betriebssicherheit:** Ruhezustand per `IOPMAssertion` verhindern, solange eine Szene läuft. Bei Verbindungsabbruch automatisch neu verbinden. Beim Start letzte Szene laden.
|
|
|
- **Netze trennen:** Technik-Netz und Klinik-Netz werden nie verbunden. Dienste binden explizit an eine Schnittstelle. Keine Internetfreigabe.
|
|
|
|
|
|
## Design
|
|
|
|
|
|
Halte dich an `docs/03-design.md` und `design/Theme.swift`. Kurz: dunkle Regie-Oberfläche, Indigo als einzige Markenfarbe, Rot/Grün ausschließlich für Tally (PGM/Vorschau), SF Pro in der App, SF Mono für Zahlen. Texte auf Deutsch, in Du-Form, kurz, im Stil von apps.zielke.studio („NDI rein. Bild, Ton und Stimme raus.“).
|
|
|
|
|
|
## Arbeitsweise
|
|
|
|
|
|
1. Vor Code: kurzer Plan in 3–6 Punkten, dann umsetzen.
|
|
|
2. Kleine Schritte, nach jedem lauffähigen Stand committen (Conventional Commits auf Englisch).
|
|
|
3. Reine Logik (Szenen, Kanalzuordnung, Parser) bekommt Unit-Tests mit Swift Testing.
|
|
|
4. Was sich nur mit Hardware prüfen lässt, beschreibst du als Schritt in `docs/05-testplan-hardware.md`, statt es zu behaupten.
|
|
|
5. Nach jedem Meilenstein: Checkbox in `docs/04-fahrplan.md` abhaken, kurze Notiz unter „Erkenntnisse“ ergänzen.
|
|
|
6. Code und Kommentare auf Englisch, UI-Texte auf Deutsch über einen String Catalog.
|
|
|
7. Wenn etwas unklar ist (Lizenz, Netz der Klinik, Hardware-Verhalten): fragen, nicht raten.
|
|
|
|
|
|
## Testen ohne Hardware
|
|
|
|
|
|
- **NDI-Quellen:** NDI Tools (Test Patterns, Screen Capture) auf einem zweiten Mac oder OBS mit DistroAV als NDI-Ausgang.
|
|
|
- **Audio:** MOTU M2 ist vorhanden; ohne M2 das eingebaute Ausgabegerät mit zwei Kanälen nutzen.
|
|
|
- **ATEM:** vorhanden, für Tally ab Meilenstein 6.
|
|
|
- **Hardware im Zulauf:** 2× ZowieBox, 2× TP-Link TL-SG2008P, MT-VIKI Dante-Adapter, Soundcraft Ui12.
|
|
|
|
|
|
## Nicht tun
|
|
|
|
|
|
- Kein Senden/Encoding von NDI, keine Aufnahme, keine Bildmischung (macht der ATEM).
|
|
|
- Keine Cloud-Dienste. Ein Relay (TURN) ist nur Plan B und läuft auf dem eigenen Server.
|
|
|
- Keine Funktionen eines späteren Meilensteins vorziehen.
|