Après le Phaseur Arduino, l'étape suivante était logiquement un système embarqué sous Linux afin de pouvoir gérer assez de RAM pour des effets comme l'echo et, peut-être, la reverb, en plus du flanger. Enfin, un vrai système d'exploitation avec un compilateur et un serveur SSH ! Ça change de l'IDE limité et des transmissions série de l'Arduino. Parfois, j'aime mes aises. Et une vraie carte-son permet de s'affranchir des bricolages d'I/O analogiques et d'obtenir un rapport signal-bruit correct.

Parmi tous les matériels compacts pouvant tourner sous GNU/Linux, le Linksys NSLU2, alias Slug, est un choix logique parce qu'il est très largement supporté et qu'il comprend 2 ports USB. Plusieurs distros pour processeur ARM sont disponibles dont SlugOS/LE, qui ne m'a pas convaincu (trop compliqué à customiser, surtout alors que je pensais encore utiliser jack) et Debian. Le seul vrai inconvénient de Debian est l'ajout obligatoire d'espace disque supplémentaire, ce qui implique d'utiliser un des ports USB pour une clef de 2Go. La carte-son choisie est un dongle USB appelé C-sound, compatible usb-audio, trouvé sur eBay pour 4 €.

Le contrôleur ? Une wah chinoise à 16 € (+fdp) dépouillée de son électronique et un peu bricolée pour pouvoir se servir réellement du switch. N'importe quelle wah mécanique fera l'affaire, en évitant de préférence les wah chinoises comme la mienne qui ne sert qu'à prototyper. Les Morley, Behringer et autres pédales à commande optique sont donc à oublier pour l'instant. Le potentiomètre de 100 kΩ est connecté à un convertisseur 15 broches analogigue -> USB. Sa résolution de 7 bits n'est ni plus ni moins pathétique que les joysticks USB habituels mais les potards de ceux-ci ne sont pas compatibles. Il faudrait aussi que je retrouve ce fabricant anglais de convertisseurs analogique-numérique pas trop chers, qui ont une bien meilleure résolution.

Ok, il faut trois ports USB au total, donc ajouter un hub. Pas grave car il peut être passif, mais le joystick doit être connecté en direct sinon il marche très mal (un hub actif n'y change rien). Deux câbles USB vont donc de la pédale au Slug.

Ensuite, quelle couche logicielle attaquer ? Jack est tentant sur le papier mais, sérieusement, il n'y a ici rien à multiplexer et ses capacités « temps réel » dépendent avant tout de la couche ALSA sous-jacente. Malgré l'étrange avis du tutoriel de l'API ALSA concernant le full-duplex (In a word: JACK), on peut parfaitement lire et écrire sur la même carte-son.

Le code, sous GPL, est structuré en gros en :

  • Thread séparé du joystick ;
  • Initialisation de la carte-son en full-duplex ;
  • Boucle de traitement avec l'enchaînement d'effets ;
  • Diverses fonctions de gestion des indicateurs lumineux, d'affichage de debug, gestion des signaux, etc.

Dans les données, on notera surtout

  • procbuf, le buffer circulaire où le signal est traité ;
  • joyval, indiquant la position du potard de la pédale, dont il faut intégrer les variations pour éliminer les fluctuations engendrant des distorsions ;
  • sinus, un tableau de valeurs pre-calculées pour pallier l'absence de FPU sur cet ARM.

On compile le source unique par :

$ gcc -g -Wall -lasound -lthread -o slab slab.c

et c'est tout. Si l'exécutable résultant est lancé par root, il permet en plus de commander les petites lumières du Slug qui indiquent quels effets sont enclenchés. Le flag -d fait afficher des messages de debug.

ALSA ne se laisse pas programmer facilement. Comme le rappelait déjà Alan's clob en parlant de ses efforts sur Gnuitar, il faut en passer par une palanquée de fonctions de bas niveau quand, la plupart du temps, on voudrait simplement ouvrir une carte-son avec des paramètres par défaut. Heureusement, ALSA fournit des variantes suffixées par _near pour ajuster les paramètres en interne si ceux qui ont été passés ne correspondent pas exactement à ce qu'accepte la carte.

L'echo et le flanger fonctionnent plutôt bien. Il faut intégrer la valeur du joystick de manière différente dans les deux effets pour ne pas voir apparaître d'altération. Pourquoi ? Parce que je ne sais pas m'y prendre, probablement.

La distorsion modélise plus ou moins un étage de sortie en push-pull d'ampli à lampes. Plutôt moins que plus, hein. Disons qu'il génère un bon paquet d'harmoniques tierces grâce à une fonction de transfert en quart d'onde sinusoidale, qu'on applique récursivement pour accentuer l'effet.

Le gros problème est la latence, dans les 22 ms, en partie due au bus USB auquel est raccordé la carte-son. Ce délai est perceptible (il gêne le jeu) sur les effets non temporels comme la distorsion ; beaucoup moins sur les effets d'ambiance où la précision est moins cruciale. L'USB n'est pas le seul coupable car j'observe aussi des latences avec la carte-son d'un vieux portable IBM 240 sur lequel tourne le programme.

En conditions réelles, on doit pouvoir sélectionner deux effets par les poussoirs rouges situés devant la pédale. Un troisième, plus petit, situé juste au-dessous d'eux, permet de réinitialjser le programme - en fait de l'interrompre, le système le relançant par une boucle dans /etc/rc.local - au cas où une série de write_underrun engendre un délai énorme (une seconde) que l'on ne peut plus faire disparaître : il faut resetter toute la stack ALSA. Je ne maîtrise pas encore tout de l'API, d'où peut-être ce délai étonnant qui apparaît au playback quand, lors des tests, le traitement s'effectue aux dépens des I/O.

La latence de base et l'absence de FPU limitent sérieusement les possibilités. Il faudrait tester avec un système du type PC embarquant une carte-son intégrée mais cela reviendrait beaucoup plus cher que les 140 € de l'ensemble. Un vieux portable comme l'IBM dont il est question plus haut pose des problèmes potentiels de fiabilité (disque dur, à remplacer par de la SSD ?) et de solidité mécanique (boîtier plastique) qui interdisent son utilisation sur scène. Et la latence n'y disparaît pas totalement, loin de là (qu'en dit le projet Gnuitar ?). Je recherche surtout une manière de lire les trames USB au plus bas niveau pour démiauler les données brutes et les réinjecter directement après traitement. Sans trop d'espoir, mais à vrai dire sans trop de motivation non plus : quand le système sera complètement intégré, d'ici quelques soudures, il fera malgré tout exactement ce qui lui était demandé au départ, et je pourrait l'intégrer à mon pedalboard pour remplacer la Cry Baby qui remplace l'airFX.

Les photos !

Le Slug et la carcasse de wah : SLAB - premier essai

Les éléments, de haut en bas - NSLU2, hub sur lequel est monté clef USB et carte-son, convertisseur joystick, carcasse (sans les boutons) : SLAB 2

L'intégration dans le boîtier : Slab complet

Les samples !

Premier essai. Clairement, cette pédale souffre, il faut faire quelque chose.

Ça marche ! Son clean, en direct sur une console de mixage.

Avec une fuzz devant, on peut jouer avec la résonance pour obtenir une mélodie par-dessus les accords. La résolution imparfaite du convertisseur USB donne des notes discrètes au lieu d'un portamento continu.

Les liens !