Aus Linux-Magazin 01/2006

Musikdateien mit Tcl bearbeiten

© photocase.com

Ob gesungen, geklimpert oder geblasen: Musikdateien gehören zum Inventar vieler Computer. Als Universalwerkzeug für Aufgaben rund um den guten Ton bewährt sich Tcl. Dank der Erweiterung Snack beherrscht es Sound in vielen Formaten, es spielt, bearbeitet und analysiert ihn.

Musikdateien füllen bei vielen privaten PCs einen großen Teil der Festplatte. Dort lagern die Schätze von CDs, Internetradios und Podcasts. Um die Datenflut zu verwalten oder zu bearbeiten, fehlt manchmal das richtige Werkzeug. Wer mit eigenen Skripten nachhelfen will, findet in der Tcl-Erweiterung Snack [1] tatkräftige Hilfe.

Praktisches Nebenprodukt

Das Abspielen von Musik war gar nicht das Ziel von Snack-Entwickler Karen Sjölander, als er an der Stockholmer TU die Erweiterung programmierte. Am Institut für Sprachforschung fehlte ein einfach zu nutzendes Werkzeug, um menschliche Sprache zu untersuchen. Aus einem Bausatz für die Aufgaben in diesem Forschungsfeld ist ein umfangreiches Paket entstanden, das viele Probleme der Tonbearbeitung löst. Angefangen beim einfachen Abspielen vieler Audioformate bis hin zum Aufnehmen, Mischen, Filtern und Analysieren sind viele komplexe Funktionen enthalten.

Die Snack-Erweiterung gehört bei vielen Linux-Distributionen und bei der Tcl-Distribution von Active State [2] zum Lieferumfang. In diesem Fall genügt folgende Zeile im Skript, um die Erweiterung einzubinden:

package require snack

Wer Snack nicht in seiner Distribution findet, kompiliert die Erweiterung aus den Quellen oder verwendet die kompilierte Version von der Snack-Homepage. Bei ihr genügt es, das Archiv auszupacken und den Suchpfad von Tcl anzupassen. Liegt das Snack-Verzeichnis beispielsweise unter »~cz/lib/«, sind im Skript folgende Zeile notwendig:

lappend auto_path /home/cz/lib/snack2.2
package require snack

Sobald Snack geladen ist, stehen einige zusätzlichen Kommandos im Namespace »snack« zur Verfügung.

Der wichtigste Snack-Befehl ist »snack::sound« zum Laden und Abspielen von Musik. Ein einfaches Beispiel gibt Listing 1. Der größte Teil des Skripts dient dazu, das File mit einem Dateidialog auszuwählen, erst der Aufruf in Zeile 27 erzeugt mit »snack::sound ton« ein Tonobjekt mit Namen »ton«. Snack lehnt sich an die Programmierweise von Tk an. In bester Tk-Tradition verbindet Zeile 30 das Tonobjekt per »configure«-Methode mit einer Datei.

Klangvoll

Es gibt mehrere Wege, auf denen Snack zu seinen Tondaten kommt. Das Beispiel in Listing 1 verwendet die Option »-file Datei«; damit liest Snack die Daten erst während des Abspielens von der Festplatte. Für kleinere Files holt »-load« zunächst die ganze Datei in den Hauptspeicher, bevor es mit dem Spielen beginnt. Die Klangdateien dürfen in beiden Fällen in den üblichen Formaten wie WAV, MP3 oder Ogg Vorbis vorliegen, Snack erkennt sie automatisch.

Listing 1: Musikdateien
abspielen

