Live-Probe-Modus (Rehearsal Mode)
Verfügbar ab: v0.7.0
Tier: Premium
Erstellt: 22. Februar 2026
Überblick
Der Probenmodus ermöglicht es dem Kapellmeister, eine Probe-Session zu starten. Alle Musiker treten mit ihrem Gerät bei und sehen automatisch die richtige Stimme als PDF — ohne manuelles Suchen. Wenn der Kapellmeister das Stück wechselt, aktualisiert sich die Anzeige bei allen Musikern in Echtzeit.
Optimiert für: Tablets, Smartphones, E-Ink-Reader (Boox, PocketBook Eo/Color Note)
Voraussetzungen
| Voraussetzung | Details |
|---|---|
| Tier | Premium |
| Rolle (Starten) | Archivar, Admin oder Owner |
| Rolle (Beitreten) | Alle Rollen (auch Viewer) |
| Stimmen-Zuordnung | Musiker muss eine bevorzugte Stimme im Profil gesetzt haben |
| PDF-Stimmen | Die Stücke müssen Stimmen-PDFs hochgeladen haben |
Ablauf
1. Bevorzugte Stimme einstellen
Jeder Musiker wählt einmalig seine Stimme(n) im Profil:
- → Profil aufrufen (Klick auf Avatar → Einstellungen)
- Unter „Bevorzugte Stimme" die eigene Stimme auswählen
- Speichern
Tipp: Musiker die mehrere Instrumente spielen (z.B. Klarinette und Saxophon) können mehrere Stimmen zuweisen.
2. Probe starten (Kapellmeister)
- → Probenmodus in der Navigation öffnen
- „Neue Probe starten" klicken
- Optional: Ein Konzert verknüpfen (für die Setlist)
3. Beitreten (Musiker)
- → Probenmodus in der Navigation öffnen
- Falls eine Probe läuft, wird automatisch zur Musiker-Ansicht weitergeleitet
- Die richtige Stimme wird anhand der Profil-Einstellung geladen
4. Stück wechseln (Kapellmeister)
- Auf dem Steuerpult ein Stück aus der Liste auswählen
- Alle verbundenen Musiker bekommen sofort das neue Stück angezeigt
5. Probe beenden
Der Kapellmeister klickt „Probe beenden" → die Session wird für alle geschlossen.
Musiker-Ansicht im Detail
Vollbild-Modus
Die Musiker-Ansicht öffnet sich als bildschirmfüllende PDF-Anzeige ohne Navigation, optimiert für maximale Lesbarkeit:
- Seitenwechsel: Tap auf die linke Hälfte (zurück) oder rechte Hälfte (weiter) des Bildschirms
- Schwebende Buttons: Alternativ Vor/Zurück-Buttons am Bildschirmrand
- Stückname: Wird oben eingeblendet
Mehrseitige Stimmen
Wenn eine Stimme mehrere Seiten hat (S.1, S.2, S.3, ...), navigiert der Musiker mit den gleichen Tap-Zonen oder Buttons durch alle Seiten seiner Stimme.
Farbinversion
Für dunkle Probenräume: Toggle für invertierte PDF-Darstellung (weiß auf schwarz). Ideal für Abendproben.
E-Ink-Modus
Speziell für E-Ink-Reader (Boox, PocketBook):
- Keine Animationen (verursachen Ghosting auf E-Ink)
- Hoher Kontrast
- Große Tap-Targets
- PDF wird ohne Inversion gerendert (E-Ink hat ohnehin hohen Kontrast)
Echtzeit-Kommunikation (SSE)
Die Kommunikation zwischen Kapellmeister und Musikern läuft über Server-Sent Events (SSE):
- Der Musiker öffnet einen SSE-Stream (
/api/rehearsals/:id/stream) - Wenn der Kapellmeister das Stück wechselt, sendet der Server ein Event an alle verbundenen Clients
- SSE reconnected automatisch bei Verbindungsabbrüchen
- Kein WebSocket nötig — SSE ist einfacher und reicht für diesen Anwendungsfall
API-Endpoints
| Method | Path | Beschreibung | Rolle |
|---|---|---|---|
GET | /api/rehearsals | Aktive Sessions auflisten | member+ |
POST | /api/rehearsals | Session erstellen | archivist+ |
GET | /api/rehearsals/:id | Session-Details | member+ |
PATCH | /api/rehearsals/:id | Stück wechseln / Status ändern | conductor |
DELETE | /api/rehearsals/:id | Session beenden & löschen | conductor |
GET | /api/rehearsals/:id/stream | SSE-Stream für Echtzeit-Updates | member+ |
GET | /api/rehearsals/user-voices | Eigene Stimmen abfragen | member+ |
PUT | /api/rehearsals/user-voices | Eigene Stimmen setzen | member+ |
Datenmodell
RehearsalSession
| Feld | Typ | Beschreibung |
|---|---|---|
id | String | UUID |
organizationId | String | Verein |
conductorId | String | Kapellmeister (User) |
concertId | String? | Optionales verknüpftes Konzert |
currentPieceId | String? | Aktuell geprüftes Stück |
status | Enum | waiting / active / paused / ended |
concertId | String? | Optionales verknüpftes Konzert |
UserVoice
| Feld | Typ | Beschreibung |
|---|---|---|
userId | String | Musiker |
voiceId | String | Bevorzugte Stimme |
organizationId | String | Verein |
PieceVoice (erweitert)
| Feld | Typ | Beschreibung |
|---|---|---|
pageNumber | Int | Seitennummer (Default: 1) |
| Unique | [pieceId, voiceId, pageNumber] |
Technischer Ablauf
Kapellmeister Fastify API Musiker (×30)
| | |
|-- POST /rehearsals --------->| |
| (Session erstellen) | |
| |<-- GET /rehearsals/:id/stream|
| | (SSE-Verbindung) |
|-- PATCH /rehearsals/:id ---->| |
| (currentPieceId ändern) |--- SSE Event: piece_changed->|
| | |-- GET /api/files/:key
| | | (PDF laden)
| | |-- PDF anzeigen ✓Edge Cases
| Situation | Lösung |
|---|---|
| Musiker hat keine Stimme zugewiesen | Hinweis: „Bitte Stimme im Profil auswählen" |
| Stück hat kein PDF für diese Stimme | Fallback auf Direktion/Partitur oder Hinweis |
| Musiker spielt mehrere Instrumente | Alle zugewiesenen Stimmen werden angezeigt |
| Kapellmeister verliert Verbindung | Session bleibt bestehen, Reconnect via SSE auto-retry |
| E-Ink-Reader mit langsamem Refresh | E-Ink-Modus: Keine Animationen, seitenbasiert |
Frontend-Dateien
| Datei | Beschreibung |
|---|---|
src/pages/RehearsalMode.jsx | Kapellmeister-Steuerpult |
src/pages/RehearsalMusicianView.jsx | Musiker-PDF-Ansicht (Fullscreen) |
src/hooks/useRehearsal.js | Hook für SSE, Session-State, PDF-Loading |
src/lib/api.js | API-Funktionen (rehearsals, userVoices) |
src/lib/tierConfig.js | rehearsalMode: boolean pro Tier |
Backend-Dateien
| Datei | Beschreibung |
|---|---|
backend/src/services/rehearsalService.ts | Business-Logik (CRUD, Join, Stückwechsel) |
backend/src/routes/rehearsal.ts | HTTP-Endpoints + SSE-Stream |
backend/src/schemas/rehearsal.ts | Zod-Validierung |
backend/src/lib/sse.ts | SSE-Infrastruktur (Event-Streaming, Client-Management) |
backend/prisma/schema.prisma | RehearsalSession, UserVoice, RehearsalStatus |
Nice-to-haves (spätere Ausbaustufen)
- 📝 Markierungen/Annotations auf dem PDF (persönlich pro Musiker)
- 🔄 Synchrones Blättern (Kapellmeister steuert die Seite für alle)
- 📊 Anwesenheits-Tracking (wer war bei der Probe dabei)
- 🎵 Metronom/Tempo-Anzeige vom Kapellmeister
- 📋 Proben-Notizen live an alle senden („Takt 34 nochmal!")
- 📱 PWA mit Service Worker für Offline-PDF-Cache
