Skip to content

Repository files navigation

WebGlitch đŸŽ›ïžđŸ“ș

Tordez des pages web avec du son. WebGlitch est une extension navigateur qui transforme n'importe quelle page web en instrument visuel : le son pilote des variables CSS en temps réel, et la page glitche, pulse, se déforme au rythme de la musique.


Table des matiĂšres


Le concept

Une page web est une matiùre plastique : tailles, couleurs, positions, flous, rotations — tout est pilotable par des variables CSS (custom properties). WebGlitch injecte ces variables dans la page et les fait bouger avec le son.

Le principe en une phrase :

On découpe le son en bandes de fréquences, on mesure le volume de chaque bande, on le mappe vers une valeur CSS (px, composante RGB, booléen, nombre...), et on injecte un bout de CSS écrit par l'utilisateur qui exploite ces variables.

Cas d'usage : performances audiovisuelles live (VJing), installations artistiques, vidéoprojection d'une page web qui réagit au set d'un musicien, détournement esthétique de sites existants.

Comment ça marche

flowchart LR
    subgraph Sources
        A[🔊 Audio systùme<br/>via loopback] --> C
        B[đŸŽč Web MIDI<br/>Ableton, contrĂŽleur...] --> D
    end
    subgraph Moteur["Moteur WebGlitch"]
        C[Filtres par bande<br/>passe-haut / bas / bande] --> E[Mesure du volume<br/>par bande]
        E --> F[Mapping<br/>bool / int / rgb / var]
        D --> F
    end
    subgraph Page["Page web cible"]
        F --> G["Variables CSS<br/>--band-a, --band-b, ..."]
        G --> H[CSS utilisateur injecté]
        H --> I[✹ La page glitche]
    end
Loading
  1. Capter — l'extension reçoit le son (entrĂ©e loopback = tout le son de l'ordi) et/ou des messages MIDI.
  2. Filtrer — chaque bande applique un filtre (passe-haut, passe-bas, passe-bande) pour isoler une zone du spectre : basses, mĂ©diums, aigus...
  3. Mesurer — le volume de chaque bande filtrĂ©e est suivi en continu.
  4. Mapper — le volume devient une valeur exploitable : un nombre entre min et max, une composante RGB, ou un boolĂ©en (au-dessus d'un seuil / en dessous d'un plancher).
  5. Injecter — les valeurs sont Ă©crites dans des variables CSS (--band-a, --band-b, ...) sur la page, et le CSS de l'utilisateur fait le reste.

Les bandes

La bande est l'unité de base de WebGlitch. On en crée autant qu'on veut. Chaque bande = un filtre + un mapping.

Le filtre

ParamĂštre RĂŽle Valeurs
type Type de filtre highpass, lowpass, bandpass, none
cutoff FrĂ©quence de coupure (ou centrale pour le passe-bande) 20 Hz – 20 kHz
q RĂ©sonance / largeur du passe-bande 0.1 – 20
depth IntensitĂ© de la rĂ©ponse : combien le signal filtrĂ© pĂšse dans la mesure 0 – 1

Exemples de configurations classiques :

  • Kick : bandpass, cutoff 60 Hz, Q Ă©levĂ© → la bande ne rĂ©agit qu'Ă  la grosse caisse.
  • Voix : bandpass, cutoff 1 kHz, Q moyen.
  • Hi-hats : highpass, cutoff 8 kHz.
  • Énergie globale : none → volume brut du signal.

Le mapping

ParamĂštre RĂŽle
type Type de sortie : int (nombre), float, rgb (composante 0–255), bool (seuil), var (valeur brute 0–1)
min / max Bornes de la valeur de sortie — le volume filtrĂ© est interpolĂ© entre les deux
center Valeur de repos quand il n'y a pas de signal
depth Amplitude de la modulation autour du centre
threshold (mode bool) seuil : la variable passe à 1 quand le volume le dépasse
floor (mode bool) plancher : la variable passe Ă  1 quand le volume passe en dessous
attack / release Lissage de la réponse (montée / descente), pour éviter le tremblement ou au contraire l'assumer

