Midi mit Alsa

ArticleCategory: [Choose a category, do not translate this]

Applications

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to de Guido Socher

AboutTheAuthor:[A small biography about the author]

Guido mag Linux nicht nur, weil es Spaß macht, die großartigen Möglichkeiten, die dieses System bietet zu entdecken, sondern auch wegen der Leute, die an seiner Entwicklung beteiligt sind.

Abstract:[Here you write a little summary]

Midi ist ein Dateiformat, das keinen ge-sampelten digitalen Sound enthält, sondern eine Beschreibung, wie der Sound zu erzeugen ist. Das ist vergleichbar mit einem Notenblatt, wo jede Note einen Ton angibt. Mididateien sind daher sehr klein im Vergleich zu wav Dateien.

Um Midi in Töne zu verwandeln, braucht man einen Midi Synthesizer. Das ist ein Stück Hardware oder Software, in dem digitale Soundsamples eines Instruments (z.B Klavier) benutzt werden, um aus dem Midi Töne zu machen. Die Soundsamples werden als "soundfont" bezeichnet.

Dieser Artikel erklärt, wie man Alsa (advanced linux sound architecture) als Interface zu einem Midi Synthesizer benutzt.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Einführung

Bis vor einigen Jahren konnte man bekannte Soundkarten wie "Gravis UltraSound" oder "SoundBlaster Gold" in jedem Computerladen finden. Beide Karten hatten interne Hardware-Midi- Synthesizer. Leider kann man diese Karten nicht mehr kaufen. Selbst wenn es sie gäbe, wären sie nutzlos, da es ISA Bus Karten waren. Heutige Computer benutzen PCI Bus und haben oft schon im Chipset auf dem Motherboard einen Soundchip. Kaum einer dieser Chips unterstützt Midi Synthese. Ein Blick auf die Liste der von Alsa unterstützten Karten zeigt, daß es sehr viele Karten gibt. Du wirst dich jetzt vermutlich fragen, welche du kaufen sollst. Leider ist die Entscheidung ganz einfach. Es gibt nur eine Karte, die man heute im Computerladen findet, die auch Midi Synthese unterstützt: Soundblaster live.

Wenn du keine Soundblaster live Karte hast, dann kann man Midi Synthesis in Software emulieren und ich werde erklären wie das geht.

Was man braucht

Alsa ist im Augenblick in einer Übergangsphase. Der stabile Release ist 0.5 und wird langsam alt. Die Version 0.9 ist aber noch nicht ganz ausgereift. Wenn man Anwendungen mit Midi benutzen möchte, dann braucht man im Augenblick noch 0.5, weil es kaum Anwendungen für 0.9 gibt und sich die Programmierschnittstelle geändert hat. (Beachte: PCM sampeled sound, wav Dateien, und Applikationen basierend auf gesampeltem Sound sind kein Problem mit Version 0.9. Ich spreche hier von Midi.)
Die Dateien für 0.5 sind: Informationen darüber, wie man Alsa kompiliert, findet man in der Alsa HOWTO (siehe Referenzen). Im Prinzip muß man folgendes machen:

tar jxvf alsa-driver-0.5.12a.tar.bz2
cd alsa-driver-0.5.12a
./configure --with-sequencer=yes --with-oss=yes --with-isapnp=no
make
make install
./snddevices

Das ist für den "driver" und "./configure;make;make install" für den Rest.

Nach der Installation kann man die Module in den Kernel laden. Für Soundblaster live (=emu10k1 Chip) ist das:

modprobe snd-card-emu10k1
modprobe snd-synth-emu10k1
modprobe snd-seq-midi
modprobe snd-pcm-oss
modprobe snd-mixer-oss
modprobe snd-seq-oss

Für andere Karten muß man einfach die ersten zwei Zeilen durch das Modul für die entsprechende Karte ersetzen (z.B snd-card-via686a für eine interne Karte basierend auf dem via 686 Chip). Mandrake und Suse unterstützen Alsa und dort kann man auch die Hardwareerkennung und Konfiguration der Distribution benutzen (harddrake und yast2). Falls du überhaupt keine Ahnung hast, was für ein Chip in deinem Rechner steckt, dann probier mal "lspci -v" (der lspci Befehl gehört zu einem Paket namens pciutils).

