FLOSS Manuals

 English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip

CSOUND Español

Csound: WAVESHAPING

WAVESHAPING

WAVESHAPING

Waveshaping is in some ways a relation of modulation techniques such as frequency or phase modulation. Waveshaping can create quite dramatic sound transformations through the application of a very simple process. In FM (frequency modulation) modulation synthesis occurs between two oscillators, waveshaping is implemented using a single oscillator (usually a simple sine oscillator) and a so-called 'transfer function'. The transfer function transforms and shapes the incoming amplitude values using a simple look-up process: if the incoming value is x, the outgoing value becomes y. This can be written as a table with two columns. Here is a simple example:

Waveshaping es de alguna manera una relación de técnicas de modulación como la frecuencia o la modulación de fase. Waveshaping puede crear transformaciones de sonido bastante dramáticas a través de la aplicación de un proceso muy simple. En FM (modulación de frecuencia), la síntesis de modulación se produce entre dos osciladores, el modelado de onda se implementa usando un solo oscilador (normalmente un simple oscilador senoidal) y una llamada función de transferencia. La función de transferencia transforma y da forma a los valores de amplitud entrantes usando un simple proceso de búsqueda: si el valor entrante es x, el valor saliente se convierte en y. Esto se puede escribir como una tabla con dos columnas. Aquí hay un ejemplo sencillo:

 

  Incoming (x) Value   Outgoing (y) Value
-0.5 or lower  -1
 between -0.5 and 0.5  remain unchanged
 0.5 or higher  1

 

 

Illustrating this in an x/y coordinate system results in the following graph:


 

Basic Implementation Model

Modelo básico de implementación

Although Csound contains several opcodes for waveshaping, implementing waveshaping from first principles as Csound code is fairly straightforward. The x-axis is the amplitude of every single sample, which is in the range of -1 to +1. This number has to be used as index to a table which stores the transfer function. To create a table like the one above, you can use Csound's sub-routine GEN07. This statement will create a table of 4096 points with the desired shape:

Aunque Csound contiene varios opcodes para wavehaping, la implementación wavehaping de los primeros principios como Csound código es bastante sencillo. El eje x es la amplitud de cada muestra, que está en el rango de -1 a 1. Este número tiene que ser utilizado como índice de una tabla que almacena la función de transferencia. Para crear una tabla como la anterior, puede utilizar la sub-rutina Csounds GEN07. Esta declaración creará una tabla de 4096 puntos con la forma deseada:

giTrnsFnc ftgen 0, 0, 4096, -7, -0.5, 1024, -0.5, 2048, 0.5, 1024, 0.5

 

Now two problems must be solved. First, the index of the function table is not -1 to +1. Rather, it is either 0 to 4095 in the raw index mode, or 0 to 1 in the normalized mode. The simplest solution is to use the normalized index and scale the incoming amplitudes, so that an amplitude of -1 becomes an index of 0, and an amplitude of 1 becomes an index of 1:

Ahora hay que resolver dos problemas. En primer lugar, el índice de la tabla de funciones no es -1 a 1. En cambio, es 0 a 4095 en el modo de índice en bruto, o 0 a 1 en el modo normalizado. La solución más simple es usar el índice normalizado y escalar las amplitudes entrantes, de modo que una amplitud de -1 se convierta en un índice de 0, y una amplitud de 1 se convierte en un índice de 1:

aIndx = (aAmp + 1) / 2

The other problem stems from the difference in the accuracy of possible values in a sample and in a function table. Every single sample is encoded in a 32-bit floating point number in standard audio applications - or even in a 64-bit float in recent Csound. A table with 4096 points results in a 12-bit number, so you will have a serious loss of accuracy (= sound quality) if you use the table values directly. Here, the solution is to use an interpolating table reader. The opcode tablei (instead of table) does this job. This opcode then needs an extra point in the table for interpolating, so we give 4097 as the table size instead of 4096.

El otro problema se deriva de la diferencia en la exactitud de los valores posibles en una muestra y en una tabla de funciones. Cada muestra individual se codifica en un número de punto flotante de 32 bits en aplicaciones de audio estándar o incluso en un flotador de 64 bits en Csound reciente. Una tabla con 4096 puntos resulta en un número de 12 bits, por lo que tendrá una pérdida grave de precisión (= calidad de sonido) si utiliza los valores de tabla directamente. Aquí, la solución es usar un lector de tabla de interpolación. El opcode tablei (en lugar de la tabla) hace este trabajo. Este opcode necesita un punto extra en la tabla para la interpolación, por lo que le damos 4097 como el tamaño de la tabla en lugar de 4096.

 

