[LinuxFocus-icon]
LinuxFocus article number 259
http://linuxfocus.org

[Guido Socher]
door Guido Socher (homepage)

Over de auteur:

Guido houdt niet alleen van Linux omdat het leuk is de eindeloze mogelijkheden ervan te ontdekken, maar ook omwille van de mensen die zich toeleggen op de vormgeving van het systeem.



Vertaald naar het Nederlands door:
Stefan Malomgré <stefan-(dot)-malomgre-(at)-skynet-(dot)-be>

Midi met Alsa

[Illustratie]

Kort:

Midi is een bestandsformaat dat geen gesampelde digitale klank bevat maar een beschrijving van hoe die klank moet worden geproduceerd. Je zou het kunnen vergelijken met een muziekpartituur, waarop iedere noot de symbolische voorstelling van een toon is. Midibestanden zijn daarom zeer licht in vergelijking met wav-bestanden.

Om het midiformaat in geluid om te zetten heeft u een midisynthesizer nodig. Dat is een stuk hardware of software dat gebruik maakt van digitale geluidsstalen (samples) van een instrument (bv. een piano) om klanken te genereren. Deze geluidsstalen staan als "soundfont" bekend.

In dit artikel bekijken we van naderbij hoe u Alsa (advanced linux sound architecture) als midi-synthesizer interface gebruikt.


_________________ _________________ _________________

 

Inleiding

Tot enkele jaren geleden kon je in elke computerzaak bekende geluidskaarten verkrijgen zoals "Gravis UltraSound" of "SoundBlaster Gold". Beide kaarten hadden een geïntegreerde hardware-midisynthesizer. Helaas zijn deze kaarten niet meer te koop en zelfs al waren ze nog verkrijgbaar, ze zouden niet meer in de huidige computers passen omdat het om ISA-bus kaarten ging. De huidige computers gebruiken een PCI-busaansluiting en hebben vaak een on-board geluidskaart die geïntegreerd is in de chipset. Bijna geen van deze chipsets ondersteunt midisynthese. Als u een blik werpt op de lijst van geluidskaarten die door Alsa worden ondersteund  zal u zich ongetwijfeld afvragen welke kaart de beste koop is. Helaas is de keuze eenvoudiger dan op het eerste gezicht lijkt. Momenteel is er maar één kaart in de handel die midisynthese ondersteunt nl. Soundblaster Live.
Indien u geen Soundblaster Live bezit kan u midisynthese uitvoeren met behulp van software emulatoren en ik zal uitleggen hoe dat in zijn werk gaat.

 

Wat heeft u nodig?

Alsa bevindt zich momenteel in een overgangsfase. De stabiele versie 0.5 geraakt langzamerhand wat gedateerd en de versie 0.9 zit nog in een ontwikkelingsstadium. Als u miditoepassingen wenst te gebruiken heeft u de versie 0.5 nodig omdat er voor de versie 0.9 nauwelijks toepassingen bestaan en de interfaces van 0.5 en 0.9 niet compatibel zijn. (Let wel: PCM gesampled geluid, wav-bestanden en toepassingen gebaseerd op gesampled geluid vormen voor de versie 0.9 geen probleem; ik heb het hier uitsluitend over midi.)
De programmatpakketten voor de versie 0.5 zijn:

Informatie over hoe Alsa moet worden gecompileerd vindt u in de Alsa HOWTO (zie verwijzingen). In principe komt het voor de driver neer op:

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

voor het overige doet u "./configure;make;make install".

Na de installatie kan u de module in de kernel laden. Voor Soundblaster Live (=emu10k1 Chip) is dat:

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

Voor andere kaarten vervangt u de twee eerste lijnen door de module voor uw desbetreffende kaart (bv. snd-card-via686a voor een interne kaart gebaseerd op de via 686 Chip). Mandrake en Suse ondersteunen Alsa en bij deze distributies kan u het hardwaredetectie- en configuratieprogramma gebruiken (resp. Harddrake en Yast2). Als u er hoegenaamd geen idee van heeft welk type van chip u bezit probeer dan "lspci -v" (het lspci- commando behoort tot het pakket "pciutils").

Nu komt het erop aan te testen of het geluid werkt. Start het programma alsamixer en tik "m" om de geluidsdemping van de master en het pcm kanaal op te heffen.  Gebruik vervolgens de pijltjestoetsen om het volume in te stellen en als dit gebeurd is verlaat u Alsamixer met de toets Esc. 

[alsamixer]

Om de instellingen in /etc/asound.conf op te slaan gebruikt u:

/usr/sbin/alsactl store

Ga vervolgens over tot het

afspelen van flute.wav

om een toon te horen. Is dit niet het geval ga dan naar /proc/asound en verifieer /proc/asound/devices en /proc/asound/oss-devices. Er zou normaal "mixer" en "digital audio" moeten staan ( mijn bestanden).

Tot zover de test om na te gaan of de pcm OSS emulatie en het geluid in het algemeen werkt. Ik zal verder uitleggen wat moet worden toegevoegd in /etc/modules.conf om alles te automatiseren maar de volgende stap is Midi aan de praat krijgen.

   

Midi

Bezit u een geluidskaart met geïntegreerde midisynthesizer (Soundblaster Live) dan moet u de "soundfonts" (gesampelde instrumenten) in de chip van de kaart laden. Beschikt u niet over een dergelijke kaart kan u Timidity installeren (zie de verwijzingen met de URL waar u het programma kan downloaden) en dit programma als Alsa-midisynthesizer gebruiken. Programma's die op Alsa draaien merken namelijk geen verschil tussen een hardwaresynthesizer en Timidity. 

De soundfont laden

U zal eerst moeten checken of het programma sfxload (/bin/sfxload) geïnstalleerd is. Is dat niet het geval dan is het nu tijd het te installeren. Dit programma maakt deel uit van het pakket awesfx (het bevindt zich op de installatie-CD van uw linuxdistributie maar kan ook worden opgehaald bij http://mitglied.lycos.de/iwai/awedrv.html ). De volgende stap is het kopiëren van het bestand 8MBGMSFX.SF2 van uw Soundblaster Live CD (/mnt/cdrom/AUDIO/Common/SFBANK/8MBGMSFX.SF2) naar /etc/midi/8MBGMSFX.SF2. De soundfont wordt met het volgende commando geladen:

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

Een uitstekend testprogramma is pmidi (zie verwijzingen). Het commando 
pmidi -l
zou het volgende resultaat moeten geven:

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

Tik nu 

pmidi -p 65:0 test.mid

en het midigeluid zou nu te horen moeten zijn.

TiMidity als softwaresynthesizer

Download TiMidity++-2.11.3.tar.gz (cf verwijzingen aan het eind van dit artikel) en pak het uit met tar zxvf TiMidity++-2.11.3.tar.gz. Open het bestand common.makefile.in. met een editor en uncomment de regel CFLAGS voor pentium gcc:

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

Nu kan je timidity voor verschillende grafische interfaces configureren, maar wij zijn hoofdzakelijk geïnteresseerd in "--enable-alsaseq". Het kan evenwel geen kwaad om het programma via een grafische interface te manipuleren: 

./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

Hiermee installeert u timidity naar /usr/local/timidity-2.11.3/bin om een reeds bestaande timidity-installatie van uw distributie niet te overschrijven. Wij installeren timidity zelf omdat ik geen enkele distributie ken die timidity voor de alsaseq interface geconfigureerd heeft.
Ook voor timidity heeft u soundfonts nodig. Die heten hier "instrument files". Een degelijke en complete set van instrumenten is tamelijk omvangrijk (ca. 10Mb). U geraakt het snelst aan deze bestanden als u de timidity++ installatie van uw linuxdistributie kopieert of door het ophalen van bv. timidity++-2.11.3-1.i386.rpm voor Redhat 7.3 . Om de bestanden van /usr/share/timidity/instruments naar /usr/local/timidity-2.11.3/share/timidity/instruments te kopiëren gebruikt u het volgende commando:

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

Nu kunnen we 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

en vervolgens pmidi -l:

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

Ziezo, we hebben 2 poorten met de TiMidity-synthesizer.
U kan vervolgens met

pmidi -p 128:0 test.mid

muziek produceren.    

/etc/modules.conf

Voor het automatisch configureren en laden van de module kan u het volgende in /etc/modules.conf invoeren (dit in de veronderstelling dat u een Soundblaster Live heeft):

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

Voor een kaart zonder midisynthesizer, bv. een interne via686 wordt dat:

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

Om timidiy automatisch tijdens de systeemstart te laden moet u de volgende regel toevoegen in /etc/init.d/alsasound (dit bestand wordt met de Alsa driver geïnstalleerd maar is niet geactiveerd. Met chkconfig kan het voor runlevel 3+5 geactiveerd worden):

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 en midi gebruiken

[kmid] In dit artikel hebben we het programma pmidi gebruikt om midibestanden af te spelen. KDE bevat het programma kmidkmid (niet te verwarren met kmidi) dat u met of zonder alsa-ondersteuning kan compileren. Redhat heeft het uitsluitend voor OSS gecompileerd, terwijl Mandrake en Suse Alsa gebruiken. De Mandrakebestanden kunnen evenwel onder Redhat worden gebruikt.

De uiteenzetting over de installatie van alsa kan ook nog van pas komen voor andere programma's die in verdere artikels aan bod zullen komen. Zo zal er bv. een artikel over Jazz verschijnen, een midisequencer en editor. Aan het slot van dit artikel vindt u een lijst met verwijzingen naar andere muziekprogramma's. 

Er zijn ook andere programma's zoals timidiy (timidity -ig start bv. timidity met gtk interface) of kmidi (niet te verwarren met kmid) die een softwaresynthesizer bevatten. In dit geval heeft u op het niveau van de kernel geen midi nodig (hetzij in de hardware of door timidity-emulatie). Over het algemeen is het aan te raden een gemeenschappelijk midi API te hanteren in de plaats van midi in in ieder programma opnieuw te implementeren.

Alsa ondergaat momenteel grote wijzigingen; zoals reeds gezegd functioneert versie 0.9 niet met de meeste toepassingen. De versie 0.5, zoals ze hier werd besproken kent eveneens enkele problemen. De OSS sequencer-emulatie (/dev/sequencer) werkt bijvoorbeeld niet. Ze functioneert alleen met Soundblaster AWE kaarten, die niet meer in de handel verkrijgbaar zijn. Dit betekent dat uitsuitend programma's die voor Alsa geschreven werden zullen functioneren. Hopelijk zal de versie 0.9 daarin verandering brengen. Dit artikel zou ook in de toekomst, als versie 0.9 verspreid geraakt, zijn nut moeten blijven bewaren omdat er eigenlijk slechts "kleinigheden" aangepast zijn. Zo zijn bv. de namen van de kernelmodule anders maar de fundamentele werking blijft dezelfde.     

Verwijzingen



Site onderhouden door het LinuxFocus editors team
© Guido Socher
"some rights reserved" see linuxfocus.org/license/
http://www.LinuxFocus.org
Vertaling info:
en --> -- : Guido Socher (homepage)
en --> nl: Stefan Malomgré <stefan-(dot)-malomgre-(at)-skynet-(dot)-be>

2005-01-14, generated by lfparser_pdf version 2.51