Aclaratori MidiShare: tocar i fer sonar música. Solucions software i hardware

De wikijoan
Salta a la navegació Salta a la cerca

Objectiu

Important llegir l'article de l'Aclaratori_Alsa_i_Jack:_fer_sonar_el_vkeybd_amb_fluidsynth_i_la_targeta_de_so_interna

Tenim com a objectiu escriure un article de referència per a fer sonar i tocar música utilitzant la llibreria MidiShare.

Per a fer sonar música tenim:

  • solucions software (fluidsynt, ja sigui utilitzant JACK o ALSA, ja sigui fent sonar la tarja de so del portàtil o la tarja externa-EDIROL UA25-EX)
  • solucions hardware: utilitzar un sintetitzador hardware (CASIO CTK-731), connectat a través de l'EDIROL.

Per a tocar música tenim:

  • solucions software: el controlador Virtual MIDI Keyboard que genera events MIDI
  • solucions hardware: tocar un controlador MIDI com el Casio CTK-731 o el controlador de vent Yamaha WX-5.

Tot això ho faré en dos àmbits. Utilitzant les aplicacions nadiues que em proporciona MidiShare (connect, display), o bé programant amb Java.

Coses en què m'hauré de fixar i documentar són la latència i els XRuns que es generen, i en definitiva mirar quines combinacions són més operatives.

Esquema

Per qualsevol d'aquests dos àmbits que s'estudien (I. Aplicacions nadiues MidiShare; II. Programant amb Java) les combinacions a testejar segueixen aquest esquema:

                                                         Fer Sonar
                                   Software                  |           Hardware
----------------------------------------------------------------------------------------------------------
      | Software   |   vkeybd/mscontrol & fluidsynth         | vkeybd/mscontrol & EDIROL-CASIO CTK-731
Tocar |---------------------------------------------------------------------------------------------------
      | Hardware   |   EDIROL-CASIO CTK-731 & fluidsynth     | EDIROL-CASIO CTK-731 & EDIROL-CASIO CTK-731
      |            |   EDIROL-Yamaha WX5 & fluidsynth        | EDIROL-Yamaha WX5 & EDIROL-CASIO CTK-731

Aplicacions Nadiues MidiShare

Les aplicacions nadiues que tenim instal.lades a /usr/src/midishare/src/linux/applications són:

  • msconnect: aplicació gràfica per connectar clients MidiShare
  • msdisplay: puc visualitzar els events MIDI
  • mscontrol: pue enviar events MIDI: Note On, Program Change, Velocity, canviar el canal.

Engego aquestes aplicacions:

/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
jobs

Tocar software, fer sonar software

Quan dic fer sonar software vull dir utilitzar el fluidsynth, que evidentment s'ha de redirigir a una targeta d'audio física. Com a targeta d'audio tinc dues opcions: la tarja de so interna del portàtil (ICH6) o la targeta de l'EDIROL UA25-EX. Engego el Virtual Midi Keyboard:

vkeybd &

Puc tocar notes MIDI amb el mscontrol i amb el vkeybd. Ara bé, com puc sentir res? Necessito una solució de síntesi d'audio com el fluidsynth. Com s'ha estudiat en un article previ, puc utilitzar el driver d'audio jack o alsa.

targeta de so interna del portàtil

Recordem que amb l'opció -l faig que no s'engegui el servidor JACK. Primer de tot executo el Jack Control per tenir total control del que estic fent. Vaig a setup i escullo la interfícide defauls (hw:0, ICH6, que és la targeta de so interna del portàtil). Escullo frames/period 128, i la latència està a 5.8msec. Engego el JACK, i un cop arrencat, ja puc engegar el fluidsynth.

$ fluidsynth -m midishare -a jack -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Ara observo com amb el msconnect ja se'm llista el fluidsynth. Ara he de fer les connexions oportunes. Com que he utilitzat el driver d'audio del jack (-a jack), en l'apartat Connections del JackControl (QJackCTL), pestanya Audio, puc connectar el fluidsynth amb el system (targeta de so), i ja sona. Per tal que soni, moc per exemple el slide pitch en el mscontrol.

El Virtual Keyboard, però, no és una aplicació midishare. Com ho faig doncs per fer sonar el vkeybd? Doncs necessito el msAlsaSeq, que és el driver de MidiShare per a ALSA, i d'aquesta manera ja tinc un pont entre MidiShare i ALSA.

