bpm_key_display.py zeigt BPM und Tonart bildschirmfüllend an (für 800x600,
skaliert aber mit jeder Auflösung) und gibt parallel die MIDI-Clock aus.
Der Analyse-Kern wird aus realtime_bpm_key_midiclock.py importiert –
beide Dateien müssen also im selben Ordner liegen.
- Raspberry Pi 5 (empfohlen) oder Pi 4, 64-bit Raspberry Pi OS – wahlweise mit Desktop (einfachster Weg) oder als Lite-Variante ohne Desktop (siehe „Minimal-Installation“ unten)
- 7"-Display (HDMI oder DSI), idealerweise mit Touch
- USB-Audio-Interface für den Eingang (der Pi hat keinen Line-In)
- USB-MIDI-Interface für die Clock (entfällt, wenn nur angezeigt werden soll)
Der einfachste Weg; wer einen dedizierten Bühnen-Pi möglichst schlank aufsetzen will, springt zur „Minimal-Installation“ weiter unten.
sudo apt update
sudo apt install -y python3-venv python3-tk libportaudio2 libsndfile1 \
libasound2-dev build-essential
python3 -m venv ~/audiowizard-env
source ~/audiowizard-env/bin/activate
pip install --upgrade pip
pip install -r requirements.txtHinweise:
soundcard(Windows-Loopback) wird auf dem Pi nicht gebraucht. Wer die Systemausgabe analysieren will: Unter PipeWire/PulseAudio erscheint die Wiedergabe als Eingang „Monitor of …“ direkt in der Geräteliste des Auswahlbildschirms. (Unter Windows zeigt derselbe Auswahlbildschirm dafür zusätzliche „Loopback: …“-Einträge, sofernsoundcardinstalliert ist.)- Die erste Analyse nach dem Start dauert ein paar Sekunden (numba kompiliert einmalig) – das Skript wärmt das beim Start vor und zeigt solange „INITIALISIERE ANALYSE …“.
source ~/audiowizard-env/bin/activate
python bpm_key_display.py- Erster Start: Auswahlbildschirm für Audio-Eingang und MIDI-Ausgang.
Die Wahl wird in
display_config.jsongespeichert; danach bootet das Programm direkt in die Anzeige. - Tasten/Optionen:
F11Vollbild umschalten,Escbeenden--windowed/--fullscreen/--setup(Auswahl erzwingen)
- Unter Linux startet das Programm automatisch im Vollbild, unter Windows im 800x600-Fenster (zum Testen).
- BPM mit Nachkommastelle: Standardmäßig wird das Tempo ganzzahlig angezeigt (ruhigere Anzeige); die MIDI-Clock läuft intern immer mit voller Auflösung.
- Beat-synchrone Clock (experimentell): Die MIDI-Clock rastet zusätzlich auf die erkannten Zählzeiten ein (Tick 1 von 24 liegt auf dem Beat), statt nur im richtigen Tempo frei zu laufen. Die Phase wird sanft nachgeregelt (max. 1,5 ms pro Tick), sodass die Clock nie springt.
- Die MIDI-Clock läuft grundsätzlich erst, sobald ein Tempo erkannt
wurde (vorher wäre es ein fiktives Tempo): Bei der ersten Schätzung
wird MIDI-
startgesendet -- mit Beat-Sync exakt auf dem nächsten Beat --, bei Stille/Songwechsel stoppt die Clock (stop) und startet beim nächsten Stück neu. - BPM-Bereich (Standard 70–140): Suchbereich der Tempo-Erkennung. Genau eine Oktave (Faktor 2) macht die Oktav-Zuordnung eindeutig; ein breiterer Bereich (z. B. 60–180) erfasst auch sehr langsame oder schnelle Stücke, kann dann aber halbes/doppeltes Tempo verwechseln.
- Die Tonart wird gedimmt angezeigt, solange die Erkennung noch
unsicher ist (kleiner Vorsprung vor dem zweitbesten Kandidaten), und
leuchtet erst bei klarer Entscheidung voll auf. In der Konsolen-Version
markiert ein
?dahinter dieselbe Unsicherheit. - Analyse anhalten (Button unten links bzw. Leertaste): friert die aktuellen Ergebnisse bewusst ein -- für Stücke mit langen Breaks. Die MIDI-Clock läuft konstant im gehaltenen Tempo weiter, und die Stille des Breaks löst keinen Reset aus. Erneutes Drücken setzt die Analyse fort (die Historie des Stücks bleibt dabei erhalten). Der Status zeigt währenddessen „ANGEHALTEN · CLOCK LAEUFT".
- Fehler und Neustarts der Analyse landen in
audiowizard.logneben den Skripten -- im Kiosk-Betrieb ohne Konsole die erste Anlaufstelle. - Der Analyse-Thread ist doppelt abgesichert: Er startet sich nach einem unerwarteten Fehler selbst neu, und die GUI überwacht ihn zusätzlich (Watchdog). Die Audio-Queue ist begrenzt, damit ein Hänger nicht den Speicher füllt.
eval_detection.pymisst die Erkennungsqualität über Testdateien im Projektordner (Namensmuster<BPM>BPM_<Tonart>.mp3, z. B.106BPM_C_Dur.mp3):python eval_detection.pyzeigt, nach wie vielen Sekunden BPM und Tonart dauerhaft korrekt stehen. Damit lässt sich jede Änderung an den Stellschrauben nachmessen.
Auf Raspberry Pi OS mit Desktop genügt eine Autostart-Datei:
mkdir -p ~/.config/autostart
nano ~/.config/autostart/bpm-display.desktopInhalt (Pfade ggf. anpassen):
[Desktop Entry]
Type=Application
Name=BPM Display
Exec=/home/pi/audiowizard-env/bin/python /home/pi/audiowizard/bpm_key_display.py
X-GNOME-Autostart-enabled=trueOptional in raspi-config: Auto-Login auf den Desktop aktivieren und den
Bildschirmschoner/Blanking abschalten.
Für einen dedizierten Bühnen-Pi reicht Raspberry Pi OS Lite (64-bit):
Statt des kompletten Desktops startet ein minimaler X-Server direkt in die
Anzeige. Das spart rund zwei Drittel Platz auf der Karte, bootet schneller,
und außer Kernel, X und Python läuft praktisch nichts. Sound- und
MIDI-Treiber stecken bereits im Kernel (ALSA, snd-usb-audio) –
USB-Audio- und USB-MIDI-Interfaces funktionieren ohne weiteres Zutun.
sudo apt update
sudo apt install -y python3-venv python3-tk libportaudio2 libsndfile1 \
xserver-xorg-core xinit xserver-xorg-input-libinput \
matchbox-window-manager x11-xserver-utils \
fonts-dejavu-core
python3 -m venv ~/audiowizard-env
source ~/audiowizard-env/bin/activate
pip install --upgrade pip
pip install -r requirements.txtHinweise:
xserver-xorg-input-libinputwird für den Touchscreen gebraucht;matchbox-window-manager(winziger Fenstermanager, ~100 KB), damit das Tk-Vollbild zuverlässig funktioniert – ganz ohne Fenstermanager ignoriert X das Vollbild-Attribut.- Falls pip für
python-rtmidikein fertiges Wheel findet und kompilieren will: vorhersudo apt install -y build-essential libasound2-dev, hinterher mitsudo apt autoremove build-essential libasound2-devwieder entfernbar. - Ohne PipeWire/PulseAudio gibt es keine „Monitor of …“-Quellen (Wiedergabe mithören) – nur echte Eingänge wie USB-Interface oder Mikrofon. Für einen reinen Analyse-Pi mit Line-In ist das egal; wer die Systemwiedergabe analysieren will, bleibt bei der Desktop-Variante.
Konsolen-Autologin aktivieren:
sudo raspi-config # System Options -> Boot / Auto Login -> Console Autologin~/.xinitrc anlegen (Pfade ggf. anpassen):
#!/bin/sh
xset s off -dpms # Bildschirmschoner und Blanking aus
matchbox-window-manager -use_cursor no &
exec $HOME/audiowizard-env/bin/python \
$HOME/audiowizard/bpm_key_display.py --fullscreenUnd am Ende von ~/.bash_profile (startet X nur auf der ersten Konsole,
nicht in SSH-Sitzungen):
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
exec startx
fiSo verhält sich der Pi wie ein Gerät: einschalten, Anzeige kommt.
Esc beendet die Anzeige – durch den Autologin startet sie sofort neu
(gewollt im Kiosk-Betrieb). Zum Arbeiten am Gerät per SSH anmelden oder
mit Strg+Alt+F2 auf eine zweite Konsole wechseln.
Auf der Bühne wird der Pi meist einfach vom Strom getrennt – auf Dauer riskiert das ein korruptes Dateisystem auf der SD-Karte. Abhilfe schafft das Overlay-Dateisystem (funktioniert mit Desktop- und Lite-Variante): Root wird read-only eingehängt, alle Schreibzugriffe landen nur noch im RAM, und hartes Ausschalten ist jederzeit folgenlos.
sudo raspi-config # Performance Options -> Overlay File System -> EnableWichtig:
- Vorher einmal normal starten und im Auswahlbildschirm Audio-Eingang,
MIDI-Ausgang und Optionen festlegen, damit
display_config.jsongeschrieben ist – mit aktivem Overlay gehen Änderungen daran beim Ausschalten verloren. - Logs (
audiowizard.log, optionalakkorde.txt) landen dann ebenfalls nur noch flüchtig im RAM. Für die Fehlersuche das Overlay vorübergehend deaktivieren. - Für Updates (git pull, pip install, Einstellungs-Änderungen) das Overlay
in
raspi-configdeaktivieren, neu starten, ändern, wieder aktivieren.
Die Analyse (HPSS + Chroma-CQT, jede Sekunde auf 8 s Audio) ist der teure
Teil. Falls die Anzeige zu träge aktualisiert, in
realtime_bpm_key_midiclock.py anpassen:
ANALYSIS_INTERVAL = 2.0(statt 1.0) – halbiert die Last, kaum spürbarBASS_TONIC_WEIGHT = 0– schaltet das zusätzliche Bass-Chroma ab (spart ein zweites CQT pro Analyse; die Tonart-Erkennung verliert dann die Bass-Evidenz, die Dur von der Mollparallele unterscheidet)- In
chroma_pcp()notfallslibrosa.feature.chroma_stftstattchroma_cqtverwenden (deutlich schneller, etwas ungenauere Tonart)
Die MIDI-Clock läuft davon unabhängig in ihrem eigenen Thread und bleibt auch bei langsamer Analyse stabil.