Chaque bande expose sa valeur dans une variable CSS : --band-a, --band-b, --band-c, etc. (nom personnalisable).

Le CSS utilisateur

L'utilisateur Ă©crit librement le CSS qui sera injectĂ© dans la page. C'est lĂ  que l'art opĂšre — WebGlitch fournit les variables, vous fournissez l'esthĂ©tique :

/* La taille du texte suit les basses, la couleur suit trois bandes */
div {
  font-size: calc(var(--band-a) * 1px);
  color: rgb(var(--band-a), var(--band-b), var(--band-c));
}

/* Glitch : la page tremble sur le kick (bande en mode bool) */
body {
  transform: translate(
    calc(var(--kick) * 8px),
    calc(var(--kick) * -5px)
  );
  filter: hue-rotate(calc(var(--band-b) * 1deg));
}

/* Les images s'inversent quand les aigus dépassent le seuil */
img {
  filter: invert(var(--hats));
}

Astuces :

  • Les variables sont des nombres sans unitĂ© — utilisez calc(var(--band-a) * 1px) pour typer.
  • Les bandes bool valent 0 ou 1 : parfaites dans opacity, invert(), ou multipliĂ©es dans un calc().
  • transition sur les propriĂ©tĂ©s ciblĂ©es adoucit ou stylise la rĂ©ponse.

Les sources de contrĂŽle

Audio via loopback

Une extension ne peut pas capter directement « tout le son de l'ordi » : on passe par un pĂ©riphĂ©rique de loopback que l'extension ouvre comme une entrĂ©e micro (getUserMedia). Une fois configurĂ©, tout ce qui sort de vos enceintes entre dans WebGlitch — y compris Ableton, un DJ set, Spotify...

OS Solution Mise en place
Linux (PipeWire) Monitor natif Dans le sélecteur d'entrée de WebGlitch, choisir Monitor of .... Sinon pw-loopback ou qpwgraph pour router finement.
Linux (PulseAudio) Monitor natif Idem : chaque sortie expose un *.monitor utilisable comme entrée.

Firefox sous Linux ne liste pas les sources Monitor of ... (limitation connue de getUserMedia). Créez une source dédiée que Firefox verra comme un vrai micro :

pactl load-module module-remap-source \
  master="$(pactl get-default-sink).monitor" \
  source_name=webglitch_loopback \
  source_properties=device.description=WebGlitch-Loopback

La source « WebGlitch-Loopback » apparaĂźt alors dans le sĂ©lecteur (Ă  recrĂ©er aprĂšs redĂ©marrage, ou via votre config PipeWire). Autre option : dĂ©marrer la capture puis rerouter le flux Firefox vers le monitor dans pavucontrol → Enregistrement.

Chrome n'affiche pas la demande de permission micro dans le panneau latĂ©ral : au premier « ▶ DĂ©marrer », WebGlitch ouvre automatiquement un onglet d'autorisation. Accordez le micro, fermez l'onglet, recliquez « ▶ DĂ©marrer » — c'est acquis pour de bon. | macOS | BlackHole | CrĂ©er un Multi-Output Device (sortie physique + BlackHole), sĂ©lectionner BlackHole comme entrĂ©e dans WebGlitch. | | Windows | VB-Cable | Router la sortie systĂšme vers CABLE Input, choisir CABLE Output comme entrĂ©e dans WebGlitch. |

L'extension liste tous les pĂ©riphĂ©riques d'entrĂ©e disponibles et permet de filtrer la source — chaque bande travaille sur cette entrĂ©e commune.

Web MIDI (Ableton & co)

