jzu - Tag - LADSPAUn peu de tout et de rien, et beaucoup de n'importe quoi2014-03-05T09:25:29+01:00Jean Zundelurn:md5:f3670f93ee9b6d0bf8c4b9dc5ac3c746DotclearDespiker & Satanaurn:md5:8c98677df1fa03e64894afce185134e52012-09-02T14:42:00+02:00jean zundelAudacityeffetGNU-LinuxguitareLADSPAmusique <p>Le <a href="https://github.com/jzu/despiker">Despiker</a> est un petit plugin <a href="http://www.ladspa.org/">LADSPA</a>. Il ne
marche pas tout le temps. Il est même possible que la différence soit peu
audible pour certains.</p>
<p>C'est normal. Le problème est complexe. Le besoin n'est pas moins courant : la
récupération d'enregistrements où des saturations numériques ponctuelles
<a href="http://fr.wikipedia.org/wiki/Contrep%C3%A8terie">brouillent l'écoute</a>.
Le Despiker fonctionne assez bien dans ces cas-là.</p>
<p>Il ne convient pas du tout à d'autres cas de distorsion. Un signal saturé
sur une période plus longue que quelques dixièmes de seconde reste saturé et
le filtrage opéré le dégrade encore de manière apparemment aléatoire. Quand
c'est le micro qui sature au départ, les mouvements de la membrane provoquent
des interférences sur une plage de fréquences beaucoup trop large et avec une
amplitude trop faible pour qu'elles puissent être détectées et atténuées.
Hormis ces cas de figure, en se restreignant à celui de la pure saturation
numérique, ce plugin a son utilité. Et une autre, aussi, découverte par hasard,
mais voyons d'abord son fonctionnement.</p>
<p>Le principe consiste à appliquer un filtre passe-bas uniquement sur les parties
de l'onde qui dépassent une valeur donnée, celle-ci étant déterminée par la
pifométrie la plus rigoureuse. Ce filtre repose sur une matrice de convolution
à une dimension dont les coefficients ont été déterminés avec la même rigueur
méthodologique que la valeur du seuil (à vrai dire, il existe des
<a href="http://en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_smoothing_filter">séries de valeurs optimales</a>).</p>
<p>Quant à l'algorithme, il est constitué de trois étapes.</p>
<ol>
<li>À chaque fois que le signal passe par zéro, et donc qu'il change de signe, cette position dans le flux est stockée pour pouvoir y revenir par la suite.</li>
<li>Quand l'intensité du signal dépasse le seuil, un indicateur est mis à 1.</li>
<li>Dès que le signal repasse par zéro, et si l'indicateur est positionné, il est réécrit depuis le point de repère précédent, en y appliquant la matrice de convolution qui a tendance à gommer les détails et donc les hautes fréquences.</li>
</ol>
<p>Les plateaux créés par une saturation numérique verront leurs angles arrondis
et pourront même disparaître s'ils sont étroits. Petite démonstration en
images pour un cas un peu extrême :</p>
<p><a href="http://jzu.blog.free.fr/public/Despiker/avant-despiker-cut.gif"><img src="http://jzu.blog.free.fr/public/Despiker/.avant-despiker-cut_m.jpg" alt="Avant (extrait)" style="display:block; margin:0 auto;" title="Avant" /></a></p>
<p><a href="http://jzu.blog.free.fr/public/Despiker/apres-despiker-cut.gif"><img src="http://jzu.blog.free.fr/public/Despiker/.apres-despiker-cut_m.jpg" alt="Après (extrait)" style="display:block; margin:0 auto;" title="Après" /></a></p>
<p>Et pour un signal moins saturé :</p>
<p><a href="http://jzu.blog.free.fr/public/Satana/original.gif"><img src="http://jzu.blog.free.fr/public/Satana/.original_m.jpg" alt="Signal d'origine, non traité" style="display:block; margin:0 auto;" title="Signal d'origine, non traité" /></a></p>
<p><a href="http://jzu.blog.free.fr/public/Satana/despiker.gif"><img src="http://jzu.blog.free.fr/public/Satana/.despiker_m.jpg" alt="Signal traité par Despiker" style="display:block; margin:0 auto;" title="Signal traité par Despiker" /></a></p>
<p>J'ai découvert accidentellement une autre utilité à cet algorithme. Sur une
piste « propre », c'est-à-dire sans saturation, mais où figurent aléatoirement
des pics n'ayant rien à voir avec la dynamique de la musique, on ne peut pas
normaliser à 0 dB de manière efficace. Les pics doivent être fastidieusement
retouchés à la main pour arriver à un niveau global décent. Ce programme les
gomme automatiquement et sans toucher au reste. L'effet est insensible quand
des pics isolés sont traités. On peut ensuite amplifier la piste à environ 1 dB
de plus par rapport au niveau d'origine.</p>
<p>Ce comportement fait tout de suite penser à celui d'un
<a href="http://fr.wikipedia.org/wiki/Compresseur_%28audio%29">compresseur/limiteur</a>. Et c'en
est un, finalement, bien que primitif et d'une utilité très limitée. Il est
toujours possible de relancer le cycle plugin + amplification mais au risque
d'impacter de plus nombreuses parties d'ondes et donc de rendre le traitement
audible.</p>
<pre></pre>
<p>Ce qui peut être intéressant, à condition d'appliquer le même principe d'une
manière un peu différente dans un autre contexte. C'est tout l'objet de
<a href="https://github.com/jzu/satana">Satana</a> (Saturation Analogique), qui dérive
du Despiker. Le signal y est traité indépendamment d'un
quelconque seuil, mais sur chaque point du signal proportionnellement à
l'amplitude de ce point. Un signal faible est laissé quasiment tel quel alors
que les échantillons proches de la saturation passent entièrement par le filtre
passe-bas.</p>
<p>L'évolution du mix entre le signal brut et le signal traité peut être linéaire
ou suivre une fonction quelconque du moment que <code>f(0)=0</code> et
<code>f(1)=1</code> ; par exemple, j'aime bien <code>sin(x*π/2)</code> en ce moment.</p>
<p>Le résultat, qui dépend des coefficients de convolution et de la fonction
d'application du filtre, ressemble de loin à une saturation analogique. Je
voudrais arriver à celle d'une bande de magnétophone dont les VU-mètres sont
calés dans le rouge. Idéalement, la fonction choisie devrait représenter le
comportement de la bande quand on la pousse dans ses retranchements. Il est
malheureusement très difficile, voire impossible, de trouver des exemples
pertinents de l'évolution du spectre d'un signal au fur et à mesure qu'il
sature une bande magnétique et il faudrait donc mettre en place un banc d'essai
avec un Revox (quand j'aurai moins la flemme). Pour l'instant, il donne un son
plutôt proche d'un ampli aux lampes rincées.</p>
<p>Bah. Satana fonctionne assez bien pour mes besoins, même s'il est ralenti par
cette fonction d'application du filtre.</p>
<p>Satana peut aussi servir à récupérer une saturation numérique (un étage
asymétrique pour les harmoniques paires suivi d'un symétrique pour les
impaires) en la transformant en distorsion simili-analogique, dans les cas où
on veut, pas forcément le son d'origine, mais un son, au sens de « un son
particulier ». Le filtre passe-bas contrôlé par les 2e et 3e paramètres du
plugin remplace celui du Despiker en plus progressif.</p>
<p>Je m'en sers surtout comme compresseur. L'altération du son, réelle et audible,
n'est pas désagréable quand on cherche plus l'efficacité que la haute-fidélité,
sans l'effet de « pompage » des compresseurs habituels quand ils sont poussés à
bloc.</p>
<p>Reprenons le deuxième exemple de traitement par Despiker, cette fois en appliquant Satana avec comme paramètres</p>
<ul>
<li><code>Compression = 1 </code> (une seule itération de la compression)</li>
<li><code>Sélectivité = 2.2 </code> (pas mal de points seront traités)</li>
<li><code>Efficacité = 25 </code> (nombre maximum de coefficients, donc très filtré)</li>
<li><code>Volume = 1 </code> (inchangé... mais le volume perçu sera plus élevé).</li>
</ul>
<pre></pre>
<p><a href="http://jzu.blog.free.fr/public/Satana/original.gif"><img src="http://jzu.blog.free.fr/public/Satana/.original_m.jpg" alt="Signal d'origine, non traité" style="display:block; margin:0 auto;" title="Signal d'origine, non traité" /></a></p>
<p><a href="http://jzu.blog.free.fr/public/Satana/satana.gif"><img src="http://jzu.blog.free.fr/public/Satana/.satana_m.jpg" alt="Signal traité par Satana (C=1, S=2.2, E=25, V=1)" style="display:block; margin:0 auto;" title="Signal traité par Satana" /></a></p>
<p>Si on pousse le premier paramètre, qui contrôle le nombre de fois que l'on
applique la fonction de compression, la distorsion devient extrêmement
perceptible au point de devenir un effet en soi. Le résultat n'est pas
désagréable sur une guitare mais c'est tout ; la plupart des pédales
d'overdrive de base sont bien meilleures. Il serait possible de l'améliorer en
ajoutant un autre étage de saturation asymétrique et surtout en travaillant
l'équalisation avant l'effet, mais ce n'est pas le but de la manœuvre.</p>
<p>Les deux plugins tournent sous Linux, sans problème avec
<a href="http://audacity.sourceforge.net/">Audacity</a> ou
<a href="http://www.mplayerhq.hu/">Mplayer</a>. En revanche, avec
<a href="http://ardour.org/">Ardour</a>, une friture bizarre apparaît, peut-être due aux
<em><a href="http://en.wikipedia.org/wiki/Denormal_number">denormals</a></em>, peut-être due à la
nature « temps réel » de cette application. Cela dit, Mplayer traite le flux
audio un peu de la même manière qu'Ardour sans que les symptômes apparaissent,
et le plugin débarrassé de tout le code de traitement provoque le même phénomène
dans Ardour.</p>
<p>Un binaire de Satana existe pour MacOS X mais reste expérimental pour l'instant
faute de disposer d'une plate-forme de compilation stable. Quant à Windows,
rien n'est prévu hormis quelques <code>#include</code>s. Une bonne âme pourra toujours forker
le repo Github et tripoter le Makefile... Avis aux amateurs.</p>