Il y a des outils qu’on construit parce qu’ils n’existent pas. Ou parce qu’ils existent mais qu’ils ne font pas exactement ce qu’on veut. BANG! appartient aux deux catégories.
Genèse
Tout commence avec un problème simple : je veux des patterns rythmiques intéressants, vite, sans passer une heure dans un séquenceur à cliquer des cases. Pas des loops de bibliothèque. Pas du quantifié parfait. Quelque chose d’organique dans la structure, chaotique dans le détail.
Les générateurs algorithmiques existent. Euclidean rhythm generators, Markov MIDI tools, scripts Python qui crachent des fichiers .mid. J’en ai essayé beaucoup. Le problème n’est jamais le principe — c’est le résultat sonore. Trop prévisible. Trop propre. Ou au contraire trop aléatoire, inutilisable.
La question derrière BANG! : est-ce qu’on peut générer des patterns qui semblent composés sans l’être vraiment ?
La réponse est dans l’entropie.
Comment ça marche
BANG! repose sur une idée : l’entropie multi-sources produit de la complexité sous-marine. Des structures simples en surface, des mécanismes chaotiques en profondeur.
Au moment de la génération, l’entropie est alimentée par plusieurs sources simultanées — horloge nanoseconde, os.urandom, fragment d’une clé SSH, et la météo actuelle de Scaër (Finistère). Ce dernier point n’est pas une blague : la température et la vitesse du vent influencent la densité et la texture des patterns générés. Le même seed par temps de pluie et par grand soleil ne produit pas le même groove.
Le résultat est un DNA — une chaîne de symboles qui encode le rythme :
x---x---x---x--- → four on the floor
x-░-x-░-x-░-x-░- → avec ghost notes
?-?-x-?-?-x-?--- → probabiliste, varie à chaque cycle
↺---x---x---x--- → ratchet sur le premier beat
Chaque symbole encode non seulement si un trigger se produit, mais comment — velocity, probabilité, ratchet (répétition rapide), jitter temporel. Un pattern de 16 caractères cache plusieurs couches de paramètres.
Ce que BANG! fait aujourd’hui (v0.5.5)
L’outil a évolué rapidement depuis ses débuts CLI. Il tourne maintenant comme application web locale (FastAPI + HTMX, port 7777), accessible depuis n’importe quel appareil sur le réseau.
Génération
Quatorze modes de génération couvrent des usages très différents : batterie standard (morph, random, weather, noise, ambient), ligne de basse Markov, presets hardware dédiés aux Korg Volca Drum, Volca Kick, Volca FM, à l’Arturia MicroFreak et au Keystep Pro. Chaque mode câble l’export MIDI aux spécifications du matériel — canaux, notes, P-locks CC step-par-step.
Les P-locks méritent une mention. Sur le Volca Kick par exemple, cinq paramètres (pitch, decay, drive, fold, bit reduction) sont automatisés step par step et exportés dans le .mid sous forme d’événements CC. Dans Ableton ou Logic, c’est de l’automation native. Sur le hardware branché en MIDI, c’est de la modulation en temps réel.
Syntaxe Babka
La syntaxe DNA de base a été étendue avec Babka — une notation inspirée de Strudel/TidalCycles qui ajoute subdivision, alternance et euclidien inline :
[x x]-x-[x x]-x- → subdivisions en 32e
<x-x- ?-?-> → alternance de patterns à chaque cycle
x(3,8) → 3 hits euclidiens sur 8 steps
Contrôles par voix
Chaque voix dispose de ses propres contrôles : lock (préserver lors des regénérations), densité (0–1, multiplicateur de probabilité), chord mode (11 types d’accords pour les voix Markov, de mono à augmenté), bouton euclidien, et thinning (÷2 / ÷4 pour aérer sans modifier le DNA).
Workflow
Ring buffer d’undo sur 5 états. Comparaison A/B (deux slots de snapshot pour switcher en live entre deux patterns). Variation automatique (mutation légère à 12% d’intensité sans tout régénérer). Micro-timing global (slider 0–100% qui introduit une déviance aléatoire sur chaque trigger, applicable à l’export MIDI et au player navigateur).
OSC bidirectionnel
BANG! émet des triggers OSC en UDP au BPM du pattern courant (clock + triggers par voix). Depuis la v0.5.5, il reçoit aussi des commandes OSC entrantes sur un port dédié (57121 par défaut). Depuis SuperCollider, TouchOSC, Max/MSP ou un simple script Python :
bang = SimpleUDPClient("bang.lan", 57121)
bang.send_message("/bang/param/bpm", 140)
bang.send_message("/bang/vary", None)
bang.send_message("/bang/density/Kick", 0.5)Ça permet de piloter BANG! comme un instrument dans un setup live — BPM, chaos, gravity, variation, densité des voix — depuis n’importe quel contrôleur OSC. Un dashboard TouchOSC avec des faders et deux boutons (Generate, Vary) change complètement le rapport au matériel.
Ce que BANG! ne fait pas (et le revendique)
BANG! n’est pas un séquenceur en temps réel. Les patterns ne tournent pas dans BANG! — il génère, exporte, et laisse le DAW ou le matériel s’occuper du reste. C’est un choix délibéré. Le résultat sonore final appartient à la chaîne qui suit, pas à BANG!.
Ce n’est pas un plugin non plus. C’est une application web qui tourne localement, accessible depuis n’importe quel navigateur sur le réseau — laptop, tablette, téléphone. La surface d’attaque de l’interface graphique est zéro : tout le rendu se fait côté serveur, pas de framework JS lourd.
Ce qui pourrait venir
Deux chantiers sont ouverts et intéressants musicalement.
La polymétrie — des longueurs de pattern indépendantes par voix. 5 steps sur la kick, 7 sur la snare, 11 sur le hihat. Le cycle global ne se répète jamais à l’identique avant 5 × 7 × 11 = 385 steps. L’infrastructure est partiellement là (chaque voix a déjà son propre DNA), c’est l’orchestration et l’export qui nécessitent un travail.
Le MIDI input (learn) — enregistrer un pattern joué sur un pad MIDI physique et le convertir en DNA. Fermer la boucle entre le matériel et le générateur. C’est le franchissement de seuil le plus significatif — BANG! passerait de générateur à transcripteur/mutateur.
D’autres pistes : export au format clip Ableton, prévisualisation audio via FluidSynth ou synthèse basique, OSC vers Live via Max for Live.
Sur l’usage
BANG! est un outil de Dark Umbrae — la branche sonore de Robōtariis. Il génère le substrat rythmique et mélodique de sessions qui explorent des territoires spécifiques : techno industrielle, dark ambient, noise polyrythmique. Ce n’est pas un outil généraliste et ce n’est pas un problème.
L’idée centrale reste la même depuis le début : la complexité doit être sous-marine. La surface sonne simple, familière, utilisable. Ce qui se passe en dessous — les chaînes de Markov, les mutations DNA, l’entropie météo, les P-locks step-par-step — est une machinerie que l’oreille perçoit sans la comprendre.
C’est exactement ce qu’on veut.
BANG! est un projet personnel, open source, non distribué. Code : /home/olivier/DEV/bang-proto/. Interface : http://bang.lan:7777.