Musik hören

Eine liebevoll gepflegte Plattensammlung bringt viel Freude beim Finden und Hören von Musik. Asunder liest Audio-CDs aus, LAME komprimiert den Datenstrom anhand eines psychoakustischen Modells und MP3diags korrigiert Metadaten. Der Music Player Daemon lässt sich über ein textorientiertes Netzwerkprotokoll steuern. Man kann darüber Wiedergabelisten verwalten und Musik wiedergeben. Der Daemon lauscht standardmäßig auf Kanalnummer 6600.

Pakete installieren

apt install asunder cdparanoia lame mp3diags mpd mpc

Musik extrahieren

Asunder liest mit einem Ripper (cdparanoia) einzelne Titel von CD, komprimiert sie mit einem Encoder (lame) und ergänzt mit einem Tagger (id3tag) Metainformationen aus einer Online-Datenbank (freedb). Für die Qualitätskontrolle verwende ich MP3diags mit folgende Schablonen:

$HOME/music/Album/%g/%a/%y - %b/%n - %t
$HOME/music/Soundtrack/%y - %b/%n - %a - %t
$HOME/music/Compilation/%g/%y - %b/%n - %a - %t

Musik komprimieren

Man unterscheidet unkomprimierte (PCM, WAVE), verlustfrei komprimierte (FLAC, APE) und verlustbehaftetete (MP3, WMA) Datenformate. Diese erreichen bei einer Bitrate von 128 kbit/s (1 Megabyte pro Minute) eine ordentliche Qualität, wobei modernere Codecs bereits bei geringeren Bitraten transparent klingen.

Jahr Erfinder Codec Auflösung
(Bit)
Abtastrate
(KHz)
Bitrate
(KBit/s)
Endung
verlustfrei
1982 Philips CD-DA 16 44.1 1411 .cdda
1990 Microsoft WAVE 8–32 .wav
2001 Xiph FLAC 8–32 1–655 .flac
2002 Monkey's Audio APE 8–24 8–96 448 .ape
verlustbehaftet
1992 MPEG-1 Part 3 MP3 16 8–48 8–320 .mp3
1992 Dolby AC3 24 32–48 32–640 .ac3
1996 Coherent DTS 24 96 1500 .dts
1997 MPEG-2 Part 7 AAC 8–192 8–529 .aac
1998 Microsoft WMA 24 8–96 8–768 .wma
2002 Xiph Vorbis 1–200 1–448 .ogg
2012 Xiph Opus 8–48 6–510 .opus

Abtastraten jenseits 44 KHz und Auflösungen jenseits 16 Bit sind physiologisch sinnlos, da das menschliche Ohr maximal Frequenzen zwischen 20Hz und 20KHz wahrnimmt und die Dynamik den Bereich bis an die Schmerzgrenze abdeckt.

Metadaten speichern

Ein Etikett speichert Informationen wie Künstlername, Album, Titel, Veröffentlichungsdatum und vieles mehr.

Format Zeichensatz KünstlerAlbum Nummer Titel Jahr Genre composer Kommentar
MP3diags %a %b %n %t %y %g
ID3 ISO-8859-1 33:62 63:92 126:1 3:32 93:96 127:1 97:125
ID3v2.3 UCS-2 TPE1 TALB TRCK TIT2 TYER TCON TCOM COMM
ID3v2.4 UTF-8 TPE1 TALB TRCK TIT2 TDRC TCON TCOM COMM
Vorbis UTF-8 ARTIST ALBUM TRACK
NUMBER
TITLE DATE GENRE
APE UTF-8 Artist Album Track Title Year Genre Composer Comment

Bibliothek konfigurieren

Der Daemon muss vor allem den Pfad zur Musiksammlung kennen.

/etc/mpd.conf
music_directory "/home/phrank/music"

Zur Inbetriebnahme starten wir den Daemon und aktualisieren die interne Datenbank der Metadaten.

systemctl enable --now mpd
mpc update

Der Daemon speichert seine Daten in folgenden Dateien:

/var/lib/mpd/state
Wiedergabeliste der in Rotation befindliche Lieder
/var/lib/mpd/playlists
Liedsammlungen als persistente Listen von Liedern
/var/lib/mpd/tag_cache
Datenbank mit strukturiertem Index der Metadaten
/var/lib/mpd/sticker.sql
SQLite-Datenbank mit benutzerdefinierbaren Metadaten

Musik ausgeben

Auf einem PC läuft meist der PulseAudio Daemon. Darüber lässt sich Musik beliebig im Netzwerk verteilen.