01 #!/usr/bin/tclsh
02 # Wenn notwendig, Suchpfad erweitern
03 lappend auto_path /home/cz/Projekte/Linux-Magazin/XXVIII/snack2.2
04 
05 # Tk- und Snack-Erweiterung anfordern
06 package require Tk
07 package require snack
08 
09 # Hauptfenster verbergen
10 wm withdraw .
11 
12 # Datei wählen
13 set datei ""
14 while {[string length $datei] == 0} {
15   set datei [tk_getOpenFile -title "Musikdatei auswählen" 
16       -filetypes {{MP3 .mp3} {WAV .wav} {"OGG Vorbis" .ogg} {Alles *}}]
17   if {![file exists $datei]} {
18     set antwort [tk_messageBox -icon error 
19         -message "Datei »$file« existiert nicht, abbrechen?" 
20         -title "Fehler" -type okcancel]
21     if {[string match "cancel" $antwort]} {exit}
22     set datei ""
23   }
24 }
25 
26 # Tonobjekt erzeugen
27 snack::sound ton
28 
29 # Tonobjekt mit Datei verbinden
30 ton configure -file $datei
31 
32 # Tonobjekt abspielen und das Skript anschießend beenden
33 ton play -blocking false -command "exit"
34 
35 # Auf Wunsch vorher stoppen
36 tk_messageBox -icon question -message "Anhalten?" -type ok
37 ton stop
38 exit

Neben dem Laden versteht das Tonobjekt die Kommandos »play«, »pause« und »stop« zum Starten, Anhalten und Beenden der Wiedergabe. Bei Play entscheidet die Option »-blocking«, ob das Kommando bis zum Ende der Klangausgabe blockiert oder sofort zurückkehrt und Snack die Datei im Hintergrund abspielt.

Abbruchbedingung

Im Beispiel soll während der Wiedergabe ein Dialogfenster dem Anwender anbieten die Wiedergabe abzubrechen. Deshalb setzt Zeile 33 »-blocking false« und sorgt mit »-command “exit”« dafür, dass nach dem Ende der Wiedergabe das Skript endet. Damit der Benutzer die Wiedergabe schon vor dem Ende der Datei anhalten kann, wartet in Zeile 36 eine »tk_messageBox« auf einen Klick. Drückt der Anwender auf »OK«, beendet »ton stop« die Wiedergabe.

Streaming per HTTP

Die Töne müssen bei Snack nicht unbedingt aus einer normalen Datei stammen, die Erweiterung liest ihre Daten aus jedem Tcl-Channel. Solche Channel können durchaus der Endpunkt einer HTTP-Verbindung sein – die Musik darf also aus dem Internet kommen.

Neben vielen Radiosendern gibt es heute vermehrt von Privatleuten produzierte Sendungen (Podcasts) als MP3 oder Ogg Vorbis. Eine Liste solcher Sender findet sich zum Beispiel bei Icecast.org [3] oder Podcast.de [4]. Listing 2 zeigt einen minimalen Client, der diese Sound-Streams abspielt. Die Prozedur »main« in Zeile 30 dient als Startpunkt, sie verarbeitet die Aufrufparameter mit Hilfe des Opt-Pakets. Das Programm erwartet nur die Angabe einer URL, die »OptProc« in der Variablen » ablegt.

Listing 2: Podcast
spielen

01 #!/usr/bin/tclsh
02 # Einfaches Beispiel für MP3-Streams,
03 # siehe http://wiki.tcl.tk/12619
04 
05 package require opt
06 package require snack 2.2
07 package require http
08 
09 proc playstream {socket token} {
10   # Handler löschen, damit »playstream« nur einmal startet
11   fileevent $socket readable ""
12 
13   # mit Stream verbinden
14   ::snack::sound ton -channel $socket
15 
16   # Puffer füllen
17   puts -nonewline stdout "Puffern ..."
18   for {set i 0} {$i < 30} {incr i} {
19     after 100
20     puts -nonewline stdout ".";
21     flush stdout
22   }
23 
24   # Abspielen
25   ton play -blocking 0
26   puts stdout "nSpiele $::senderurl"
27 }
28 
29 # Startprozedur
30 tcl::OptProc main {
31   {url "" "HTTP-URL für MP3-, Ogg-Vorbis- oder M3U-Datei"}
32 } {
33   # Eingabe prüfen
34   if {![regexp {^http:/} $url]} {
35       error "Ungültige URL »$url«, nur HTTP-Protokoll unterstützt."
36   }
37 
38   # Falls Playlist (m3u), dann diese laden und auswerten
39   if {[string match ".m3u" [file extension $url]]} {
40     set handler [http::geturl $url]
41     set ::senderurl [http::data $handler]
42     http::cleanup $handler
43   } else {
44     set ::senderurl $url
45   }
46 
47   # Dann die Verbindung zur MP3- oder Ogg-Vorbis-Datei öffnen
48   if {![catch {http::geturl $::senderurl -handler playstream} weberr]} {
49     vwait forever
50   } else {
51     puts stdout $weberr
52     quit
53   }
54 }
55 
56 # Main starten
57 if [catch {eval main $argv} err] {
58   puts stderr $err
59   exit 1
60 }