$ man msAlsaSeq
msAlsaSeq   creates  an  ALSA  sequencer  client  and  a  corresponding
       MidiShare client, both named client-name  ("MidiShare/ALSA  Bridge"  by
       default)  and establishes connections to other ALSA clients as given by
       the -i and -o options. MIDI input received by the ALSA  client  becomes
       the  input  of the MidiShare client, and output of the MidiShare client
       is sent to the output side of the  ALSA  client.  This  allows  you  to
       access ALSA devices and other ALSA clients from MidiShare applications,
       simply by connecting your MidiShare application  to  the  input/and  or
       output of the msAlsaSeq MidiShare client.
...

$ msAlsaSeq

El MidiShare/ALSA Bridge m'apareix tant en el msconnect (és un client midishare), com amb el aconnect (és un client ALSA), com amb la pestanya ALSA del JackControl (QJackCTL). Per tant, amb el aconnect (aconnectgui) o amb el JackControl connectaré el Virtual Keyboard amb el amb el MidiShare/ALSA Bridge, i amb el msconnect connecto el MidiShare/ALSA Bridge amb el fluidsynth, i aleshores quan toco amb el vkeybd ja sona.

Funciona. Tot això passa a través del JACK amb una latència de 5.8 msec.

$ aconnect -i -o -l

client 129: 'Virtual Keyboard' [type=user]
    0 'Virtual Keyboard'
	Connecting To: 131:0
client 131: 'MidiShare/ALSA Bridge' [type=user]
    0 'MidiShare/ALSA Bridge'
	Connected From: 129:0

Ara faré el mateix però amb el driver d'audio d'alsa. És a dir, no vull que el JACK intervingui per a res.

$ fluidsynth -m midishare -a alsa -l  /home/joan/soundfonts/AI-APiano02trans.sf2

L'opció -l continua sent necessària perquè si no intenta engegar el dimoni jackd.

Igual que abans, amb msconnect connecto el mscontrol amb el fluidsynth, i això ja funciona.

Per connectar el vkeybd ara m'oblido totalment del JACK. Engego el msAlsaSeq i ja tinc el client MidiShare/ALSA Bridge. Amb el msconnect connecto el MidiShare/ALSA Bridge amb el fluidsynth, i amb el aconnect (o millor aconnectgui) connecto el vkeybd amb el MidiShare/ALSA Bridge. I ja sona.

Aquesta és una solució totalment ALSA (amb el dimoni JACK apagat). És millor o pitjor? Segons l'article que compara ALSA vs JACK (no és exactament el mateix, JACK treballa sobre ALSA), es comenten les meravelles del JACK, i diuen que per afegir la capa del JACK no introdueix cap mena de retard, senzillament una mica més de consum de microprocessador. El cert és que treballant amb el JACK puc controlar fàcilment la latència i jugar amb altres paràmetres.

targeta de so externa: Edirol UA-25 EX

Tocar software sonar software edirol.png

Recordem que amb l'opció -l faig que no s'engegui el servidor JACK. Primer de tot executo el Jack Control per tenir total control del que estic fent. Vaig a setup i escullo la interfícide defauls (hw:1, UA-25EXl). Escullo frames/period 128, i la latència està a 5.8 msec. Engego el JACK, i un cop arrencat, ja puc engegar el fluidsynth.

$ fluidsynth -m midishare -a jack -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Ara observo com amb el msconnect ja se'm llista el fluidsynth. Ara he de fer les connexions oportunes. Com que he utilitzat el driver d'audio del jack (-a jack), en l'apartat Connections del JackControl (QJackCTL), pestanya Audio, puc connectar el fluidsynth amb el system (targeta de so, ja sigui interna o externa), i ja sona. Per tal que soni, moc per exemple el slide pitch en el mscontrol. (he de connectar el mscontrol amb el fluidsynth).

Ara he de connectar el Virtual Keyboard.

$ msAlsaSeq

MidiShare ALSA driver anchored on "MidiShare/ALSA Bridge" is running.
Type 'q' to quit.

El MidiShare/ALSA Bridge m'apareix tant en el msconnect (és un client midishare), com amb el aconnect (és un client ALSA), com amb la pestanya ALSA del JackControl (QJackCTL). Per tant, amb el aconnect (aconnectgui) o amb el JackControl connectaré el Virtual Keyboard amb el amb el MidiShare/ALSA Bridge, i amb el msconnect connecto el MidiShare/ALSA Bridge amb el fluidsynth, i aleshores quan toco amb el vkeybd ja sona.

