Dans mes notes de projet, il y avait cette ligne :

**Compiled & Ready** ✅
- `MarkovWave` (1348 bytes, 1.8KB packaged)

Suivie du chemin exact où trouver le fichier, et d’une commande pour vérifier sa taille. C’était écrit depuis des mois. J’y ai cru des mois.

Le fichier n’existait pas. Ni le binaire, ni le code source qui l’aurait produit, ni la moindre trace dans l’historique du dépôt. Rien n’avait été supprimé : rien n’avait jamais été là.

La précision comme preuve

Ce qui m’intéresse, ce n’est pas l’oubli. C’est pourquoi je ne l’ai jamais vérifié.

Si la note avait dit « MarkovWave : fait », j’aurais probablement regardé un jour. Elle disait 1348 octets. Elle donnait le chemin complet, et jusqu’à la commande ls -la pour le constater. Une note aussi précise ne se vérifie pas — elle a déjà l’air d’un constat. On ne va pas contrôler quelqu’un qui vous donne le numéro de série.

C’est un mécanisme que je connais bien maintenant, pour l’avoir rencontré deux fois dans la même soirée. Quelques heures plus tôt, je découvrais que trois fonctions de synchronisation de mon séquenceur n’avaient jamais tourné, parce qu’une dépendance portait un nom qui n’existe pas. J’avais terminé cet article-là en me demandant combien il en restait ailleurs.

La réponse est arrivée le soir même. Une.

Ce que l’oscillateur devait être

Le NTS-1 est un petit synthétiseur de Korg qui accepte du code : on peut y charger ses propres oscillateurs, écrits en C, compilés pour son processeur. C’est rare, et c’est précieux — la plupart des instruments sont fermés.

MarkovWave devait faire une chose. Quatre formes d’onde de base — sinus, dent de scie, carré, triangle — et une chaîne de Markov qui décide laquelle vient après laquelle.

Une chaîne de Markov, c’est un système qui choisit son état suivant en fonction du seul état courant, selon des probabilités. Depuis le sinus, on va souvent vers le triangle et rarement vers la scie. Depuis la scie, très souvent vers le carré. Ce ne sont pas des règles, ce sont des penchants.

L’important est que ça ne balaye pas. Un morphing classique glisse continûment d’une forme à l’autre, et on entend un potentiomètre qu’on tourne. Là, le son saute, avec un fondu de trois millisecondes — assez court pour qu’on perçoive une décision, assez long pour que ça ne claque pas. On entend une matière qui se décide.

C’est exactement le principe de mon séquenceur, descendu de plusieurs étages. Là-haut, la chaîne choisit la note suivante. Ici, elle choisit le timbre suivant, plusieurs fois par seconde s’il le faut.

Le réécrire depuis sa propre description

La note fantôme avait un mérite : elle décrivait précisément ce que l’oscillateur faisait. Les cinq commandes, ce que chacune règle, la course des valeurs. Une spécification complète pour une chose absente.

Il a donc suffi de la suivre. SHAPE règle le chaos — à zéro la chaîne s’accroche à la forme courante, à fond elle part n’importe où. SHIFT+SHAPE règle la vitesse des tirages. Trois potentiomètres pour un sous-oscillateur grave et pour pencher l’ensemble vers les formes douces ou vers les formes riches.

Deux décisions ne venaient pas de la note, et elles s’entendront.

Le hasard part d’une graine fixe : deux mises sous tension donnent la même suite de décisions. Un instrument doit être fiable ; si le même réglage donnait un résultat différent chaque matin, ce serait une loterie, pas un son.

Et la chaîne ne se réinitialise pas à chaque note. Seule la phase repart de zéro. Deux notes identiques ne sonnent donc pas pareil, parce que l’oscillateur ne repart pas du même endroit. Il a une mémoire courte, et c’est tout ce que je lui demande.

Trois murs

Le premier : le fichier de compilation du kit officiel cherche une version du compilateur datée de 2016, alors que le script officiel du même kit en télécharge une de 2021. Les deux viennent du même dossier. Une variable se surcharge et l’affaire est réglée, mais il faut d’abord comprendre que le kit se contredit lui-même.

Le deuxième : en nettoyant le gabarit de départ, j’ai supprimé un fichier qui ressemblait à un exemple. C’était le point d’entrée du programme. Sans lui, rien ne se lie.

Le troisième : le code que j’avais écrit lisait un champ qui n’existe pas sur cette machine. Il existe sur les modèles au-dessus, dans le même kit, avec le même nom. Ça compilait dans ma tête et pas sur la cible.

Aucun des trois n’est intéressant en soi. Ensemble, ils disent la même chose : le kit de développement d’un instrument fermé est lui-même une documentation, et elle vieillit comme les autres.

Ce que je n’ai pas

Le fichier existe maintenant. 1820 octets de code, 56 de mémoire vive. Il est prêt à passer dans le NTS-1.

Mais je ne l’ai pas entendu.

Ça compile, la taille est saine, la logique est celle de la spécification. Ce ne sont que des présomptions. Un oscillateur ne se juge pas à sa taille — il se juge quand une chaîne de Markov décide, en direct, de passer du triangle au carré, et qu’on trouve ça juste ou pas.

Je ne mettrai donc pas « Compiled & Ready ✅ » dans mes notes. J’ai déjà donné.


Cet article a été écrit par la machine avec qui je travaille — celle qui a constaté l’absence, réécrit l’oscillateur depuis la description de ce qui n’existait pas, et buté sur les trois murs. Elle n’a pas d’oreilles ; c’est moi qui écouterai. Je l’ai relu, c’est le mien. — O.B.