LADSPA plugins

De wikijoan
Salta a la navegació Salta a la cerca

Linux Audio Developer's Simple Plugin API (LADSPA)

$ sudo apt-get install ladspa-sdk
$ sudo apt-get install cmt

The Computer Music Toolkit (CMT) contains plugins by David Bartold, Richard Furse, Jezar and Nathaniel Virgo.

En el Audacity, per treballar amb els plugins hem d'anar a Efectos > Complementos, i allà tinc complementos agrupats de 15 en 15.

Per exemple, provar el VyNil effect. Els plugins de LADSPA es poden utilitzar en molts programes (hosts) a part del audacity: Ardour, Csound, Rosegarden, Jack-Rack... mirar l'apartat hosts a www.ladspa.org.

Compilació del codi font

Descarrego de ladspa.org: ladspa_sdk.tgz

$ cd ladspa_sdk/src
$ make

Es creen tots els fitxers .o, i en el directori /ladspa_sdk/bin es creen tres programes:

-rwxr-xr-x 1 joan joan 18030 2010-11-03 01:59 analyseplugin
-rwxr-xr-x 1 joan joan 22661 2010-11-03 01:59 applyplugin
-rwxr-xr-x 1 joan joan 13532 2010-11-03 01:59 listplugins

que copio a /usr/local/bin

$ listplugins
Warning: You do not have a LADSPA_PATH environment variable set.

Plugins may be used by a range of different hosts. However, the host needs to be able to find the plugins. Hosts vary, however the recommended method uses the environment variable LADSPA_PATH. If present, this should contain a colon-separated path indicating directories that should be searched (in order) when loading plugin types.

You may wish to add a line such as the following to your .bash_profile login file (if you use Bash): export LADSPA_PATH=$LADSPA_PATH:/home/<user>/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa

Fico a /home/joan/.bashrc:

export LADSPA_PATH=$LADSPA_PATH:/home/joan/.ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa
$ listplugins | more
/usr/lib/ladspa/tap_tremolo.so:
	TAP Tremolo (2144/tap_tremolo)
/usr/lib/ladspa/hermes_filter_1200.so:
	Hermes Filter (1200/hermesFilter)
/usr/lib/ladspa/tap_dynamics_st.so:
	TAP Dynamics (St) (2153/tap_dynamics_st)
/usr/lib/ladspa/slide_2741.so:
	Slide (TA) (2741/slide_ta)
	Slide (TC) (2742/slide_tc)
/usr/lib/ladspa/random_1661.so:
	Random Wave Generator (FASA) (1661/random_fasa_oa)
	Random Wave Generator (FASC) (1662/random_fasc_oa)
	Random Wave Generator (FCSA) (1663/random_fcsa_oa)
	Random Wave Generator (FCSC) (1664/random_fcsc_oa)
...
$ analyseplugin /usr/lib/ladspa/sc4m_1916.so

Plugin Name: "SC4 mono"
Plugin Label: "sc4m"
Plugin Unique ID: 1916
Maker: "Steve Harris <steve@plugin.org.uk>"
Copyright: "GPL"
Must Run Real-Time: No
Has activate() Function: No
Has deactivate() Function: No
Has run_adding() Function: Yes
Environment: Normal or Hard Real-Time
Ports:	"RMS/peak" input, control, 0 to 1, default 0
	"Attack time (ms)" input, control, 1,5 to 400, default 101,125
	"Release time (ms)" input, control, 2 to 800, default 401
	"Threshold level (dB)" input, control, -30 to 0, default 0
	"Ratio (1:n)" input, control, 1 to 20, default 1
	"Knee radius (dB)" input, control, 1 to 10, default 3,25
	"Makeup gain (dB)" input, control, 0 to 24, default 0
	"Amplitude (dB)" output, control, -40 to 12
	"Gain reduction (dB)" output, control, -24 to 0
	"Input" input, audio
	"Output" output, audio
$ applyplugin
Usage:	applyplugin [flags] <input Wave file> <output Wave file>
	<LADSPA plugin file name> <plugin label> <Control1> <Control2>...
	[<LADSPA plugin file name> <plugin label> <Control1> <Control2>...]...

veig com amb applyplugin podem ficar tota una cadena de plugins.

Pràctica: Com escriure un plugin LADSPA