Funciona. Tot això passa a través del JACK amb una latència de 5.8 msec.

$ aconnect -i -o -l

client 129: 'Virtual Keyboard' [type=user]
    0 'Virtual Keyboard'
	Connecting To: 131:0
client 131: 'MidiShare/ALSA Bridge' [type=user]
    0 'MidiShare/ALSA Bridge'
	Connected From: 129:0

Ara faré el mateix però amb el driver d'audio d'alsa. És a dir, no vull que el JACK intervingui per a res. (no ha funcionat, de moment)

El problema està en com dir-li al fluidsynth que la interfície és la hw:1. La solució és:

$ fluidsynth -o help
audio.alsa.device        STR   [def='default']

$ fluidsynth -m midishare -a alsa -o audio.alsa.device='hw:1' -l  /home/joan/soundfonts/AI-APiano02trans.sf2

però dóna un error:

fluidsynth: error: Failed to find a workable audio format

També faig les proves amb el QSynth. En la pestanya Audio, on posa audio device he de posar hw:1

M'he registrat a la llista de fluidsynth: fluid-dev (fluid-dev@nongnu.org) (joan_quintana@yahoo.com/jq****), i envio un mail.

I'm new to fluid-dev.

I use Ubuntu Studio (9.04, Jaunty), and I have an external sound card: Edirol UA-25EX (hw:1) and of course my laptop internal soundcard (hw:0) 

I can start fluidsynth with jack audio driver, no matters if I configure jack with my internal device (hw:0) or my external device (hw:1):

$ fluidsynth -m alsa_seq -a jack  -l  soundfont.sf2

I can start fluidsynth with alsa audio driver, connecting to my internal device (hw:0):

$ fluidsynth -m alsa_seq -a alsa -o audio.alsa.device='hw:0' -l  soundfont.sf2

But I can't start fluidsynth with alsa audio driver, connecting to my external device (hw:1):

$ fluidsynth -m alsa_seq -a alsa -o audio.alsa.device='hw:1' -l  soundfont.sf2

and the reason is:
fluidsynth: error: Failed to find a workable audio format

trying with QSynth I can choose two sample formats: 16bits and float

From fluidsynth -o help I think that the parameter to configure is:
audio.sample-format      STR   [def='16bits']

Any ideas?

I want to test all my hardware and code with JACK and without JACK, directly to ALSA. Really JACK is a nice thing, but I ask if there are benefits to use ALSA directly, avoiding the JACK layer.

Thanks in advance, Joan Quintana

La resposta és:

Do you know what sample rates the UA-25EX support? Perhaps you have to
set the sample rate explicitly in fluidsynth to that sample rate (e g -o
synth.sample-rate=48000). You could also try 'plughw:1' instead, which
will make ALSA convert the rate (and format) automatically (at the cost
of some additional CPU consumption).

// David
(David Henningsson" <launchpad.web@epost.diwic.se>)

I efectivament!, la solució és:

$ fluidsynth -m midishare -a alsa -o audio.alsa.device='plughw:1' -l  /home/joan/soundfonts/AI-APiano02trans.sf2

L'opció -l continua sent necessària perquè si no intenta engegar el dimoni jackd.

Igual que abans, amb msconnect connecto el mscontrol amb el fluidsynth, i això ja funciona.

Per connectar el vkeybd ara m'oblido totalment del JACK. Engego el msAlsaSeq i ja tinc el client MidiShare/ALSA Bridge. Amb el msconnect connecto el MidiShare/ALSA Bridge amb el fluidsynth, i amb el aconnect (o millor aconnectgui) connecto el vkeybd amb el MidiShare/ALSA Bridge. I ja sona.

Una altra possibilitat és fer:

joan@UStudio:~$ aconnect -i -o
...
client 129: 'Virtual Keyboard' [type=user]
    0 'Virtual Keyboard'

$ msAlsaSeq "MidiShare-ALSA" -i 129:0
Connecting input "Virtual Keyboard" (129:0).
MidiShare ALSA driver anchored on "MidiShare-ALSA" is running.
Type 'q' to quit.
q

o millor dóna un nom més intel.ligible:
$ msAlsaSeq "virtual_keyboard" -i 129:0

D'aquesta manera, en el moment de crear els clients ALSA i MidiShare, li estic donant el nom que jo vull (MidiShare-ALSA), i ja estic fent una connexió amb el client ALSA (puc comprovar que s'ha establert la connexió amb aconnectgui).

       -i client:port[/msport]
              Establishes  an input connection with the given ALSA client and port. The client can be given either by its numeric id or a pattern for the client name. The MidiShare port number msport is optional. If present, it indicates that input is mapped to the given MidiShare  port  when an event is delivered to the MidiShare application.

       -o client:port[/msport]
              Establishes  an  output  connection for the given ALSA client and port. If the MidiShare port number msport is given, only MidiShare events directed to that port will be output on this connection