audio_output {
	type	"pulse"
	name	"Pulse"
}

Auf einem Server können wir die Musik via ALSA auch direkt über den eingebaute Soundchip auf Lautsprecher ausgeben.

audio_output {
	type	"alsa"
	name	"Speaker"
	device	"hw:1,0"
}

Falls kein (hochwertiger) Soundchip zur Verfügung steht, können wir als Alternative einen DAC per USB anschließen.

audio_output {
	type	"alsa"
	name	"FiiO DAC"
	device	"hw:2,0"
	mixer_type "hardware"
}

Um internetfähige Radios wie zum Beispiel das Sonos System mit Musik zu versorgen, können wir einen HTTP-Datenstrom einrichten. Dieser ist dann unter http://localhost:8000 erreichbar.

audio_output {
	type	"httpd"
	name	"HTTP Stream"
	encoder	"lame"
	port	"8000"
	quality	"5.0"
	format	"44100:16:1"
}

Mit dem Server sprechen

Das zeilenorientierte Protokoll eignet sich gut für manuelle oder skriptgesteuerte Interaktion mit dem Daemon. Zeichenkodierung ist UTF-8.

netcat localhost 6600
OK MPD version 0.18.0
command_list_begin
volume 86
play 7
currentsong
command_list_end
file: unsorted/teen_spirit.mp3
Last-Modified: 2012-12-23 18:23:45
Time: 215
Artist: Nirvana
Title: Smells Like Teen Spirit
Album: Nevermind
Pos: 7
Id: 42
OK

Diese folgende Auflistung soll nur einen Überblick über die verfügbaren Kommandos und Optionen vermitteln und erhebt keinen Anspruch auf Vollständigkeit. Als authoritative Quelle gelten nur die Manpages und die offizielle Dokumentation.

Kommando Parameter Beispiel Beschreibung
Status
clearerror Löscht die aktuelle Fehlermeldung
currentsong Gibt Metadaten des aktuellen Lieds aus
status Gibt Status der Wiedergabe aus
stats Anzahl der Künstler und Lieder, Gesamtspieldauer und Laufzeit
Wiedergabe
play Pos 1 Startet die Wiedergabe (an dieser Position)
playid Id 1 Startet die Wiedergabe mit diesem Lied
pause true | false 0 Pausiert die Wiedergabe oder setzt sie fort
stop Beendet die Wiedergabe und vergisst die Position
seek Pos Seconds 1 120 Spult das Lied an die Position
seekid Id Seconds 1 120 Spult das Lied an die Position
seekcur Seconds 120 Spult im aktuellen Lied an die Position
previous Springt zum voerhergehenden Lied
next Springt zum nächsten Lied
setvol Percent 80 Setzt Lautstärke von 0 (Aus) bis 100 (Maximum)
volume [-]Percent 50 Ändert die Lautstärke relativ
crossfade Seconds 5 Setzt Überblendungsdauer beim Übergang von Liedern
mixrampdb Decibel -17 Dämpfung, -17 Decibel sind gut
mixrampdelay Seconds 5 Verzögerung
random true | false 0 Wählt das nächste Lied zufällig
repeat true | false 0 Wiederholt die Wiedergabeliste
single true | false 0 Spielt nur das aktuelle Lied – endlos im repeat Modus
consume true | false 0 Entfernt gespielete Lieder aus der Wiedergabeliste
replay_gain_mode off | track | album | auto
Wiedergabeliste
add Url /song.mp3 Hängt Lied hinten an
addid Url Pos /song.mp3 20 Hängt Lied irgendwo ein
clear Entfernt alle Lieder
delete Pos[:Pos] 2:4 Entfernt das aktuelle Lied oder eine Spanne
deleteid Id 2 Entfernt irgendein Lied
move Pos[:Pos] Pos 2:4 20 Verschiebt das aktuelle oder mehrere Lieder auf einen anderen Platz
moveid Id Pos 2 20 Verschiebt ein Lied auf einen anderen Platz
swap Pos Pos 2 20 Vertauscht zwei Lieder
swapid Id Id 2 20 Vertauscht zwei Lieder
playlist Listet URIs aller Lieder auf
playlistid Id 2 Zeigt ein bestimmtes Lied
playlistinfo Pos:Pos 2:4 Zeigt alle Lieder oder Lieder in einer Spanne
playlistfind Tag Value artist Beyonce Zeigt Lieder mit exakten Übereinstimmungen
playlistsearch Tag Value artist B Zeigt Lieder mit schwammigen Suchkriterien
plchanges Version 7 Listet Änderungen seit einer älteren Version auf
plchangesposid Version 7
prio Priority Pos:Pos 1 2:4 Weist Priorität beim shuffle zu
prioid Priority Id 1 2 Weist Priorität beim shuffle zu
shuffle Pos:Pos 2:4 Randomisiert die Sortierung (einer Spanne) unter Beachtung von Prioritäten
Liedsammlungen
load Name [Pos:Pos]bestof 2:4 Ersetzt (Teile der) Wiedergabeliste
save Name bestof Persistiert die Wiedergabeliste
rename Name NewName bestof worst Benennt eine Liedsammlung um
rm Name bestof Löscht eine Liedsammlung
listplaylists Listet alle gespeicherten Liedsammlungen auf
listplaylist Name bestof Listet URIs in einer Liedsammlung auf
listplaylistinfo Name bestof Listet Metadaten in einer Liedsammlung auf
playlistadd Name Url bestof /s.mp3 Hängt Lied an eine Liedsammlung an
playlistmove Name Id Pos Sortiert Liederer innerhalb einer Liedsammlung um
playlistdelete Name Pos Entfernt Lied aus einer Liedsammlung
playlistclear Name Entfernt alle Lieder aus einer Liedsammlung
Datenbank
list Tag Value artist Beyonce Listet eindeutige Etiketten eines Typs (mit Einschränkungen) auf
listall Url /heap Listet URLs (in einem Verzeichnis) auf
listallinfo Url /heap Listet Metadaten (in einem Verzeichnis) auf
lsinfo Url /heap Listet Metadaten (in einem Verzeichnis) auf
count Tag Value artist Beyonce
find Tag Value artist Beyonce Search exact match
findadd Tag Value artist Beyonce Add search results to current playlist
search Tag Word artist B Search substring
searchadd Tag Word artist B Add search results to current playlist
searchaddpl Name Tag Word bestof artist B Hängt Suchergebnisse an die Wiedergabeliste
update Url /heap Aktualisiert die (oder Teile der) Datenbank
rescan Url /heap Dito, aber auch unveränderte Dateien
sticker set Url Name Value/song.mp3 foo barErzeugt oder ändert ein Etikett
sticker get Url Name /song.mp3 foo Liefert ein Etikett
sticker list Url /song.mp3 Listet alle Etiketten auf
sticker find Url Name /song.mp3 foo
sticker delete Url Name /song.mp3 foo Entfernt ein Etikett
Verbindung
password Password Authentifiziert den Client mit einem Klartext-Passwort
ping Liefert immer OK
close Schließt die Verbindung
kill Beendet den Daemon
Ausgabe
outputs Listet Ausgabegeräte auf
disableoutput Id 1 Schaltet ein Ausgabegerät aus
enableoutput Id 1 Schaltet ein Ausgabegerät ein
toggleoutput Id 1 Wechselt hin und her
Reflexion
local config Gibt interessante Variablen aus: music_directory
commands Gibt die erlaubten Kommandos aus
notcommands Gibt die verbotenen Kommandos aus
tagtypes Listet verfügbare Etiketten auf
urlhandlers Listet unterstützte URL-Schemata auf
decoders Listet unterstützte Dateiformate auf
Chat
channels Listet Kanäle auf
subscribe Channel chitchat Betritt einen Kanal bei oder erzeugt einen Neuen
unsubscribe Channel chitchat Verlässst einen Kanal
readmessages Liest Nachrichten von allen Kanälen
sendmessage Channel Text chitchat Hello Sendet Nachricht an einen Kanal

Kochbuch

WAVE in MP3 umwandeln mit Standardeinstellungen

lame -h song.wav

FLAC in MP3 umwandeln

flac -d -c song.flac | lame -h - song.mp3

Album mit Cue- und FLAC-Datei in einzelne WAVE-Dateien zerlegen

shnsplit -t "%n - %t" -f album.cue album.flac

Dateien mit Sonderzeichen auf ein FAT32-Dateisystem kopieren und dabei die nicht erlaubten Zeichen durch einen Unterstrich ersetzen:

pax -rw -s '/[?<>\\:*|\"]/_/gp' $HOME/music/Source /media/Dest

Literatur

  1. Wikipedia: Audio Formats
  2. Monty/Xiph: 24/192 Music Downloads
  3. Mark's Pages Of Stuff: Yet Another Musical (Raspberry) Pi