Nun ist es Zeit zu testen, ob der Sound funktioniert. Starte das Programm
alsamixer
und tippe "m" zum un-mute des master und pcm Kanals (un-mute = nicht stummschalten). Mit den Pfeiltasten kann man die Lautstärke einstellen. Mit Esc wird das Programm verlassen.

[alsamixer]

Um die Einstellungen in /etc/asound.conf zu speichern, benutzt man:

/usr/sbin/alsactl store

Nun kann man mit

play flute.wav

einen Flötenton hören. Falls nicht, gehe zu /proc/asound und überprüfe /proc/asound/devices und /proc/asound/oss-devices. Dort sollte es "mixer" und "digital audio" geben (meine Dateien).

Das war ein Test der pcm oss Emulation und Sound im allgemeinen. Weiter unten werde ich erklären, wie man mit /etc/modules.conf alles automatisch machen kann. Der nächste Schritt ist jedoch, Midi zum laufen zu bringen.

Midi

Wenn du eine Soundkarte mit internem Midi Synthesizer (Soundblaster live) hast, dann muß man die "soundfonts" (gesampelte Instrumente) in den Chip der Soundkarte laden. Wenn du keine solche Karte hast, dann kannst du timidity installieren (siehe Referenzen für einen URL zum Download) und timidity als Alsa Midi Synthesizer benutzen. Für Programme, die oberhalb von Alsa laufen, ist kein Unterschied zwischen dem Hardware Synthesizer und timidity zu sehen.

Den Soundfont laden

Du solltest überprüfen, daß das Programm sfxload (/bin/sfxload) installiert ist. Wenn nicht, dann installiere es jetzt, Es ist Teil eines Paketes namens awesfx (auf den CDs deiner Linuxdistribution oder http://mitglied.lycos.de/iwai/awedrv.html). Als nächstes kopiere die Datei 8MBGMSFX.SF2 von deiner Soundblaster Live CD (/mnt/cdrom/AUDIO/Common/SFBANK/8MBGMSFX.SF2) nach /etc/midi/8MBGMSFX.SF2. Der Soundfont wird mit folgendem Befehl geladen:

/bin/sfxload /etc/midi/8MBGMSFX.SF2

Ein gutes Testprogramm ist pmidi (siehe Referenzen). Der Befehl
pmidi -l
sollte folgendes anzeigen:

Port Client name Port name
64:0 External MIDI 0 MIDI 0-0
65:0 Emu10k1 WaveTable Emu10k1 Port 0
65:1 Emu10k1 WaveTable Emu10k1 Port 1
65:2 Emu10k1 WaveTable Emu10k1 Port 2
65:3 Emu10k1 WaveTable Emu10k1 Port 3

Nun tippe

pmidi -p 65:0 test.mid

und du solltest Midi Sound hören.

TiMidity als Software Synthesizer

Lade TiMidity++-2.11.3.tar.gz (siehe Referenzen am Ende) herunter und entpacke es (tar zxvf TiMidity++-2.11.3.tar.gz). Editiere die Datei common.makefile.in. Hier kommentiert man die CFLAGS Zeile für pentium gcc aus:

CFLAGS = -O3 -mpentium -march=pentium -fomit-frame-pointer \
-funroll-all-loops -malign-double -ffast-math

Nun kann man timidity für verschiedene grafische Oberflächen konfigurieren, aber wir sind hauptsächlich an "--enable-alsaseq" interessiert. Es schadet aber nicht, wenn man das Program auch über eine grafische Oberfläche steuern kann:

./configure --enable-ncurses --enable-xaw --enable-spectrogram --enable-xaw=dynamic --enable-audio=oss,alsa --enable-alsaseq --prefix=/usr/local/timidity-2.11.3
make
make install

Das installiert timidity nach /usr/local/timidity-2.11.3/bin, um eine bereits existierende timidity Installation aus deiner Linuxdistribution nicht zu überschreiben. Wir installieren timidity hier selbst, weil ich keine einzige Distribution kenne, die timidity für das alsaseq Interface konfiguriert hat.
Für timidity braucht man auch Soundfonts. Diese nennen sich hier "instrument files". Ein guter und kompletter Satz von Instrumenten ist ziemlich groß (ca. 10Mb). Am schnellsten kommst du an diese Dateien heran, wenn du sie aus der timidity++ Installation deiner Linuxdistribution kopierst. Oder z.B. von timidity++-2.11.3-1.i386.rpm, Download für Redhat 7.3. Um die Dateien von /usr/share/timidity/instruments nach /usr/local/timidity-2.11.3/share/timidity/instruments zu kopieren, benutzt man folgenden Befehl:

cd /usr
find share/timidity -print | cpio -dump /usr/local/timidity-2.11.3

Nun können wir timidity testen:

/usr/local/timidity-2.11.3/bin/timidity -iA -B2,8 -Os -EFreverb=0
TiMidity starting in ALSA server mode
set SCHED_FIFO
Opening sequencer port: 128:0 128:1

und dann pmidi -l:

Port Client name Port name
128:0 Client-128 TiMidity port 0
128:1 Client-128 TiMidity port 1

Voila, wir haben 2 Ports mit dem TiMidity Synthesizer.
Nun kann man mit

pmidi -p 128:0 test.mid

Musik erzeugen.

/etc/modules.conf

Zur automatischen Konfiguration und zum Laden der Module kann man folgendes in /etc/modules.conf eintragen, falls man eine Soundblaster live Karte hat:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-emu10k1
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias midi snd-synth-emu10k1
below snd-seq-oss snd-synth-emu10k1
post-install snd-synth-emu10k1 /bin/sfxload /etc/midi/8MBGMSFX.SF2 ; alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

Für eine andere Karte ohne Midi Synthesizer, z.B. eine interne via686:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-via686a
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-12 snd-pcm-oss
# restore original mixer:
post-install snd-card-via686a alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

Um timidiy automatisch während des Booten zu starten, sollte man folgende Zeile in /etc/init.d/alsasound (diese Datei wird mit dem Alsa Driver installiert, ist aber nicht aktiv. Mit chkconfig kann sie für Runlevel 3+5 aktiviert werden) einfügen:

echo "starting timidity"
timidiy=/usr/local/timidity-2.11.3/bin/timidity # do not forget the "&" in the next line:
$timidity -iA -B2,8 -Os -EFreverb=0 > /dev/null &

Alsa und Midi nutzen

[kmid] Wir haben oben schon das pmidi Programm benutzt, um Midi Dateien abzuspielen. KDE enthält ein Programm namens kmid (nicht zu verwechseln mit kmidi). Kmid kann man mit oder ohne Alsa Unterstützung kompilieren. Redhat hat es nur für OSS kompiliert. Mandrake und Suse nutzen Alsa. Man kann die Mandrake Dateien unter Redhat benutzen.

Dieser Artikel ist auch ein vorbereitender Artikel für andere Artikel über Musikprogramme. Wir werden z.B. einen Artikel zu Jazz haben. Jazz ist ein Midi Sequencer und Editor. Am Ende des Artikels findet sich eine Liste mit Referenzen zu anderen Musikprogrammen.

Es gibt auch andere Programme wie timidiy (timidity -ig wird z.B. timidity mit gtk Oberfläche starten) oder kmidi (nicht kmid), die schon einen Software Synthesizer enthalten. In diesem Fall braucht man auf Kernelebene kein Midi (ob in Hardware oder durch timidity emuliert). Im allgemeinen ist es jedoch besser, ein gemeinsames Midi API zu haben und nicht Midi in jedem Programm neu zu implementieren.

Alsa durchläuft im Augenblick große Veränderungen. Wie schon vorher gesagt, funktioniert Version 0.9 mit den meisten Applikationen nicht. Die Version 0.5, wie sie hier besprochen wurde, hat jedoch auch Probleme. Die OSS Sequencer Emulation (/dev/sequencer) funktioniert nicht. Sie funktioniert nur mit Soundblaster AWE Karten, die man nicht mehr kaufen kann. Das bedeutet, daß nur Programme, die auch für Alsa geschrieben wurden, funktionieren werden. Das wird sich hoffentlich mit Version 0.9 ändern. Dieser Artikel sollte aber auch in Zukunft noch seinen Wert haben, wenn Version 0.9 weiter verbreitet ist, da sich eigentlich nur "Kleinigkeiten" geändert haben. So sind z.B. die Namen der Kernelmodule anders, aber das grundsätzliche Vorgehen ist gleich.

Referenzen