Sing it!

Sing it!

It’s karaoke-time!

Ziel dieser Aufgabe ist es, ein Programm zu schreiben, welches die Lyrics eines Songs stückweise auf der Konsole anzeigt, während im Hintergrund der Song läuft.

Special: Wenn Sie diese Aufgabe im Vorkurs 2024 lösen, erhalten Sie die Möglichkeit, Ihr fertiges Proramm zu testen! Karaokeparty! Schauen Sie dazu während der Tutorienzeiten in Raum U.039 vorbei, oder fragen Sie zur Not die Dozierenden (oder zur Not Ihre:n Tutor:in).

Lyrics herunterladen

Für Lyrics können Sie auf Datenbanken des Open Source-Karaokeprogramms “UltraStar Deluxe” zurückgreifen. Die Datenbanken stellen für viele bekannte Songs Textdateien zur Verfügung, in denen Textschnipsel zu Zeitstempeln zugeordnet werden.

Wir empfehlen Ihnen die Datenbank usdb.eu, da Sie diese ohne Account nutzen können. Finden Sie einen Song über die Startseite oder über den Musikkatalog, und rufen Sie die Seite des Songs auf (Beispiel). Anschließend können Sie über den Download-Button mit der Option “Txt” ausschließlich die Lyrics-Datei herunterladen (Beispiel).

Musik herunterladen

Nun fehlt Ihnen noch die Musik zu Ihrem Song. Diese können Sie mithilfe des Python-Tools yt-dlp herunterladen:

  1. Installieren Sie, sofern noch nicht geschehen, yt-dlp mit pip install yt-dlp (nutzen Sie dafür ggf. ein virtual environment)

  2. Suchen Sie das Musikvideo zu Ihrem Song auf YouTube und kopieren Sie den Link des Musikvideos (Beispiel). Wenn Sie usdb.eu für die Lyrics verwendet haben, können Sie nutzen, dass das entsprechene Musikvideo bereits in der Datenbank hinterlegt ist, indem Sie bei dem Video dort auf das YouTube-Logo unten rechts klicken.

  3. Laden Sie die Audioversion des Videos herunter, indem sie in einem Terminal yt-dlp -x "<YouTube-Link" (mit dem YouTube-Link) ausführen. Beispiel: yt-dlp -x "https://www.youtube.com/watch?v=mNEUkkoUoIA"

Hinweis: Laden Sie niemals Videos zu anderen als persönlichen Nutzungszwecken von YouTube herunter! Informieren Sie sich ggf. selbst über geltende Regelungen!

Lyrics-Format

Das Format der UltraStar-Deluxe Lyrics-Dateien ist hier dokumentiert.

Hier ist ein Auszug aus einer Beispieldatei zu sehen:

Wichtige Zeilen (für eine erste Version des Programms, das einige Angaben ignoriert) sind die Folgenden:

  • #BPM:309,20: Hier wird die Geschwindigkeit des Songs in Beats/Minute angegeben. Alle Zeitangaben von Noten sind in Beats angegeben
  • #RELATIVE: No: Zeitangaben sind hier absolut (relative Zeitangaben bedeuten, dass immer die Anzahl der Beats seit der letzten Note als Zeit angegeben wird, ggf. müssen die Zeitangaben in dem Fall erst von Ihnen umgerechnet werden)
  • #GAP:7190,00: Anzahl an Millisekunden, die vor der ersten Textzeile gewartet werden soll (es sollen also am Anfang 7190 Millisekunden des Songs laufen, bevor die Zeit für die Lyrics gezählt wird).
  • #START:0: Anzahl an Sekunden, die von der Audiodatei am Anfang übersprungen werden sollen. Um es sich einfacher zu machen, können Sie die Audiodatei immer von Anfang an wiedergeben, und die bei START angebene Zeit wie die bei GAP angebenene behandeln
  • NoteType StartBeat Length Pitch Text (Bsp.: : 9 3 5 know): Eine Note von gegebenem Typ NoteType, die bei StartBeat beginnt, Length Beats dauert, die Tonhöhe Pitch hat und zu der der Text Text gehört. NoteType kann eines der folgenden Symbole sein: :, *, F, R, G (in Ihrem Programm können Sie alle Typen gleich behandeln). Length und Pitch können Sie in Ihrem Programm ignorieren.
  • - StartBeat (Bsp.: - 45): Ende einer Phrase zur Zeit StartBeat

Wiedergabe von Musik

Eine Audiodatei kann mit der Bibliothek python-vlc wie folgt wiedergegeben werden (die Wiedergabe läuft ab diesem Zeitpunkt unabhängig von ihrem Code im Hintergrund):

import vlc

audiofile = './OneRepublic - I Ain’t Worried (From “Top Gun: Maverick”) [Official Music Video] [mNEUkkoUoIA].opus'  # Pfad zu der Datei im Dateisystem

p = vlc.MediaPlayer(audiofile)
p.play()

Aufgabe

Schreiben Sie ein Programm, welches eine Lyrics-Datei einliest und verarbeitet. Ihr Programm soll dann die Musik starten und nacheinander Stücke des Liedtexts auf die Konsole drucken. Zwischen zwei Textstücken müssen Sie dabei jeweils die korrekte Zeit abwarten (z. B. wartet time.sleep(wartezeit) den Wert von wartezeit in Sekunden).

Später(!) können Sie ihr Programm erweitern, Songtextzeilen immer komplett darzustellen, und dabei den bereits gehörten Teil rot auszudrucken. Das Programm kann dann beispielsweise so aussehen:

Karaoke-Programm

Tipps

Lyricsdatei einlesen
Parsing
Lyricsschnippsel ausdrucken