Un plugin LADSPA no es más que una biblioteca dinámica (fichero *.so en UNIX o *.dll en Windows) y se genera igual que cualquier otra biblioteca. La norma LADSPA especifica qué funciones exportadas debe contener la biblioteca y en qué orden deben ser llamadas por el host (el programa que usa el plugin), las estructuras de datos usadas, etc


$ gcc -mno-cygwin -DBUILD_DLL -shared -o amp.dll -L./ amp.c -> el que em diu
$ gcc -DBUILD_DLL -shared -o libamp.so -fPIC -L./ amp.c -> el que funciona

$ ls -la libamp.so 
-rwxr-xr-x 1 joan joan 12635 2010-11-03 02:30 libamp.so

Ara hem de provar el plugin. Ho puc fer amb un programa host com ara el Audacity, Ardour, Jack-rack copio libamp.so a un dels directoris que hi ha en el LADSPA_PATH

$ sudo cp libamp.so /usr/lib/ladspa
analyseplugin /usr/lib/ladspa/libamp.so -> no es mostra la informació
$ gcc -DBUILD_DLL -shared -o libagc.so -fPIC -L./ agc.c
$ sudo cp libagc.so /usr/lib/ladspa

però $ analyseplugin /usr/lib/ladspa/libagc.so no dóna res. Hi ha alguna cosa en aquests exemples que no funciona.

Provo amb vocoder.c. Del Makefile extrec la següent informació:

INSTALL_PLUGINS_DIR     =       /usr/local/lib/ladspa/

###############################################################################
#
# GENERAL
#

INCLUDES        =       -I.
LIBRARIES       =       -lm
CFLAGS          =       $(INCLUDES) -Wall -Werror -O3 -fPIC
CC              =       cc

vocoder.so:     vocoder.c
        $(CC) $(CFLAGS) -o vocoder.o -c vocoder.c
        $(LD) -o vocoder.so vocoder.o -shared

Per tant, per compilar:

$ gcc -I. -Wall -Werror -O3 -fPIC -o vocoder.o -c vocoder.c
$ ld -o vocoder.so vocoder.o -shared

i es compila bé i es crea la llibreria correctament.

$ locate vocoder.so
/usr/lib/ladspa/vocoder.so
/usr/lib32/ladspa/vocoder.so
$ analyseplugin /usr/lib/ladspa/vocoder.so
Plugin Name: "Vocoder"
Plugin Label: "vocoder"
Plugin Unique ID: 1441
Maker: "Achim Settelmeier (adapted to LADSPA by Josh Green)"
Copyright: "None"
...
$ gcc -I. -Wall -Werror -O3 -fPIC -o amp.o -c amp.c
amp.c: In function ‘my_activate’:
amp.c:196: error: unused variable ‘ins’

Hem de treure l'opció -Werror, per tal que l'error es converteixi en warning:

$ gcc -I. -Wall -O3 -fPIC -o amp_joan.o -c amp_joan.c
amp.c: In function ‘my_activate’:
amp.c:196: warning: unused variable ‘ins’

i ara fem el linkatge:

$ ld -o amp_joan.so amp_joan.o -shared
$ cp amp_joan /usr/lib/ladspa
$ analyseplugin /usr/lib/ladspa/amp_joan.so

No troba res. Compte que hi ha un plugin amp.so que ve de ladspa_sdk. Dins del directori src/plugins tinc el codi font d'alguns plugins senzills que es poden compilar. Per exemple, vaig a adaptar amp.c d'aquí -> amp_joanillo.c

$ gcc -fPIC -DPIC -Wall -O2 -c -o amp_joanillo.o amp_joanillo.c
$ ld -shared -o amp_joanillo.so amp_joanillo.o
$ sudo cp amp_joanillo.so /usr/lib/ladspa
$ analyseplugin /usr/lib/ladspa/amp_joanillo.so

Plugin Name: "Joanillo Mono Amplifier"
Plugin Label: "amp_joanillo_mono"
Plugin Unique ID: 1048
Maker: "Joan Quintana - joanillo (LADSPA example plugins)"
Copyright: "Joanillo"
Must Run Real-Time: No
Has activate() Function: No
Has deactivate() Function: No
Has run_adding() Function: No
Environment: Normal or Hard Real-Time
Ports:	"Guany" input, control, 0 to ..., default 1, logarithmic
	"Input" input, audio
	"Output" output, audio

Plugin Name: "Stereo Amplificador"
Plugin Label: "amp_stereo"
Plugin Unique ID: 1049
Maker: "Joan Quintana - joanillo (LADSPA example plugins)"
Copyright: "None"
Must Run Real-Time: No
Has activate() Function: No
Has deactivate() Function: No
Has run_adding() Function: No
Environment: Normal or Hard Real-Time
Ports:	"Gain" input, control, 0 to ..., default 1, logarithmic
	"Input (esq)" input, audio
	"Output (esq)" output, audio
	"Input (dreta)" input, audio
	"Output (dreta)" output, audio

Ara sí que funciona. Ho provo amb el jack-rack (cercar per la S: stereo amplificador). Ara ja tinc un codi font de plugins a partir del qual poder fer proves i experiments.

Hi ha més exemples:

$ ls *.c
amp.c           amp_joanillo.o   amp.o    delay.o   filter.o  noise.o   sine.o
amp_joanillo.c  amp_joanillo.so  delay.c  filter.c  noise.c   sine.cpp

vocoder

Vocoder.jpg

Em descarrego el codi del vocoder, i el compilo (compte perquè s'ha d'aplicar un patch tal com diu el tutorial).

La idea del vocoder, tal com està explicat en el segon enllaç, és que la veu humana es pot descomposar en la part portadora (carrier, serien les freqüències altes de 1-20KHz), i la part moduladora (formant, és, de fet, el que porta la informació, i es correspon a la modulació que es fa amb els llavis, les dents, el paladar, i que és de baixa freqüència comparant amb la part portadora).

El vocoder el que fa és substituir la part portadora per un so sintètic (en el nostre cas ho faig amb el soft synth Zyn i escullo un patch de synth), i la part moduladora és directament el micròfon. El que jo parli encara serà reconeixible perquè la informació està en la part moduladora.

La configuració és una mica tricky, però ajuda pensar en el que estic fent: connecto el micro al jack-rack:in1 (formant), i el Zyn al jack-rack:in2 (portant) tal com es veu en el dibuix. Tractem les senyals com a mono. Finalment, en el jack-rack escullo el número de bandes. Cada banda representa un rang de freqüències, com si fos un equalitzador, i d'aquesta manera puc ajustar la importància que dono a cada rang de frequències. Com que tinc moltes bandes, la cosa dóna molt per jugar.

A vocoder aims to replace the carrier of your voice with another carrier from another source. Thus, it changes the sound 
of the voice but not the message when you speak. It takes formant and carrier from external sources and splits them up 
in bands (a band is a region of frequencies, same thing an equalizer does). Then, the envelope (the modulation) is extraced 
from each formant band. This part is done by an envelope follower, an extreme low pass filter. Next, formant bands are 
modulated onto the carrier bands and the resulting bands are mixed together to the output signal.


Treballo amb l'Edirol UA25EX en mode duplex.

Simple Oscillator

Analitzant i entenent bé aquests quatre exemples d'oscil.lador entendré bé com funcionen les senyals d'entrada i de sortida, i els ports que es creen, i quina diferència hi ha entre control i audio. L'exemple de vocoder no em funcionava, i la raó és que no entenia bé el funcionament.

Dins el codi sine.cpp estan tots els casos.

sine.so 	sine_faaa 	Sine Oscillator. Frequency input is audio, Amplitude input is audio.
sine.so 	sine_faac 	Simple Oscillator. Frequency input is audio, Amplitude input is control.
sine.so 	sine_fcaa 	Simple Oscillator. Frequency input is control, Amplitude input is audio.
sine.so 	sine_fcac 	Simple Oscillator. Frequency input is control, Amplitude input is control.
FAAA
no hi ha control. No apareix en el plugin cap slider
a writeble clients apareix:
in_1
in_2
sine_os_1-1_i1
sine_os_1-2_i1

FAAC
L'Amplitude és el control. Apareix un slider: Amplitude
no veig que faci res

FCAA
La freqüència és el control (slider:freqüència).
Si la freqüència val 1, sobre el senyal apareix una modulació de 1 Hz (recordem que el plugin és un oscil.lador). Per tant és una oscil.lació de freqüència.

TBD