Posted by hordia on 17th May 2010
If you ever wrote at least 2 audio plugins in your life, for sure you have noticed you had to write a lot of duplicated code. In other words, most of the times, writing a plugin there is very little entropy from your code.
My first approach to this problem was some years ago when i did a simple code generator of the base code of a clam plugin (see these clam-devel threads for more info ‘Commit #11195: templated plugins generator‘ and ‘Frontend for automatic generation of plugin code‘)
Now i’m with a simple but i think powerful project (derived from the needs i noticed at club de audio de la fiuba) to have an application to generate code of different standards using XML based specifications. Then, as before, you nearly only need to write the signal processing code of the plugin (and can forget about the mechanical work).
The idea is to get VST, LADSPA, lv2, CLAM, Audio Units and possibly others standards base code ready to compile for different operating systems and using different build systems. Indeed, once finished, will be easy to implement new modules for others plugins specifications since will consist only into implement an interface.
My proposed xml specification (comments and suggestions are welcome!), showed as a clam plugin definition example is here. Basically contains metadata, input and output ports and controls and other build definitions:
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE AudioPlugin SYSTEM "AudioPluginDef.dtd">
<audioplugin Version="0.1">
<metadata>
<name>TestRtPlugin</name>
<description>This is a test realtime audio plugin</description>
<authors>Fulano, Sultano, Mengano</authors>
<copyright Year="2010">Club de Audio FIUBA</copyright>
<license>GPL</license>
<category>Plugins</category>
</metadata>
<inputs>
<port Name="L Input">AudioInPort</port>
<port Name="R Input">AudioInPort</port>
<control Name="Gain" Min="0." Max="1.0" DefaultValue=".5">InControlFloat</control>
</inputs>
<outputs>
<port Name="L Output">AudioOutPort</port>
<port Name="R Output">AudioOutPort</port>
</outputs>
<outputplugin Standard="CLAM" BuildSystem="Scons" OS="Linux">
<basetemplatename>Default</basetemplatename>
<clam_defaultconfig> <!-- CLAM plugin specific configuration -->
<baseclass>Processing</baseclass>
<withconfig>True</withconfig>
</clam_defaultconfig>
</outputplugin>
</audioplugin>
I also thought about an UID (Uniqued ID) field at metadata, there is not showed in the example since is not needed to clam plugins.
There is also a .dtd file to check the correctness of the plugin spec.
audio
, CLAM
, ClubAudioFiuba
, english
, free software
, ideas
, plugins
, programming
, projects
, python
, signal processing
, specifications
, standards 
Share This/Compártelo
Posted in audio, signal processing, free software, programming, python, projects, English, CLAM, standards, plugins, specifications, ideas, ClubAudioFiuba | No Comments »
Posted by hordia on 26th August 2007
Working to have audio-to-midi in NetworkEditor (CLAM) I needed to convert a fundamental frequency value to a MIDI note one.
I found some source code related with this in Voice2MIDI app, but was not explained at all, so looking for the reason of that formula I arrived at this:
Knowing about equal-tempered scale (check this) and
relation between frequencies plus the fact that C4 or “middle c” has a MIDI value of 60, it’s easy to conclude that then A4 (which its frequency value is 440Hz, a standard for tunning and is 9 semi-tones more) has a MIDI value of 69.
Then, starting with:

It’s easy to arrive at this:

and then, also taking in account this mathematical relation::

the final formula looks like:

and a final c++ code like:
fund_midinote = round( 69. + log(fundfrec/440.)*17.31234 );
Related post: nictuku’s inverse formula (i.e. from MIDI to Hz) here “Translanting MIDI Notes to frequencies in the diatonic scale using the central A (440hz) as reference“.
algorithms
, audio
, c++
, CLAM
, english
, GSoC2007
, math
, midi
, music theory
, programming
, standards 
Share This/Compártelo
Posted in audio, algorithms, programming, music theory, c++, midi, math, English, CLAM, standards, GSoC2007 | No Comments »
Posted by hordia on 6th August 2007
Hace un tiempo escribí un par de funciones para trabajar con wavs en python como si fuesen vectores, es decir, al “estilo” matlab (para más detalles ver este post “Funciones para trabajar con wav’s vectorialmente en python“).
Casualmente en la misma semana 2 personas, Cesar Perez (Colombia) y Elizabeth Coixet (España), me escribieron a este blog comentandome que estaban usando mis funciones con éxito pero tenian problemas al leer wav’s de 8 bits. Les recomendé que lo charlaramos en el grupo Buena Señal ya que entre todos (y posiblemente alguna contribución de alguno más de los del grupo) seguramente iba a ser más fácil y todos podriamos aprender algo de ello (ver estos 2 threads: 1, 2).
Y asi fue
Luego de que Cesar planteara el problema y yo hiciese mis apreciaciones sobre el asunto, Elizabeth encontró que el wav de 8 bits era unsigned y no signed (como el de 16 bits) con lo que se termino de resolver el misterio de porque la solución que manejabamos leia en forma extraña…
Bueno la función queda asi:
# Example: [ y, Fs, bits ] = wavread8bits( 'filename' )
def wavread8bits( name ):
file = wave.open( name, 'r' )
[Channels,Bytes,Fs,Frames,Compress,CompressName] = file.getparams() # (nchannels, sampwidth in bytes, sampling frequency, nframes, comptype, compname)
Bits = Bytes*8 # 8 bits per sample
Data = file.readframes( Frames )
Data = (fromstring( Data, UInt8 ) / 128.0 ) - 1.0 # -1..1 values
print "Fs: ",Fs,"\nBits: ",Bits,"\nChannels: ",Channels
file.close()
return Data, Fs, Bits
De paso también escribí la función para escribir un wav de 8 bits.
# Example: wavwrite8bits( y, Fs, filename )
def wavwrite8bits( data_array, Fs, name ):
file = wave.open( name, 'w' )
file.setframerate( Fs ) # sets sampling frequency
file.setnchannels( 1 ) # sets number of channels
file.setsampwidth( 1 ) # number of bytes, 8 bits per sample
clipped = False
block_size = 1024*10 # write block size: 10k
a_max = 255 # max amp
a_min = 0 # min amp
n = 0
len_data_array = len( data_array ) # 1 byte (UInt8) data
while n < len_data_array :
frame = '' # string frame of 'block_size'
for i in range( block_size ) :
if n < len_data_array :
newbyte = int( (data_array[n]+1.0) * 128 ) # ~ 255/2
if newbyte > a_max or newbyte < a_min : clipped = True
newbyte = min( max(newbyte,a_min), a_max ) # normalization, 0..255
#newbyte.clip( min=a_min, max=a_max ) # normalization, 0..255
frame += chr( newbyte & 0xFF ) # takes the byte, converts it to char and adds it to the frame
n += 1
file.writeframes( frame )
if clipped == True : print "Warning: Some values were clipped"
print "Final length:", len_data_array/512,"kb" # n*2/1024 (bytes size/1024) = n/512
file.close()
El archivo con todas estas funciones de lectura/escritura (8 y 16 bits) es este: wav_array.py
Gracias a todos!
algorithms
, audio
, Castellano
, formats
, GPL
, programming
, python 
Share This/Compártelo
Posted in audio, algorithms, programming, GPL, formats, python, Castellano | No Comments »
Posted by hordia on 12th July 2007
CLAM es un completo framework para hacer investigación y desarrollo sobre audio y música (esto también incluye aplicaciones para usuarios finales). Ofrece un modelo conceptual y herramientas para el análisis, la síntesis y el procesamiento de señales de audio. Tiene una interfaz muy amigable, es Software Libre, multiplataforma y esta escrito en C++ (en muchas de sus aplicaciones utiliza tiempo real).
A pesar de que tuvo su origen en una Universidad de Barcelona, España, la documentación en español sobre este framework es escasa, asi que me decidí a hacer una pequeña introducción sobre las cosas básicas, pero con links (eso si, la mayoria en inglés) para el que quiera ir más allá. Pienso que le puede servir a más de uno para empezar.
Básicamente hay dos perfiles: el de usuario final (de las aplicaciones) y el de desarrolladores que quieran escribir sus propios programas sobre este framework.
En este momento se compone de 4 programas principales:
NetworkEditor:
Es una aplicación que permite conectar módulos en forma de red de procesamiento al estilo pd (pero mucho más amigable), MaxMSP o Reaktor (o para los que usan matlab, tipo simulink). Estas redes se ejecutan en tiempo real y se pueden correr con jack, portaudio, LADSPA o VST como backend.
Una de las características más interesantes es que esta red se puede exportar y después correr con una interfaz gráfica diseñada con QTDesigner (ambos programas exportan a un xml que luego se corre con la aplicación Prototyper)
Recomiendo ver esta presentación: “Visual prototyping of audio applications”
Es decir, un usuario que no es programador puede armar complejos plugins o aplicaciones sin escribir una sola línea de código. También es muy útil para armar prototipos de futuras aplicaciones o desarrollos.
En este momento se esta integrando con LADSPA, lv2 y se planea reforzar aún más la posibilidad de usar plugins externos (como un módulo más) dentro del NetworkEditor y vicerversa, usar estas redes como plugins en otras aplicaciones.
Para el que quiera empezar, recomiendo esto:
Annotator:
Es un programa para hacer transcripciones, en el estilo de Sonic Visualizer. Muy potente y con características que lo hacen único.
Para conocer más:
SMSTools:
Un analizador de señales de audio en el estilo de wavesurfer que soporta diferentes tipos de visualización como spectogramas, y todas las derivadas del módelo Sinusoides + Residuo asi como trasnformaciones complejas basadas en este modelo (gender change, pitch-shifting, morph, etc) y muchas otras cosas más (ver tutorial).
Voice2MIDI:
Convierte voz en MIDI. Esta comentado en este artículo de linuxjournal.
Para desarrolladores, sirve como entorno para realizar sus propias aplicaciones de forma fácil o como herramienta para hacer prototipos de sus futuras implementaciones.
Recomiendo:
Si uno quiere, puede aportar al proyecto mandando ‘patchs’ de código a los desarrolladores principales y hasta convertirse en ‘developer’ luego de haber mandado varios de ellos.
En fin, es un proyecto bastante grande y ambicioso. Incluso hay miles de desarrollos más sobre el mismo que no están en el ‘paquete principal’, pero me pareció útil dar un panorama general porque tal vez sea tan abarcativo que maree un poco para el que recién escucha algo de él.
Como ya dije, es multiplataforma y esta disponible para GNU/Linux (con paquetes para varias distribuciones), Windows y Mac (ver más y descargar)
Otro links interesantes:
algorithms
, audio
, c++
, Castellano
, CLAM
, effects
, free software
, GNU/Linux
, GPL
, GSoC2007
, GUI
, libraries
, library
, midi
, music
, noise
, programming
, projects
, publications
, signal processing
, speech
, standards 
Share This/Compártelo
Posted in audio, algorithms, effects, signal processing, music, free software, programming, GNU/Linux, GPL, c++, noise, libraries, midi, publications, projects, Castellano, CLAM, standards, speech, GSoC2007, GUI, library | No Comments »
Posted by hordia on 24th May 2007
This post has the main purpose of showing my support to the Free Software Foundation campaign called “playogg” which was launched by the FSF this 16 of May of 2007, in Boston, Massachusetts, U.S.A. and basically wants to spread the use of the ogg vorbis codec in all platforms.
To begin, the ogg vorbis format is technically better than mp3, compressing with better quality and less space. For example, among other things, whereas an mp3 with normal quality takes 128kb with an ogg vorbis file “is enough” with 64kb.
More technical info about the format here: xiph.org
On the other hand, although in my country (Argentina), at least so far there are no problems with software patents, that’s not the case of countries like United States and many others, where indeed they can’t use free programs with an excellent implementation from the mp3 standard like LAME.
In order to have an idea about the costs of mp3, you can check: http://www.mp3licensing.com/royalty
The ogg vorbis specification is in the public domain so anyone can use the format or write software to use it without being dependent on a patent holder for permission.
In addition, this format was recently extended also to personal music players (I believe that was one of the main problems for normal users). And more, recently I found out a very interesting project to replace the firmware of those gadgets by free versions, and of course most of them also implements the ogg vorbis codec, I’m speaking about the Rockbox project.
Update: Mobile players known to support ogg vorbis here: PortablePlayers.
algorithms
, audio
, codecs
, english
, formats
, free culture
, free software
, hardware
, music
, projects
, standards 
Share This/Compártelo
Posted in audio, algorithms, free culture, music, free software, hardware, codecs, formats, projects, English, standards | No Comments »
Posted by hordia on 23rd May 2007
Este post tiene como finalidad mostrar mi apoyo a la campaña organizada por la Free Software Foundation denominada “playogg” la cual fue lanzada por la FSF este 16 de mayo de 2007, en Boston, Massachusetts, EEUU y básicamente prentende fomentar el uso del codec ogg vorbis en todas las plataformas.
Para empezar, el formato ogg vorbis es muy superior técnicamente al mp3, comprimiendo con mejor calidad y ocupando menos espacio. Por ejemplo, entre otras cosas, mientras que un mp3 de calidad aceptable arranca en los 128kb un archivo ogg vorbis “ya se escucha bien” con 64kb.
Más info técnica del formato aca: xiph.org
Por otro lado, a pesar de que en mi país (Argentina), al menos por ahora no hay problemas con las patentes de software, ese no es el caso de países como Estados Unidos y muchos otros más en los que incluso hay trabas para utilizar programas libres que implementan de forma excelente el standard mp3 como LAME.
Para tener una idea de los costos del mp3 se puede consultar: http://www.mp3licensing.com/royalty
La especificación de ogg vorbis está en el dominio público y cualquiera puede implementarla y darle la utilización que prefiera sin depender de ningún permiso de algún tenedor de patentes.
Además, recientemente este formato se extendió también entre los reproductores personales de música (creo una de las trabas más grandes que habia para el usuario común). Y es más, hace poco me enteré de un interesante proyecto para reemplazar los firmwares de estos aparatos por versiones libres y que generalmente también implementan ogg vorbis por las razones antes mencionadas, hablo del proyecto Rockbox.
Update: Para saber que reproductores portátiles soportan ogg vorbis consultar el siguiente link: PortablePlayers.
algorithms
, audio
, Castellano
, codecs
, formats
, free culture
, free software
, hardware
, projects
, standards 
Share This/Compártelo
Posted in audio, algorithms, free culture, free software, hardware, codecs, formats, projects, Castellano, standards | No Comments »
Posted by hordia on 20th May 2007
Es un modelo de análisis/síntesis para procesamiento espectral orientado a aplicaciones musicales y de audio. Se puede ver como una generalización de la STFT (transformada de tiempo corto) y los modelos sinusoidales. Básicamente añade flexibilidad a la STFT manteniendo buena fidelidad de sonido y una representación eficiente.
Este modelo también es conocido como SMS (Spectral Modeling Synthesis) y como HILN en el contexto de MPEG4.
Básicamente esta modelado como la suma de un conjunto de sinusoides (los “sobretonos” estables armónicos o no, las componentes determinísticas del sonido) más el residuo de ruido (modelado como un proceso estocástico) como dos componentes separadas:
![s(t) = \sum_{r=1}^R A_r(t) cos[ \Phi_r(t)] + e(t) s(t) = \sum_{r=1}^R A_r(t) cos[ \Phi_r(t)] + e(t)](http://audiores.uint8.com.ar/blog/mimetex/pictures/522c595214e80d353ed7445c5887db9f.gif)
donde
y
son la amplitud y fase instantaneas de la
sinusoide respectivamente, y
es la componente de ruido en el tiempo
.
La fase instantanea de la ecuación es: 
El primer paso del análisis detecta los
sobretonos presentes en el espectro y los representa con sinusoides que varian con el tiempo . Luego se le resta al sonido original las componentes sinusoidales para obtener el “residuo” (ver el diagrama de bloques).
La señal residual es modelada como un proceso estocástico y se describe como ruido blanco filtrado:

donde
es ruido blanco y
es la respuesta al impulso de un filtro que varia con el tiempo evaluada en el instante
.
El residuo comprende la energía debida a vibraciones no estacionarias y a cualquier otra componente energética de naturaleza no sinusoidal.
Algunas áreas donde este modelo se puede aplicar:
- análisis
- compresión de sonido
- separación de fuentes de sonido
- acústica musical
- percepción musical
Algunos links con más información sobre este modelo:
Este tipo de cosas me hace acordar que tengo que postear sobre la tesis de
Juan Vuletich: “
Nuevas bases para el procesamiento de música en el dominio tiempo-frecuencia” (
aca un paper sobre la misma idea) un enfoque diferente para este tipo de cosas (
wavelets) que pienso que merece (como mínimo) un post entero lo antes posible.
audio
, Castellano
, CLAM
, GSoC2007
, noise
, publications
, signal processing
, sound
, standards 
Share This/Compártelo
Posted in audio, signal processing, noise, publications, Castellano, CLAM, standards, GSoC2007, sound | No Comments »
Posted by hordia on 20th May 2007
Is an analysis/synthesis model for spectral processing oriented to audio and music applications. We can see it as a generalization of STFT and sinusoidal models, basically adds more flexibility to STFT while maintaining a good sound fidelity and efficient representation.
This model is also known as SMS (Spectral Modeling Synthesis) and HILN in the context of MPEG4.
Basically is modeled as the sum of a set of sinusoids (only the stable partials of a sound, harmonics or not, deterministic components) plus a noise residual (modeled as stochastic process) as two separate components:
![s(t) = \sum_{r=1}^R A_r(t) cos[ \Phi_r(t)] + e(t) s(t) = \sum_{r=1}^R A_r(t) cos[ \Phi_r(t)] + e(t)](http://audiores.uint8.com.ar/blog/mimetex/pictures/522c595214e80d353ed7445c5887db9f.gif)
where
and
are the instantaneous amplitude and phase of the
sinusoid respectively, and
is the noise component at time
.
The instantaneous phase of the equation is: 
The first analysis step detects partials present in the spectra and represents them with time-varying sinusoids. Then the sinusoidal component is subtracted from the original sound to obtain the remaining “residual” (see the block diagram).
This residual signal is modeled as stochastic process and is described as filtered white noise:

where
is white noise and
is the response of a time varying filter to an impulse at time
.
The residual comprises the energy produced by not stationary vibrations plus any other energy component that is not sinusoidal in nature.
Some areas where this model could be applied:
- analysis
- sound compression
- sound source separation
- musical acoustics
- music perception
Some links with more info about this model:
These kind of things remembers me that I have to post about
Juan Vuletich thesis: “
New bases for music processing in the time-frequency domain” (ATM only in Spanish,
here a paper about the same idea) a different approach of those kind of things (
wavelets) which I think deserves a (at least) an entire post ASAP.
audio
, CLAM
, english
, GSoC2007
, noise
, publications
, signal processing
, sound
, standards 
Share This/Compártelo
Posted in audio, signal processing, noise, publications, English, CLAM, standards, GSoC2007, sound | No Comments »
Posted by hordia on 29th March 2007
Algunos ecos de lo que fue LAC2007:
Parece que todo el “streaming recolectado” va a estar disponible para bajar en esta dir: link.
Por otra parte, estos días (del 27 al 31 de marzo) se esta llevando a cabo en Frankfurt, Alemania, la exposición (creo más grande del mundo) de instrumentos, software y hardware musical y accesorios denominada Musikmesse.
Conclusión: LAC2007 en Berlin, Musikmesse en Frankfurt, parece que todo pasa por Alemania…
algorithms
, alsa
, audio
, c++
, Castellano
, codecs
, conferences
, effects
, events
, formats
, free culture
, free software
, GNU/Linux
, GPL
, hardware
, instruments
, libraries
, lutheria
, midi
, music
, open source
, programming
, publications
, python
, signal processing
, talks 
Share This/Compártelo
Posted in audio, algorithms, effects, signal processing, free culture, music, free software, programming, instruments, GNU/Linux, GPL, open source, c++, hardware, codecs, libraries, formats, alsa, midi, lutheria, python, publications, Castellano, talks, events, conferences | No Comments »
Posted by hordia on 23rd March 2007
Aprovecho la información que organicé para contestar un mail en una lista de Musix para hacer un post sobre conversión de audio a MIDI. El mail que contesté era de alguien que estaba buscando software de código abierto que hiciera eso (conversión audio-midi).
Dentro de los proyectos software libre yo conozco:
El wave2mid, que fue desarrollado como un proyecto de fin de carrera (Ingeniería Electrónica en la Universidad de Granada) por Pablo Busto González. Originalmente codificado en Matlab, luego fue migrado a Octave por la misma persona para poder distribuirlo libremente! Aún no tuve la oportunidad de probarlo ni examinar el código fuente, pero al menos parece estar bastante bien documentado (aunque en la misma página web anticipan que es muy lento, como era de esperar por estar desarrollado sobre este tipo de programas que en todo lo que no sea multiplicación de matrices dejan mucho que desear en cuanto a velocidad).
Programados en C++, están el Free Audio Note Recognition, también conocido simplemente como fanr (polifónico) y el Midingsolo (monofónico).
Nunca los probé y no se en que estado están. Tampoco se cual es el “estado del arte” en este tema, no se si hay algún programa (de código abierto o no) que realmente lo haga bien. La última vez que probé programas de este tipo fue hace muchos años y no quedé para nada conforme.
Algunas cosas relacionadas que conozco, que no hacen específicamente esto pero creo que pueden servir de referencia son:
El Voice2MIDI, que como su nombre lo indica esta orientado a la conversión de voz a midi, no de instrumentos. El trabajo que le dió origen parece estar aqui. Es parte del framework CLAM y según el pdf antes citado fue presentado como proyecto de fin de carrera de Ingeniería Técnica en Informática de Sistemas en la Universitat Pompeu Fabra y lo tuvo como director a Xavier Amatriain (uno de los principales desarrolladores del proyecto CLAM). Fue revisado aqui (en realidad se revisa el proyecto CLAM en general, pero también se le dedican unas palabras a este soft)
Tartini, una herramienta de análisis musical en tiempo real que esta orientado a una completa visualización del timbre de notas interpretadas por instrumentos o voz (tiene varios tipos de vistas) y entre otras cosas sirve para identificarlas (aunque creo que no de forma automatizada) y analizar su contenido espectral de diferentes maneras. Fue resultado de un trabajo para obtener un PhD y el autor, Philip McLeod ofrece un par de papers al respecto en su web (yo se los pedí hace un tiempo y me los envío enseguida).
Reciéntemente Avelino Herrera Morales hizo en su blog varios posts sobre separación de fuentes de sonido (que pueden venir bien para que sea polifónico!) y algunas implementaciones de algoritmos (liberadas bajo GPL!) para lograrlo:
¿Alguien conoce algo más?
algorithms
, audio
, Castellano
, CLAM
, formats
, free software
, GPL
, instruments
, matlab
, midi
, programming
, signal processing 
Share This/Compártelo
Posted in audio, algorithms, signal processing, free software, programming, instruments, matlab, GPL, formats, midi, Castellano, CLAM | No Comments »