Intento utilitzar la comanda opcional [/msport] per tal d'establir directament la connexió del "MidiShare-ALSA" amb el fluidsynth, però no me n'en surto. (crec que aquesta no és la idea d'utilitzar [/msport]).

Tornant al tema del fluidsynt, rebo altres mails:

> UA-25EX in "advanced mode" uses 24 bits samples. This sample format  is not yet
> supportted by fluidsynth. You can switch off the "advanced mode" to use 16
> bits samples.
> Regards, Pedro (pedro.lopez.cabanillas@gmail.com)

Using ALSA device plughw:1 should do the trick as was already mentioned, which will do the necessary sample format conversion, in which case FluidSynth should be left at its default of 16bits for audio.sample-format.

Best regards,
Josh Green

Per tant, és normal obtenir l'error Failed to find a workable audio format, doncs en mode avançat la UA-25EX utilitza format de 24 bits, no suportat per fluidsynth. Puc fer la prova de ficar Mode Avançat=Off (no vàlid si vull fer MIDI), i veure que suporta el format de 16 bits.

Tocar software, fer sonar hardware

Tocar software sonar hardware.png

Fer sonar el vkeybd i que soni pel Casio CTK-731 és senzill, però aquest article és de midishare, és a dir que jo vull que el flux d'aquests events midi passin per MidiShare.

Engego msconnect, msdisplay i mscontrol. Engego el vkeybd. Connecto el Edirol a l'ordinador, i el CASIO al MIDI OUT de l'Edirol. Engego el driver msAlsaSeq:

/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
vkeybd &
msAlsaSeq

Si amb el aconnect (aconnectgui) connecto dirextament el Virtual Keyboard al UA-25EX MIDI 1, puc veure com sona el CASIO (configurat com a INTERNAL, EXTERNAL o EXTERNAL SOLO, però no EXTERNAL PLAY). Però això no és el que vull, ho vull fer a través de MidiShare.

Amb el aconnect connecto el MidiShare/ALSA Bridge (sortida) al Edirol (entrada), i el vkeybd (sortida) al MidiShare/ALSA Bridge (entrada). Fixem-nos que la connexió la faig a través del MidiShare/ALSA Bridge. És a dir, el MidiShare fa de pont. De moment no sona.

Què falta per fer? Per acabar d'unir el camí que va del vkeybd al CASIO, he de connectar el MidiShare/ALSA Bridge amb el MidiShare/ALSA Bridge. Però compte! això no ho he de fer en el aconnectgui, sinó en el msconnect. I ara ja funciona!

Tocar hardware, fer sonar software

Si vinc de l'apartat anterior, no oblidar-nos de què les connexions MIDI han canviat. El CASIO (MIDI OUT) el connecto al EDIROL (MIDI IN).

targeta de so interna del portàtil

Tocar hardware sonar software.png

Primer de tot executo el Jack Control per tenir total control del que estic fent. Vaig a setup i escullo la interfícide defauls (hw:0, ICH6, que és la targeta de so interna del portàtil). Escullo frames/period 128, i la latència està a 5.8msec. Engego el JACK, i un cop arrencat, ja puc engegar el fluidsynth.

$ /usr/src/midishare/src/linux/applications/msconnect/msconnect &
$ fluidsynth -m midishare -a jack -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Ara observo com amb el msconnect ja se'm llista el fluidsynth. També he de fer el pont entre ALSA i MidiShare:

$ msAlsaSeq

Ara he de fer les connexions oportunes.

  • Com que he utilitzat el driver d'audio del jack (-a jack), en l'apartat Connections del JackControl (QJackCTL), pestanya Audio, he de connectar el fluidsynth amb el system (targeta de so).
  • En la pestanya ALSA, he de connectar el UA-25EX amb el MidiShare/ALSA Bridge (o bé en el aconnect, aconnectgui)
  • i finalment en el msconnect, he de connectar el MidiShare/ALSA Bridge amb el fluidsynth.

Per tant, la cadena des que toco una tecla del CASIO fins que sóna per l'altaveu del portàtil és: CASIO - UA-25EX - MidiShare/ALSA Brige - fluidsynth - targeta de so interna (system). Aclarim on s'estableixen les connexions:

  • CASIO - UA-25EX: és una connexió física
  • UA-25EX - MidiShare/ALSA Brige: és una connexió ALSA (feta en la pestanya ALSA del JACK o directament amb aconnect o aconnectgui)
  • MidiShare/ALSA Brige - fluidsynth: connexió MidiShare, amb el msconnect
  • fluidsynth - targeta de so interna. Pestanya audio del JACK.

Latència: tinc una latència de 5.8 ms, efectivament està molt bé. Quan toco el CASIO, immediatament el fluidsynth respon fent sonar la nota tocada. Vaig a ficar una latència alta. Configuro el JACK amb frames/period=1024, que em dóna una latència de 46.4 ms, i torno a establir les connexions. Fins i tot 46.4 ms podria ser acceptable. Ara faig frames/period=2048 i periods/buffer=4, que em dóna 186 ms. Ara sí que la latència és inacceptable.


Ara faré el mateix però amb el driver d'audio d'alsa. És a dir, no vull que el JACK intervingui per a res.

$ fluidsynth -m midishare -a alsa -l  /home/joan/soundfonts/AI-APiano02trans.sf2
$ msAlsaSeq

Estableixo les connexions:

  • CASIO - UA-25EX: és una connexió física
  • UA-25EX - MidiShare/ALSA Brige: és una connexió ALSA (feta en la pestanya ALSA del JACK o directament amb aconnect o aconnectgui)
  • MidiShare/ALSA Brige - fluidsynth: connexió MidiShare, amb el msconnect

I ara ja sona. Com que per al fluidsynth he fet servir el driver d'audio alsa, no cal associar el fluidsynth amb la targeta de so (com feia amb el JACK). La latència que tindré és segons els paràmetres amb què s'hagi creat el driver d'ALSA. (observo que la latència no és molt bona)

> settings
...
synth.sample-rate        44100.000
audio.periods            16
audio.period-size        64
...

D'aquí puc calcular la latència que tinc:

64 * 16 / 44100 = 23.2 ms

Anem a disminuir aquesta latència a 128*2/441100 = 5.8 ms:

$ fluidsynth -m midishare -a alsa -o audio.alsa.device='hw:0' -o synth.sample-rate=44100.000 -o audio.periods=2 -o audio.period-size=128 -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Efectivament, es nota la diferència. Així doncs, compte amb els valors per defecte. També puc reduir a 2.9 ms ficant el frames/period=64.

Una altra possibilitat és utilitzar les opcions:

  • -c, --audio-bufcount=[count] Number of audio buffers (es correspon a audio.periods)
  • -z, --audio-bufsize=[size] Size of each audio buffer (es correspon a audio.period-size)
  • -r, --sample-rate Set the sample rate (es correspon a synth.sample-rate)

queda més senzill i és més aclaridor

fluidsynth -a alsa -m midishare -c 2 -z 1024 -r 48000 -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Per controlar la latència hi ha diversos factors, però els més importants són el buffer size i el sample rate. De fet:

latència = buffer size / sample rate

El buffer size es calcula multiplicant el número d'audio buffers (-c) per la mida de cada audio buffer (z)

Per exemple, -c 3 -z 1024 es correspon a un buffer de 3072 frames. Si en un segon hi caben 48000 frames (-r 48000) ens dóna una latència de 64 ms

The real buffer size is the product of the two option values. Keep it as low
as possible to reduce the latency. Too much low values would produce noise 
and distorted sound. The minimum value for -c is 2, but many (Intel HDA)
cards need a minimum of 3 periods or more.

targeta de so externa: Edirol UA-25 EX

Primer de tot executo el Jack Control (configurat a hw:1, la UA-25EX) per tenir total control del que estic fent (latència de 5.8 ms). Engego el JACK, i un cop arrencat, ja puc engegar el fluidsynth.

$ /usr/src/midishare/src/linux/applications/msconnect/msconnect &
$ fluidsynth -m midishare -a jack -l  /home/joan/soundfonts/AI-APiano02trans.sf2

Ara observo com amb el msconnect ja se'm llista el fluidsynth. També he de fer el pont entre ALSA i MidiShare:

$ msAlsaSeq

Ara he de fer les connexions oportunes.

  • Com que he utilitzat el driver d'audio del jack (-a jack), en l'apartat Connections del JackControl (QJackCTL), pestanya Audio, he de connectar el fluidsynth amb el system (targeta de so).
  • En la pestanya ALSA, he de connectar el UA-25EX amb el MidiShare/ALSA Bridge (o bé en el aconnect, aconnectgui)
  • i finalment en el msconnect, he de connectar el MidiShare/ALSA Bridge amb el fluidsynth.

Per tant, la cadena des que toco una tecla del CASIO fins que sóna per l'altaveu del portàtil és: CASIO - UA-25EX - MidiShare/ALSA Brige - fluidsynth - targeta de so interna (system). Aclarim on s'estableixen les connexions:

  • CASIO - UA-25EX: és una connexió física
  • UA-25EX - MidiShare/ALSA Brige: és una connexió ALSA (feta en la pestanya ALSA del JACK o directament amb aconnect o aconnectgui)
  • MidiShare/ALSA Brige - fluidsynth: connexió MidiShare, amb el msconnect
  • fluidsynth - targeta de so interna. Pestanya audio del JACK.

i sona sense problemes (compte amb el volum...)


Ara faré el mateix però amb el driver d'audio d'alsa. És a dir, no vull que el JACK intervingui per a res. Engego fluidsynth amb el meu coneixement acumulat de connectar el fluidsynth creant un driver d'ALSA que apunti a la UA-25EX amb baixa latència:

$ fluidsynth -m midishare -a alsa -o audio.alsa.device='plughw:1' -o synth.sample-rate=44100.000 -o audio.periods=2 -o audio.period-size=128 -l  /home/joan/soundfonts/AI-APiano02trans.sf2
$ msAlsaSeq

Estableixo les connexions:

  • CASIO - UA-25EX: és una connexió física
  • UA-25EX - MidiShare/ALSA Brige: és una connexió ALSA (feta en la pestanya ALSA del JACK o directament amb aconnect o aconnectgui)
  • MidiShare/ALSA Brige - fluidsynth: connexió MidiShare, amb el msconnect

I ara ja sona. Funciona a la perfecció. Sembla ser que tinc una latència de 23.2 ms que no em molesta. Com la puc rebaixar? No m'ha fet cas les opcions que li he passat en línia de comandes.

Tocar hardware, fer sonar hardware

Tocar hardware sonar hardware.png

Faré servir el Yamaha WX5 com a controlador MIDI, i el CASIO WX-5 com a mòdul de so. Els connecto tots dos al EDIROL.

Amb tota l'experiència acumulada no em presenta grans dificultats fer sona el WX5 pel CASIO. El camí és:

  • Yamaha WX5-EDIROL MIDI IN: connexió física
  • EDIROL MIDI OUT - MidiShare/ALSA Bridge: connexió ALSA, feta amb aconnect, aconnectgui, o bé msAlsSeg -i 20:0
  • MidiShare/ALSA Bridge - MidiShare/ALSA Bridge: connexió midishare feta amb msconnect
  • MidiShare/ALSA Bridge - EDIROL MIDI IN: connexió ALSA, feta amb aconnect, aconnectgui, o bé msAlsSeg -o 20:0
  • EDIROL MIDI IN - CASIO: connexió física.

Per tant, per establir directament les connexions del bridge amb la UA-25EX puc fer:

$ aconnect -i -o
$ msAlsaSeq "bridge" -i 20:0 -o 20:0
$ aconnect -i -o -l (es comprova també amb aconnectgui)

Programant MidiShare amb Java

Ja que en l'apartat anterior hem utilitzat msconnect per fer les connexions dels clients midishare, aquestes connexions les podem fer en un aplicatiu Java, i de pas demostrar en aquest aplicatiu que podem utilitzar el codi Java per capturar els events MIDI i afegir lògica programada. Concretament, mostrarem informació per la consola, filtrarem la nota C4 (Middle C, 60) en els events MIDI d'entrada (la nota 60 no sonarà); farem sonar per les altres notes la seva octava; i les notes 60-72 faran canvis de programa, que tindran més o menys efecte en funció del soundfont que esculli.

Tot el codi Java està documentat en el Proj4: Projecte_Proj4

Tocar software, fer sonar software: proj4, v1

targeta de so interna del portàtil

Utilitzaré el vkeybd (aplicació ALSA) i el msconnect (aplicació MidiShare) per generar events MIDI, i el fluidsynth per produir so. És important el soundfont que escullo per al fluidsynth, doncs em limita el so que puc tocar. Si escullo un soundfont de piano, només tindré veus de piano. Buscar un soundfont que tingui diferents instruments per a cada canal, i així puc jugar amb els canals per a produir so. Amb el soundfont hi ha una cosa que no tinc clara: l'event change program no produeix cap canvi d'instrument.

Com a novetat, utilitzaré un scripit per automatitzar al màxim la preparació del sistema: obrir les aplicacions, establir les connexions,... i finalment executar l'aplicació java quan ja tingui la versió definitiva. En aquest script hauré de tenir que els id de les aplicacions poden canviar. Per tant, hauré de fer referència al nom més que al id.

Script proj4_v1.sh:

#!/bin/bash
/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
/usr/bin/vkeybd &
sleep 2
xterm -e 'bash -c "/usr/local/bin/fluidsynth -a alsa -m midishare -o audio.alsa.device='hw:0' -c 2 -z 128 -r 44100 -l  /home/joan/soundfonts/collections/Casio_VL_1.SF2"' &
sleep 2
xterm -e '/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "Virtual Keyboard":0' &
sleep 2
java -classpath /usr/src/midishare/lang/java/native:/home/joan/workspace/Proj4/bin v1.Proj4

Aquesta és la manera correcta d'executar l'aplicatiu de forma ràpida, i aquest és el mètode general que seguiré. En fase de desenvolupament tindré en el script menys la última línia. Amb el Eclipse compilaré i executaré l'aplicació. Recordem que el programa Java s'encarrega de connectar l'aplicatiu Proj4 amb els altres aplicatius clients.

Utilitzaré processos en segon pla. Per matar els processos en segon pla, puc utilitzar kill passant com a argument el número de la tasca:

$ jobs
[3]   Running                 vkeybd &
[7]+  Stopped                 msAlsaSeq "ALSA_MS_bridge" -i "Virtual Keyboard":0

$ kill %7
[7]+  Terminado               msAlsaSeq "ALSA_MS_bridge" -i "Virtual Keyboard":0

Les connexions midishare les establiré a nivell de codi, i així de fet no em caldrà msconnect. A nivell de codi he de connectar:

  • mscontrol amb msdisplay (opcional)
  • mscontrol amb fluidsynth (opcional)
  • ALSA_MS_bridge amb fluidsynth.

Per tal de no dependre del JACK i de cap interfície gràfica, arrecnaré el fluidsynth amb el driver d'audio d'alsa (-a alsa), controlant els valors adequats per tenir una latència baixa (tal com s'explica en els articles sobre fluidsynth).

Com que fluidsynth l'he arrencat amb l'opció -m midishare, és una aplicació midishare, no pas una aplicació ALSA (tot i que també hagués pogut fer -m alsa_seq).

Si tinc problemes i em diu quan arrenco el fluidsynth que el recurs hw:0 ja està sent utilitzat, puc probar:

  • sudo /etc/init.d/alsa-utils restart
  • sudo /sbin/alsa force-reload
  • arrencar el fluidsynth amb sudo

de totes maneres, no està clar quan passa això, ho hauré de documentar millor.

NOTA (2/2/2010). Fins ara, quan he programat amb Midishare (JAVA o C) he utilitzat el fluidsynth amb el driver midi de midishare (-m midishare). Però això no té perquè ser així, puc utilitzar el driver d'alsa (-m alsa_seq).

1) engego el JACK
2) $ fluidsynth -j -m alsa_seq -a jack  /home/joan/soundfonts/Theremin.sf2
(recordem que l'opció j el que fa és connectar directament el fluidsynth a system, la sortida física)
3) $ /usr/local/bin/msAlsaSeq "ALSA_MS_bridge" (sense cap opció). ALSA_MS_bridge apareix tant al msconnect com al servidor JACK. És efectivament un pont
5) en el JACK connecto ALSA_MS_bridge al fluidsynth (pestanya ALSA). 

