Sintetitzador midi: Fluidsynth

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

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/):

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.

Midishare

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

Fluidsynth vkeybd aconnectgui.png

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ó).

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 Aclaratori_MidiShare:_tocar_i_fer_sonar_música._Solucions_software_i_hardware#Tocar_hardware.2C_fer_sonar_software entrada.

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

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