English Version French Version Spanish Version

Wavetable Sounds: Tutoriel #1

Ce tutoriel décrit comment analyser et recréer les sons "wavetable" des morceaux SID avec la MIDIbox SID.

Le terme "wavetable" est utilisé par la communauté C64 pour définir une méthode de synthèse dans laquelle les formes d'onde et la fréquence d'une voix SID sont modulé si rapidement que le son en résultant sonne comme une nouvelle forme d'onde, nouvelle forme d'onde qui n'est à l'origine pas disponible sur le chip. Les changements de paramètres sont stockés dans une table - d'où le nom - cette technique n'a donc rien à voir avec la "synthèse à table d'onde" (wavetable synthesis), qui elle est basée sur des samples audio.

La MIDIbox SID dispose d'un séquenceur de tables d'onde trés souple, qui peut non seulement séquencer les formes d'ondes et la fréquence, mais aussi n'importe quel paramètre CC (voir aussi la liste de tous les paramètres CC). Trois pistes allant jusqu'à 32 pas sont disponibles, qui peuvent contrôler trois CCs différents. Pour des sons "wavetable" classiques, c'est suffisant pour contrôler la forme d'onde (OSC1 waveform: CC#33) et la valeur de transposition (OSC1 transpose: CC#17) d'une voix simple. Il est également possible de contrôler les valeurs waveform/transpose pour tous les oscillateurs à la fois (CC#32 et CC#16), ou de moduler le CC d'un second oscillateur en parallèle du premier. Une autre utilisation intéressante de la troisième piste restante est de moduler un paramètre d'un LFO ou d'un générateur d'enveloppe. A noter également, le séquenceur de table d'onde peut être utilisé pour jouer des notes et des phrases d'arpèges - la méthode appropriée est décrite dans le tutoriel suivant!

Extraction de son de percussion C64 par l'analyse des formes d'onde

La création de forme d'onde peut sembler relever d'une alchimie complexe, mais l'usage en est en fait trés simple et ouvre beaucoup de nouvelles perspectives pour de nouveaux sons dés que vous en maîtrisez les bases. L'analyse de morceaux réalisés avec le SID peut nous apprendre beaucoup. Dans ce tutoriel, j'ai pris la grosse caisse du titre "Auf Wiedersehen Monty" de Rob Hubbard comme exemple (ce titre m'a tellement impressioné dans les années 80, que je n'ai jamais pu oublier ce groove). Donc, pourquoi ne pas jetter un oeil sur le sample audio de ce morceau, joué sur un SID? Bon, c'est assez difficile d'extraire la grosse caisse elle-même, dans la mesure où d'autres sons sont joués simultanément. Ceci rend difficile d'isoler la forme d'onde qui nous intéresse du reste du mix.

Mais ceci va nous aider: il est aujourd'hui possible de jouer des titres SID sur des émulateurs sur PC. SIDPLAY est un des plus ancien de ces simulateurs, mais à la différence de sidplay2, il permet de muter les voix du SID (View->Mixer). La voix mise en solo peut aussi bien être jouée avec l'émulateur qu'avec la MIDIbox. Mais la méthode la plus simple consiste à enregistrer la sortie du SID dans un fichier ("File->Save as", sélectionnez filetype ".wav")

Voici la vue de la grosse caisse émulée, elle commence à 0:38, canal #2:

On peut distinguer ces différentes parties:

  • elle commence par une forme d'onde "triangle", active pendant 20 mS
  • ensuite une courte partie "noise" pendant 20 mS
  • elle termine par une forme d'onde "pulse", dont la fréquencce et l'amplitude diminue progressivement

Dans les titres SID, les séquences wavetable sont généralement divisées en "frames" de 20 mS, ce qui correspond à la manière dont sont implémentés les trackers dans les jeux (les sons sont appellés selon une trame d'intérruption dont la fréquence dépends du taux de rafraichissement de l'écran: 50Hz dans les systèmes PAL  (50Hz -> 20 mS period)).

Afin de reconstituer cette forme d'onde, vous devez commencer par d'abord sélectionner le même taux de wavetable. Dans la mesure ou le moteur sonore de la MIDIbox SID fonctionne suivant une horloge plus rapide qu'un C64 (taux de rafraichissement de 0.819 mS), la wavetable doit être ralentie. la periode d'actualisation de la wavetable peut être calculée en suivant la formule suivante: periode = 2 * (127-rate) * 0.819mS. Afin d'obtenir une fréquence de 20 mS, le taux approprié est 115

Vous pouvez maintenant assigner la piste 1 au CC#33 (forme d'onde OSC1) et la piste 2 au CC#17 (OSC1 transpose). Testez les séquences suivantes (vous pouvez aussi bien utiliser l'éditeur JSynthLib, ou éditer cette séquence directement depuis la Surface de Contrôle du SID):

STEP CMD    #1  #2  #3
00 Play 01 40 +00 # Plays triangle, transposed by +0 (40 is the middle)
01 Play 08 +00 +00 # Plays noise, transpose value untouched
02 Play 04 +00 +00 # Plays a pulse, transpose value untouched
03 Play 14 -07 +00 # release gate bit, transpose value decremented by -7
03 Play +00 -07 +00 # transpose value decremented by -7
03 Play +00 -07 +00 # transpose value decremented by -7
06 End +00 +00 +00 # stop wavetable

Afin de faire un "fade out" aprés que le bit gate ait été relaché, vous devez augmenter le taux de release de l'envellope DCA de l'OSC . Jouez quelques notes sur votre clavier pour tester le son.

Extraction par suivi des changements dans les registres SID 

La méthode décrite plus haut n'est pas idéale pour reproduire exactement un son wavetable, car les fréquences (valeurs de transposition) sont a dé(terminer à l'oreille (par ex. en comparant les fréquences). Ne serait-il pas mieux d'extraire les valeurs envoyées dans les registres sonores du SID directement du fichier .sid? Si - et c'est possible en utilisant l'outil approprié. J'ai trouvé SIDDump V1.0 de covertbitops.c64.org vraiment pratique pour réaliser une telle analyse. Il joue les fichiers .sid en émulant le CPU C64, et fait un dump des changements de registres SID vers STDOUT.

Retour à notre Grosse Caisse - voici les changements de registres relevés par SIDdump:

| Frame | Freq Note/Abs WF ADSR Pul | Freq Note/Abs WF ADSR Pul | Freq Note/Abs..
+-------+---------------------------+---------------------------+--------------..
...
| 1937 | .... ... .. 08 0000 ... | 0EA3 A-3 AD 11 08F8 ... | 057B E-2 9C ..
| 1938 | .... ... .. .. .... ... | 40A3 (B-5 C7) 81 .... ... | 684C (G-6 CF)..
| 1939 | .... ... .. .. .... ... | 0B23 (E-3 A8) 41 .... ... | .... ... .. ..
| 1940 | .... ... .. .. .... ... | 0923 (C#3 A5) 40 .... ... | 057B (E-2 9C)..
| 1941 | .... ... .. .. .... ... | 03CE (A#1 96) .. .... ... | .... ... .. ..
| 1942 | 2BD6 ... .. .. .... ... | .... ... .. .. .... ... | .... ... .. ..

(Le début du fichier, et la partie droite contenant la colonne "channel 3" et "filter" ont été coupés pour plus de clarté)

Pour ceux que ça pourrait intéresser, voici une explication des changements sur le canal #2. Si ceci vous laisse perplexe, passer au chapître suivant, où une méthode plus simple est décrite.

Dans la première colonne vous pouvez voir:

  • note A-3 avec forme d'onde triangle, valeurs ADSR: A=0, D=8, S=F, R=8
  • note B-5 avec forme d'onde noise 
  • note E-3 avec forme d'onde pulse 
  • note C#3, pulse, gate relaché
  • note A#1 (pulse, gate toujours relaché)

Pour la transcription vers le format des paramètres MIDIbox SID, les points suivants doivent êtres considérés:

  • une frame est traitée chaque 20 mS (50 Hz), le taux wavetable approprié pour la MIDIbox SID est 115 (voir plus haut).
    Si vous connaissez la durée du son, le nombre de frame peut être calculé avec la formule suivante: frame = 50 * seconds
  • le demi-ton "A-3" de SID-Dump est équivalent au demi-ton "A-2" de la MIDIbox SID (la même octave est affichée dans MIDI-Ox)
  • Lorsque vous utilisez le paramètre Transpose (CC#16..CC#19), il est plus simple de compter avec les chiffres de la colonne "Abs":
    • nous commençons par une valeur Transpose de 40 (les valeurs transpose sont "décentrées", 40 correspond à la valeur intermédiaire) - note: pour MIDIbox SID-D il est nécessaire d'ajuster cette valeur, afin que le son commence toujours à la fréquence désirée. MBSID-D joue "C-3", ce qui signifie que la note doit être transposée par -3 pour commencer sur A-2
      LA valeur de transposition initiale est donc 40-03 = 3C
    • transpose entre 1. et 2. frame: C7-AD = +1A
    • transpose entre 2. et 3. frame: A8-C7 = -1F
    • transpose entre 3. et 4. frame: A5-A8 = -03
    • transpose entre 4. et 5. frame: 96-A5 = -0F
    Tous les nombres sont au format hexadecimal  - il est utile d'avoir une calculatrice qui supporte ce format (Je me sert d'une HP48GX)
  • Les deux chiffres du paramètre WF sont inversés pour les paramètres MIDIbox SID CC#32..CC#35 (voir sid_cc_implementation_chart.txt)
  • les valeurs ADSR doivent être multipliées par 8

Convertion des relevés SID

Automatiser la re-calculation des valeurs des registres SID vers les paramètres CC MIDIbox SID peut nous faire gagner du temps, du coup j'ai écrit un script perl qui lit le fichier dump, et le convertit vers un format qui peut être directement vers les wwavetable. Vous trouverez ce script ici

Aprés que le relevé SIDdump ait été retranscrit dans un fichier approprié:

   siddump.exe Auf_Wiedersehen_Monty.sid > dump
le convertisseur peut être lancé avec (exemple):
   perl siddump_convert.pl dump -track 2 -time 0:38 -lines 100
ou transcrivez simplement le fichier entier vers un nouveau fichier avec:
   perl siddump_convert.pl dump -track 2 -frame 0 > converted
voici le fichier de sortie aprés convertion:

| Frame | Time  | Freq Note/Abs WF ADSR Pul | MBSID Wave Transpose Att Dec Sus Rel |
+-------+-------+---------------------------+--------------------------------------+
...
| 1937 | 0:38 | 0EA3 A-3 AD 11 08F8 ... | 01 49 ( 49) 0 64 120 64 |
| 1938 | 0:38 | 40A3 (B-5 C7) 81 .... ... | 08 +1A ( 63) ... ... ... ... |
| 1939 | 0:38 | 0B23 (E-3 A8) 41 .... ... | 04 -1F ( 44) ... ... ... ... |
| 1940 | 0:38 | 0923 (C#3 A5) 40 .... ... | 14 -03 ( 41) ... ... ... ... |
| 1941 | 0:38 | 03CE (A#1 96) .. .... ... | +00 -0F ( 32) ... ... ... ... |
| 1942 | 0:38 | .... ... .. .. .... ... | +00 +00 (+00) ... ... ... ... |

Les valeurs ADSR de la partie droite peuvent être directement entrées dans l'éditeur de patch MIDIbox SID  (ou via la surface de contrôle...) - les valeurs wavetable peuvent aussi être copiées directement:

STEP CMD    #1  #2
00 Play 01 49
01 Play 08 +1A
02 Play 04 -1F
03 Play 14 -03
03 Play +00 -0F
03 Play +00 +00 # (1) voir notes plus bas
03 Play +00 +00
03 Play +00 +00
06 End 7F +00 # (2) arrêt de la wavetable et reset de l'ADSR
Voir aussi ce snapshot JSynthLib.

Jouez C-3 (la note "du milieu") sur votre clavier - vous devriez ententendre exactement le son de Grosse Caisse du fichier .sid file! :-)

(1) afin de permettre à la note de se terminer correctement, quelques lignes vides ont été insérées
(2) "End 7F" a été introduit avec MIDIbox SID-D, et sera aussi supporté par le firmware > v1.7 MIDIbox SID   - Ces commandes effectue un "reset" des registres de l'envellope afin d'éviter les " hick-ups" de l'ADSR, qui peuvent survenir en raisonb d'un bug sillicone du chip SID.

Et voici à quoi ressemble la forme d'onde, jouée par un SID hardware:

Il manque quelque chose? Oui, la forme d'onde triangle n'est pas visible! C'est dû à un bug du delai de l'ADSR du SID. Ce bug a plusieurs conséquences, qui ont été mise een évidence par Dag Lem, et documentée dans le source code of reSID. sidplay2 utilise ce nouveau moteur et du coup émule le SID avec plus de précision que SIDPLAY (malheureusement sidplay2 ne permet pas de muter les canaux...). Un delay d'environ 30mS est appliqué au gate !

Ce délai peut être complètement éliminé en réglant le taux de Release de l'ADSR sur 0. Mais dans ce cas, le son n'est plus "fadé" (-> moins de dynamique):

Il y a aussi comme explication que la plupart des sons Preset d'une MIDIbox SID n'utilisent pas le Release - qui ajoute une latence inacceptable, qui ne peut être compensée qu'en jouant les notes MIDI 30 mS plus tôt (ce qui n'est pas difficile à réaliser avec les séquenceurs, mais difficile à réaliser en live), ou en coupant le délai initial du sample enregistré.

Dans les presets MIDIbox SID-D, ce dalai est admis (les drums sont joués par un séquencer de toute façon, et pas en live). Soit la piste drum doit être jouée avec un delai de -30mS, ou les drums doivent être rejoués par un  sampler, une fois qu'ils ont été joués correctement et qu'ils ont été calés avec le reste des instruments utilisés dans la song 

Jouer des Drums wavetable 

Avec le firmware standard MIDIbox SID, seulement un patch peut être joué par paire core/SID. Il n'y a qu'une wavetable de 3 pistes par patch, et basculer entre les patches prends un certain temps, ce qui n'est pas souhaitable lors du jeu d'une séquence de différents sons Drum. En d'autres mots: le firmware est adapté pour créer un son de DrumC64 simple, l'enregistrer et le rejouer avec un sampler, mais il n'est pas adapté pour jouer une séquence de drums à partir d'un unique SID. Une telle limitation est problèmatique si un Drumset entier doit être mis en place pour une song, de fait, j'ai implémenté un firmware alternatif optimisé pour les Drums: MIDIbox SID-D.

Des informations supplémentaires sur la MIDIbox SID-D sont disponibles uniquement dans cet article du forum. Je réaliserais une page spéciale séparée une fois que le firmware serat finalisé.

Dans la démo suivante, j'ai utilisé le son de drum extrait du titre de Rob Hubbard's "Auf Wiedersehen Monty". Les Patches font partie également de la librairie de preset MBSID-D  (dossier TK, premier drumkit)

mbsid-d_demo2.mp3

Liens



Last update: 2015-09-24

Copyright 1998-2015, Thorsten Klose. All rights reserved.