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:
-
Installieren Sie, sofern noch nicht geschehen,
yt-dlpmitpip install yt-dlp(nutzen Sie dafür ggf. ein virtual environment) -
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.
-
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.
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 Anfang7190Millisekunden 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 beiSTARTangebene Zeit wie die beiGAPangebenene behandelnNoteType StartBeat Length Pitch Text(Bsp.:: 9 3 5 know): Eine Note von gegebenem TypNoteType, die beiStartBeatbeginnt,LengthBeats dauert, die TonhöhePitchhat und zu der der TextTextgehört.NoteTypekann eines der folgenden Symbole sein::,*,F,R,G(in Ihrem Programm können Sie alle Typen gleich behandeln).LengthundPitchkönnen Sie in Ihrem Programm ignorieren.- StartBeat(Bsp.:- 45): Ende einer Phrase zur ZeitStartBeat
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):
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:
