Débuter avec le FV-1:
Premiers pas en DSP
Vous vous demandez peut-être comment toutes ces entreprises de pédales faisaient rentrer des effets si compliqués dans de si petites boites. La réponse est presque toujours le traitement numérique.
Un processeur de signal numérique (DSP) très populaire auprès des fabricants de pédales est le FV-1 par Spin-Semiconductor. Il est facile à intégrer dans un circuit de pédale et sa programmation a été rendue relativement simple.
Il existe des DSP bien plus complexes avec beaucoup d'options comme la série SHARK par Analog Device utilisés notamment par Strymon. Cependant, le FV-1 reste capable de gérer la majorité des effets de guitare.
Débuter en traitement du signal numérique n'est pas une mince affaire, surtout si vous n'êtes pas habitués aux méthodes de travail propre au digital. La bonne nouvelle est qu'il existe des super outils et documents pour vous aider. J'ai rédigé ce tutoriel pour vous aider à suivre les étapes dans l'ordre.
Qu'est-ce qu'un DSP ?
Un Digital Signal Processor est un processeur très spécialisé fait pour le traitement en temps réel d'un signal. Pour traiter en temps réel, le processeur doit finir tous ses calculs à la fin d'un cycle d'horloge de façon très fiable. C'est quelque chose auquel les processeurs généralistes, comme celui dans votre ordinateur, ne sont pas très bons. L'architecture et le panel d'instructions du DSP sont donc optimisés pour la vitesse. La plupart des modules de l'architecture son tout de même semblables à ceux d'un processeur généraliste.
Vous pourrez trouver des DSP dans beaucoup de matériel audio, table de mixage, interfaces audio, effets en rack et même de micros.
Présentation du FV-1
En regardant la datasheet vous pourrez voir que le FV-1 est relativement petit avec son format SOIC-28. Voici l'architecture du FV-1, nous allons l'étudier rapidement :
La première chose à remarquer est que le FV-1 est stéréo avec des convertisseurs dedans. Cela veut dire que nous pouvons injecter directement un signal analogique stéréo en entrée et récupérer un signal stéréo analogique en sortie. C'est très pratique, nous n'aurons pas à utiliser une puce de conversion contrairement à beaucoup de DSP.
L'horloge peut être générée par un cristal 32 kHz ou une horloge externe jusqu'à 48 kHz. Un fois encore, cela rend le DSP facile à implémenter, nous n'avons besoin que de connecter un cristal entre deux pattes pour avoir une horloge. Une astuce intéressante est de réduire la fréquence de l'horloge, cela introduit une texture glitch.
Il y a trois entrées pour potentiomètre afin d'ajouter de la flexibilité à vos programmes. A mon sens, c'est l'un des points faibles du FV-1 car trois potentiomètres est parfois trop peu pour un programme complexe. Toutefois, c'est amplement suffisant pour beaucoup d'effets créatifs et les fabricants de pédales l'ont démontré plus d'un fois.
Le FV-1 possède 8 programmes par défaut :
Toutefois, cela devient intéressant quand nous coderons nos propres programmes. Spin-Semiconductor on créé leur propre IDE gratuit où nous pourrons faire cela appelé SpinAsm (pour Windows seulement).
Nos programmes seront exécutés via une mémoire EEPROM externe. On peut écrire 8 programmes sur une puce EEPROM et la connecter au DSP. Il faut d'abord sélectionner les programmes extérieurs puis les 8 programmes peuvent être sélectionnés en comptant en binaire via 3 broches.
Voici le schéma d'application typique tiré de la datasheet :
L'alimentation est de 3.3V, dans une pédale cette alimentation est faite grâce à un 78L33.
Le modèle d'EEPROM requis est la 24LC32A. J'ai déjà réussi à connecter deux EEPROMs avec un commutateur DPDT comme sur la Bit Quest de Dr. Scientist. Cependant, une fois le changement d'EEPROM fait, les interrupteurs de sélection de programme doivent être bougés afin de charger le nouveau programme. Je ne sais pas encore comment améliorer ce système.
Pour interfacer les potentiomètres au DSP, rien de plus simple, il suffit de diviser l'alimentation avec le potentiomètre et de relier à la bonne broche, comme montré dans le schéma. On peut sélectionner les programmes d'usine ou les programmes externes avec un simple interrupteur. Le numéro du programme est sélectionné avec trois interrupteurs faisant un code binaire.
Si vous voulez voir un schéma de pédale comprenant le FV-1 vous pouvez vous référer au Molecular Disruptor de David Rolo ou bien à l'Arachnide de Pedal PCB.
Avec quoi commencer ?
Hardware :
Pour commencer à programmer pour le FV-1 vous aurez besoin d'un moyen de programmer l'EEPROM avec votre code. De plus, vous devrez envoyer de l'audio dans le DSP et écouter ce qui en sort. Le moyen le plus facile est une plateforme de développement, elle se connecte directement à votre ordinateur pour flasher l'EEPROM et elle comprend toute l'électronique nécessaire pour envoyer et recevoir de l'audio au DSP. Je possède la plateforme de développement officielle qui est onéreuse. Il existe une alternative DIY et moins chère par Pedal PCB et elle semble tout à fait recommandable.
Vous pourriez aussi essayer avec un flasheur d'EEPROM générique et un circuit de pédale mais le débugge de vos programmes va être fastidieux.
Software :
Vous aurez besoin d'une machine Windows avec SpinAsm installé.
Vous pouvez aussi télécharger SpinCAD Designer sur Github. C'est un super outil graphique de programmation du FV-1 (qui ressemble un peu à Max-MSP) fait par Holy City Audio. Vous aurez besoin de Java Runtime Environement, vous n'aurez plus qu'à exécuter le fichier jar.
Cet outil peut être utilisé pour créer des programmes très rapidement et on peut être amené à comprendre bien mieux la programmation du FV-1 en étudiant sa sortie.
Une autre caractéristique utile de SpinCAD c'est qu'il comprend un simulateur. Vous pouvez mettre un fichier wav en entrée et récupérer un aperçu de votre effet. Techniquement vous n'avez donc pas besoin d'un FV-1 pour commencer à programmer pour. Même si un vrai moyen de tester vos programmes est nécessaire, c'est une bonne fonctionnalité pour écouter votre programme sans avoir à flasher l'EEPROM.
Coder pour le FV-1
Commençons par lister où vous pourrez trouver de l'aide et du savoir. Tout d'abord sur le site de Spin-Semiconductor. Il héberge une base de savoir très complète ainsi que le forum officiel où vous trouverez des programmes, de l'aide et des discussions. Voici une liste de programmes gérée par MsStratMan. Si vous avez perdu votre fichier de programme et voulez le récupérer depuis l'EEPROM voici un décompilateur programmé par Igor de Shift Line.
Commençons avec les grands principes. A chaque cycle d'horloge, les convertisseurs produisent un nouvel échantillon audio, de plus, le DSP exécute toutes les instructions données par son programme de haut en bas. Ce que vous écrivez dans votre programme est exécuté en boucle 32768 fois par seconde (si vous utilisez le cristal comme source d'horloge). Comme nous le verrons les instructions du DSP sont optimisées pour faire plusieurs choses en même temps, par exemple il peut lire une mémoire et multiplier la valeur lue en une seule opération. La longueur maximale de votre programme est déterminée par la vitesse du DSP, mesurée en MIPS (million instructions per second), et par la fréquence d'échantillonnage. Le FV-1 est à 6 MIPS à 48 kHz.
Les registres sont des mémoires, le FV-1 en a 64. Il y a 32 registres utilisateurs de 24 bits. Les registres utilisateur peuvent être utilisés par exemple pour stocker un échantillon audio pour le rappeller plus loin dans le code. Les valeurs des convertisseurs d'entrée, de sortie et les valeurs des potentiomètres sont stockées dans des registres réservés que l'on peut lire.
On programme en utilisant des instructions. Le FV-1 a 28 instructions différentes, elles sont expliquées individuellement ici et ici. Nous allons aborder les plus importantes d'entre elles mais vous devriez savoir vous servir de la totalité, afin de pouvoir exploiter toutes les possibilités du DSP. Spin-Semiconductor a écrit une feuille de rappel très utile pour des rappels rapides.
Une autre chose très importante est le registre accumulateur. Vous pouvez l'imaginer comme votre établi, les valeurs lues se retrouvent dessus. Vous pouvez les transformer sur votre établi puis les envoyer dans d'autres registres. Vous pouvez aussi nettoyer l'accumulateur à tout moment.
Nous allons voir comment coder pour le FV-1 en étudiant un exemple très simple de programme sur SpinCAD. Commençons avec un contrôle de volume. Je sais que ce n'est rien de très excitant mais cela va nous permettre de comprendre la base du code de SpinAsm. Vous pouvez cliquer sur n'importe quel programme pour le télécharger afin de vous exercer avec.
Dans SpinCAD le programme ressemble à ça, quatre blocks, un block volume connecté à l'entrée gauche et la sortir gauche, contrôlé par le premier potentiomètre.
En utilisant File > Copy ASM To Clipboard, nous pouvons coller le programme dans SpinAsm et voici le résultat.
La majorité des lignes commencent par un point-virgule. Ces lignes sont des commentaires et ne font pas partie du programme. SpinCAD utilise les commentaires pour préciser le nom du programme, la fonction de tous les potentiomètres ainsi que le début des blocks de fonction. SpinCAD écrit toutes les instructions en majuscules et précise tous les zéros à la fin des nombres. Ce n'est pas nécessaire de faire ça quand vous programmerez votre propre code.
La première instruction est "rdax adcl,1". Rdax est utilisée pour lire un registre et le mettre dans l'accumulateur, dans notre cas nous voulons lire l'entrée audio gauche. Nous pouvons l'appeler en écrivant simplement adcl (analog to digital convertor left). Cette instruction permet aussi de multiplier cette valeur avant de l'ajouter à l'accumulateur, cette multiplication peut être faite par un nombre entre -2 et +1.9999389 (multiplier par un nombre négatif inverse la phase). Ici nous multiplions par 1 parce que nous ne voulons pas encore affecter notre gain d'entrée. Nous aurions aussi pu écrire "ldax", qui est une instruction semblable mais qui ne fait pas de multiplication et qui écrase la valeur précédente de l'accumulateur.
La ligne suivante est "mulx pot0". Mulx est utilisée pour multiplier l'accumulateur par la valeur d'un autre registre. La valeur de l'échantillon de l'entrée gauche dans notre accumulateur est alors multipliée par la valeur présente dans le registre pot0. Comme vous l'avez sûrement deviné la valeur du registre pot0 est déterminée par le potentiel à dela broche correspondant au potentiomètre 0. Sa valeur est comprise entre 0 et 1. Maintenant la position du potentiomètre contrôle le volume d'entrée. Il reste juste à faire sortir cette valeur.
La ligne suivante est "wrax reg0,0". L'instruction wrax est utilisée pour écrire la valeur de l'accumulateur et puis multiplier la valeur restant dans l'accumulateur par un nombre. Nous écrivons donc la valeur de l'audio controlé en volume dans le registre utilisateur 0 et nous multiplions l'accumulateur par 0. Ce qui fait que l'accumulateur est nul après cette opération.
Les deux dernières lignes récupèrent la valeur dans reg0 et l'écrivent dans le registre de sortie gauche avec "wrax dacl,0".
Nous sommes arrivés au bout, mais nous avons fait des détours inutiles. En effet, nous n'avions pas besoin d'écrire le signal dans un registre pour le récupérer directement après pour l'adresser à la sortie. Voici une façon plus efficace pour écrire ce programme avec des commentaires à chaque ligne.
Un Tremolo Simple : Utiliser le LFO
Maintenant que nous avons abordé les bases, commençons un programme un peu plus avancé en utilisant les périphériques à notre disposition. Le FV-1 possède deux générateurs de sinus, deux générateurs de rampes et une mémoire RAM de delay (une seconde d'audio à 32 kHz). Avec ces périphériques, nous pouvons accéder à des effets tels que le changement de hauteur (pitch), le delay, tremolo, flanger, chorus...
Pour vous montrer comment utiliser les LFO et la mémoire de delay, j'ai écrit deux programmes simples, un tremolo et un delay. Chacun vous montrera comment utiliser ces périphériques et introduira de nouvelles instructions.
Commençons avec le tremolo. Nous allons créer une LFO contrôlable et l'utiliser pour moduler l'audio en volume. Voici le code et son équivalent dans SpinCAD.
Etudions le programme ensemble. Quand on utilise un LFO, on se doit d'abord de l'initialiser. On a besoin de faire cela qu'une seule fois. L'instruction "skp run,1" fait en sorte que la ligne suivante soit lue une seule fois. Des astuces intéressantes existent avec cette instruction qui fait sauter certaines lignes. "Run" est la condition de saute de ligne et 1 est le nombre de lignes à sauter si la condition est remplie.
L'instruction d'initialisation pour un LFO sinusoïdal est "wlds" suivi par le numéro du LFO (0 ou 1), la frequence du LFO (9 bits) ainsi que son amplitude (15 bits). Dans notre cas ces nombres ont peu d'importance car ils vont être contrôlés par deux potentiomètres.
Pour contrôler la fréquence et l'amplitude, nous avons juste besoin d'écrire dans les bons registres. Pour le premier LFO sinusoïdal, ce sont "sin0_rate" et "sin0_range". Nous écrivons donc les valeurs de chaque potentiomètre dans un de ces registres. Nous multiplions la valeur du potentiomètre de vitesse par 0,4 pour garder une vitesse maximale autour de 16Hz.
Ensuite, nous avons besoin de récupérer la valeur du LFO pour la stocker dans un registre afin de l'utiliser plus loin dans le programme. Pour récupérer la valeur, de LFO on utilise "cho rdal". Cho est l'une des instructions les plus complexes du FV-1, mais "cho rdal" est plutôt simple.
Maintenant la valeur du LFO récupérée, nous avons besoin de faire en sorte qu'elle soit entre 0 et 1, par défaut elle est entre -1 et 1. Nous avons donc besoin de multiplier la valeur de LFO par 0,5 et ajouter 0,5. Nous pouvons faire cela avec l'instruction "sof". Sof est très utile, elle peut multiplier par un chiffre entre -2 et 1,9999389 et additionner un autre avec les mêmes conditions. Elle peut être utilisée pour construire des étages de gain par exemple.
Maintenant que le LFO est initialisé, contrôlé par les potentiomètres, dans des limites utiles et stocké dans reg0. Il reste juste à multiplier l'audio en entrée par la valeur du LFO dans reg0 et d'écrire le résultat dans une sortie audio. C'est exactement ce que font les trois dernières lignes.
Un Delay Simple : Utiliser la Mémoire de Delay
Pour montrer comment utiliser la mémoire de delay du FV-1, j'ai codé un delay basique. Voici son équivalent SpinCAD ainsi que le programme lui-même. Encore un fois, n'hésitez pas à télécharger les programmes en cliquant dessus afin d'expérimenter avec vous-même.
Je vais expliquer seulement les nouveaux éléments, car vous avez probablement compris comment les signaux sont routés et atténués.
Commençons par une explication de la mémoire de delay. On peut y accéder avec des adresses allant de 0 à 32767. Ces adresses sont automatiquement mises à jour à chaque nouveau cycle d'horloge, de cette façon, pas besoin de calculer à chaque fois. On peut l'imaginer comme une fenêtre glissante d'échantillons qui peuvent être lus à partir de n'importe quel numéro. A chaque nouveau cycle d'horloge l'adresse 0 deviens 1, 1 deviens 2 etc... L'adresse 32767 est alors écrasée. Par exemple, si nous voulons une seconde de delay à 32 kHz, nous écrirons notre signal à l'adresse 0 et le récupérerons à l'adresse 32767.
L'instruction "wra" est utilisée pour écrire l'accumulateur dans une adresse de la mémoire delay. Vous pouvez voir que nous écrivons à l'adresse 0 et annulons l'accumulateur après.
Puis nous associons la valeur de pot0 au registre addr_ptr, qui veut dire "address pointer". Ce registre est utilisé pour naviguer les adresses de la mémoire delay, c'est très utile pour contrôler la longueur du delay.
Une fois que c'est fait, "rmpa" est utilisé pour simplement récupérer l'échantillon stocké dans l'adresse de la mémoire delay indiquée par l'"address pointer". Comme beaucoup d'autres instruction elle donne la possibilité de multiplier la valeur récupérée par un nombre.
Conclusion
J'espère que ce tutoriel a aidé les constructeurs qui cherchent à atteindre de nouveaux horizons. Ces exemples très basiques, vous ont sûrement aidé à mesurer toutes les possibilités que les DSP et le FV-1 réservent.
Comme toujours n'hésitez pas à pointer les inéxactitudes et à poser des questions.
Amusez-vous!
Legal
A Propos