50 ways... ALSA MIDI programming with the Linux Shell

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Abstract

Abstract in English

The Advanced Linux Sound Architecture (ALSA) provides audio and MIDI functionality to the Linux operating system. Thanks to ALSA drivers we can use a lot of commercial soundcards. ALSA provides different light tools that we are going to use, and an API is available so programmers can build their own MIDI and audio applications.

In this video of the project 50 Ways to Play Una Plata d'Enciam, we show two different ways to play our preferred song, Una Plata d'Enciam, sending the MIDI messages directly to the audio interface using the command line shell, and using the native ALSA tools.

Resum

ALSA (Advanced Linux Sound Architecture) proporciona la funcionalitat MIDI a Linux. Gràcies als drivers d'ALSA podem utilitzar moltes de les targetes de so comercials. ALSA proporciona diferents eines que utilitzarem, i per als programadors hi ha una API per tal que puguin construir les seves aplicacions de MIDI i d'àudio.

En aquest vídeo del projecte 50 Ways to Play Una Plata d'Enciam, ensenyarem dues maneres diferents de tocar la nostra cançó preferida, Una Plata d'Enciam, enviant missatges MIDI directament a la interfície d'àudio utilitzant la línia de comandes, i utilitzant les utilitats d'ALSA natives.

Desenvolupament

amb aquesta informació he de fer en el video els dos exemples:

Video

p1. portada
p2. intro
p3. titol amidi
p4. playing from CLI: amidi
p5. títol echo
p6. playing from CLI: echo
p7. comiat
p8. contraportada

Transcripció català

[p2]

En aquest projecte, 50 Ways to Play Una Plata d'Enciam, volem tocar aquesta cançó de moltes maneres, i com que és un projecte de música electrònica, utilitzarem en la majoria dels projectes (no en tots) l'ordinador. La nostra opció és utilitzar Linux i software lliure. En el món Linux, parlar de so és parlar d'ALSA.

ALSA és l'acrònim de Advanced Linux Sound Architecture, és a dir, Arquitectura Avançada de So a Linux. Consisteix en un conjunt de controladors del kernel, una Interfície de Programació d'Aplicacions (API) anomenada libasound, i programes d'utilitats per suportar el so sota Linux (http://www.linuxjournal.com/article/6735?page=0,0)

ALSA és una bona elecció si el que es vol és treballar amb audio a baix nivell, molt a la vora de la capa de hardware, i així obtenir el màxim control i rendiment, o bé si es busca característiques especials no suportades per altres APIs.

Des del kernel de Linux 2.6 ALSA forma part del kernel estable de Linux, i és la tecnologia correcta per treballar amb audio i midi, en detriment de la tecnologia anterior que es deia OSS.

En aquest video del projecte 50 Ways to Play Una Plata d'Enciam, ensenyem dues maneres diferents de tocar la nostra cançó preferida, Una Plata d'Enciam, enviant missatges MIDI directament a la interfície d'àudio utilitzant la línia de comandes de Linux, i utilitzant les eines natives d'ALSA.

[p4]

Vull enviar missatges MIDI directament al port MIDI mitjançant scripts en línia de comandes. Utilitzaré l'aplicatiu d'alsa amidi (man amidi).

Com que en aquest exemple per produir el so utilitzarem fluidsynth, que és un sintetitzador software, necessito crear uns ports MIDI virtuals.

sudo modprobe snd-virmidi
sudo modprobe snd-virmidi snd_index=1
aconnect -o
cat /proc/asound/cards 
cat /proc/asound/devices 
ls -la /dev/snd/midiC1D0

Per exemple, si vull tocar el Do central durant 2 segons faré:

# play middle C for 2 seconds
# on channel 1 then turn it off
amidi -p hw:1,0 -S "90 3C 7F"
sleep 2
amidi -p hw:1,0 -S "90 3C 00"

i explico quin és el format del missatge MIDI: 90 és el valor hexadecimal que es correspon a NoteON, 3C amb hexadecimal és 60, que és el Do central, i 7F correspon a un volum de 100, i per apagar la nota envio un NOTE ON amb volum 0.

Per tant, per tocar Una Plata d'Enciam des de línia de comandes utilitzant la utilitat amidi, executarem el següent script, on veiem codificades totes les notes de la canço.

Per produir el so, en aquest exemple utilitzo fluidsynth com a sintetitzador software. Ara faig totes les connexions per tal de redirigir les comandes del meu script a un so de piano, i aquí tenim el resultat.