Per tant, ja tinc feta tota la ruta. Tot i que és interessant, no és obligat tenir el fluidsynth compilat amb l'opció -m midishare. A més, això m'obre les portes a utilitzar altres sintetitzadors, com el ZynAddSubFX.

targeta de so externa: Edirol UA-25 EX

Script proj4_v1_UA25EX.sh:

#!/bin/bash
/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
/usr/bin/vkeybd &
sleep 2
xterm -e 'bash -c "/usr/local/bin/fluidsynth -a alsa -m midishare -o audio.alsa.device='plughw:1' -c 2 -z 128 -r 44100 -l  /home/joan/soundfonts/collections/Casio_VL_1.SF2"' &
sleep 2
xterm -e '/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "Virtual Keyboard":0' &
sleep 2
java -classpath /usr/src/midishare/lang/java/native:/home/joan/workspace/Proj4/bin v1.Proj4

Tant amb la targeta interna com amb l'externa he tingut problemes de latència, degut a què no utilitzava el kernel rt, i a què el meu portàtil no dóna per més.

Tocar software, fer sonar hardware: proj4, v2

Ara no necessito el fluidsynth. Connecto el ALSA_MS_bridge al Virtual Keyboard (toco software) i a la UA-25EX (on tinc connectat el Casio). D'altra banda, connecto en el codi java Proj4 al ALSA_MS_bridge, en els dos sentits.

