Sintetitzador midi: Fluidsynth
Contingut
- 1 Introducció
- 2 Funcionament
- 3 Midishare
- 4 QSynth
- 5 format sfArk
- 6 analitzant arrencada fluidsynth
- 7 Controlar la latència
- 8 soundfont FluidR3_GM.sf2
- 9 convertir midi a wav i mp3
- 10 Executar fluidsynth en l'inici del sistema
- 11 Enviar missatges MIDI a la consola del fluidsynth
- 12 Programació de l'API de fluidsynth
- 13 Compilació des de les fonts
Introducció
FluidSynth is a real-time software synthesizer based on the SoundFont 2 specifications. FluidSynth can read MIDI events from a MIDI input device and render them to an audio device using SoundFont instruments. SoundFont files are composed of digital audio "samples" and additional instrument parameters. These files can be created or downloaded off the Internet. FluidSynth also has support for controlling effects in real time and can play MIDI files.
Note: FluidSynth was previously called IIWU Synth.
If you want to use sound effects in your application or you want to play music using samples, then you could consider using FluidSynth. Integrating the FluidSynth in your project is very easy. The interface is what you'd expect from a SoundFont synthesizer: noteon, noteoff, control_change, sfload, etc. The synthesizer was designed to be as self-contained as possible so there are no dependencies on other libraries. It is fairly small and fairly efficient. Off course, that will continue to improve over time ;) It's also important to note that FluidSynth runs on Linux, FreeBSD, Mac OSX, MacOS and Win32.
Podem trobar soundfonts a http://www.hammersound.net/, per exemple, AltosaxJan.SF2, i sobretot a http://soundfonts.homemusician.net. UN soundfont multipropòsit que ve amb el source del fluidsynth és: GeneralUser_GS_FluidSynth_v1.43.sf2
També podem descarregar una bona col.lecció de soundfonts (129Mb) a:
Soundfonts lliures que utilitza Luke Peterson (són tots de piano) (http://lukepeterson.com/2010/02/07/arriving-midi-keyboard-live-rig/):
- learjeff’s Rhodes
- Simon Baker’s WurlitzerEPDry
- Warren Trachtman’s WST25FStein_00Sep22.zip
- 198 Rhodes VS extreme
- 198_VL_1_wurlitzer_VS
- http://www.sf2midi.com/ (jonibigut/5878a7ab)
Si vull un gran so de piano: Salamander Grand Piano (buscar, són 1,5 Gb) -> però compte! això no és un soundfont, és una altra tècnologia de síntesi
Un soundfont molt bo generalista: Unison.SF2. Està a /home/joan/soundfonts/Unison.SF2 (recordem: fluidsynth -a jack /home/joan/soundfonts/Unison.SF2). L'he descarregat de ftp://ftp.personalcopy.net/pub/Unison.sf2.gz
Un altre soundfont que s'ha construït cercant la qualitat és el Crisis GM 3.0 (http://www.bismutnetwork.com/10Music/Crisis/Soundfont3.0.php). Ja l'he provat i sona realment molt bé, tot i que els saxos no. Hi ha efectes interessants com soroll de gos, galop, cotxe, tro, cotxe,... Són més de 600MB (del qual el piano són més de 100MB -sona bé-), i amb 2GB de RAM (és el que tinc a 32 bits) ocupa el 68% de la RAM. El format original és sfpack i he necessitat un programa per convertir-lo a sf2.
Si vull trobar tots els soundfonts que tinc instal.lats al sistema, molt fàcil:
$ locate sf2 ... /home/joan/soundfonts/GeneralUser_GS_FluidSynth_v1.43.sf2 /home/joan/soundfonts/fluid-soundfont-3.1/FluidR3_GM.sf2 /home/joan/soundfonts/fluid-soundfont-3.1/FluidR3_GS.sf2 ...
Funcionament
$ man fluidsynth
NAME
FluidSynth - a SoundFont synthesizer
SYNOPSIS
fluidsynth [options] [ SoundFonts ] [ midifiles ]
DESCRIPTION
FluidSynth is a real-time MIDI synthesizer based on the SoundFont(R) 2 specifications. It can be used to render MIDI input or MIDI files to audio.
The MIDI events are read from a MIDI device. The sound is rendered in real-time to the sound output device.
The easiest way to start the synthesizer is to give it a SoundFont on the command line: ’fluidsynth soundfont.sf2’. fluidsynth will load the
SoundFont and read MIDI events from the default MIDI device using the default MIDI driver. Once FluidSynth is running, it reads commands from the
stdin. There are commands to send MIDI events manually, to load or unload SoundFonts, and so forth. All the available commands are discussed
below.
FluidSynth can also be used to play a list of MIDI files. Simply run FluidSynth with the SoundFont and the list of MIDI files to play. In this
case you might not want to open the MIDI device to read external events. Use the -n option to deactivate MIDI input. If you also want to deacti‐
vate the use of the shell, start FluidSynth with the -i option: ’fluidsynth -ni soundfont.sf2 midifile1.mid midifile2.mid’.
Run fluidsynth with the --help option to check for changes in the list of options.
Fer funcionar el fluidsynth (sense jack)
(en altres articles també s'explica el funcionament de fluidsynth i hi ha més exemples).
Com que no hi havia manera, he instal.lat la interfície gràfica del fluidsynt, el QSynth, i així sí que ho he aconseguit fer funcionar. En el Qsynth puc mirar la configuració que funciona (Setup > Settings), i en el fluidsynt, per veure la configuració, quan estic en el prompt del fluidsynth (>) puc fer
> settings
L'opció -f per carregar un fitxer de configuració sembla que no funciona:
$ fluidsynth -f settings.cfg (això no ha funcionat)
nota gener 2012. L'opció -f no s'utilitza així. En el fitxer settings.cfg hi poden haver instruccions de la consola del fluidsynth, com per exemple un canvi de programa (prog 0 65). Exemple d'ús: AKAI_EWI_USB#Script_arrencada_autom.C3.A0tica
A mi el que m'ha funcionat és alsa driver: alsa, midi driver: alsa_seq
http://fluidsynth.resonance.org/trac/wiki/FluidSettings
Un cop ja tinc el fluidsynth funcionant, ja sigui en consola o amb el QSynth, ja el puc associar amb el virtualkeyboard (per exemple) per comprovar que funciona:
$ fluidsynth -a alsa -m alsa_seq /home/joan/fluidsynth/doc/example.sf2
$ aconnect -i -o
...
cliente 129: 'FLUID Synth (11499)' [tipo=usuario]
0 'Synth input port (11499:0)'
cliente 130: 'Virtual Keyboard' [tipo=usuario]
0 'Virtual Keyboard'
$ aconnect 130:0 129:0
Finalment, he aconseguit fer sonar un midi
$ fluidsynth -a alsa -m alsa_seq /home/joan/fluidsynth/doc/example.sf2 /home/joan/Escritorio/beethoven-moonlight_sonata.mid
El tema complicat és que moltes vegades que vull engegar el fluidsynth em diu:
fluidsynth: error: The "default" audio device is used by another application Failed to create the audio driver
i sembla ser que el problema és que el JACK s'engega i quan tanco el fluidsynth el JACK es queda engegat. S'arregla tancant el Jack Control. En canvi, el QSynth el control que fa sobre el Jack és més previsible.
Una altra solució per a The "default" audio device is used by another application: $ sudo /sbin/alsa force-reload
Solució: en mode comanda s'ha d'arrencar el fluidsynth amb l'opció -l, que fa que no s'engegui el servidor JACK. És així com ho fa el QSynth.
Quan estic en el prompt del fluidsynth (>) puc accedir a diverses comandes, com ara veure quins instruments tinc a cada canal:
> channels chan 0, El Cheapo Organ chan 1, El Cheapo Organ chan 2, El Cheapo Organ chan 3, El Cheapo Organ chan 4, El Cheapo Organ chan 5, El Cheapo Organ chan 6, El Cheapo Organ chan 7, El Cheapo Organ chan 8, El Cheapo Organ chan 9, no preset chan 10, El Cheapo Organ chan 11, El Cheapo Organ chan 12, El Cheapo Organ chan 13, El Cheapo Organ chan 14, El Cheapo Organ chan 15, El Cheapo Organ > help help Command summary. 'help help' for more help topics quit Quit the synthesizer load file [reset] [bankofs] Load SoundFont (reset=0|1, def 1; bankofs=n, def 0) unload id [reset] Unload SoundFont by ID (reset=0|1, default 1) reload id Reload the SoundFont with the specified ID fonts Display the list of loaded SoundFonts inst font Print out the available instruments for the font channels [-verbose] Print out preset of all channels interp num Choose interpolation method for all channels interpc chan num Choose interpolation method for one channel gain value Set the master gain (0 < gain < 5) reset System reset (all notes off, reset controllers) echo arg Print arg > settings
Amb settings puc veure quina configuració tinc i amb quins paràmetres s'ha creat el driver d'alsa (amb aquesta informació es pot calcular la latència, explicat en una altra banda).
Fer funcionar el fluidsynth (amb jack)
http://ubuntuforums.org/showthread.php?t=1044476
http://ubuntuforums.org/showthread.php?t=1044476
Primer arrenco el JACK, i estableixo els settings per configurar la latència. Engego el JACK
Arrenco el fluidsynth:
$ fluidsynth -a jack /home/joan/soundfonts/collections/Casio_VL_1.SF2
El fluidsynth provaria d'arrencar igualment el JACK, però en aquest cas ja està arrencat (per tal que el fluidsynth no provi d'arrencar el JACK, utilitzar l'opció -l).
Arrenco també el Virtual Keyboard. En l'apartat de connexions del JACK estableixo les connexions: en la pestanya ALSA connecto el vkeybd amb el fluidsynth, i en la pestanya audio connecto fluidsynth amb system (que representa la targeta d'audio físical). Ja puc escoltar.
Controlador Midi: keyboard Casio CTK-731 i controlador de vent WX-5
Arrenco el fluidsynth
$ fluidsynth -a alsa -m alsa_seq /home/joan/Escritorio/AltosaxJan.sf2
i miro quins ports he de connectar:
$ aconnect -i -o
...
cliente 20: 'UA-25EX' [tipo=kernel]
0 'UA-25EX MIDI 1 '
cliente 129: 'FLUID Synth (6523)' [tipo=usuario]
0 'Synth input port (6523:0)'
i faig la connexió:
$ aconnect 20:0 129:0
$ aconnect -i -o -l
cliente 20: 'UA-25EX' [tipo=kernel]
0 'UA-25EX MIDI 1 '
Conectando con: 129:0
cliente 129: 'FLUID Synth (6523)' [tipo=usuario]
0 'Synth input port (6523:0)'
Conectado desde: 20:0
i ja puc fer sonar el keyboard Casio amb el saxo que em proporciona la soundfont que he escollit. També faig sonar el WX5. Tinc una latència considerable, tema amb el qual encara no m'he ficat (estic amb Ubuntu Jaunty beta, que no és rt).
El Jack està apagat, per tant no puc controlar tots els paràmetres del Jack per visualitzar la latència.
El fluidsynth està sonant pels altaveus (dolents) del portàtil. Ara que tinc endollat el Edirol, hauria de fer sonar per l'output de l'Edirol:
Sistema > Preferencias > Sonido > Eventos de Sonido: Edirol UA-25EX USB Audio (OSS) -> no m'ha sortit, ho deixo com estava. INTEL ICH6 OSS
Tot el tema del Jack i latència ho hauré de deixar per més endavant.
Treballant amb midishare, el fluidsynth és important perquè midishare proporciona un driver per a fluidsynt, la qual cosa significa que els meus projectes midishare els podré fer sonar a través de fluidsynth.
$ fluidsynth -m midishare soundfont.sf2
Tot això està explicat a Compilació_de_fluidsynth_amb_compatibilitat_midishare
QSynth
$ sudo apt-get install qsynth
Qsynth holds its settings and configuration state per user, in a file located as $HOME/.config/rncbc.org/Qsynth.conf. Normally, there's no need to edit this file, as it is recreated and rewritten everytime qsynth is run.
format sfArk
What is sfArk? It's a lossless audio compression format optimized for SoundFont files. sfArk free for non-commercial use. Programs to decompress sfArk files currently exist for Windows, MacOS X and Linux platforms.
Per descomprimir un soundfont sfArk: sfArkXTc. This is a simple terminal/command-line based decompressor and should run on most if not all x86 based Linux platforms. It will decompress sfArk V2 files (including "self-extracting" sfArk files). If you find files on the net compressed with sfArk V1, please contact the originator and ask for the file to be converted to sfArk V2 format.
Per descomprimir està ben explicat a: https://help.ubuntu.com/community/HowToCompressedSoundFonts
$ cd ~/soundfonts/ $ mkdir sfark $ cd sfark $ wget http://www.melodymachine.com/files/sfarkxtc_lx86.tar.gz $ tar -xzf sfarkxtc_lx86.tar.gz
You will also require the older libstdc++5, so install that:
sudo apt-get install libstdc++5
vull descomprimir un fitxer sfArK:
$ ../sfark/sfarkxtc Trumpet3.sfArk sfArkXTc 1.03 (using sfArkLib version: 224) copyright (c) 1998-2004 melodymachine.com, free for non-commercial use Uncompressing Joshua_Melodic_Trumpet.sfArk... Progress: 100% Created Joshua_Melodic_Trumpet.SF2 (478 kb) successfully. Time taken 0.11 seconds Result: Successful
i efectivament obtinc Joshua_Melodic_Trumpet.SF2
Si vull descomprimir tots els fitxers sfArk que hi ha en una carpeta de cop:
$ for i in *.sf[Aa]rk ; do ../sfark/sfarkxtc "$i" && rm "$i" ; done
analitzant arrencada fluidsynth
El soundfont /home/joan/soundfonts/collections/Casio_VL_1.SF2 està bé perquè és un exemple de soundfont en el que hi ha ficats diferents instruments (molts soundfonts només tenen un instrument). Anem a arrencar aquest soundfont amb el fluidsynth per analitzar els missatges de l'arrencada (en aquest cas utilitzem ALSA, no utilitzem JACK. Amb l'opció -l el fluidsynth no intenta engegar el JACK):
$ fluidsynth -a alsa -m alsa_seq -l /home/joan/soundfonts/collections/Casio_VL_1.SF2 fluidsynth: warning: Instrument not found on channel 8 [bank=0 prog=8], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 10 [bank=0 prog=10], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 11 [bank=0 prog=11], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 12 [bank=0 prog=12], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 13 [bank=0 prog=13], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 14 [bank=0 prog=14], substituted [bank=0 prog=0] fluidsynth: warning: Instrument not found on channel 15 [bank=0 prog=15], substituted [bank=0 prog=0] fluidsynth: ALSA driver: Using format s16, rw, interleaved FluidSynth version 1.1.0 Copyright (C) 2000-2009 Peter Hanappe and others. Distributed under the LGPL license. SoundFont(R) is a registered trademark of E-mu Systems, Inc. Type 'help' for information on commands and 'help help' for help topics. > channels chan 0, Piano chan 1, Fantasy chan 2, Violin chan 3, Flute chan 4, Guitar chan 5, ADSR chan 6, Percussion chan 7, Loops chan 8, Piano chan 9, no preset chan 10, Piano chan 11, Piano chan 12, Piano chan 13, Piano chan 14, Piano chan 15, Piano > fonts ID Name 1 /home/joan/soundfonts/collections/Casio_VL_1.SF2 > inst font inst: invalid argument > inst 1 000-000 xaphoon > inst 2 000-000 Piano 000-001 Fantasy 000-002 Violin 000-003 Flute 000-004 Guitar 000-005 ADSR 000-006 Percussion 000-007 Loops
Veiem que del canal 0 al 7 es carreguen diferents instruments, i que a partir del canal 8 no es troba cap instrument, i per defecte se li assigna l'instrument del bank=0, prog=0: Piano. L'assignació típica és assignar un programa (instrument) per a cada canal. També és molt típic que el canal 9 no tingui cap assignació (està reservat a percussió).
- chan=0 Prog=0: Piano
- chan=1 Prog=1: Fantasy
- chan=2 Prog=2: Violin
- chan=3 Prog=3: Flute
- chan=4 Prog=4: Guitar
- chan=5 Prog=5: ADSR
- chan=6 Prog=6: Percussion
- chan=7 Prog=7: Loops
Per fer sonar tots aquests instruments, farem servir el Virtual Keyboard, mostrant els canals i Program List (veure gràfic). Amb el aconnectgui connectem el fluidsynth amb el Virtual Keyboard. Per canviar al programa Fantasy, he d'escollir en el vkeybd el canal 1 i el program 1 (no n'hi ha prou amb canviar de canal). Quan canvio al canal 8 em surt el següent missatge, i és per això que torna a sonar el piano:
> fluidsynth: warning: Instrument not found on channel 8 [bank=0 prog=8], substituted [bank=0 prog=0]
També és interessant veure com funciona el canal 7 (Loops). A cada nota que toco no tinc un sol instrument, sinó diferents sons de percussió que fan un loop i obtinc una funcional caixa de ritmes.
Controlar la latència
Llegir també http://fluidsynth.resonance.org/trac/wiki/LowLatency, fruit de la discussió que hi ha hagut en la llista de distribució fluid-dev.
Si utilitzo -a jack, la latència ve controlada pels settings del Jack (que alhora crearà el driver d'alsa amb aquests settings). Si utilitzo -a alsa, ve controlada directament per alsa.
There are several factors, but a very important one is the buffer size. It can be controlled by two command line options:
-c, --audio-bufcount=[count]
Number of audio buffers
-z, --audio-bufsize=[size]
Size of each audio buffer
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.
If you use Jack with FluidSynth, the buffer options must be given in the jackd command line (or using a GUI control program, like qjackctl.)
For instance, this command line (Linux, ALSA):
$ fluidsynth -a alsa -c 3 -z 1024 -r 48000 soundfont.sf2
starts FluidSynth with the ALSA driver, a buffer of 3072 frames and a SR of 48000 Hz. This means about 3*1024/48000 = 0.064 seconds of latency.
Note that the real hardware buffer size may also depend on the software layer. If you access the device directly (-o audio.alsa.device=hw:0) the driver tries to use the provided sizes, but if you use the layer "plughw:x" the real buffers may be larger. In both cases ALSA may decide to use different values, if the provided ones are outside the allowed boundaries. You can watch the ALSA hardware parameters, looking a control file:
$ cat /proc/asound/card0/pcm0p/sub0/hw_params access: RW_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 48000 (48000/1) period_size: 64 buffer_size: 128
The above command was executed after running FluidSynth with the following command line:
$ fluidsynth -a alsa -r 48000 -c 2 -z 64 -o audio.alsa.device=hw:0,0
Anem a comprovar que això és cert per a la meva targeta:
$ fluidsynth -m midishare -a alsa -o audio.alsa.device='plughw:0' -o synth.sample-rate=44100.000 -o audio.periods=2 -o audio.period-size=128 -l AI-APiano02trans.sf2 > settings audio.periods 2 audio.alsa.device plughw:0 audio.period-size 128 synth.sample-rate 44100.000 $ cat /proc/asound/card0/pcm0p/sub0/hw_params access: RW_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 128 buffer_size: 256
tot és correcte, però compte que com es comenta utilitzant plughw:0 podríem no obtenir els resultats previstos.
$ fluidsynth -m midishare -a alsa -o audio.alsa.device='plughw:0' -o synth.sample-rate=48000 -o audio.periods=2 -o audio.period-size=64 -l AI-APiano02trans.sf2 > settings audio.periods 2 audio.alsa.device plughw:0 audio.period-size 64 synth.sample-rate 48000.000 $ cat /proc/asound/card0/pcm0p/sub0/hw_params access: RW_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 48000 (48000/1) period_size: 64 buffer_size: 128
tot concorda. Per tant, per mirar la latència real, mirarem /proc/asound/card0/pcm0p/sub0/hw_params (ficar el número de targeta correcta). Si apago el fluidsynth la informació que apareix és closed. Per tant, el fitxer hw_params emmagatzema la informació real amb que ha arrencat el driver d'alsa.
Controlar la latència amb el Edirol UA-25EX
prova 1
Tinc l'interruptor hardware del sample rate a 441000
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 2 -z 64 -r 44100 -l /home/joan/soundfonts/AI-APiano02trans.sf2 > settings audio.periods 2 audio.alsa.device plughw:1 audio.sample-format 16bits audio.period-size 64 synth.sample-rate 44100.000 $ cat /proc/asound/card1/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 64 buffer_size: 128
Són 2,9 ms
prova 2
arrenco el fluidsynth amb -r 48000, però sense tocar l'interruptor hardware: no li farà cas.
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 3 -z 128 -r 48000 -l /home/joan/soundfonts/AI-APiano02trans.sf2 > settings audio.periods 3 audio.alsa.device plughw:1 audio.sample-format 16bits audio.period-size 128 synth.sample-rate 48000.000 $ cat /proc/asound/card1/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 118 buffer_size: 474
Veig com els paràmetres reals són diferents. En el Edirol tinc seleccionat l'interruptor de sample rate a 44100 (selecció per hardware), i per tant és lògic que no en faci cas. Per calcular la latència he de fer servir els paràmetres reals.
prova 3
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 3 -z 128 -r 44100 -l /home/joan/soundfonts/AI-APiano02trans.sf2 > settings audio.periods 3 audio.alsa.device plughw:1 audio.sample-format 16bits audio.period-size 128 synth.sample-rate 44100.000 $ cat /proc/asound/card1/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 128 buffer_size: 384
prova 4
ara fico l'interruptor del sample rate del Edirol UA-25EX a 48000 (he de treure el cable USB i tornar-lo a ficar), i veuré com treballarà de forma nadiua a 48000:
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 2 -z 64 -r 48000 -l /home/joan/soundfonts/AI-APiano02trans.sf2 > settings audio.periods 2 audio.alsa.device plughw:1 audio.sample-format 16bits audio.period-size 64 synth.sample-rate 48000.000 $ cat /proc/asound/card1/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 48000 (48000/1) period_size: 64 buffer_size: 128
això són 2,6 ms de latència
prova 5
$ fluidsynth -a alsa -o audio.alsa.device='hw:1' -o audio.sample-format=16 -c 2 -z 64 -r 48000 -l /home/joan/soundfonts/AI-APiano02trans.sf2 ... fluidsynth: error: Failed to find a workable audio format Failed to create the audio driver
Amb la Edirol UA-25EX no pretenem que ens funcioni -o audio.alsa.device='hw:1', sinó que sempre farem -o audio.alsa.device='plughw:1', pel següent motiu:
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.
Per tant és lògic que sempre que intento fer -o audio.alsa.device='hw:1' em doni aquest error.
prova 6
ara poso la Edirol UA-25EX a 96000P
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 2 -z 64 -r 96000 -l /home/joan/soundfonts/AI-APiano02trans.sf2 > settings audio.periods 2 audio.alsa.device plughw:1 audio.sample-format 16 audio.period-size 64 synth.sample-rate 96000.000 $ cat /proc/asound/card1/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 96000 (96000/1) period_size: 96 buffer_size: 192
Tinc una latència de 2,0 ms
prova 7
ara poso la Edirol UA-25EX a 96000R
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -o audio.sample-format=16 -c 2 -z 64 -r 96000 -l /home/joan/soundfonts/AI-APiano02trans.sf2
i ara no em fa cas...
Nota
he observat problemes amb els XRuns. Una bona combinació pot ser treballar a -c 2 -z 64 -r 44100 (46ms), que quasi no s'observen XRuns. Recordar, però, que estic treballant amb una màquina justeta (CPU: 600MHz, 1Gb de RAM). Quan tingui una màquina potent no hi hauria d'haver problemes.
(la prova és amb Ubuntu 9.04, sense kernel rt)
Per millorar la qualitat i disminuir els XRuns puc seguir els consells de http://fluidsynth.resonance.org/trac/wiki/LowLatency (NetBooks and low performance computers), que diu de ficar les opcions -C0 -R0 -r22050 (deshabilitar el chorus i el reverb). L'opció -r22050 no té efectes en el cas de l'edirol perquè no ho suporta.
running FluidSynth with a native sound card sample rate will give the better results, because reducing the sample rate requires ALSA to perform software interpolation (by the plughw: layer) to transform the buffers into the native frequency before sending it to the hardware. This requires larger buffers and consumes CPU cycles. On the other hand, using the native frequency allows you to use the hw: interface directly.
prova 8, utilitzo JACK
Configuro el jack a 44100 (equivalent a -c 2 -z 64 -r 44100)
$ fluidsynth -a jack /home/joan/soundfonts/AI-APiano02trans.sf2
i el resultat és molt pitjor que utilitzant alsa directament (la prova és amb Ubuntu 9.04, sense kernel rt)
soundfont FluidR3_GM.sf2
Aquest soundfont ocupa 141 MB, i representa que és un soundfont molt complet i amb molts instruments. Recordem que la meva màquina és bastant justa com per carregar un soundfont de tants megues.
$ fluidsynth -a alsa -o audio.alsa.device='plughw:1' -c 2 -z 64 -r 44100 -l /home/joan/soundfonts/fluid-soundfont-3.1/FluidR3_GM.sf2
Els instruments són (els números indiquen el banc i el preset-instrument):
> inst 1 000-000 Yamaha Grand Piano 000-001 Bright Yamaha Grand 000-002 Electric Piano 000-003 Honky Tonk 000-004 Rhodes EP 000-005 Legend EP 2 000-006 Harpsichord 000-007 Clavinet 000-008 Celesta 000-009 Glockenspiel 000-010 Music Box 000-011 Vibraphone 000-012 Marimba 000-013 Xylophone 000-014 Tubular Bells 000-015 Dulcimer 000-016 DrawbarOrgan 000-017 Percussive Organ 000-018 Rock Organ 000-019 Church Organ 000-020 Reed Organ 000-021 Accordian 000-022 Harmonica 000-023 Bandoneon 000-024 Nylon String Guitar 000-025 Steel String Guitar 000-026 Jazz Guitar 000-027 Clean Guitar 000-028 Palm Muted Guitar 000-029 Overdrive Guitar 000-030 Distortion Guitar 000-031 Guitar Harmonics 000-032 Acoustic Bass 000-033 Fingered Bass 000-034 Picked Bass 000-035 Fretless Bass 000-036 Slap Bass 000-037 Pop Bass 000-038 Synth Bass 1 000-039 Synth Bass 2 000-040 Violin 000-041 Viola 000-042 Cello 000-043 Contrabass 000-044 Tremolo 000-045 Pizzicato Section 000-046 Harp 000-047 Timpani 000-048 Strings 000-049 Slow Strings 000-050 Synth Strings 1 000-051 Synth Strings 2 000-052 Ahh Choir 000-053 Ohh Voices 000-054 Synth Voice 000-055 Orchestra Hit 000-056 Trumpet 000-057 Trombone 000-058 Tuba 000-059 Muted Trumpet 000-060 French Horns 000-061 Brass Section 000-062 Synth Brass 1 000-063 Synth Brass 2 000-064 Soprano Sax 000-065 Alto Sax 000-066 Tenor Sax 000-067 Baritone Sax 000-068 Oboe 000-069 English Horn 000-070 Bassoon 000-071 Clarinet 000-072 Piccolo 000-073 Flute 000-074 Recorder 000-075 Pan Flute 000-076 Bottle Chiff 000-077 Shakuhachi 000-078 Whistle 000-079 Ocarina 000-080 Square Lead 000-081 Saw Wave 000-082 Calliope Lead 000-083 Chiffer Lead 000-084 Charang 000-085 Solo Vox 000-086 Fifth Sawtooth Wave 000-087 Bass & Lead 000-088 Fantasia 000-089 Warm Pad 000-090 Polysynth 000-091 Space Voice 000-092 Bowed Glass 000-093 Metal Pad 000-094 Halo Pad 000-095 Sweep Pad 000-096 Ice Rain 000-097 Soundtrack 000-098 Crystal 000-099 Atmosphere 000-100 Brightness 000-101 Goblin 000-102 Echo Drops 000-103 Star Theme 000-104 Sitar 000-105 Banjo 000-106 Shamisen 000-107 Koto 000-108 Kalimba 000-109 BagPipe 000-110 Fiddle 000-111 Shenai 000-112 Tinker Bell 000-113 Agogo 000-114 Steel Drums 000-115 Woodblock 000-116 Taiko Drum 000-117 Melodic Tom 000-118 Synth Drum 000-119 Reverse Cymbal 000-120 Fret Noise 000-121 Breath Noise 000-122 Sea Shore 000-123 Bird Tweet 000-124 Telephone 000-125 Helicopter 000-126 Applause 000-127 Gun Shot 008-004 Detuned EP 1 008-005 Detuned EP 2 008-006 Coupled Harpsichord 008-014 Church Bell 008-016 Detuned Organ 1 008-017 Detuned Organ 2 008-019 Church Organ 2 008-021 Italian Accordion 008-024 Ukulele 008-025 12 String Guitar 008-026 Hawaiian Guitar 008-028 Funk Guitar 008-030 Feedback Guitar 008-031 Guitar Feedback 008-038 Synth Bass 3 008-039 Synth Bass 4 008-040 Slow Violin 008-048 Orchestral Pad 008-050 Synth Strings 3 008-061 Brass 2 008-062 Synth Brass 3 008-063 Synth Brass 4 008-080 Sine Wave 008-107 Taisho Koto 008-115 Castanets 008-116 Concert Bass Drum 008-117 Melo Tom 2 008-118 808 Tom 009-125 Burst Noise 016-025 Mandolin 128-000 Standard 128-001 Standard 1 128-002 Standard 2 128-003 Standard 3 128-004 Standard 4 128-005 Standard 5 128-006 Standard 6 128-007 Standard 7 128-008 Room 128-009 Room 1 128-010 Room 2 128-011 Room 3 128-012 Room 4 128-013 Room 5 128-014 Room 6 128-015 Room 7 128-016 Power 128-017 Power 1 128-018 Power 2 128-019 Power 3 128-024 Electronic 128-025 TR-808 128-032 Jazz 128-033 Jazz 1 128-034 Jazz 2 128-035 Jazz 3 128-036 Jazz 4 128-040 Brush 128-041 Brush 1 128-042 Brush 2 128-048 Orchestra Kit
En el Virtual Midi Keyboard puc escollir el back (no confondre amb el canal!!), i dins de cada bank, l'instrument. A efectes pràctics, però, si miro els errors que em dóna el fluidsynth, els bancs diferents del 0 no són operatius i són substituïts pels banc 0 (on hi ha molts instruments).
convertir midi a wav i mp3
toquem el midi en l'Edirol:
$ fluidsynth -a alsa -m alsa_seq -o audio.alsa.device='plughw:1' -c 2 -z 1024 -r 44100 -l /home/joan/soundfonts/collections/Casio_VL_1.SF2 /home/joan/scores/saltiro_cardina/saltiro_cardina_tenora_1.midi
Amb l'opció -F renderitzem el midi al format raw:
$ fluidsynth -F /home/joan/fluidsynth.raw -c 2 -z 1024 -r 44100 -l /home/joan/soundfonts/collections/Casio_VL_1.SF2 /home/joan/scores/saltiro_cardina/saltiro_cardina_tenora_1.midi
i obtenim fluidsynth.raw (48 MB)
Amb sox convertim a wav:
$ sox -r 44100 -s -b 16 -c 2 fluidsynth.raw fluidsynth.wav
Fem sonar el wav en línia de comanda:
$ aplay -D plughw:UA25EX fluidsynth.wav
Convertim el wav a mp3 (això ja s'havia fet en el langtrainer):
$ ffmpeg -i fluidsynth.wav -acodec libmp3lame -ab 32 -ar 44100 fluidsynth.mp3
i ja sona fluidsynth.mp3 fent doble click. Per fer sonar un mp3 en línia de comanda:
$ sudo apt-get install mpg123 $ mpg123 fluidsynth.mp3 (targeta interna) $ mpg123 -a plughw:UA25EX fluidsynth.mp3 (targeta externa)
Executar fluidsynth en l'inici del sistema
La idea que persegueixo és executar que l'aplicació que vulgui executar sigui funcional en l'inici del sistema, sense haver de connectar manualment les aplicacions. Després de barallar-me molt he aconseguit connectar el fluidsynth amb el vkeybd, de la següent manera.
La millor solució és ficar un sol script: fluidsynth_vkeybd.sh amb les següents comandes, i ficar aquest script a Sistema > Preferencias > Aplicaciones de inicio. En aquest script ficaré tota la funcionalitat. script fluidsynth_vkeybd.sh
#!/bin/bash xterm -e 'bash -c "/usr/local/bin/fluidsynth -a alsa -m alsa_seq -o audio.alsa.device='plughw:1' -c 2 -z 128 -r 44100 -l /home/joan/soundfonts/collections/Casio_VL_1.SF2; sleep 3"' & sleep 5 /usr/bin/vkeybd & sleep 5 /usr/bin/aconnect 'Virtual Keyboard':0 'FLUID Synth':0
$ sudo chmod +x fluidsynth_vkeybd.sh $ ./fluidsynth_vkeybd.sh
El problema ha vingut principalment perquè el fluidsynth mostra un prompt (>) que és necessari. De la manera que ho he fet, obro el fluidsynth en un nou terminal. Nota important. A Sistema > Preferencias > Sonido, a la pestanya 'Sonido': desactivar Reproducir Alertas y efectos de sonido; reproducir sonido de alerta. Això és degut a què en l'inici del sistema el so de benvinguda ocupa la targeta de so interna. Això no té importància si treballo amb l'Edirol.
Enviar missatges MIDI a la consola del fluidsynth
En el prompt del fluidsynth (>) puc escriure missatges midi (sempre que no s'hagi obert el fluidsynth amb l'opció -i).
MIDI MESSAGES
noteon channel key velocity
Send a note-on event
noteoff channel key
Send a note-off event
cc channel ctrl value
Send a control change event
prog chan num
Send program-change message
select chan sfont bank prog
Combination of bank-select and program-change
channels
Print out the presets of all channels.
Per exemple,
> noteon 0 60 127 > noteoff 0 60
Ara vull enviar missatges midi a la consola del fluidsynth des d'un script (bash, python) o des d'una altra consola. Si faig això no funciona:
$ tty /dev/pts/2 $ echo hola > /dev/pts/2 $ echo "noteon 0 60 127" > /dev/pts/1 $ echo "noteoff 0 60" > /dev/pts/1
Aconsegueixo escriure en el prompt del fluidsynth, però no té efectes.
La documentació del fluidsynth diu que aquestes operacions s'han de fer amb telnet.
How to send manual midi commands to fluidsynth from another program?: http://www.mail-archive.com/fluid-dev@nongnu.org/msg00885.html
Arrenco el fluidsynth de la següent manera (amb opció -i o sense):
$ fluidsynth -a alsa -m alsa_seq -o audio.alsa.device='hw:0' -i -s -o "shell.port=9988" -c 2 -z 128 -r 44100 -l /home/joan/soundfonts/collections/Casio_VL_1.SF2
I aleshores faig un telnet al port 9988, i envio comandes
$ telnet localhost 9988 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. noteon 0 60 127 noteoff 0 60 quit cheers! Connection closed by foreign host.
Tot el que sigui connectar-me amb telnet (amb un script python, amb Java també es deu poder fer...) puc enviar missatges midi al fluidsynth.
Una altra possibilitat, que no he explorat:
$ echo "noteon 1 60 100" > /dev/tcp/localhost/9988 $ echo "noteoff 1 60" > /dev/tcp/localhost/9988
Programació de l'API de fluidsynth
puc programar clients de fluidsynth amb llenguatge C.
Aquest exemple i altres exemples estan trets de
$ gcc -g -O -o fluidsynth_simple fluidsynth_simple.c -lfluidsynth $ ./fluidsynth_simple /home/joan/soundfonts/reed/463-Tenor_Sax_1.sf2
Nota: ha d'estar engegat el JACK. He de fer la connexió del client fluidsynth amb el system (targeta d'audio) de forma manual Nota: utilitzo el soundfont de saxo tenor perquè la nota no s'esgota i tinc temps de connectar el fluidsynth amb la targeta de so.
fluidsynth_simple.c:
/* FluidSynth Simple - An example of using fluidsynth
*
* This code is in the public domain.
*
* To compile:
* gcc -g -O -o fluidsynth_simple fluidsynth_simple.c -lfluidsynth
*
* To run
* fluidsynth_simple soundfont
*
* [Peter Hanappe]
*/
#include <stdio.h>
#include <fluidsynth.h>
int main(int argc, char** argv)
{
fluid_settings_t* settings;
fluid_synth_t* synth = NULL;
fluid_audio_driver_t* adriver = NULL;
int err = 0;
if (argc != 2) {
fprintf(stderr, "Usage: fluidsynth_simple [soundfont]\n");
return 1;
}
/* Create the settings object. This example uses the default
* values for the settings. */
settings = new_fluid_settings();
if (settings == NULL) {
fprintf(stderr, "Failed to create the settings\n");
err = 2;
goto cleanup;
}
/* Create the synthesizer */
synth = new_fluid_synth(settings);
if (synth == NULL) {
fprintf(stderr, "Failed to create the synthesizer\n");
err = 3;
goto cleanup;
}
/* Load the soundfont */
if (fluid_synth_sfload(synth, argv[1], 1) == -1) {
fprintf(stderr, "Failed to load the SoundFont\n");
err = 4;
goto cleanup;
}
/* Create the audio driver. As soon as the audio driver is
* created, the synthesizer can be played. */
adriver = new_fluid_audio_driver(settings, synth);
if (adriver == NULL) {
fprintf(stderr, "Failed to create the audio driver\n");
err = 5;
goto cleanup;
}
/* Play a note */
fluid_synth_noteon(synth, 0, 60, 100);
printf("Press \"Enter\" to stop: ");
getchar();
printf("done\n");
cleanup:
if (adriver) {
delete_fluid_audio_driver(adriver);
}
if (synth) {
delete_fluid_synth(synth);
}
if (settings) {
delete_fluid_settings(settings);
}
return err;
}
Compilació des de les fonts
Ja m'havia trobat alguna vegada que en compilar em donava que el checking d'ALSA i JACK era que no, tot i que em deixava treballar amb els drivers d'ALSA i JACK (?)
En la sortida del ./configure:
... --checking for ALSA ..no --checking for JACK ..no
miro config.log
configure:12336: checking for ALSA configure:12344: $PKG_CONFIG --exists --print-errors "alsa >= 0.9.1" Package alsa was not found in the pkg-config search path. Perhaps you should add the directory containing `alsa.pc' to the PKG_CONFIG_PATH environment variable No package 'alsa' found configure:12347: $? = 1 configure:12362: $PKG_CONFIG --exists --print-errors "alsa >= 0.9.1"
Miro d'arreglar el tema del PKG_CONFIG:
$ sudo apt-get install libxml2-dev $ echo $PKG_CONFIG_PATH res
fico en el meu .bashrc:
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/bin/pkg-config
$ echo $PKG_CONFIG_PATH
ja està!
$ sudo apt-get install libasound2-dev checking for ALSA... yes
Soluciono el tema del JACK:
configure:12686: checking for JACK configure:12694: $PKG_CONFIG --exists --print-errors "jack" Package jack was not found in the pkg-config search path. Perhaps you should add the directory containing `jack.pc' to the PKG_CONFIG_PATH environment variable No package 'jack' found configure:12697: $? = 1 configure:12712: $PKG_CONFIG --exists --print-errors "jack" Package jack was not found in the pkg-config search path. Perhaps you should add the directory containing `jack.pc' to the PKG_CONFIG_PATH environment variable No package 'jack' found
ja està!
sudo apt-get install libjack-dev
$ ls /usr/lib/pkgconfig alsa.pc jack.pc
(Què representen els fitxer .pc?)
i ja puc compilar fluidsynth:
$ ./autogen.sh $ ./configure ... JACK: yes ALSA: yes $ make $ sudo make install
i els drivers ja es creen bé amb el fluidsynth
$ fluidsynth -l -a alsa -m alsa_seq /home/joan/soundfonts/general/Unison.sf2 $ fluidsynth -l -a jack -m jack /home/joan/soundfonts/general/Unison.sf2
creat per Joan Quintana Compte, març 2009, desembre 2010