[p6] Una altra possibilitat és utilitzar la comanda de Linux echo. Normalment amb echo escribim per pantalla, però també podem redirigir la sortida aun dispositiu, com ara un fitxer de text.

echo www.joanillo.org
echo $PATH

echo 50 Ways... > 50ways.txt
cat 50ways.txt

La idea és redirigir la sortida de echo directament a la targeta de so.

echo -ne '\x90\x46\x64' > /dev/snd/midiC1D0
sleep 2
echo -ne '\x80\x46\x64' > /dev/snd/midiC1D0

Posem tota la cançó en un script: script una_plata_denciam2.sh. En aquesta línia tenim codificades tres veus de la cançó. Veiem les notes, el volum de les notes, i la durada de les notes. El script és una mica críptic, però aquí podem veure el codi de NOTE ON i NOTE OFF.

Bé doncs, executem i Una Plata d'Enciam amb tres veus.

[p7] Comiat

En aquesta ocasió hem vist com amb Linux i ALSA podem treballar i programar a nivell de hardware. No és la manera habitual de fer les coses. Per als programadors existeixen llibreries i APIs; i per als usuaris normals existeixen les aplicacions finals amb interfícies gràfiques amigables, com per exemple els editors de partitures, editors d'efectes de so,...

Transcripció castellà

En este proyecto, 50 Ways to Play Una Plata d'Enciam, queremos tocar esta canción de muchas maneras, y como es un proyecto de música electrónica, utilizaremos en la mayoría de los proyectos (no en todos) el ordenador. Nuestra opción es utilizar Linux y software libre. En el mundo Linux, hablar de sonido es hablar de ALSA.