script proj4_v2_UA25EX.sh

#!/bin/bash
/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
/usr/bin/vkeybd &
sleep 2
xterm -e '/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "Virtual Keyboard":0 -o "UA-25EX":0' &
sleep 2
java -classpath /usr/src/midishare/lang/java/native:/home/joan/workspace/Proj4/bin v2.Proj4

En el codi Java les connexions queden:

            //em connecto al mscontrol
            int ref_mscontrol;
            if ((ref_mscontrol = Midi.GetNamedAppl("mscontrol")) > 0) Midi.Connect (ref_mscontrol,midiHandler.refnum, 1);
            // msAlsaSeq "bridge". Amb aconnectgui connecto el vkeybd amb el bridge (driver midishare-ALSA)
            //també connecto el bridge amb la Edirol UA-25EX
            //i ara he de connectar el bridge amb la meva aplicació, en els dos sentits
            int ref_bridge;
            if ((ref_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > 0) Midi.Connect (midiHandler.refnum,ref_bridge, 1);
            if ((ref_bridge = Midi.GetNamedAppl("ALSA_MS_bridge")) > 0) Midi.Connect (ref_bridge,midiHandler.refnum, 1);
            //com a control, connecto Proj4 al msdisplay
            int ref_display;
            if ((ref_display = Midi.GetNamedAppl("msdisplay")) > 0) Midi.Connect (midiHandler.refnum,ref_display, 1);

Sona perfecte pel Casio, sense cap latència (és una solució hardware).

Tocar hardware, fer sonar software: proj4, v3

no necessito el Virtual Keyboard, necessito el fluidsynth.

targeta de so interna del portàtil

script proj4_v3.sh

#!/bin/bash
/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
sleep 2
xterm -e 'bash -c "/usr/local/bin/fluidsynth -a alsa -m midishare -o audio.alsa.device='hw:0' -c 2 -z 128 -r 44100 -l  /home/joan/soundfonts/collections/Casio_VL_1.SF2"' &
sleep 2
xterm -e '/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "UA-25EX":0' &
sleep 2
java -classpath /usr/src/midishare/lang/java/native:/home/joan/workspace/Proj4/bin v4.Proj4

targeta de so externa: Edirol UA-25 EX

script proj4_v3_UA25EX.sh

#!/bin/bash
/usr/src/midishare/src/linux/applications/msconnect/msconnect &
/usr/src/midishare/src/linux/applications/msdisplay/msdisplay &
/usr/src/midishare/src/linux/applications/mscontrol/mscontrol &
sleep 2
xterm -e 'bash -c "/usr/local/bin/fluidsynth -a alsa -m midishare -o audio.alsa.device='plughw:1' -c 2 -z 128 -r 44100 -l  /home/joan/soundfonts/collections/Casio_VL_1.SF2"' &
sleep 2
xterm -e '/usr/local/bin/msAlsaSeq "ALSA_MS_bridge" -i "UA-25EX":0' &
sleep 2
java -classpath /usr/src/midishare/lang/java/native:/home/joan/workspace/Proj4/bin v4.Proj4

S'observen els mateixos problemes de latència que en la v1

Tocar hardware, fer sonar hardware: proj4, v4

No necessito per a res el Virtual Keyboard i el fluidsynth.

El codi és el mateix que la v2. Ho he probat tocant amb el WX5 i amb el Casio, i fent sonar el Casio.