Bei den meisten Sendern verweist der Link von den Webseiten erst auf eine Playliste im M3U-Format. Snack braucht aber die darin enthaltene MP3-Datei, deshalb lädt der Code ab Zeile 39 die Playliste, liest den Link zur Musikdatei (Zeile 41) und speichert diese URL in der globalen Variablen »senderurl«. Dank des HTTP-Pakets von Tcl ist der Code dafür erfreulich knapp.

In Zeile 48 öffnet das Programm mit Hilfe der Sender-URL den MP3-Stream. Der »http::geturl«-Aufruf setzt die Option »-handler« so, dass die Prozedur »playstream« für die weitere Verarbeitung zuständig ist. Diesen so genannten Fileevent-Handler ruft Tcl immer auf, wenn Daten von Server bereitliegen. Während der Wartezeiten übernimmt die Eventqueue die Kontrolle, damit erledigen Tcl-Skripte auch ohne Multithreading viele Aufgaben quasi gleichzeitig.

Das Puffern der Eingangsdaten soll in diesem Fall Snack erledigen, daher ist der Eventhandler unnötig:

fileevent $socket readable ""

Dieses Kommando in Zeile 11 des Skripts löscht den Handler gleich beim ersten Aufruf, sobald die Verbindung steht. Zeile 14 übergibt den Stream an Snack. Nun könnte das Programm die Wiedergabe schon starten – bei Engpässen im Netzwerk käme es aber gleich zu hörbaren Aussetzen.

Puffer schützt vor Aussetzern

Gegen die Tonstörung hilft der beim Streaming übliche Trick, den Datenstrom zunächst einige Sekunden zu puffern und dann erst mit der Wiedergabe zu beginnen. Der Code in den Zeilen 17 bis 22 wartet 3 Sekunden und schreibt während dieser Zeit alle 100 Millisekunden einen Punkt auf die Standardausgabe. Für das Warten sorgt »after 100«. Damit die Punkte sofort im Terminalfenster erscheinen und nicht erst nach dem nächsten Newline-Zeichen, leert »flush stdout« in Zeile 21 den Ausgabepuffer. Nach der Zwangspause startet Zeile 25 die Wiedergabe per »ton play«. 60 Zeilen Code genügen diesem Internetradio-Client:

tclsh listing2.tcl http://www.dradio.de/streaming/dlf.m3u

Eine Besonderheit versteckt sich in Zeile 49. Der »vwait«-Aufruf wartet, bis sich die Variable namens »forever« ändert. Da es keine Variable dieses Namens gibt, wartet der Aufruf ewig oder bis das Programm explizit endet. Während der Wartezeit hängt Tcl in der Eventqueue – genau das ist der erwünschte Effekt. Er ist nötig, um Snack und den Fileevent-Mechanismus zu aktivieren; beide verwenden die Eventqueue.

Viele Formate

Neben MP3 und Ogg gibt es viele weitere Soundformate, für einige finden sich im Tclers Wiki auch Clients auf Basis von Snack. Sehr umfassend ausgestattet ist der Audioplayer Snackamp [9]. Er arbeitet sogar als Server im Hausnetz, zudem enthält das Programm neben dem ansprechende GUI (Abbildung 1) auch einen Webserver für die Fernsteuerung und besticht mit seiner automatischen Erstellung von Playlisten.

Abbildung 1: Der MP3-Player Snackamp ist bestens ausgestattet. Tom Wilkason hat dieses Programm in Tcl und der Snack-Erweiterung implementiert.

Abbildung 1: Der MP3-Player Snackamp ist bestens ausgestattet. Tom Wilkason hat dieses Programm in Tcl und der Snack-Erweiterung implementiert.

Derzeit unterstützt Snack weder das Windows-Media-Format noch Real Audio. Wer Radiosendungen etwa von der BBC (British Broadcasting Corporation) aufnehmen möchte, bleibt lieber beim Realplayer und dem virtuellen Audiokabel Vsound [5]. Bei den vielen Shoutcast- und Icecast-Sendern erledigt Streamripper [6] die gleiche Aufgabe. Dieses Programm lädt die Streams und kodiert sie in handliches MP3. Mit der Datei arbeitet Snack dann wieder klaglos.

Der ganze Funktionsumfang von Snack erschließt sich erst auf den zweiten Blick. Eine Übersicht wichtiger Befehle gibt Tabelle 1, das Angebot reicht vom Aufnehmen und Schneiden bis zum Mischen und Filtern. Wie das alles funktioniert, zeigen die mit Snack mitgelieferten Demonstrationsskripte. Auch das Tclers Wiki enthält einige Seiten mit Beispielen, darunter einen Client für Shoutcast-Streams [7].

Das Neueste

Open Office ist für viele Anwender die wichtigste Linux-Applikation. Leider ist es nicht eben einfach, Erweiterungen dafür zu entwickeln. Arnulf Wiedemann und Wolfgang Großer habe mit Tcluno [12] ein Paket geschrieben, mit dem Tcl-Skripte das Open-Office-Programm steuern können. Als Unterstützung während der Entwicklung steht mit Unospection (Abbildung 4) ein Klassen- und Methoden-Browser bereit. Aus diesem GUI heraus lassen sich Befehle auch direkt ausführen.

Tcl-Anwendungen aus mehreren Skripten, Erweiterungen und Icons sind für Endanwender schwierig zu installieren. Mit Dennis LaBelles Freewrap [13] gelingt es, alle Bestandteile in einer einzigen ausführbaren Datei zusammenzufassen. Die aktuelle Version 6.1 verbessert die Debuggingmöglichkeiten und behebt einige kleinere Fehler.

Mit Steve Landers Muzic-Paket [14] steht ein ganzer Synthesizer für Tcl bereit. Die Ansteuerung geschieht über Midi-Kommandos. Neben den integrierten Instrumenten verwendet Muzic auch Soundfonts [15].

Khamis Abuelkomboz hat einen weiteren Editor in und für Tcl entwickelt, den Code-Navigator [16]. Er unterstützt viele Skript- und Compilersprachen mit Syntaxhighlighting, Symboltabellen und Crossreferencing. Das Tool ist kostenlos für privaten Gebrauch.

Abbildung 4: Mit Tcluno greifen Tcl-Skripte direkt auf die UNO-Komponenten von Open Office zu. Das GUI-Werkzeug Unospection stellt die verfügbaren Klassen dar und enthält sogar die Dokumentation.

Abbildung 4: Mit Tcluno greifen Tcl-Skripte direkt auf die UNO-Komponenten von Open Office zu. Das GUI-Werkzeug Unospection stellt die verfügbaren Klassen dar und enthält sogar die Dokumentation.

Tabelle 1: Wichtige
Snack-Kommandos

 

Kommando

Erklärung

snack::sound Name -load Datei -file Datei
-channel Kanal

Erzeugt ein neues Sound-Objekt; mit »-load«
lädt Snack die Datei in den Hauptspeicher, mit
»-file« oder »-channel« holt es die Daten
erst bei Bedarf

$sound length Länge

Fragt die Länge der Datei ab oder ändert sie

$sound play -start Start -end Ende -blocking
blockierend

Spielt die Datei ab, das Kommando kehrt mit »-blocking
false« sofort zurück und spielt im Hintergrund
weiter

$sound stop

Beendet die Wiedergabe

$sound record

Nimmt Töne auf

$sound write Dateiname -fileformat
Dateiformat

Speichert Musikdateien

$sound powerSpectrum -start Start -end Ende
-fftlength Länge -windowlength Länge

Berechnet das Spektrum im angegebenen Bereich und gibt eine
Liste mit den Werten zurück

snack::audio stop

Beendet die Wiedergabe aller Snack-Soundobjekte