ALSA es el acrónimo de Advanced Linux Sound Architecture, es decir, Arquitectura Avanzada de Sonido en Linux. Consiste en un conjunto de controladores del kernel, una Interficie de Programación de Aplicaciones (API) llamada libasound, y programas de utilidades para soportar el sonido bajo Linux (http://www.linuxjournal.com/article/6735?page=0,0)

ALSA es una buena elección si lo que se quiere es trabajar con audio a bajo nivel, muy cerca de la capa de hardware, y así obtener el máximo control y rendimiento, o bien si se buscan características especiales no soportadas por otras APIs.

Desde el kernel de Linux 2.6 ALSA forma part del kernel estable de Linux, y es la tecnología correcta para trabajar con audio y MIDI, en detrimento de la tecnología anterior que se llamaba OSS.

En este video del proyecto 50 Ways to Play Una Plata d'Enciam, enseñamos dos maneras diferentes de tocar nuestra canción preferida, Una Plata d'Enciam, enviando mensajes MIDI directamente a la interfície de audio utilizando la línea de comandos de Linux, y utilizando las herramientas nativas de ALSA.

[p7] Despedida

En esta ocasión hemos visto que con Linux y ALSA podemos trabajar y programar a nivel de hardware. No es la manera habitual de hacer las cosas. Para los programadores existen librerías y APIs; y para los usuarios normales existen las aplicacions finales con interfícies gráficas amigables, como por ejemplo los editores de partituras, editores de efectos de sonido,...

Transcripció anglès

[p2] In this project, 50 Ways to Play Una Plata d'Enciam, we want to play this song in many ways, and because this one is a electronic music project, we are going to use the computer in most of the performances. Our option is to use Linux and Free Software. In the Linux world, to speak about sound is to speak about ALSA.

ALSA stands for the Advanced Linux Sound Architecture. It consists of a set of kernel drivers, an application programming interface library (API) called libasound, and utility programs for supporting sound under Linux. (http://www.linuxjournal.com/article/6735?page=0,0)

ALSA is a good choice if you are performing low-level audio functions for maximum control and performance, very close to the hardware layer, or if you want to make use of special features not supported by other sound APIs.

Since Linux 2.6 kernel, ALSA is part of the stable Linux kernel, and is the correct technology to perform with audio and MIDI, instead of OSS, the previous standard.

In this video of the project 50 Ways to Play Una Plata d'Enciam, we show two different ways to play our preferred song, Una Plata d'Enciam, sending the MIDI messages directly to the audio interface using the Linux command line shell, and using the native ALSA tools.

[p9] Comiat In this video we have seen how with Linux and ALSA we can work and programming in the hardware level. This is not the usual way to do things. For programmers it exist libraries and APIs; and for the normal users there are final applications with nice and friendly graphical interfaces, like score editors, Digital Audio Workstations, sound effect editors,...

Gravació: Barrejar veu i música amb qualitat

El problema que se'm planteja en aquest video és que he de mesclar la veu (micròfon) amb la música que surt de la targeta de so. Actuaré de manera diferent si la música surt pel fluidsynth (targeta interna) o pel sintetitzador hardware. He d'utilitzar arecord o recordmydesktop per grabar la sortida d'audio.

No puc fer playback i record amb la mateixa targeta de so (amb l'EDIROL ho hauria de poder fer, és duplex). Això no és problema perquè tinc dues targetes de so: la interna i l'externa.

música per la targeta interna: fluidsynth

la sortida de cascs de la targeta interna té el senyal del fluidsynth. Barrejo aquesta senyal amb el micròfon, i ho connecto a l'entrada LEFT del UA25-EX (necessito un connector JACK 2 a 1, 2 femelles a 1 mascle, mono i de diàmetre gros). Com que ho entro en el canal esquerra, per grabar faré:

$ arecord -r 44100 -f cd -t wav -D plug:record_left barreja.wav
o bé
$ recordmydesktop -channels 2 -freq 48000 -device plug:record_left -delay 3 -fps 25 --overwrite -o barreja.ogv

recordem que record_left està definit al fitxer .soundrc i és la manera en la Edirol UA-25EX de què la senyal mono que fiquem per l'esquerra estigui en els dos canals i de què no s'instrodueixi soroll per la dreta.

L'atra possibilitat és fer un cable 2x2 per barrejar les dues senyals (sortida cascs i micro) i que es fiqui el senyal pels dos canals de la UA-25EX. En aquest cas:

$ arecord -r 44100 -f cd -t wav -D plughw:1 barreja.wav
o bé
$ recordmydesktop -channels 2 -freq 48000 -device hw:1 -delay 3 -fps 25 --overwrite -o barreja.ogv

Per tal de què els dos senyals estiguin ben balancejats he de jugar amb el control SENSE de la Edirol, i amb alsamixer puc controlar el senyal de sortida pels cascs.

conclusió: la targeta interna produeix un pitido quan el senyal dels cascs el fico al'edirol!!! (Veure la solució més endavant: això és perquè tinc la configuració del JACK en mode duplex)

Ara que ja sé com es fa amb el fluidsynth per l'EDIROL, ara hauria de documentar com fer-ho d'aquesta manera.

música per la targeta externa UA-25EX: Roland JV-2080

El JV-2080 té una sortida d'audio (cascs). El micro està en el INPUT 1/L de la Edirol. El senyal de sortida el fico en l'entrada MIC de la targeta interna.

Aleshores, per grabar:

$ arecord -r 44100 -f cd -t wav -D plughw:0 barreja.wav
o bé
$ recordmydesktop -channels 2 -freq 48000 -device hw:0 -delay 3 -fps 25 --overwrite -o barreja.ogv

El problema és que també sento el pitido. (Veure la solució més endavant: això és perquè tinc la configuració del JACK en mode duplex). El recordmydesktop també funciona (amb pitido). Lo bo és que el micro (que estava ficat en el INPUT 1/L) té repartit el senyal pels dos canals.

El Volum del Direct Monitor afecta al volum dels Inputs, però no al senyal intern que ve de l'ordinador (fluidsynth). Per què funcioni ha d'estar encès el LED vermell, que s'activa amb el botó MON SW. Per tant, és una manera de balancejar el nivell entre el micro i el senyal de l'ordinador (a més del botó SENS del INPUT 1/L). El botó MONO no afecta res, ni tampoc el pitido.

Nota: ara vénen unes proves per solucionar el tema del pitido (veure la solució més endavant).

El pitido no té res a veure amb la distància del micròfon a l'ordinador. El INPUT 2/R, com que no el faig servir, he ficat el botó SENS a 0, però això tampoc afecta al pitido.

Més proves per solucionar el pitido:

Tot això em fa pensar que l'origen del pitido no té res a veure amb l'EDIROL, sinó que és problema de la targeta interna de l'ordinador. Ara bé, si connecto directament el micro a l'entrada mic de l'ordinador i grabo el micro, aleshores el pitido desapareix... Per tant, algo si que té a veure amb l'EDIROL.

$ recordmydesktop -channels 2 -freq 48000 -device hw:0 -delay 3 -fps 25 --overwrite -o barreja.ogv

Bé!! Ja tinc una pista. El pitido es sent quan el JACK està encès. Si el JACK està apagat, amb el micròfon connectat a INPUT 1/L i el PHONES de l'Edirol al mic de l'ordinador, grabo per la tarja interna i no se sent pitido. Però a mi això no em soluciona res, doncs necessito el fluidsynth.

La solució aproximada és:

Ja tinc la solució!. La configuració final per poder treballar amb el JACK-fluidsynth i grabar la veu al mateix temps és:

Aleshores:

$ arecord -r 44100 -f cd -t wav -D plug:record_left barreja.wav
o bé
$ recordmydesktop -channels 2 -freq 48000 -device plug:record_left -delay 3 -fps 25 --overwrite -o barreja.ogv

i per escoltar
$ aplay -D plughw:0 barreja.wav

En aquest cas escolto per la tarja interna. Si vull escoltar per la tarja externa em diu que el recurs està ocupat (hauria d'apagar el JACK)

La idea és que no treballem en la configuració del JACK diem que NO treballem en mode Duplex. El JACK només s'encarrega de la reproducció, i des de la consola podrem fer la gravació amb arecord o amb recordmydesktop

Balanceig veu-fluidsynth. Per tal de què quedi ben compensat el que grabo per la veu i el que escolto pel fluidsynth, la posició dels knobs en la Edirol queda de la següent manera:

solucció alternativa: recordmydesktop -use-jack

Referit als videos gravats per Leigh Dier sobre el funcionament de diferets sintes de software, en els videos es veu com barreja amb qualitat la veu i el so del sinte. Algú pregunta com ho ha fet, i la resposta és utilitzant recordmydesktop amb mode jack, i utilitzant el Ardour com a mesclador.

Did you use recordMyDesktop??
---
Hi guys,

Yep, it was recordMyDesktop, using the JACK option for capturing the
audio. I used Ardour as a mixer -- I set up recordMyDesktop capturing
Ardour's master out, and then ran both my microphone and the synth
output in to tracks within Ardour.

Thanks
Leigh
At the command line, if I type in ]$ recordmydesktop -use-jack (port #) 
> I should be able to run the app through Jack.  So, where do I set the 
> port # for Jack?
> Tom

If you have installed jack-audio-connection-kit-example-clients then you
should be able to use the command line "jack_lsp" to list the names of
all available ports at the point you run the command. 

Anem a fer-ho:

$ jack_lsp
system:capture_1
system:capture_2
system:playback_1
system:playback_2
alsa_pcm:Midi-Through/midi_capture_1
alsa_pcm:Midi-Through/midi_playback_1
alsa_pcm:TiMidity/midi_playback_1
alsa_pcm:TiMidity/midi_playback_2
alsa_pcm:TiMidity/midi_playback_3
alsa_pcm:TiMidity/midi_playback_4
alsa_pcm:ardour/midi_capture_1
alsa_pcm:ardour/midi_playback_1
alsa_pcm:ardour/midi_capture_2
alsa_pcm:ardour/midi_playback_2
alsa_pcm:ardour/midi_capture_3
alsa_pcm:ardour/midi_playback_3
ardour:click/out 1
ardour:master/in 1
ardour:master/in 2
ardour:master/out 1
ardour:master/out 2
ardour:auditioner/out 1
ardour:auditioner/out 2

que és la informació que també puc veure en el QJackctl. Fixem-nos que port no fa referència a un número. Per utilitzar aquest port amb el recordMyDesktop:

$ recordmydesktop -channels 2 -freq 48000 -use-jack 'ardour:master/out 1' -delay 3 -fps 25 --overwrite -o p6a.ogv

i ara el recordmydesktop ja apareix en la pestanya AUDIO del QJackCtl, enllaçat amb el MasterOut de l'Ardour. Ara la única cosa que em faltaria és la sortida de la meva targeta de so ficar-la amb una pista d'entrada en el Ardour. Ara bé, utilitzant la Edirol UA-25EX no té cap benefici respecte l'anterior, doncs només té una sortida (i en aquesta sortida ja ve mesclat el micro amb el sinte). El mètode que s'exposa només té sentit si disposo d'una targeta de so amb vàries entrades i sortides, i aleshores una sortida és el micro, i una altra sortida és el sinte. Aleshores puc associar dues pistes en el Ardour, i fer servir el Ardour com a mixer. Finalment, el master out de l'ardour connectat al recordmydesktop, i ja gravo la mescla.

Notes tècniques

Enllaços


creat per Joan Quintana Compte,

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines