OpenStage ist eine lokale, browserbasierte Karaoke-Anwendung für UltraStar-Songs. Sie lädt bestehende Songordner mit Noten, Audio, Video und Bildern, erkennt die gesungene Tonhöhe direkt im Browser und unterstützt zwei lokale Mikrofone sowie zusätzliche Smartphones als drahtlose Mikrofone.
Projektstatus: funktionsfähige lokale Familien- und Party-Version. OpenStage ist noch kein vollständiger Ersatz für UltraStar Deluxe, deckt aber Import, Wiedergabe, Mehrmikrofonbetrieb, Live-Pitch-Feedback, Scoring, Smartphone-Mikrofone und die lokale USDB-Anbindung ab.
- responsives Webinterface für TV, Laptop und Smartphone
- Import kompletter UltraStar-Songordner (
.txt, Audio, Cover und Video) - Video-Hintergründe mit
#VIDEOGAP-Synchronisierung und frei durchsuchbare Wiedergabe - Parser für normale, goldene und Freestyle-Noten
- lokale Tonhöhenerkennung über Web Audio
- Karaoke-Bühne mit Notenverlauf, Lyrics und einer klaren Anzeige für „höher“, „tiefer“ oder „Ton getroffen“
- getrenntes Scoring je Sänger: Start bei 0, ausschließlich steigende Punkte bis maximal 10.000
- Ergebnisbildschirm mit einem bis fünf Sternen und Titeln wie „Superstimme“ oder „Bühnenstar“
- zwei gleichzeitig nutzbare lokale Mikrofone mit eigener Gerätewahl, Pegelanzeige und regelbarem Mithören
- automatische Geräteerkennung; getrennte USB- und Handy-Mikrofone verschwinden sofort aus Bühne und Wertung
- stabile, erneuerbare Raumcodes und frei wählbare lokale oder Handy-Mikrofone
- QR-Code für zusätzliche Handy-Mikrofone; übertragen werden nur Tonhöhe, Klarheit und Pegel, niemals das Audiosignal
- ein von macOS bereitgestelltes iPhone-Mikrofon kann wie ein lokales Mikrofon direkt ausgewählt werden – dann ist kein QR-Code nötig
- USDB-Adapter über den lokalen Webserver von USDB Syncer
- sichtbarer USDB-Downloadstatus mit laufender Aktualisierung, Fehleranzeige und Wiederholen-Funktion
- Erkennung unvollständiger Downloads, bei denen Noten und Bilder vorhanden sind, aber Audio oder Video fehlen
Voraussetzungen sind Node.js 22 oder neuer sowie Python 3 für den lokalen USDB-Adapter.
Im Finder die Datei OpenStage.command doppelklicken. Beim ersten Start installiert sie fehlende Node-Abhängigkeiten sowie USDB Syncer, bietet die einmalige USDB-Anmeldung an und startet anschließend alle benötigten Prozesse. OpenStage öffnet die Steuerung lokal auf dem Mac und ist standardmäßig auch im Heimnetz erreichbar.
Lokale USB-Mikrofone und ein von macOS angebotenes iPhone-Mikrofon funktionieren dabei direkt. Für ein Handy, das sich über den QR-Code als eigenständiges Netzwerk-Mikrofon verbindet, ist eine vertrauenswürdige HTTPS-Adresse erforderlich; der passende Start ist im Abschnitt „Handy als Netzwerk-Mikrofon“ beschrieben.
Falls macOS die Datei beim ersten Mal blockiert: Rechtsklick auf OpenStage.command, Öffnen wählen und einmal bestätigen. Beendet wird OpenStage im geöffneten Terminalfenster mit Ctrl+C.
Falls OpenStage ausdrücklich nur auf diesem Mac erreichbar sein soll:
./OpenStage.command --localnpm install
npm run setup:usdb
npm run devDanach http://localhost:3000 öffnen. OpenStage startet automatisch auch den lokalen USDB-Syncer-Adapter. Auf localhost funktioniert der Mikrofonzugriff ohne TLS.
Für Geräte im LAN:
npm run dev:lanÜber die normale HTTP-Netzwerkadresse kann ein anderes Gerät die Oberfläche öffnen, mobile Browser geben dort aber kein Mikrofon frei.
Browser erlauben getUserMedia außerhalb von localhost nur in einem sicheren Kontext. Für zusätzliche iPhones oder Android-Geräte deshalb OpenStage mit dem optionalen HTTPS-Tunnel starten:
./OpenStage.command --https-tunnelDabei wird zuerst die optimierte Produktionsversion gebaut. Danach erscheint in „Mikrofone“ automatisch ein QR-Code mit einer zufälligen trycloudflare.com-Adresse. QR-Code scannen, Namen eingeben, Mikrofonzugriff erlauben und „Als Mikrofon verbinden“ wählen.
Die Adresse endet beim Beenden von OpenStage. USDB-Suche und Downloads sind über den öffentlichen Handy-Link gesperrt. Diese Variante benötigt cloudflared, unter macOS beispielsweise über:
brew install cloudflaredRein lokales HTTPS ist alternativ mit einer lokalen CA möglich, deren Root-Zertifikat einmalig auf jedem Handy installiert und als vertrauenswürdig markiert werden muss.
Hinweis für iPhones am selben Mac: Wenn macOS das iPhone bereits in der Mikrofonliste anbietet, kann es direkt als „Sänger 1“ oder „Sänger 2“ ausgewählt werden. Dieser Continuity-Weg braucht weder QR-Code noch Tunnel.
USDB bietet derzeit keine offizielle API. Die Integration verwendet deshalb bewusst USDB Syncer, der Login, Suche und Songdownloads übernimmt. Zugangsdaten gelangen dadurch nicht in diese Web-App.
- USDB Syncer einmalig projektlokal installieren (im Schnellstart oben bereits enthalten):
npm run setup:usdb- USDB Syncer einmal mit dem eigenen USDB-Konto einrichten:
npm run usdb:loginIm geöffneten Syncer-Fenster anschließend:
- USDB → USDB Login wählen und anmelden.
- USDB → Check USDB Song List wählen und die Aktualisierung abwarten.
- Zurück in OpenStage den USDB-Katalog erneut laden.
Danach genügt npm run dev: OpenStage startet den Syncer automatisch auf Port 5000 mit freigeschalteter Suche und Downloadfunktion und beendet ihn beim Herunterfahren wieder.
Falls bereits ein Syncer auf Port 5000 läuft, verwendet OpenStage diesen, ohne ihn später zu beenden. Falls ein anderer oder externer Adapter verwendet wird, .env.local anlegen:
USDB_SYNCER_URL=http://127.0.0.1:5000Im Tab „USDB“ kann anschließend gesucht und ein Download angestoßen werden. OpenStage zeigt die Zustände „Wartet“, „Lädt“, „Fertig“ oder „Fehlgeschlagen“ und aktualisiert sie automatisch. Ein fehlgeschlagener Download kann direkt erneut gestartet werden. Danach den Songordner in der Bibliothek neu laden.
Beim Setup werden USDB Syncer und yt-dlp aktualisiert. OpenStage kontrolliert zusätzlich, ob ein angeblich synchronisierter Song tatsächlich eine Audio- oder Videodatei besitzt. Fehlen beide, gilt der Download als fehlerhaft und kann erzwungen wiederholt werden. Die Zugangsdaten verbleiben im USDB Syncer; die Karaoke-App speichert sie nicht.
- In OpenStage „Mikrofone“ öffnen und „Mikrofone neu erkennen“ wählen.
- Für „Sänger 1“ und optional „Sänger 2“ unterschiedliche Eingänge auswählen.
- Beide gemeinsam oder einzeln aktivieren. Ein sichtbarer Pegel bestätigt das Eingangssignal.
- „Mithören“ langsam hochziehen, wenn die eigene Stimme über den Mac ausgegeben werden soll.
Kopfhörer sind beim Mithören empfohlen, weil offene Lautsprecher Rückkopplungen erzeugen können. Wird ein USB-Mikrofon abgezogen oder über „Trennen“ deaktiviert, wird der zugehörige Sänger sofort von der Bühne und aus der Wertung entfernt. Dasselbe gilt für ein getrenntes Handy-Mikrofon.
Jeder Sänger beginnt einen Song mit 00000 Punkten. Treffer fügen Punkte hinzu; schlechte oder ausgelassene Töne ziehen bereits erspielte Punkte nicht wieder ab. Ein vollständig perfekt gesungener Song ergibt 10.000 Punkte. Am Songende werden daraus Sterne und ein Leistungs-Titel abgeleitet.
Während des Singens zeigt die Bühne pro Sänger:
- den erkannten Ton und die Signalklarheit,
- „Höher singen“, „Tiefer singen“ oder „Ton getroffen“,
- die Abweichung in Cent,
- die eigene farbige Tonspur im Notenverlauf.
Die Tonhöhenerkennung läuft auf jedem Mikrofon-Gerät. Zwei lokale Eingänge – einschließlich eines von macOS angebotenen iPhone-Mikrofons – können direkt und gleichzeitig geöffnet werden. Weitere Smartphones verbinden sich optional per QR-Code und übertragen nur kleine Messpakete; damit bleiben Bandbreite und Latenz niedrig und das Mikrofonsignal privat. Beim bewussten Trennen wird ein Netzwerk-Mikrofon sofort gelöscht; bei einem Verbindungsabbruch greift zusätzlich ein fünfsekündiges Offline-Timeout. Die Messwerte werden über Cloudflare D1 zwischen den Geräten koordiniert. Ohne D1-Binding verwendet die lokale Umgebung einen In-Memory-Fallback.
Für eine vollwertige Version stehen als Nächstes an:
- persistente lokale Bibliothek mit Dateisystem-Index und automatischem Refresh
- WebRTC-Datenkanal oder WebSocket statt kurzer D1-gestützter HTTP-Messpakete
- Kalibrierung und noch genaueres USDX-kompatibles Scoring
- Playlists, Party-Modi und Songwarteschlange
- installierbares Paket (Docker/Desktop-Host) mit automatisch eingerichtetem LAN-HTTPS
- offizieller USDB-API-Adapter, sobald USDB diesen anbietet
npm run lint
npx tsc --noEmit
npm testDie Tests bauen die Anwendung und prüfen Parser, Pitch-Erkennung, kumulatives Scoring, API-Routen, Mikrofon-Abmeldung, gerenderte Oberfläche sowie den kombinierten OpenStage-/USDB-Launcher.
Die mit Codex geführte, für das Repository bereinigte Gesprächs- und Entscheidungschronik liegt unter docs/CONVERSATION.md. Zugangsdaten, lokale USDB-Sitzungen und interne Laufzeitdateien werden nicht versioniert.
OpenStage steht wie USDX unter GPL-2.0. Dieses Projekt ist eine neue Webimplementierung und enthält keinen kopierten USDX-Code. USDB Syncer steht unter GPL-3.0 und läuft als separater lokaler Prozess. Songdateien, Audio und Videos werden nicht mitgeliefert und müssen vom Nutzer rechtmäßig bereitgestellt werden.
