---
title: "Cette puce ne stocke aucune musique. Pourtant, elle rejoue toujours la même chanson"
locale: "fr"
url: "https://irz.fr/fr/articles/baochip-uid-deterministic-song-fr"
markdown_url: "https://irz.fr/fr/articles/baochip-uid-deterministic-song-fr.md"
category: "tech"
tags: ["Baochip-1x", "musique générative", "MIDI", "Web Audio", "identité matérielle"]
published_at: "2026-08-22T16:29:00.000Z"
author: "Léa Perrin"
translation: "https://irz.fr/en/articles/baochip-uid-deterministic-song-en.md"
---

# Cette puce ne stocke aucune musique. Pourtant, elle rejoue toujours la même chanson

Phillip Torrone transforme l’UID usine 64 bits d’un Baochip-1x en composition déterministe. Même silicium, même morceau, sans compte, cloud ni modèle génératif.

Deux puces presque identiques sortent d’usine avec des nombres qui se ressemblent à s’y méprendre : `0000c09b9ec2f24c` pour la première, `0000c09b9ec49174` pour la seconde, avec seulement quelques caractères qui changent vers la fin de la chaîne.

Dans le projet présenté par Phillip Torrone pour CircuitPython Day 2026, cette petite différence suffit à envoyer les deux puces vers deux morceaux différents : la première devient `9eac`, en ré aéolien à 64 BPM, tandis que la seconde devient `c228`, en do mineur mélodique à 69 BPM.[1](https://x.com/adafruit/status/2090846912194683102)

Aucun morceau n’est stocké dans le silicium et aucun modèle ne « compose » après avoir observé l’UID ; le navigateur applique simplement la même suite d’opérations au même nombre, raison pour laquelle le résultat revient à l’identique.

**L’identité matérielle devient une seed créative.**

Cette distinction rend le projet beaucoup plus intéressant que les générateurs de mélodies vaguement aléatoires : le numéro attribué au matériel à l’usine devient ici l’entrée stable d’un système génératif entièrement déterministe.

## Seize caractères

Le matériel choisi, le Baochip-1x d’Andrew « bunnie » Huang, est fabriqué en TSMC 22 nm autour d’un cœur VexRiscv RV32, avec 2 Mio de SRAM et 4 Mio de RRAM ; son dépôt public contient les éléments ouverts du matériel sous CERN-OHL-W-2.0.[2](https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/)[3](https://baochip.github.io/baochip-1x/)[4](https://github.com/baochip/baochip-1x)

Huang présente Baochip-1x comme microcontrôleur orienté haute assurance, doté d’une architecture beaucoup plus ouverte que celle de la plupart des puces de sécurité.[2](https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/) Chez Torrone, pourtant, la propriété utile est autrement plus banale : le nombre d’usine stable, **64 bits représentés ici par seize caractères hexadécimaux**.[1](https://x.com/adafruit/status/2090846912194683102)

> Illustration: Baochip-1x sur la carte d'évaluation Dabao. Le Baochip-1x est un vrai SoC, pas un jeton musical spécialement fabriqué pour cette démo. Le projet détourne une identité matérielle existante en point de départ créatif. Credit: [Andrew 'bunnie' Huang](https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/).

> Illustration: Schéma bloc du Baochip-1x avec processeur, mémoires et périphériques. L’expérience UID → musique ne représente qu’un usage minuscule d’un SoC généraliste. Le schéma est utile justement parce que presque rien dans cette architecture n’a été conçu pour composer. Credit: [Andrew 'bunnie' Huang](https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/).

Torrone décrit une page qui lit cet UID depuis le matériel via Web Serial dans Firefox. Le détail tombe à un moment assez particulier : après douze ans de ticket, Mozilla indique que Web Serial a finalement été livré dans Firefox 151 sur macOS, Windows et Linux.[5](https://bugzilla.mozilla.org/show_bug.cgi?id=926940)[7](https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API)

Il faut éviter une extrapolation tentante. Torrone présente son travail comme son projet CircuitPython 2026, mais les sources consultées ne montrent pas un port CircuitPython public du Baochip-1x. Nous n’allons donc pas prétendre que CircuitPython exécute le synthétiseur sur la puce. Ce qui est documenté, c’est le trajet de l’identité matérielle vers le navigateur et la composition JavaScript.[1](https://x.com/adafruit/status/2090846912194683102)

## Réduire à 32

La chaîne de transformation est courte et, surtout, publiée assez précisément dans le post.

Le navigateur passe les seize caractères hexadécimaux de l’UID dans **FNV-1a**, obtient une seed de 32 bits, puis confie celle-ci à **xorshift32**, petit générateur pseudo-aléatoire déterministe dont la suite de nombres sélectionne les paramètres musicaux.[1](https://x.com/adafruit/status/2090846912194683102)

> UID → MUSIQUE
> **Une chaîne sans mémoire cachée**
> - UID usine complet du Baochip-1x, lu comme 16 caractères hexadécimaux.: 64 bits
> - Réduit cette identité à une seed de 32 bits.: FNV-1a
> - Produit ensuite une suite déterministe de valeurs pseudo-aléatoires.: xorshift32
> - Les valeurs choisissent tonalité, mode, tempo, progression, motif et timbre.: Musique
> Pipeline décrit par Phillip Torrone dans le post Adafruit du 21 août 2026.

Le mot « aléatoire » devient trompeur si l’on oublie le préfixe pseudo : aucun tirage extérieur n’intervient, si bien qu’un même UID redonne la même seed, la même séquence xorshift32 et les mêmes choix musicaux à chaque rechargement.

Les bits ne deviennent pourtant jamais directement des notes. Torrone l’explique avec une formule assez saine, des nombres arbitraires font de mauvais compositeurs, et les sorties servent plutôt à choisir dans un vocabulaire volontairement borné.[1](https://x.com/adafruit/status/2090846912194683102)

## Borner le hasard

Le vocabulaire comprend douze fondamentales, cinq modes à couleur mineure, des tempos de 48 à 72 BPM et huit progressions d’accords ; s’y ajoutent motif de cinq à sept notes, direction de cloche, désaccordage des oscillateurs et fréquence de coupure du filtre.[1](https://x.com/adafruit/status/2090846912194683102)

Ce choix répond au problème classique des systèmes génératifs : l’espace des valeurs possibles dépasse largement celui des résultats que l’on a réellement envie d’entendre.

Si huit octets devenaient naïvement huit hauteurs MIDI, l’identité matérielle produirait bien une séquence unique, mais sans raison pour que cette séquence ait une cohérence harmonique. Ici, le nombre ne « contient » donc pas la mélodie. Il choisit des règles dans un ensemble déjà composé par l’auteur du système.

Chaque mesure reçoit pad de trois notes, basse, parfois quinte et motif de quatre notes ; toutes les quatre mesures arrive aussi une cloche FM. La voix principale combine trois oscillateurs en dent de scie légèrement désaccordés, passe-bas résonant balayé, passe-haut, compresseur, puis mélange délai/réverbération à feedback.[1](https://x.com/adafruit/status/2090846912194683102)

La part créative se situe exactement là : **dans la conception des contraintes qui transforment n’importe quelle seed en résultat acceptable**.

## Deux horloges

Le navigateur joue le morceau en direct avec Web Audio. Torrone précise que les événements sont programmés à l’avance sur l’horloge audio plutôt que déclenchés au dernier moment par des timers JavaScript.[1](https://x.com/adafruit/status/2090846912194683102)

Dans le séquenceur, cette décision compte beaucoup : MDN recommande la même famille de techniques, regarder légèrement en avance et programmer les notes avec `AudioContext.currentTime`, afin que les variations du thread JavaScript ne deviennent pas des variations de rythme audibles.[6](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Advanced_techniques)

Le projet ne s’arrête pas au son du navigateur. Il fabrique également un **Standard MIDI File format 0**, à 480 PPQ, sur seize mesures, avec tempo, nom de piste, événements de notes et delta-times.[1](https://x.com/adafruit/status/2090846912194683102)

Le morceau peut donc quitter le synthé Web Audio qui lui donne sa première voix. Le fichier MIDI peut être ouvert dans une DAW ou envoyé vers un autre synthétiseur. L’UID définit la composition ; le timbre final peut changer complètement.

## Presque identiques

Torrone a essayé de vérifier que le système ne se contentait pas de produire des variations anecdotiques.

Les deux cartes réelles citées plus haut diffèrent dans tous les champs musicaux mesurés par le projet. L’équipe a ensuite testé **256 UID frères**, identiques sauf leur dernier octet. Dans ce petit ensemble, les douze fondamentales, les cinq modes, 25 tempos et huit progressions sont tous apparus, avec 256 identifiants musicaux distincts.[1](https://x.com/adafruit/status/2090846912194683102)

Le test montre bien que de petites variations d’UID se diffusent dans les choix du générateur, sans permettre pour autant d’attribuer une composition globalement unique à chacun des UID 64 bits possibles.

La chaîne elle-même interdit cette garantie pour une raison arithmétique très simple.

L’UID contient 64 bits, mais FNV-1a le réduit ici à **32 bits** avant le générateur. Cette compression a un prix très concret : de nombreux UID différents tombent forcément sur une seed identique, puis suivent exactement la même trajectoire musicale. Avec des entrées uniformément réparties, l’approximation dite des anniversaires place déjà autour de **77 000 UID** la zone où la probabilité d’avoir rencontré au moins une collision atteint environ 50 %.

> IDENTITÉ ≠ UNICITÉ
> **Même puce, même morceau. L’inverse ne tient pas**
> - Espace théorique de l’identité matérielle à 64 bits.: 2⁶⁴ UID
> - La fonction FNV-1a compresse cet espace avant la génération musicale.: 2³² seeds
> - Deux UID différents peuvent donc partager une seed et la même composition.: Collision possible
> - Le song ID est encore un raccourci calculé depuis les paramètres, jamais l’identité matérielle.: 4 chiffres
> Conséquence directe de la réduction 64 → 32 bits décrite par le projet.

Le projet marque d’ailleurs lui-même cette différence : son identifiant de morceau à quatre caractères est calculé depuis les paramètres musicaux et Torrone le présente seulement comme un raccourci pour « cette musique », l’identité matérielle restant l’UID complet.[1](https://x.com/adafruit/status/2090846912194683102)

## Un bug audible

La partie la plus réjouissante est peut-être celle où le système a été mesuré comme un instrument plutôt que simplement regardé comme une démo.

Une analyse de l’audio a montré qu’environ **55 % de l’énergie se trouvait sous 60 Hz** dans une première version, zone peu utile sur des haut-parleurs de laptop tout en consommant de la marge dynamique. La basse a été remontée d’une octave et un passe-haut à 55 Hz a été ajouté ; le générateur MIDI a été modifié pour rester cohérent avec le rendu audio.[1](https://x.com/adafruit/status/2090846912194683102)

Ce détail montre aussi où le déterminisme s’arrête : la seed choisit toujours les mêmes paramètres, mais l’auteur garde la main sur la fonction qui les interprète. Une révision du programme peut alors donner au même UID une nouvelle version du même principe de morceau.

La reproductibilité dépend donc du triplet **UID + algorithme + version du vocabulaire musical**. L’histoire du morceau déjà caché dans la puce est plus jolie ; la version d’ingénieur, elle, dit exactement ce qu’il faut conserver pour pouvoir le rejouer.

## Mesuré ou déclaré

Le projet introduit encore une distinction utile, cette fois sur la provenance de l’identité.

Reçu par le port série depuis le matériel physique, l’UID fait afficher `measured from hardware` ; fourni simplement dans une URL `?uid=...`, il devient `from link - a claimed uid, not measured here`.[1](https://x.com/adafruit/status/2090846912194683102)

Ce n’est pas de la cryptographie d’attestation. N’importe qui peut écrire un nombre dans une URL. L’interface refuse simplement de confondre ce qu’elle a effectivement lu sur un appareil avec ce qu’un visiteur lui affirme.

Le reste est volontairement pauvre en infrastructure : Torrone décrit un HTML statique sans serveur applicatif, stockage central, compte, analytics, CDN ni état caché ; un lien `?uid=` suffit à régénérer ailleurs la composition correspondant au nombre fourni.[1](https://x.com/adafruit/status/2090846912194683102)

Cette sobriété est presque le point du projet : aucune table « numéro de puce → fichier audio » n’a besoin d’être entretenue, puisque la musique est une fonction.

**UID → algorithme → partition.**

Et c’est ce qui transforme un banal numéro d’usine en quelque chose de curieusement personnel : la chanson n’est pas gravée dans le silicium, mais tant que nous conservons la règle qui la produit, cette identité matérielle peut toujours être rejouée.

## References

1. [Adafruit / Phillip Torrone, projet CircuitPython Day 2026, 21 août 2026](https://x.com/adafruit/status/2090846912194683102)
2. [Andrew 'bunnie' Huang, Baochip-1x: A Mostly-Open, 22nm SoC for High Assurance Applications, 27 février 2026](https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/)
3. [Baochip, Coder's guide to the Baochip 1x](https://baochip.github.io/baochip-1x/)
4. [Baochip, dépôt matériel baochip-1x](https://github.com/baochip/baochip-1x)
5. [Mozilla Bugzilla, WebSerial API, support livré dans Firefox 151](https://bugzilla.mozilla.org/show_bug.cgi?id=926940)
6. [MDN, Advanced techniques: Creating and sequencing audio](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Advanced_techniques)
7. [MDN, Web Serial API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API)