En complément (ou à la place) de l'audio, WebGlitch écoute les messages MIDI CC via un adaptateur Web MIDI unique (src/ui/midi.ts + src/core/midi/). Depuis Ableton Live :

  1. Créer un port MIDI virtuel (Linux : natif ALSA ; macOS : IAC Driver ; Windows : loopMIDI).
  2. Dans Ableton, router une piste MIDI (ou des automations d'enveloppe) vers ce port.
  3. Dans WebGlitch, ouvrir le menu đŸŽč de la barre de transport : l'Ă©numĂ©ration des entrĂ©es ne dĂ©marre qu'Ă  ce moment (init paresseuse, le prompt de permission n'apparaĂźt pas avant), choisir « Toutes les entrĂ©es » ou un port prĂ©cis — branchement Ă  chaud si un contrĂŽleur arrive aprĂšs coup.

CC learn : bouton Learn dans le mĂȘme menu → les contrĂŽles assignables (cutoff, Q, depth, attack, release, mute d'une bande, ou PERF) s'illuminent d'un halo → cliquer le contrĂŽle visĂ©, puis bouger le contrĂŽleur ou le CC de la piste Ableton : l'assignation se fait toute seule, avec un badge ch1·CC74 affichĂ© Ă  cĂŽtĂ© du contrĂŽle. Un mĂȘme CC peut piloter plusieurs contrĂŽles Ă  la fois (macro). Le menu affiche aussi une table d'assignation (--kick · cutoff — ch1·CC74 ✕) pour Ă©diter ou nettoyer d'un clic.

Source CC par bande : dans le panneau de mapping, un sĂ©lecteur Source : Audio | MIDI CC (+ bouton « CC ? » pour apprendre le CC source) fait passer la bande en pilotage direct — la valeur 0–127 du CC remplace la mesure audio et traverse le mĂȘme lissage/mapping que d'habitude. Ce mode fonctionne sans capture audio : la boucle de lecture tourne dĂšs qu'une bande CC existe. Les contrĂŽles de filtre se grisent (un filtre biquad n'a pas de sens sur un CC). C'est le mode « CV » Ă©voquĂ© dans l'idĂ©e d'origine : des automations Ableton qui pilotent directement la page, avec une prĂ©cision impossible Ă  obtenir par analyse audio.

Firefox : la disponibilitĂ© de Web MIDI dans les pages d'extension reste incertaine (gating « permission par site » cĂŽtĂ© add-on). WebGlitch le dĂ©tecte : si l'API est absente, le menu đŸŽč se masque proprement avec un message, sans casser le reste de l'interface.

L'interface

Construite avec potard (knobs, faders, VU-mÚtres, XY pads style Ableton) et habillée par lunar-aurora. Depuis la v0.3, la console tient dans une barre de transport unique (façon DAW), enrichie en v0.4 des menus MIDI et presets :

[▶/■] [MIX|GRV|TML] [PERF] ───── [đŸŽč MIDI] [đŸ’Ÿ presets] [🎯 cible] [◐ thĂšme] [ Bande]
  • Transport Ă  gauche : ▶ dĂ©marre la capture, ■ l'arrĂȘte.
  • SĂ©lecteur de vue segmentĂ© : MIX (Mixage), GRV (Groovebox), TML (Timeline) — la vue est globale, choisie librement.
  • PERF bascule le mode Performance (mis en Ă©vidence en rouge).
  • đŸŽč MIDI (v0.4) : entrĂ©es disponibles, Learn, table d'assignation — voir Web MIDI.
  • đŸ’Ÿ Presets (v0.4) : sauvegarder sous, charger, supprimer, export/import JSON — voir Les presets.
  • À droite : le tĂ©moin de cible 🎯 (suivi/verrouillĂ©/reciblage, comportement v0.2 conservĂ©), un menu thĂšme ◐, et le menu  Bande avec des dĂ©parts rapides — Kick (bandpass 60 Hz), Mids (bandpass 1 kHz), Hats (highpass 8 kHz), Énergie (lowpass large) — pour ne plus repartir d'une bande vierge Ă  chaque fois.

Dans l'Ă©diteur CSS, un menu {} (v0.4) insĂšre au curseur un des 7 effets intĂ©grĂ©s (pulse, shake, hue-spin, invert-flash, aberration chromatique, scanlines, blur-beat) ou un snippet perso : sĂ©lectionner du CSS dans l'Ă©diteur → «  snippet » → le nommer — il est ensuite disponible dans le menu et exportĂ© avec les presets (voir Les presets).

Les trois vues

  • Mixage — les bandes en colonnes verticales, table de mixage classique : nom, LED, filtre, VU. La tranche sĂ©lectionnĂ©e ouvre son mapping complet dans un panneau bas partagĂ© (façon channel-strip), plutĂŽt qu'un <details> par tranche.
  • Groovebox — une grille de pads, un pad par bande. Le pad est le XY (cutoff/Q au doigt) et pulse visuellement avec le signal.
  • Timeline — une ligne dense par bande (LED, nom, rĂ©sumĂ© du filtre, mini-knobs, VU Ă  traĂźnĂ©e qui garde l'historique du signal) : pensĂ©e pour scaler Ă  beaucoup de bandes visibles d'un coup.

Les deux modes

  • Édition — tous les rĂ©glages fins accessibles (filtre, mapping, panneau bas / onglets selon la vue).
  • Performance — la mĂȘme vue, rĂ©duite aux gestes de live : cibles tactiles Ă©largies, rĂ©glages fins masquĂ©s, mute par bande au premier plan. Le VU continue de vivre, mais la page ne rĂ©agit plus tant qu'une bande est coupĂ©e.

Les trois thĂšmes

Trois peaux commutables, assignables par mode (par dĂ©faut : mat en Édition, neon en Performance) :

ThĂšme Traits
mat — Mat industriel Surfaces plates, la couleur ne dit que l'information
relief — Relief discret Ombres douces, knobs bombĂ©s, VU encastrĂ©s, LED Ă©missives
neon — ArĂȘtes nĂ©on Fond quasi noir, contours luisants, signal qui irradie

La vue courante, le mode et le choix de thĂšme par mode sont persistĂ©s (config d'interface, pas les presets — voir Les presets).

Sous le capot, deux attributs cohabitent sur <html> : data-theme="cyberpunk" (statique, le socle lunar-aurora dont hérite l'app) et data-wg-theme (dynamique, seul porteur de ces trois peaux).

Deux surfaces, inchangĂ©es depuis v0.2, toutes deux habillĂ©es par cette mĂȘme barre de transport :

  • Panneau latĂ©ral (sidePanel Chrome / sidebar Firefox) — le mode « tweaking » : la console reste ouverte Ă  cĂŽtĂ© de la page pendant qu'on ajuste.
  • FenĂȘtre dĂ©tachĂ©e — le mode « live » : la console dans une fenĂȘtre indĂ©pendante, dĂ©plaçable sur l'Ă©cran du laptop, pendant que la page glitchĂ©e part en plein Ă©cran sur le vidĂ©oprojecteur.

Les presets

  • Config d'interface persistĂ©e — vue courante, mode et thĂšme par mode sont dĂ©jĂ  sauvegardĂ©s localement (v0.3) : on retrouve son poste de pilotage tel qu'on l'a laissĂ©.
  • Contenu d'un preset — bandes (filtre + mapping), CSS utilisateur et assignations MIDI : tout ce qui fait une configuration de live tient dans un seul objet.
  • Menu đŸ’Ÿ — sauvegarder sous (nom saisi en ligne), charger, supprimer ; le rechargement d'un preset est Ă  chaud, sans couper la capture en cours.
  • Rappel par site — l'Ă©tat courant s'auto-sauvegarde (debounce 500 ms) sous le hostname de l'onglet ciblĂ©, et se recharge automatiquement au dĂ©marrage ou au reciblage vers un site dĂ©jĂ  connu.
  • Export / Import JSON — partagez vos presets, versionnez-les, prĂ©parez vos sets ; un import fusionne avec l'existant, en suffixant les doublons de nom (« (2) »).
  • Sidepanel et fenĂȘtre dĂ©tachĂ©e synchronisĂ©s — les deux surfaces partagent le mĂȘme stockage et se mettent Ă  jour l'une l'autre via storage.onChanged.

Architecture technique

Vue d'ensemble

flowchart TB
    subgraph UI["UI (sidepanel / fenĂȘtre dĂ©tachĂ©e)"]
        MIC[getUserMedia<br/>entrée loopback] --> WA[Web Audio<br/>BiquadFilterNode + AnalyserNode<br/>par bande]
        MIDI[Web MIDI<br/>CC in] --> CORE
        WA --> CORE[core/ — moteur de mapping<br/>TS pur, zĂ©ro API navigateur]
        POTARD[potard<br/>knobs & faders] <--> CORE
    end
    CORE -- "valeurs des bandes<br/>(runtime.sendMessage)" --> BG[background/<br/>service worker — routage]
    BG --> CS[content/<br/>content script]
    CS -- "setProperty('--band-a', v)" --> PAGE[(Page web)]
    CS -- "injection &lt;style&gt;" --> PAGE
Loading

Trois zones d'exécution, reliées par le message passing de WebExtensions :

  1. UI (sidepanel ou fenĂȘtre dĂ©tachĂ©e) — c'est ici que vivent la capture audio, le graphe Web Audio, l'Ă©coute MIDI et le moteur de mapping. Un document visible a le droit d'ouvrir getUserMedia et tourne sans ĂȘtre throttlĂ©.
  2. Background (service worker) — pur routeur de messages, sans Ă©tat lourd (contrainte MV3 : il peut ĂȘtre tuĂ© Ă  tout moment).
  3. Content script — minimal par design : il reçoit des paquets de valeurs et les Ă©crit (documentElement.style.setProperty), et gĂšre la balise <style> du CSS utilisateur. Aucune logique mĂ©tier dans la page.

Structure du dépÎt

WebGlitch/
├─ src/
│  ├─ core/          # Moteur pur TypeScript — AUCUNE API navigateur
│  │                 # band.ts, mapping.ts, smoothing.ts, frequency.ts, live.ts,
│  │                 # preset.ts / snippets.ts (sĂ©rialisation JSON), starters.ts
│  │  └─ midi/       # assignments.ts, learn.ts, scale.ts — CC learn et mise Ă  l'Ă©chelle, TS pur
│  │                 # → 100 % testable sous Vitest, candidat à extraction en lib
│  ├─ audio/         # Graphe Web Audio : source → filtres biquad → analyseurs
│  ├─ ui/            # Console : composants potard, thĂšme lunar-aurora, Ă©diteur CSS,
│  │                 # midi.ts (adaptateur Web MIDI), presets.ts (menu đŸ’Ÿ)
│  ├─ content/       # Content script : pose des variables + CSS utilisateur
│  ├─ background/    # Service worker : routage des messages UI ↔ contenu
│  └─ platform/      # Adaptateur browser.ts (Chrome/Firefox) Ă©crit maison
├─ tests/            # Tests Vitest (TDD)
├─ docs/             # Documentation, specs de design
├─ manifest.chrome.json   # Manifest V3 Chrome
├─ manifest.firefox.json  # Manifest V3 Firefox
└─ Idea.md           # L'idĂ©e d'origine, conservĂ©e pour l'histoire

RÚgle d'or de core/ : aucun import d'API navigateur (ni chrome.*, ni Web Audio, ni DOM). Le moteur reçoit des nombres, rend des nombres. C'est ce qui le rend testable en TDD sans navigateur, et extractible plus tard en bibliothÚque autonome (voir Roadmap).

Flux de données

  1. L'UI capture l'audio → le graphe Web Audio produit, par bande, un niveau (0–1) mesurĂ© Ă  requestAnimationFrame.
  2. Le MIDI arrive en Ă©vĂ©nements midimessage, normalisĂ©s en 0–1.
  3. core/ applique le mapping de chaque bande (interpolation min/max, seuils bool, lissage attack/release).
  4. Les valeurs qui ont changé (et seulement elles) partent en un seul message groupé par frame vers le content script.
  5. Le content script écrit les variables CSS. Le navigateur fait son travail : le CSS utilisateur réagit.

Performance

  • Filtres natifs : BiquadFilterNode et AnalyserNode sont implĂ©mentĂ©s en code natif par le navigateur — aucun DSP JavaScript dans le chemin chaud.
  • Un message par frame maximum, valeurs groupĂ©es et dĂ©dupliquĂ©es — pas de spam du message passing.
  • Variables CSS ciblĂ©es : modifier une custom property ne recalcule que les rĂšgles qui l'utilisent.
  • MesurĂ©, pas supposĂ© : au banc d'essai (pire cas 26 bandes — RMS 1024 Ă©chantillons, lissage, mapping, quantification, traĂźnĂ©es), le moteur JS coĂ»te ~0,5 ms par frame, soit ~3 % du budget 60 Hz. Le vrai coĂ»t d'un glitch est ailleurs : le pipeline de rendu de la page cible (prĂ©fĂ©rer transform/opacity, compositeur seul, aux filter/text-shadow globaux qui repeignent tout).
  • TachymĂštre intĂ©grĂ© : la barre de transport affiche en continu le coĂ»t rĂ©el du moteur par frame, le dĂ©bit de messages et le framerate de la page cible (0.42 ms · 12 msg/s · page 58 fps).
  • Cadence adaptative : la page cible mesure son propre framerate et le remonte Ă  la console ; si le repaint sature (CSS lourd), l'envoi des variables est automatiquement dĂ©cimĂ© (Ă·2 
 Ă·6, avec hystĂ©rĂ©sis) — moins de changements = moins de repaints — puis revient Ă  pleine cadence dĂšs que la page respire. Le lissage, lui, reste calculĂ© Ă  60 Hz : l'enveloppe ne triche jamais.
  • WebAssembly : envisagĂ© dĂšs l'origine du projet, volontairement repoussĂ© en phase 2. Il ne deviendra pertinent que pour du DSP custom (dĂ©tection d'attaques, suivi de pitch, FFT exotique) que les nƓuds natifs ne couvrent pas — pas pour un chemin chaud qui consomme 3 % du budget.

Philosophie : zéro dépendance externe

WebGlitch ne dépend d'aucune bibliothÚque tierce en production. Les deux seules dépendances runtime sont des projets maison, maßtrisés de bout en bout et co-évolutifs :

Dépendance RÎle Pourquoi
potard ContrĂŽles audio (Web Components, canvas, zĂ©ro dĂ©pendance) Knobs, faders, crossfaders, VU-mĂštres, XY pads — exactement l'UI d'une console
lunar-aurora Framework CSS (OKLCH, @property, @layer, thÚmes) Habillage de l'interface, thÚmes sombres adaptés au live

CĂŽtĂ© outillage (dev uniquement) : typescript, vite, vitest — la mĂȘme chaĂźne que potard. Pas de framework d'extension (WXT...), pas de webextension-polyfill : l'adaptateur cross-browser (src/platform/browser.ts) est Ă©crit maison (~50 lignes), parce qu'un code qu'on maĂźtrise vaut mieux qu'une dĂ©pendance qu'on subit.

Compatibilité navigateurs

Chrome / Chromium Firefox
Manifest V3 (manifest.chrome.json) V3 (manifest.firefox.json)
Panneau latéral chrome.sidePanel sidebar_action
FenĂȘtre dĂ©tachĂ©e chrome.windows.create({type:"popup"}) idem
EntrĂ©e audio getUserMedia ✅ getUserMedia ✅
Web MIDI ✅ ⚠ selon gating (permission par site) — dĂ©gradation propre sinon

Les différences d'API sont absorbées par src/platform/, seul endroit du code autorisé à connaßtre le navigateur qui l'exécute.

Développement

git clone git@github.com:yrbane/WebGlitch.git
cd WebGlitch
pnpm install

pnpm test        # Vitest — le projet est dĂ©veloppĂ© en TDD
pnpm dev         # build rapide (sans vérification des types) ; recharger l'extension à la main
pnpm build       # build de production (Chrome + Firefox)

Chargement de l'extension en dev :

  • Chrome : chrome://extensions → mode dĂ©veloppeur → « Charger l'extension non empaquetĂ©e » → dist/chrome/
  • Firefox : about:debugging → « Ce Firefox » → « Charger un module complĂ©mentaire temporaire » → dist/firefox/manifest.json

Roadmap

v0.1 — Le cƓur (en cours)

  • Moteur core/ : bande, filtre, mapping, lissage — en TDD
  • Graphe Web Audio : entrĂ©e loopback → filtres → mesures
  • Content script : injection des variables et du CSS utilisateur
  • UI sidepanel minimale : une bande, un knob, un textarea CSS

v0.2 — La console

  • Multi-bandes dynamique (ajout/suppression/duplication)
  • Tranches de console complĂštes avec potard (VU-mĂštres, XY pad filtre)
  • FenĂȘtre dĂ©tachĂ©e (mode vidĂ©oprojecteur)
  • ThĂšme lunar-aurora

v0.3 — Refonte UX (livrĂ©e)

  • Barre de transport unique (transport, sĂ©lecteur de vue, mode Performance, cible, thĂšme,  Bande avec dĂ©parts rapides)
  • Trois vues commutables : Mixage (panneau de mapping bas partagĂ©), Groovebox (pads-XY pulsĂ©s par le signal), Timeline (lignes denses Ă  VU Ă  traĂźnĂ©e)
  • Deux modes Édition/Performance, avec mute par bande et cibles Ă©largies en Performance
  • Trois thĂšmes (mat / relief / neon) assignables par mode, config d'interface persistĂ©e

v0.4 — Le live avancĂ© (livrĂ©e)

  • EntrĂ©e Web MIDI + apprentissage CC (« MIDI learn »), table d'assignation, source CC par bande (mode CV)
  • Presets nommĂ©s, auto-rappel par site, export/import JSON
  • BibliothĂšque de snippets CSS de dĂ©part (glitch pack) + snippets perso

Phase 2 — L'Ă©cosystĂšme

  • Extraction de core/ en bibliothĂšque autonome (yrbane/
) : moteur audio→valeurs rĂ©utilisable hors extension (sites, installations, Node)
  • Pont Ableton : patch Max for Live envoyant OSC/WebSocket vers l'extension (automations « CV » haute prĂ©cision)
  • WebAssembly pour DSP custom (dĂ©tection d'attaques, suivi de pitch) — si les mesures le justifient
  • Publication des stores (Chrome Web Store, AMO)

Conventions du projet

  • TDD : le test d'abord, toujours. core/ vise une couverture complĂšte.
  • SOLID / DRY / KISS : des unitĂ©s petites, une responsabilitĂ© chacune, des interfaces claires entre core/, audio/, ui/ et content/.
  • Langue : code et identifiants en anglais, commentaires et messages de commit en français.
  • ZĂ©ro dĂ©pendance : toute nouvelle dĂ©pendance runtime externe doit ĂȘtre refusĂ©e par dĂ©faut ; on Ă©crit, ou on fait Ă©voluer un repo maison.

Licence

MIT — comme potard et le reste de l'Ă©cosystĂšme.


WebGlitch fait partie de l'écosystÚme yrbane : potard · lunar-aurora

About

đŸŽ›ïžđŸ“ș Tordez des pages web avec du son — le son pilote des variables CSS en temps rĂ©el.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages