Dans les articles précédents, nous avons démonté les principales briques d’un module : samples, instruments, canaux, patterns et commandes. Il manque pourtant un élément essentiel. Toutes ces données doivent être exécutées dans le temps.

Un tracker ne se contente pas de lire une liste de notes à une valeur de BPM donnée. Son moteur possède une horloge particulière, héritée de l’histoire des trackers. Pour comprendre réellement la lecture d’un MOD ou d’un XM, il faut distinguer plusieurs niveaux : song order, pattern, row et tick.

Le morceau commence par une séquence

Un module est organisé autour d’une liste indiquant dans quel ordre les patterns doivent être joués. Le moteur commence à une position de cette séquence, récupère le numéro du pattern correspondant puis entre dans celui-ci.

Lorsque le pattern est terminé, le lecteur passe normalement à la position suivante de la séquence. Certaines commandes peuvent toutefois modifier ce déroulement et provoquer un saut ou un changement de pattern.

Le temps du tracker est donc déjà lié à une structure : le morceau avance dans une séquence de blocs musicaux.

Le pattern contient des rows

Le pattern est lui-même divisé en lignes, généralement appelées rows. Dans l’éditeur, ce sont ces lignes que l’on voit défiler verticalement.

À chaque nouvelle row, le moteur examine les différents canaux. Il peut y rencontrer une note, un numéro d’instrument, une valeur de volume ou une commande d’effet.

Mais une row n’est pas nécessairement un instant indivisible. C’est là qu’intervient la notion la plus importante de cet article : le tick.

Le tick : la petite unité de travail du moteur

Une row est exécutée pendant plusieurs ticks. Le premier tick possède généralement un rôle particulier : le moteur y traite les nouveaux événements de la ligne. Les ticks suivants permettent notamment à certaines commandes d’effets de continuer leur action.

Cette distinction explique une grande partie du son tracker. Un portamento, un vibrato ou certains changements de volume peuvent évoluer progressivement pendant les ticks qui composent une seule row.

Autrement dit, ce que l’on voit comme une seule ligne dans l’éditeur peut correspondre à plusieurs étapes internes dans le moteur de replay.

Speed : combien de ticks pour une row ?

Dans la terminologie de FastTracker II et de nombreux trackers, la valeur souvent appelée Speed détermine le nombre de ticks utilisés pour faire avancer une ligne dans le fonctionnement normal du moteur.

Une valeur classique est 6. Dans cette configuration, une row s’étend sur six ticks avant que le lecteur passe à la suivante, sous réserve des commandes qui peuvent modifier le comportement normal.

Il faut donc éviter de confondre Speed avec BPM. Les deux valeurs participent au tempo ressenti, mais elles n’agissent pas au même niveau.

BPM : déterminer la durée du tick

Dans le modèle temporel utilisé par FastTracker II, le BPM intervient dans la durée d’un tick. Une relation couramment utilisée par les moteurs compatibles FT2 est :

durée d’un tick = 2,5 / BPM secondes

À 125 BPM, un tick dure donc environ 0,02 seconde, soit 20 millisecondes.

Avec une Speed de 6, une row dure alors approximativement :

6 × 20 ms = 120 ms

Cette mécanique permet de comprendre pourquoi deux paramètres sont nécessaires : l’un contrôle le nombre d’étapes internes par ligne, l’autre leur durée.

Un exemple concret

Prenons un morceau avec :

Speed = 6
BPM = 125

Le moteur arrive sur une nouvelle row. Au tick initial, il lit les événements : par exemple une note C-4 utilisant l’instrument 01 avec une commande de vibrato.

Il poursuit ensuite l’exécution de la ligne pendant les ticks suivants. La commande peut modifier progressivement la hauteur selon sa logique. Une fois le nombre de ticks prévu écoulé, le moteur passe à la row suivante.

Cette opération se répète des centaines ou des milliers de fois pendant un morceau.

Pourquoi les effets dépendent des ticks

Les commandes d’effets tracker ne fonctionnent pas toutes comme des traitements audio modernes appliqués indépendamment à un signal. Beaucoup sont intimement liées à l’avancement du moteur.

Une commande peut être initialisée au premier tick puis agir aux ticks suivants. Certaines possèdent également des comportements historiques spécifiques selon le tracker ou le format.

C’est pourquoi reproduire correctement un module ne consiste pas simplement à lire ses notes au bon moment. Le moteur doit savoir à quel tick une opération doit être exécutée.

Le premier tick n’est pas toujours comme les autres

Cette notion mérite une attention particulière. Dans de nombreux comportements tracker, le tick initial d’une row sert à déclencher ou préparer les nouveaux événements, tandis que certains effets travaillent principalement sur les ticks suivants.

Une implémentation naïve qui appliquerait exactement la même opération à chaque tick pourrait donc produire un résultat différent du logiciel historique.

Ces détails deviendront particulièrement importants lorsque nous étudierons les commandes d’effets dans l’article suivant.

Tempo et musique : pourquoi le mot BPM peut tromper

Dans une station audionumérique moderne, on associe spontanément le BPM au nombre de battements musicaux par minute. Dans un tracker historique, la valeur appelée BPM participe plutôt au calcul de l’horloge interne du moteur.

La relation entre cette horloge et le rythme musical dépend ensuite de la Speed, de l’organisation des rows et de la manière dont le compositeur structure ses patterns.

Il est donc préférable de comprendre le couple Speed + BPM plutôt que d’interpréter isolément la valeur BPM comme on le ferait dans un séquenceur moderne.

Changer le tempo pendant le morceau

Les commandes du tracker peuvent modifier Speed ou BPM pendant la lecture. Le morceau peut ainsi accélérer, ralentir ou changer la densité temporelle de ses lignes sans qu’il soit nécessaire de reconstruire les patterns.

Cette possibilité fait partie intégrante de la composition. Les paramètres temporels ne sont pas seulement une configuration placée au début du fichier : ils peuvent devenir des événements musicaux.

Pourquoi cette mécanique compte pour un lecteur Web

Pour lire un module dans un navigateur, il ne suffit donc pas de convertir les rows en une liste approximative de notes programmées à l’avance. Un moteur compatible doit maintenir son propre état : position dans la séquence, pattern courant, row actuelle, tick actuel, Speed, BPM et état des effets pour chaque canal.

Conceptuellement, sa boucle ressemble à ceci :

Song position → Pattern → Row → Tick → effets → Tick suivant → Row suivante

Cette machine d’état constitue le cœur du replay tracker.

Le temps fait partie du format

Nous pouvons maintenant compléter la définition commencée dans les premiers articles. Un module contient de la matière sonore, une structure musicale et des instructions, mais son identité dépend aussi d’un modèle temporel que le moteur doit respecter.

C’est précisément pour cela que la fidélité d’un lecteur est importante. Une petite différence dans l’interprétation des ticks ou des effets peut modifier le groove, les glissements, les vibratos et finalement le caractère du morceau.

Dans le prochain article : nous utiliserons cette horloge pour comprendre la programmation cachée dans la musique tracker : arpège, portamento, vibrato, volume, retrigger, pattern break et autres commandes d’effets.