snack::audio pause

Hält alle Tonwiedergaben an

snack::audio play

Startet alle Tonwiedergaben erneut

snack::audio scaling Faktor

Ändert die Lautstärke

Nicht nur Töne

An der TU Stockholm wird mit Snack das Programm Wavesurfer entwickelt ([8] und Abbildung 2), seine Aufgabe sind wissenschaftliche Untersuchungen. Dazu kommen etwa die FFT-Spektren (Abbildung 3) zum Einsatz.

Abbildung 2: Der Snack-basierte Wavesurfer dient als leistungsfähiger Soundeditor und als Analysesoftware für Audio. Das Tool stammt von einen Uni-Institut, das Sprache, Musik und Hörwahrnehmung erforscht.

Abbildung 2: Der Snack-basierte Wavesurfer dient als leistungsfähiger Soundeditor und als Analysesoftware für Audio. Das Tool stammt von einen Uni-Institut, das Sprache, Musik und Hörwahrnehmung erforscht.

Abbildung 3: Für wissenschaftliche Anwendungen enthält Wavesurfer ausgeklügelte Analysewerkzeuge, hier ein FFT-Spektrum.

Abbildung 3: Für wissenschaftliche Anwendungen enthält Wavesurfer ausgeklügelte Analysewerkzeuge, hier ein FFT-Spektrum.

Neuere Dateiformate wie MP3 oder Ogg Vorbis enthalten nicht nur die Tondaten, sondern zusätzlich Informationen über den Musiker oder den CD-Titel. Auch diese lassen sich mit Tcl leicht aus den Dateien extrahieren [10]. Im FTP-Bereich zum Artikel [17] ist ein drittes Skript zu finden, das ähnlich wie das normale »ls«-Kommando Informationen über Dateien anzeigt. Es präsentiert die MP3-Felder etwa über Künstler, Erscheinungsjahr und Genre.

Das Extrahieren der MP3-Tags übernimmt ein Skript von Martin Lemburg. Beim Parsen der Kommandozeileneingabe kommt wieder das Opt-Package zum Zuge. Als kleine Besonderheit verwendet das Programm Ansi-Steuersequenzen, um fette Schrift auf der Konsole einzuschalten. Richard Suchenwirth veröffentlichte im Tclers Wiki [11] einige Beispiele zu diesen Steuercodes.

Musikalisches Tcl

Es zeigt sich, dass Tcl sogar im Musikbereich ungeahnte Möglichkeiten eröffnet. Snack bildet eine solide Grundlage, die auch bei komplexen Problemen wie FFT-Spektren oder Filtern weiterhilft. Wer den Lautstärkepegel einer großen Musiksammlung vereinheitlichen muss oder Dateien anhand von MP3-Tags finden will, kann dies schnell mit einem Tcl-Skript automatisieren. (fjl)

Infos

[1] Snack: [http://www.speech.kth.se/snack/]

[2] Active Tcl: [http://www.activestate.com/Tcl.plex]

[3] Icecast: [http://dir.xiph.org]

[4] Podcast.de: [http://www.podcast.de]

[5] Vsound: [http://www.zorg.org/vsound/]

[6] Streamripper: [http://streamripper.sourceforge.net]

[7] Shoutcast-Player: [http://wiki.tcl.tk/14032]

[8] Soundeditor und Analysetool Wavesurfer: [http://www.speech.kth.se/wavesurfer/]

[9] Audioplayer Snackamp: [http://snackamp.sourceforge.net]

[10] ID3-Tags: [http://wiki.tcl.tk/8759]

[11] Ansi-Color: [http://wiki.tcl.tk/1143]

[12] Open-Office-Steuerung mit Tcluno: [http://www.tugm.de/Projekte/TCLUNO/]

[13] Freewrap : [http://freewrap.sf.net]

[14] Muzic: [http://wiki.tcl.tk/Muzic]

[15] Soundfont: [http://www.fluidsynth.org]

[16] Codenav: [http://www.codenav.com]

[17] Downloads zum Artikel: [ftp://ftp.linux-magazin.de/pub/magazin/2006/01/Federlesen]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben