develia.org
»» i686 slackware tarballs..
»» software projects..
»» and much more..
 NAVIGATION 
 OPTIONS 

 INFO 
*** develia.org ***
di Giacomo Lozito
© 2004-2010

valid xhtml 1.0valid css!
powered by apachepowered by php
valid rss 2.0get firefox!

NO software patents in UE
 DOCUMENTS 
Advanced Linux Sound Architecture e supporto MIDI

1. Un pò di storia del sistema audio di Linux
2. Installazione dei driver ALSA
3. Mixer ed impostazioni per ALSA
4. MIDI e soundfont con ALSA
5. Versione scaricabile dell'HOWTO


 Un pò di storia del sistema audio di Linux

Il sistema audio di Linux era originariamente basato su OSS (Open Sound System), un set di driver che fornivano un'API uniforme per le principali piattaforme UNIX e supportavano numerosi dispositivi audio. Successivamente Hannu Savolainen, sviluppatore originario della maggior parte del codice di OSS per Linux, si spostò assieme ad altri programmatori in una compagnia, 4Front Technologies, che produceva driver migliorati per Linux. Si trattava però di implementazioni con licenza commerciale, disponibili per tutti coloro che erano disposti ad acquistarle. Col tempo OSS/Free (l'implementazione audio nel kernel di Linux, open source) venne accantonata dagli sviluppatori originari che decisero di concentrarsi su OSS/Linux, come testimonia questa pagina.
Nonostante ciò OSS/Free rimase ancora per del tempo il sistema audio standard di Linux. Quando ci si rese conto che la componente audio era oramai piuttosto datata rispetto al resto del kernel che progrediva, comparve ALSA (Advanced Linux Sound Architecture) come risposta al problema.

Piuttosto che la rivisitazione ed il rinnovo del codice dei vecchi driver sonori di linux, gli sviluppatori di ALSA (tra cui cito Jaroslav Kisela e Takashi Iwai) decisero di ripartire da zero, con tutti i benefici del caso. Fu infatti possibile scrivere un sistema modulare, con supporto MIDI, molto efficiente, in grado anche di supportare le applicazioni basate su OSS attraverso un apposito modulo per la compatibilità. Diversi produttori di schede audio, compresa la serietà del progetto, fornirono le specifiche delle schede ai programmatori ALSA, permettendo loro di estendere il supporto ad una vastissima gamma di schede e chipset.
I driver ALSA sono stati integrati nel kernel a partire dalla serie 2.5.x, in previsione del loro pieno supporto nella nuova serie 2.6.x dove i driver OSS, anche se presenti, sono stati dichiarati obsoleti.

Non è necessario passare al kernel 2.6.x per poter utilizzare i driver ALSA. Tutto il necessario è scaricabile dal sito web relativo e perfettamente funzionante per qualsiasi kernel a partire dalla serie 2.2.x. Nello stesso sito è possibile reperire la lista delle schede audio supportate, nonchè una grande quantità di documentazione sia per l'installazione dei driver che per la produzione di applicazioni che si avvalgano di ALSA.


 Installazione dei driver ALSA

Per realizzare questa guida ho deciso di prendere come esempio la configurazione ALSA per due schede molto diffuse, la Sound Blaster Live e la Sound Blaster Audigy, che funzionano con il driver del chipset emu10k1, anche se in realtà le Audigy montano un chipset diverso. Nel discorso sono ovviamente incluse le varianti di queste schede (platinum, value, gamer, digital entertainment).
Tutte le indicazioni che darò restano comunque validissime per qualsiasi scheda audio si possieda, sostituendo opportunamente i parametri laddove necessario. E' possibile consultare guide specifiche per la propria scheda visitando la tabella delle schede supportate nel sito di ALSA.

Prima di tutto dobbiamo procurarci i tre pacchetti di sorgenti che ci servono per allestire un sistema audio ALSA con i fiocchi. Direttamente nella homepage del sito web di ALSA troviamo ciò che ci serve, sotto la voce "latest software releases" nella riga "stable", e più precisamente:

alsa-driver-VERSIONE.tar.bz2
alsa-lib-VERSIONE.tar.bz2
alsa-utils-VERSIONE.tar.bz2

dove VERSIONE è il numero di versione; prendiamo ovviamente la più recente disponibile, che tra l'altro è l'unica che il sito di ALSA ci permetta di scaricare direttamente in homepage, quindi non possiamo sbagliare.
Potrà sorgere una domanda: se ci interessa installare i driver, perchè abbiamo preso anche le librerie e le utility? Perchè le librerie sono indispensabili per compilare e far funzionare i programmi con supporto ALSA, mentre tra le utility troveremo il mixer, fondamentale per gestire attivazione e volume delle varie componenti audio.
E' buona norma mantenere una directory, magari sotto la propria home, nella quale conservare i sorgenti dei programmi che si va a compilare. Lo stesso si può fare per i pacchetti dei sorgenti di ALSA. Supponiamo comunque di creare una directory alsa sotto la nostra home, per esempio /home/user/alsa/. Posizioniamo lì i tre pacchetti scaricati e digitiamo tar xfvj alsa-driver-VERSIONE.tar.bz2 per decomprimere il primo, ossia quello dei drivers. Spostiamoci ora nella nuova directory alsa-driver-VERSIONE/ che contiene i driver decompressi, procederemo alla configurazione dei driver.

Digitando ./configure --help possiamo ottenere un elenco dei parametri di configurazione. Essenzialmente ci interessa compilare i driver ALSA in modo che supportino la nostra scheda, abbiano il modulo di compatibilità per il vecchio sistema OSS usato ancora da molti programmi e abbiano il supporto MIDI (se la nostra scheda lo prevede).

./configure --with-cards=emu10k1 --with-oss --with-sequencer
make
make install


Ecco quindi tradotte in configure le nostre esigenze.
Per default ALSA installa con prefisso /usr , quindi make install deve essere digitato da utente root. Per le schede SB Live e Audigy si seleziona il chipset emu10k1, chiaramente tale valore andrà cambiato se si possiede una scheda diversa. E' possibile trovare il valore corretto più eventuali altre note per la configurazione visitando la matrice delle schede supportate sul sito di ALSA e consultando la pagina contenente i dettagli per la propria scheda.
Se questa è la prima installazione di ALSA, è necessario creare ora i file speciali relativi alle varie periferiche audio, a questo penserà un comodo script presente nella directory dei drivers, snddevices, impostando i permessi corretti ( ossia chmod a+rw /dev/dsp /dev/mixer /dev/sequencer /dev/midi ). Attenzione! Se si usa devfs (un filesystem virtuale per l'accesso ai device drivers), non bisogna lanciare questo script. Il supporto devfs è sperimentale nella serie 2.4.x del kernel quindi se non avete mai ricompilato il kernel inserendolo spontaneamente è improbabile che lo stiate usando.

Dunque i driver sono al loro posto, potremmo già provare a farli funzionare nel kernel ma procediamo prima a compilare anche librerie e utility, rigorosamente lavorando prima sul pacchetto delle librerie e poi su quello delle utility. In entrambi i casi è sufficiente decomprimere i relativi pacchetti, entrare nella directory che contiene i sorgenti e digitare:

./configure
make
make install


Come si può vedere, è davvero molto semplice. A questo punto abbiamo installato tutte le parti significative di ALSA sul nostro sistema, dobbiamo procedere a configurare quest'ultimo. Logghiamoci come utente root e apriamo con un editor di testo il file /etc/modules.conf (per kernel 2.4.x) o /etc/modprobe.conf (per kernel 2.6.x) dove inseriremo le seguenti righe:

# ALSA portion
alias char-major-116 snd
alias snd-card-0 snd-emu10k1
# module options should go here

# OSS/Free portion
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0

# card #1
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

Queste righe permetteranno al sistema di caricare opportunamente i moduli sonori (emulazione OSS inclusa) quando necessario. Si tenga presente che anche in questo caso le righe per modules.conf fanno riferimento alle schede SB Live e Audigy, per schede diverse sarà sempre possibile reperire i dati corretti da inserire in modules.conf attraverso la pagina dei dettagli per la propria scheda, nella matrice delle schede supportate da ALSA.

Non ci resta che inaugurare il tutto. Assicuriamoci che non ci sia il modulo sonoro OSS caricato, possiamo controllare tramite lsmod. Nel caso delle schede SB Live e Audigy, il modulo si chiama emu10k1 e potremo rimuoverlo con
modprobe -r emu10k1
dopo aver chiuso tutti i programmi che ne stavano facendo uso. E' una buona idea mettere questo modulo in blacklist su hotplug ( inserendo il suo nome nel file /etc/hotplug/blacklist ) per far sì che non venga più caricato all'avvio di sistema.
Procediamo ora a caricare nel kernel i moduli di ALSA, scrivendo

modprobe snd-emu10k1
modprobe snd-pcm-oss
modprobe snd-mixer-oss
modprobe snd-seq-oss

Ovviamente snd-emu10k1 è corretto per le schede SB Live e Audigy, per le altre schede si caricherà il modulo con il nome corretto... devo ancora ripetervi dove far riferimento? :)
Se tutto va bene i moduli saranno caricati nel kernel, ora non ci resta che regolare il volume, i bassi e quant'altro.


 Mixer ed impostazioni per ALSA

Il volume è impostato a zero subito dopo l'inserimento dei driver nel kernel, quindi è necessario regolarlo. Possiamo farlo usando alsamixer, comoda utility con interfaccia ncurses per la gestione del volume e delle componenti audio della nostra scheda.
Digitiamo alsamixer e alziamo il volume master. E' possibile anche rendere muta (e viceversa) una componente audio selezionandola e premendo il tasto m. Se si desidera regolare bass e treble secondo gusto, è necessario togliere il mute alla voce tone. Si tenga presente nel supporto per la scheda SB Audigy la regolazione di bass e treble è ancora imperfetta. Se doveste sperimentare disturbi nell'audio con certi giochi, provate a rimettere muta la voce tone. Per esempio, di solito applico questo accorgimento quando gioco ad Unreal Tournament.

L'idea di dover impostare il volume ad ogni riavvio di sistema proprio non ci piace, per fortuna abbiamo dalla nostra tutti i mezzi per evitarlo. Dopo aver regolato il volume come desideriamo, logghiamoci come utente root e digitiamo
alsactl store
per memorizzare le impostazioni del mixer nell'apposito file /etc/asound.state . Per richiamare queste impostazioni, in qualsiasi momento volessimo farlo (verosimilmente dopo aver riavviato per ripristinare le nostre impostazioni di volume), ci basterà digitare
alsactl restore
Va da sè che inserire questo comando in uno dei file lanciati in automatico all'avvio del nostro sistema è una buona idea ( per esempio in rc.local ). Ma possiamo fare ancora meglio! Nella directory dove risiedono i sorgenti dei driver ALSA (la prima che abbiamo compilato seguendo la guida sopra) troveremo una subdirectory denominata utils che contiene lo script alsasound, comodo script di start/stop che potremo collocare nelle nostre directory di init e che, oltre a caricare i moduli di ALSA, si preoccuperà di ripristinare con alsactl restore le impostazioni mixer che avevamo scelto. Gli utenti slackware possono usare questo rc.alsa che è quello realizzato appositamente per i pacchetti ALSA della distribuzione e funziona a dovere con il sistema di init BSD-like.

Si può ottenere un controllo ancora più dettagliato sulla propria scheda audio (e persino gestirne più di una in modo ordinato) tramite la scrittura di un file .asoundrc in base alle specifiche descritte per ciascuna scheda sul sito di ALSA. Spero di avere il tempo di investigare le possibilità offerte da questo file in futuro.
Sempre sulle pagine ALSA dedicate a ciascuna scheda, è possibile trovare molte informazioni per sfruttarne appieno le caratteristiche; per esempio ci sono righe di modules.conf per il funzionamento di ingressi e uscite del livedrive fornito con la SB Live Platinum e per il funzionamento del telecomando ad infrarossi di quel pannello.


 MIDI e soundfont con ALSA

Questa parte è espressamente dedicata a coloro che possiedono una Sound Blaster Live o Audigy (e relative varianti). Queste schede infatti supportano MIDI direttamente nel loro hardware e permettono il suo campionamento attraverso insiemi di strumenti definiti in file detti soundfont. Ciò che ci interessa è capire come caricare un file soundfont nel sequencer per poter riprodurre i nostri file midi. Dove reperire un loader apposito?
Il programma sfxload fa parte di un set di driver realizzati da Takashi Iwai (che ha realizzato tantissimi drivers per schede audio Sound Blaster ed attualmente si occupa anche di alcuni driver ALSA) per la vecchia scheda audio Sound Blaster AWE 32/64, la prima ad avvalersi dei soundfont. Dal momento che a noi interessa caricare i SoundFont, il programma fa proprio al caso nostro.
Avremo bisogno delle utility awesfx, tra cui c'è l'ultima versione realizzata di questo loader. Gli utenti debian e gentoo potranno usare rispettivamente apt ed emerge per procurarsi comodamente questo pacchetto. E' facile reperirlo anche in formato RPM. Agli utenti slackware ho pensato io creando un bel pacchetto di awesfx, disponibile nella sezione multimedia di questo sito. Dulcis in fundo, i sorgenti sono reperibili su questa pagina di Takashi Iwai (dedicata al vecchio driver per AWE, ma non solo).

Bene, abbiamo il loader ma su Linux non abbiamo soundfont. Dal momento che disponiamo di una scheda Sound Blaster, potremo trovarli comodamente sul cd di installazione della scheda audio (sono files con estensione .SF2). Presumibilmente ne troveremo più di uno, con dimensioni diverse. Vale la regola che di solito il più grande garantisce la migliore qualità del suono. Personalmente uso CT8MGM.SF2, che fa parte del set di soundfont incluso con la scheda SB Audigy. E' una buona idea collocare i soundfont in una directory apposita, per esempio /usr/lib/sfbank o /etc/midi o /usr/share/midi o quel che uno preferisce. Dopodichè potremo caricarlo con il comando:
sfxload /usr/lib/sfbank/CT8MGM.SF2
dove ovviamente si sostituirà percorso e nome del soundfont con i propri. Il loader sfxload dispone di numerose opzioni, vale davvero la pena consultarne la man page. Tra le altre cose ricordo la possibilità di usare un file di configurazione, /etc/sfxloadrc , contenente le opzioni che si desidera attivare di default (come il path dove cercare i soundfont) o per uno specifico soundfont.

Ovviamente il pensiero di dover caricare il soundfont ogni volta che occorre non ci alletta, possiamo ovviare anche a questo. Far caricare il soundfont al boot è un'idea, ma presenta una piccola controindicazione. Se i moduli ALSA relativi al sequencer MIDI venissero cancellati dalla lista dei moduli in uso del kernel (questo avviene per tutti i moduli in modalità autoclean che non vengono usati per un pò di tempo), sarebbe necessario fornire i soundfont ad ogni successivo caricamento dei moduli ALSA del sequencer. Proprio quest'ultimo ragionamento ci fornisce la giusta soluzione, che è quella di loggarsi come utente root, aprire con un editor di testo il file /etc/modules.conf (se si adopera un kernel 2.4.x) e aggiungere la riga seguente:

post-install snd-emu10k1-synth /usr/bin/asfxload /usr/lib/sfbank/CT8MGM.SF2

Nel caso in cui si stia usando un kernel 2.6.x, il file da modificare sarà invece /etc/modprobe.conf e la riga da aggiungere sarà la seguente:

install snd-emu10k1-synth /sbin/modprobe --first-time --ignore-install snd-emu10k1-synth && { /usr/bin/asfxload /usr/lib/sfbank/CT8MGM.SF2; }

Questa riga fa sì che ogniqualvolta venga caricato il modulo del sintetizzatore MIDI, venga anche lanciato sfxload con relativo soundfont (nella riga ovviamente sostituire laddove necessario i path e il nome del soundfont prescelto).
Molto bene, a questo punto abbiamo reso praticamente tutto automatico e non dovremo più metterci a giocare con loader e soundfont, se non che per il piacere di provare soundfont diversi.

Collaudiamo il tutto, possiamo usare allo scopo il programma pmidi, le istruzioni per l'uso sono disponibili nella sua homepage. L'unica cosa che mi preme ricordavi è quella di visualizzare l'elenco delle porte MIDI con pmidi -l per poterne selezionare una da usare, in ogni caso è tutto ben spiegato nella documentazione.

Chiunque avesse voglia di sperimentare con i soundfont, sarà felice di sapere che è possibile reperirne su numerose pagine web. Vi segnalo personalcopy.com, dove troverete alcuni soundfont davvero di buona qualità, che potrete scaricare liberamente per il vostro uso personale. Un paio di questi soundfont sono già pronti per Linux (uno da 23 e uno da 50 mb!) mentre gli altri sono compressi attraverso un'apposita utility di compressione per soundfont, sfArk. E' disponibile anche un decompressore di file sfArk per Linux, sarà quindi possibile sperimentare tutti i soundfont disponibili.
Non mi resta che augurarvi buon divertimento!



Questo HOWTO è stato realizzato da Giacomo Lozito, il maintainer di develia.org, con passione e pazienza.
Se qualcuno trovasse l'howto particolarmente utile (magari per un sito dedicato all'audio su Linux) è libero di pubblicarlo sul proprio sito, a patto però che lasci immutati questi crediti (link a develia.org incluso) e che abbia la gentilezza di farmelo sapere via email.


Questo HOWTO è disponibile anche in versione scaricabile, in formato PDF. Ringrazio Giovanni Scafora aka voidnull (fondatore di #linuxmania @ irc.azzurra.org) per l'adattamento e conversione nel suddetto formato.