This is the code for simple waveshaping using our transfer function which has been discussed previously:

Este es el código para wavehaping simple utilizando nuestra función de transferencia que se ha discutido anteriormente:

 

EXAMPLE 04E01_Simple_waveshaping.csd

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
sr = 44100
ksmps = 32
nchnls = 2
0dbfs = 1

giTrnsFnc ftgen 0, 0, 4097, -7, -0.5, 1024, -0.5, 2048, 0.5, 1024, 0.5
giSine    ftgen 0, 0, 1024, 10, 1

instr 1
aAmp      poscil    1, 400, giSine
aIndx     =         (aAmp + 1) / 2
aWavShp   tablei    aIndx, giTrnsFnc, 1
          outs      aWavShp, aWavShp
endin

</CsInstruments>
<CsScore>
i 1 0 10
</CsScore>
</CsoundSynthesizer>

 

Powershape

Forma de poder

The powershape opcode performs waveshaping by simply raising all samples to the power of a user given exponent. Its main innovation is that the polarity of samples within the negative domain will be retained. It simply performs the power function on absolute values (negative values made positive) and then reinstates the minus sign if required. It also normalises the input signal between -1 and 1 before shaping and then rescales the output by the inverse of whatever multiple was required to normalise the input. This ensures useful results but does require that the user states the maximum amplitude value expected in the opcode declaration and thereafter abide by that limit. The exponent, which the opcode refers to as 'shape amount', can be varied at k-rate thereby facilitating the creation of dynamic spectra upon a constant spectrum input.

El opcode de powershape realiza wavehaping levantando simplemente todas las muestras a la energía de un exponente dado usuario. Su principal innovación es que se mantendrá la polaridad de muestras dentro del dominio negativo. Simplemente realiza la función de potencia en valores absolutos (valores negativos hechos positivos) y luego reinstala el signo menos si es necesario. También normaliza la señal de entrada entre -1 y 1 antes de dar forma y luego vuelve a escalar la salida por la inversa de cualquier múltiplo que se requirió para normalizar la entrada. Esto asegura resultados útiles, pero requiere que el usuario indique el valor máximo de amplitud esperado en la declaración del código operativo y, posteriormente, respete ese límite. El exponente, al que el opcode se refiere como cantidad de forma, se puede variar a velocidad k facilitando de este modo la creación de espectros dinámicos a una entrada de espectro constante.

If we consider the simplest possible input - a sine wave - a shape amount of '1' will produce no change (raising any value to the power of 1 leaves that value unchanged).

Si consideramos la entrada más simple posible - una onda senoidal - una cantidad de forma de 1 no producirá ningún cambio (elevar cualquier valor a la potencia de 1 deja ese valor sin cambios).

A shaping amount of 2.5 will visibly 'squeeze' the waveform as values less than 1 become increasingly biased towards the zero axis.

Una cantidad de conformación de 2,5 comprime visiblemente la forma de onda cuando valores inferiores a 1 se tornan cada vez más inclinados hacia el eje cero.

 

 

Much higher values will narrow the positive and negative peaks further. Below is the waveform resulting from a shaping amount of 50.

Valores mucho más altos reducirán aún más los picos positivos y negativos. A continuación se muestra la forma de onda resultante de una cantidad de conformación de 50.

 

Shape amounts less than 1 (but greater than zero) will give the opposite effect of drawing values closer to -1 or 1. The waveform resulting from a shaping amount of 0.5 shown below is noticeably more rounded than the sine wave input.

Las cantidades de forma inferiores a 1 (pero superiores a cero) darán el efecto opuesto de aproximar valores de dibujo a -1 o 1. La forma de onda resultante de una cantidad de conformación de 0,5 mostrada a continuación es notablemente más redondeada que la entrada de onda sinusoidal.

 

Reducing shape amount even closer to zero will start to show squaring of the waveform. The result of a shape amount of 0.1 is shown below.

Reducción de la cantidad de forma aún más cerca de cero comenzará a mostrar cuadratura de la forma de onda. A continuación se muestra el resultado de una cantidad de forma de 0,1.

 

The sonograms of the five examples shown above are as shown below:

Los sonogramas de los cinco ejemplos mostrados anteriormente son como se muestra a continuación:

As power (shape amount) is increased from 1 through 2.5 to 50, it can be observed how harmonic partials are added. It is worth noting also that when the power exponent is 50 the strength of the fundamental has waned somewhat. What is not clear from the sonogram is that the partials present are only the odd numbered ones. As the power exponent is reduced below 1 through 0.5 and finally 0.1, odd numbered harmonic partials again appear but this time the strength of the fundamental remains constant. It can also be observed that aliasing is becoming a problem as evidenced by the vertical artifacts in the sonograms for 0.5 and in particular 0.1. This is a significant concern when using waveshaping techniques. Raising the sampling rate can provide additional headroom before aliasing manifests but ultimately subtlety in waveshaping's use is paramount.

A medida que la potencia (cantidad de forma) aumenta de 1 a 2.5 a 50, se puede observar cómo se añaden los parciales armónicos. Vale la pena señalar también que cuando el exponente de potencia es 50 la fuerza de la fundamental ha disminuido algo. Lo que no está claro en el sonograma es que los parciales presentes son sólo los impares. A medida que el exponente de potencia se reduce por debajo de 1 a 0,5 y finalmente por 0,1, parciales de armónicos impares aparecen nuevamente, pero esta vez la fuerza del fundamental permanece constante. También se puede observar que el aliasing se está convirtiendo en un problema como se evidencia por los artefactos verticales en los sonogramas para 0,5 y en particular 0,1. Esto es una preocupación importante cuando se utilizan técnicas de ondas. Aumentar la velocidad de muestreo puede proporcionar espacio libre adicional antes de que se manifiesten los alias, pero en última instancia la sutileza en el uso de ondas es primordial.

 

Distort

The distort opcode, authored by Csound's original creator Barry Vercoe, was originally part of the Extended Csound project but was introduced into Canonical Csound in version 5. It waveshapes an input signal according to a transfer function provided by the user using a function table. At first glance this may seem to offer little more than what we have already demonstrated from first principles, but it offers a number of additional features that enhance its usability. The input signal first has soft-knee compression applied before being mapped through the transfer function. Input gain is also provided via the 'distortion amount' input argument and this provides dynamic control of the waveshaping transformation. The result of using compression means that spectrally the results are better behaved than is typical with waveshaping. A common transfer function would be the hyperbolic tangent (tanh) function. Csound now possesses an GEN routine GENtanh for the creation of tanh functions:

El opcode distorsionado, creado por el creador original de Csounds, Barry Vercoe, fue originalmente parte del proyecto Extended Csound, pero fue introducido en Csound canónico en la versión 5. Se wavehapes una señal de entrada de acuerdo con una función de transferencia proporcionada por el usuario utilizando una tabla de funciones. A primera vista esto puede parecer poco más de lo que ya hemos demostrado de los primeros principios, pero ofrece una serie de características adicionales que mejoran su usabilidad. La señal de entrada primero tiene compresión de rodilla suave aplicada antes de ser mapeada a través de la función de transferencia. La ganancia de entrada también se proporciona a través del argumento de entrada de la cantidad de distorsión y esto proporciona control dinámico de la transformación wavehaping. El resultado del uso de la compresión significa que espectralmente los resultados se comportan mejor de lo que es típico con wavehaping. Una función de transferencia común sería la función tangente hiperbólica (tanh). Csound ahora posee una rutina de GEN GENtanh para la creación de funciones de tanh:

GENtanh

f # time size "tanh" start end rescale

By adjusting the 'start' and 'end' values we can modify the shape of the tanh transfer function and therefore the aggressiveness of the waveshaping ('start' and 'end' values should be the same absolute values and negative and positive respectively if we want the function to pass through the origin from the lower left quadrant to the upper right quadrant).

Ajustando los valores de inicio y de fin podemos modificar la forma de la función de transferencia de tanh y por lo tanto la agresividad de la forma de onda (los valores de inicio y final deben ser los mismos valores absolutos y negativos y positivos respectivamente si queremos que la función pase a través del origen Desde el cuadrante inferior izquierdo hasta el cuadrante superior derecho).

Start and end values of -1 and 1 will produce a gentle 's' curve.

Los valores de inicio y fin de -1 y 1 producirán una suave curva.

 

This represents only a very slight deviation from a straight line function from (-1,-1) to (1,1) - which would produce no distortion - therefore the effects of the above used as a transfer function will be extremely subtle.

Esto representa sólo una desviación muy ligera de una función de línea recta de (-1, -1) a (1,1) - lo que no produciría distorsión - por lo tanto los efectos de lo anterior utilizado como una función de transferencia será extremadamente sutil.

Start and end points of -5 and 5 will produce a much more dramatic curve and more dramatic waveshaping:

Los puntos inicial y final de -5 y 5 producirán una curva mucho más dramática y más dramática wavehaping:

f 1 0 1024 "tanh" -5 5 0

 

Note that the GEN routine's argument p7 for rescaling is set to zero ensuring that the function only ever extends from -1 and 1. The values provided for 'start' and 'end' only alter the shape.

Tenga en cuenta que el argumento de rutinas GEN p7 para reescalar se establece en cero asegurándose de que la función sólo se extiende desde -1 y 1. Los valores proporcionados para el inicio y el final sólo alteran la forma.

In the following test example a sine wave at 200 hz is waveshaped using distort and the tanh function shown above.

En el ejemplo de prueba siguiente, una onda sinusoidal a 200 hz se forma en ondas utilizando la distorsión y la función tanh mostrada anteriormente.

 

EXAMPLE 04E02_Distort_1.csd 

<CsoundSynthesizer>
<CsOptions>  
-dm0 -odac
</CsOptions>

<CsInstruments>

sr = 44100
ksmps =32
nchnls = 1
0dbfs = 1

giSine  ftgen   1,0,1025,10,1           ; sine function
giTanh  ftgen   2,0,257,"tanh",-10,10,0 ; tanh function

instr 1
 aSig  poscil   1, 200, giSine          ; a sine wave
 kAmt  line     0, p3, 1                ; rising distortion amount
 aDst  distort  aSig, kAmt, giTanh      ; distort the sine tone
       out      aDst*0.1
endin

</CsInstruments>
<CsScore>
i 1 0 4
</CsScore>
</CsoundSynthesizer>

The resulting sonogram looks like this:

 

As the distort amount is raised from zero to 1 it can be seen from the sonogram how upper partials emerge and gain in strength. Only the odd numbered partials are produced, therefore over the fundemental at 200 hz partials are present at 600, 1000, 1400 hz and so on. If we want to restore the even numbered partials we can simultaneously waveshape a sine at 400 hz, one octave above the fundamental as in the next example:

A medida que la cantidad de distorsión se eleva de cero a 1, puede verse en el sonograma cómo emergen los parciales superiores y aumentan su fuerza. Sólo se producen los parciales impares, por lo tanto sobre el fundemental a 200 hz los parciales están presentes en 600, 1000, 1400 hz y así sucesivamente. Si queremos restaurar los parciales pares pares podemos simultáneamente modelar un seno a 400 hz, una octava por encima de la fundamental como en el siguiente ejemplo:

EXAMPLE 04E03_Distort_2.csd

<CsoundSynthesizer>
<CsOptions>
-dm0 -odac
</CsOptions>
<CsInstruments>

sr = 44100
ksmps =32
nchnls = 1
0dbfs =    1

giSine    ftgen    1,0,1025,10,1
giTanh    ftgen   2,0,257,"tanh",-10,10,0

instr 1
 kAmt  line     0, p3, 1                 ; rising distortion amount
 aSig  poscil   1, 200, giSine           ; a sine
 aSig2 poscil   kAmt*0.8,400,giSine      ; a sine an octave above
 aDst  distort  aSig+aSig2, kAmt, giTanh ; distort a mixture of the two sines
       out      aDst*0.1
endin

</CsInstruments>

<CsScore>
i 1 0 4
</CsScore>
</CsoundSynthesizer>

The higher of the two sines is faded in using the distortion amount control so that when distortion amount if zero we will be left with only the fundamental. The sonogram looks like this:

El mayor de los dos senos se desvaneció en el uso del control de la cantidad de distorsión de modo que cuando la cantidad de distorsión si cero nos quedará con sólo el fundamental. El sonograma se ve así:

What we hear this time is something close to a sawtooth waveform with a rising low-pass filter. The higher of the two input sines at 400 hz will produce overtones at 1200, 2000, 2800... thereby filling in the missing partials.

Lo que oímos esta vez es algo cercano a una forma de onda de diente de sierra con un filtro de paso bajo ascendente. El más alto de los dos senos de entrada a 400 hz producirá armónicos a 1200, 2000, 2800 ... rellenando así los parciales que faltan.

REFERENCES

Distortion Synthesis - a tutorial with Csound examples by Victor Lazzarini http://www.csounds.com/journal/issue11/distortionSynthesis.html

There has been error in communication with Booktype server. Not sure right now where is the problem.

You should refresh this page.