223 Commits

Author SHA1 Message Date
L'électron rare 144d55a7fa feat(matrix): MD-index pinch slot = breakdown
CI build oscope-of / build-check (push) Has been cancelled
User request live: right-hand index pinch fires breakdown instead of
relanceEvolve — SC default, generator default, web defaults, the 196
presets and the test pins all updated. relanceEvolve stays in the
assignable vocabulary.
2026-07-02 21:44:40 +02:00
L'électron rare 0bc15e7000 feat(matrix): composed live variants
CI build oscope-of / build-check (push) Has been cancelled
Regenerate 112 *_live-[1-4].matrix with the composition engine.
84 intro/live/outro originals untouched. All 6 preset tests pass.
2026-07-02 21:22:12 +02:00
L'électron rare 0e5c4df3d7 feat(matrix): melodic composition engine
7 style families x 8 melodic roles x 6 composition stages. Chord
progressions (i-VI-III-VII etc.) aligned across all voices per colour;
call-response via +4-step offset for melody/stab vs arp/acid. Pure
deterministic transforms: rotate, ornament, climax (+7 oct lift),
sparse, resolve-to-anchors. New MEL[role]["composed_<style>"] entries;
existing hand-authored families untouched.
2026-07-02 21:22:05 +02:00
L'électron rare ba5db3237e feat(matrix): 112 live variant presets
CI build oscope-of / build-check (push) Has been cancelled
Context: live sets needed variety; the single *_live.matrix per style
gave no choice during a performance.

Approach: 28 styles x 4 variants each produced by
generate_live_variant_sc() with deterministic era kits and family
overrides.

Changes:
- Add *_live-1..4.matrix for every style (112 files)
- v1 house/M1: m1_organ/m1_piano/dx7_epiano on chord/bells/melody
- v2 acid/hoover: tb303 on acid/arp, hoover on lead/reese
- v3 virus/nord: virus_saw on lead/arp, nord_lead on melody/arp
- v4 raw 909/rave: tr909_snare on snare, rave_stab/brass_stab on stab
- Each variant uses a distinct pattern family and busy-block profile

Impact: 196 total .matrix presets; SC engine discovers all via ls scan.
2026-07-02 20:28:04 +02:00
L'électron rare c8318cecc2 feat(matrix): live variant generator
Add generate_live_variant_sc() to produce 4 deterministic live
variants per style (112 files). Each variant differs by:
  - pattern family (VARIANT_FAMILIES per style group)
  - era instrument kit overlay (house/M1, acid/hoover, virus/nord,
    raw 909/rave) merged from VARIANT_ERA_KITS
  - busy-block recolour config (VARIANT_BUSY, 4 distinct profiles)

Also: fix generator defaults to match live state:
  - globalActions: fill/doubleTime/washReverb/muteDrums/relanceEvolve/
    halfTime/next/muteMelo (was fill/drop/breakdown/evolve/...)
  - hand-mod depths 0.70 (was 0.40/0.50 for rHandX/rHandY/lHandX/lHandY)
  - INST_CHOICES synced with matrix.scd ~matInstChoices (10 new vintage
    synths: tr909_snare hoover m1_piano m1_organ dx7_epiano brass_stab
    nord_lead virus_saw rave_stab reese_juno)

Update test_global_actions.py to expect new 8-action mapping.
Add test_live_variants.py: 112 files, legal instruments, distinct
variants, determinism.
2026-07-02 20:27:36 +02:00
L'électron rare 876afc0cf9 feat(matrix): wire vintage synths into voices
Add hoover/nord_lead/virus_saw to arp+lead, brass_stab/rave_stab to
stab, m1_piano/m1_organ/dx7_epiano to chord+sub+bells+melody,
reese_juno to sub+pad+reese, tr909_snare to clap+snare.
Mirror changes in web UI MATRIX_INST_CHOICES.
2026-07-02 20:14:42 +02:00
L'électron rare a6556e809a feat(sound): vintage 90s synthdefs
Add 10 classic machine emulations for the matrix:
tr909_snare, hoover, m1_piano, m1_organ, dx7_epiano,
brass_stab, nord_lead, virus_saw, rave_stab, reese_juno.
All note-terminating; cutoff+res args on res-voice targets.
2026-07-02 20:14:36 +02:00
L'électron rare fbc6d4efa3 chore: drop preset pycache from git
The deepen-bindings commit accidentally staged the preset generator's
__pycache__ directory (compiled .pyc artifacts). Untrack the files and
add a local .gitignore so preset regeneration never stages them again.
2026-07-02 18:46:37 +02:00
L'électron rare 1302ffd87a feat(matrix): deepen hand mod bindings to 0.70
CI build oscope-of / build-check (push) Has been cancelled
User request live: more audible depth on the hand X/Y mods. All 1848
lHand/rHand X/Y bindings across the 84 presets raised from 0.40-0.50
to 0.70 (per-voice editable in the web UI as before).
2026-07-02 18:44:10 +02:00
L'électron rare bcf7ac180e chore(matrix): migrate presets to new mapping
CI build oscope-of / build-check (push) Has been cancelled
Update globalActions in all 84 .matrix preset files from old
default to: [\fill, \doubleTime, \washReverb, \muteDrums,
\relanceEvolve, \halfTime, \next, \muteMelo].
2026-07-02 14:56:50 +02:00
L'électron rare a569122f14 feat(matrix): drum feel + relance actions
Add \doubleTime and \halfTime as drum-only subdivision feel toggles
(\matDrumFeel \normal/\double/\half, mutually exclusive). Engaging a
feel re-sources only drum voices (matLastColor reset + matApplyBar).
The \relanceEvolve composite action seeks to bar 0 then fires
matRelanceEvolve. \matDrumFeelPush sends /matrix/drumfeel on toggle
and on preset load (resets to \normal). OSCdef mat_drumfeel_get added.
Drum feel stretch applied in matVariationOverlay + matColorStepPattern
via txStretch local var; non-drum voices use matTxStretch unchanged.
Web vocab: relanceEvolve added, evolve relabelled Évolue.
Test file extended with sections R (feel toggle) and S (relanceEvolve).
2026-07-02 14:56:07 +02:00
L'électron rare 3199aa326d feat(matrix): remove fist gestures
SC handlers (edge detector, tick, OSCdefs, pose/hands calls) and web
UI (Poings section, sensibilite poing slider, fistprogress indicators)
removed. Python FIST_ENABLE=0 kill-switch was already in effect.
Old .matrix files with fistThresh key load without error (key silently
ignored). Test harness Q section removed from test_global_actions.scd.
2026-07-02 14:42:43 +02:00
L'électron rare 65c06ed4c6 feat(presets): emit default fist threshold
Context: Task 1 wired fistThresh into the SC matrix engine (default
0.15); the generator was not yet emitting this field, so every
.matrix was missing it and the engine fell back to its hardcoded
default.

Approach: TDD — added a failing check to test_global_actions.py,
then edited to_sc so pinchHoldMs ends with a comma and fistThresh
0.15 follows as the last field before the closing paren.
Regenerated 84 presets twice for determinism.

Changes:
- generate_presets.py: pinchHoldMs now ends with comma; fistThresh
  0.15 emitted as the final key in every preset's SC Event literal
- test_global_actions.py: EXPECT_FTH block checks to_sc output and
  all 84 on-disk .matrix files
- *.matrix (84 files): regenerated with fistThresh field

Impact: all four gates green (GLOBALACT-PY, test_sections,
test_families, GLOBALACT SC); fistThresh is now a first-class
preset field readable at load time by ~matLoadFile.
2026-06-30 16:50:02 +02:00
L'électron rare 24078111b4 feat(matrix): fist-held gestures (reload/next)
Held closed-fist (low openness, hysteresis+presence guard) per hand
fires an action after ~matPinchHoldMs: left hand reloads the current
preset, right hand advances to the next. Progress emitted on
/matrix/fistprogress.

- ~matFistEdge edge detector (engage/release/absent + hysteresis)
- ~matFistTick fires once past hold threshold (guarded by ~matFistFired)
- ~matFistReloadCurrent and ~matNextPreset wired to hand 0/1
- /matrix/fisthresh[/get] OSCdefs + ~matFistThreshPush
- fistThresh saved and restored per .matrix file
- 30 Hz poller now calls ~matFistTick alongside ~matPinchTick
- Harness group Q: A-Q all green
2026-06-30 16:42:58 +02:00
L'électron rare 2ced4e728f feat(presets): emit default pinch hold ms
Add top-level 'pinchHoldMs': 300 to every generated .matrix so the SC
engine (Task 2) reads it instead of its hardcoded default.

- generate_presets.py: globalSettings ends with ',' and
  'pinchHoldMs': 300 is the last field before the closing ')'
- test_global_actions.py: EXPECT_PHMS check added (TDD red then green)
- 84 .matrix files regenerated (28 morceaux x intro/live/outro)
2026-06-30 16:01:59 +02:00
L'électron rare 0daa6d6bcd feat(matrix): pinch hold-to-fire + progress 2026-06-30 15:53:59 +02:00
L'électron rare 9590615069 feat(presets): 8 pinch actions, trim settings
Expand globalActions from 4 to 8 slots:
[\fill, \drop, \breakdown, \evolve,
 \muteDrums, \muteMelo, \washReverb, \next]

Drop openThresh/closeThresh from globalSettings (now
engine-side constants via Task 1). Regenerate all 84
.matrix files deterministically.

All gates: GLOBALACT-PY PASS, TEST PASS x2, GLOBALACT PASS
2026-06-30 14:56:50 +02:00
L'électron rare cc485003f6 feat(matrix): pinch-triggered global actions
Replace open/close hand detection with 8 pinch slots (hand*4+finger-1).
Global actions array grows from 4 to 8 entries (L/R x index..ring).
Remove ~matHandFlip, ~matHandState, openThresh/closeThresh entirely.
2026-06-30 14:49:49 +02:00
L'électron rare afc220f83f feat(matrix): matrix bpm tempo route 2026-06-30 14:29:23 +02:00
L'électron rare 0bd8e46dd7 feat(matrix): mute groups, time-warp, wash, next 2026-06-30 14:00:09 +02:00
L'électron rare 8bead14e23 feat(presets): emit default global settings
Context: Phase 2 Task 1 made the SC engine load a globalSettings Event
from .matrix files (openThresh/closeThresh/transientBars/breakdownKeep)
and default it when absent. Generator was not yet writing the field.

Approach: append globalSettings after globalActions in to_sc() return
string; extend test_global_actions.py with EXPECT_SET check against
both the to_sc sample and all 84 .matrix files on disk.

Changes:
- generate_presets.py: to_sc now ends with globalActions (comma) then
  globalSettings Event with default values matching SC defaults
- test_global_actions.py: add EXPECT_SET literal + two check() calls
- *.matrix (84 files): each preset now carries the globalSettings field

Impact: every preset ships with openThresh/closeThresh/transientBars/
breakdownKeep defaults; SC engine reads them on load; no more implicit
fallback needed at runtime for any preset in the library.
2026-06-30 13:36:00 +02:00
L'électron rare 9f53f27317 feat(matrix): editable global action settings
Replace four hard-coded constants (~matTransientBars,
~matBreakdownKeep, ~matOpenThresh, ~matCloseThresh) with
~matGlobalSettings Event (openThresh, closeThresh,
transientBars, breakdownKeep). All three consumers
(~matHandFlip, ~matSetTransient, ~matFireGlobal) now
read from settings. Add ~matGlobalSettingsPush + OSCdefs
/matrix/globalsettings[/get]. Save/restore in .matrix.
Harness A-K green.
2026-06-30 13:27:51 +02:00
L'électron rare cadbced958 fix(matrix): no baseGrid leak in evolve one-shot
CI build oscope-of / build-check (push) Has been cancelled
When the evolve toggle is OFF, ~matRelanceEvolve now snapshots
~matBaseGrid, mutates once, then restores it to nil. When ON it
keeps the persistent base and re-mutates from it. Fixes stale-
snapshot corruption across preset loads. Case I added to harness.
2026-06-30 12:19:14 +02:00
L'électron rare 50e9e79a22 feat(presets): emit default global actions mapping
Context: SC engine (Task 2) loads 'globalActions' from .matrix files
and defaults to [\fill, \drop, \evolve, \breakdown] when absent.
Generated presets did not write this field, causing implicit reliance
on the engine default.

Approach: extend to_sc() return string to include the globalActions
key so every preset explicitly carries the default mapping
(LH-open=fill, LH-closed=drop, RH-open=evolve, RH-closed=breakdown).

Changes:
- generate_presets.py: add 'globalActions' line in to_sc() return
- test_global_actions.py: new Python test verifying to_sc() output
  and all 84 on-disk .matrix files carry the field
- 84 .matrix files: regenerated with globalActions field present

Impact: presets are self-documenting; SC engine reads the explicit
value rather than applying a silent default.
2026-06-30 11:50:51 +02:00
L'électron rare 0cc64194df feat(matrix): hand gesture detection + mapping io
Add ~matHandFlip (hysteresis open/closed per hand),
~matGlobalActionsPush, OSCdefs /matrix/globalaction + /get,
/pose/hands integration, globalActions save/load roundtrip.
2026-06-30 11:41:55 +02:00
L'électron rare b72056ecb3 feat(matrix): global actions + transient engine
Adds fill/drop/breakdown/evolve one-shot transient overrides:
- ~matEffColor: per-voice colour gate for any active transient
- ~matSetTransient/~matTransientTick: set and expire transients
- ~matRelanceEvolve: one-shot evolve mutation
- ~matFireGlobal: dispatch gesture-slot -> action
- ~matGlobalActions/~matBreakdownKeep: configurable defaults
- ~matApplyBar now routes through ~matEffColor (grid untouched)
- ~matPlay routine ticks transient once per bar
- test_global_actions.scd harness: GLOBALACT PASS
2026-06-30 11:29:53 +02:00
L'électron rare 8dde561c34 feat(presets): per-style variation in live loop
CI build oscope-of / build-check (push) Has been cancelled
The live loop tiled the plateau into 4 identical blocks -- full but static.
LIVE_STYLE maps each morceau to a style group; LIVE_VAR holds per-style
profiles; _live_variation recolours active cells in some 16-bar blocks
(rhythmic 2/4, melodic 3 octave) and adds phrase-end fills (colour 6) so the
full loop breathes in a genre-appropriate way -- techno double-time hats +
fills, breaks snare rolls, ambient gentle bell octaves, etc. Active cells
only -> density unchanged, no voice dropped, no intro/breakdown back.

test_sections asserts the live still has no intro/breakdown AND varies (not
4 identical blocks). Regen 84 deterministic, VALIDATE 84/84 + DEFAULTS PASS.
2026-06-30 10:27:05 +02:00
L'électron rare db8d7d465f feat(presets): live = continuous full loop
CI build oscope-of / build-check (push) Has been cancelled
Each morceau's _live section reused the standalone arc, which re-introduced
(near-empty intro -> rebuild -> plateau -> breakdown). Now make_live_continuous
tiles the plateau (P, bars 32-47) across all 64 bars: full groove from bar 0,
no intro ramp, no breakdown -- a clean loop the _intro builds to and the
_outro descends from. Applied post-apply_colors for the live section only via
to_sc(post=); intro/outro unchanged.

test_sections asserts the live is full-from-start + has no breakdown dip.
Regen 84 deterministic, VALIDATE 84/84 + DEFAULTS PASS, test_families PASS.
2026-06-30 10:03:16 +02:00
L'électron rare 5def521587 fix(presets): remove default pose->voice triggers
CI build oscope-of / build-check (push) Has been cancelled
The SP-A default bound danse->gate on the fx and sweep voices, so the
action-head classifying the dancer as "danse" toggled those voices on/off
even with no fx/sweep cells in the grid -- poses triggering FX that the
user never placed. Pose->voice triggers are now opt-in (default_poses
returns []); continuous pose modulation (default_mods) is unchanged.

Updated test_default_mods.py + the validate_presets DEFAULTS assertion
(fx voicePoses now expected empty). Regenerated 84 presets. VALIDATE
84/84 + DEFAULTS PASS; test_families + test_sections PASS.
2026-06-30 09:48:21 +02:00
L'électron rare ce00b90f43 feat(matrix): autofill name on load
CI build oscope-of / build-check (push) Has been cancelled
Emit /matrix/loaded <name> at each user-facing load point (the /matrix/load
OSCdef, the queued branch of ~matWrapStep firing at the wrap, and the
not-playing fallback in /matrix/loadnext) - not from the shared ~matLoad,
to avoid spamming during the boot autoload. The web fills #matrix-name from
it, so SAUVER updates the loaded matrix in place. For CHARGER SUIVANT the
name tracks the actual swap (at the wrap), never the merely-armed preset.

VALIDATE 84/84, test_matnames PASS, node --check + 29 web tests pass.
2026-06-30 09:25:08 +02:00
L'électron rare 68fa3c4e3b feat(matrix): queued load at loop wrap 2026-06-30 09:13:23 +02:00
L'électron rare af55f8a145 fix(matrix): persist user saves in load list 2026-06-30 09:12:04 +02:00
L'électron rare 3a5cf80aa7 refactor(presets): breaks arcs independent
CI build oscope-of / build-check (push) Has been cancelled
Expand the 7 breaks morceaux from the shared _breaks_intro/_breaks_outro
helper into 14 fully-independent arc bodies (one intro + one outro each),
per the "no shared helper" requirement. Each varies by morceau character
(bass_science reese-forward, jungle_amen amen-snare, footwork kick step2,
neuro_reese stab, tribal_perc tom/perc).

test_sections PASS, VALIDATE 84/84.
2026-06-30 00:24:28 +02:00
L'électron rare 4c7d960b45 feat(presets): wire families + live default
Wire the hand-authored families into the 84 presets and make the launcher
boot the live section.

Changes:
- patterns_for: strip the _intro/_live/_outro suffix before the
  PRESET_FAMILY lookup, so all 84 section presets resolve to their
  morceau's family.
- PRESET_FAMILY: retarget mel families to the new banks where they fit -
  house (detroit/rave/trance/melodic/electro), psy (hypnotic/psytrance/
  minimal), dub (dub_techno/melodic_deep), ambient (ambient_intro); drum
  families now style ride/shaker/clap/perc per dfam.
- launch_concert.sh: MATRIX_PRESET default -> techno_drive_live.

Impact: genre presets now use the authored families. test_families PASS,
test_sections PASS, regen deterministic, VALIDATE PASS 84/84.
2026-06-30 00:20:19 +02:00
L'électron rare 1090f2c223 feat(presets): 56 intro/outro arcs
Hand-write the intro and outro arc for each of the 28 morceaux (56 new
independent arc functions). intro = voices enter across the 64 bars
(sparse->full, capped at the plateau with a light O lead-in into live);
outro = voices exit (full early, dropping out toward the break/outro).

Approach:
- one arc_intro_<m> / arc_outro_<m> per morceau, registered in
  INTRO_ARCS/OUTRO_ARCS; composed from the primitive fill/hit grid API
  over the I/B/R/D/P/K/O section codes.
- the 7 breaks morceaux share a _breaks_intro/_breaks_outro shape
  parameterized per morceau (deviation from "fully independent" - flagged
  for review).
- test_sections.py gate: intro builds, outro breaks down, live densest -
  all 28 PASS.

Impact: 84 presets regenerated, VALIDATE PASS 84/84. Section feel is
shape-correct; musical review by ear pending.
2026-06-30 00:17:51 +02:00
L'électron rare fc73be4851 feat(presets): hand-authored pattern families
Add explicit 6-colour style families to the pattern bank so genre presets
feel musically distinct (merged SP-C2). All colours hand-written following
the role convention (base/busier/broken/double/sparse/fill), velocity-
humanized; existing families and every default stay untouched.

Changes:
- MEL: dub (reese/pad/chord/bells/melody), psy (sub/reese/arp/lead/stab),
  house (pad/chord/stab/bells/lead/melody), ambient (pad/bells/melody/
  sub/reese) - 21 families x 6 motifs.
- DRUMS: percu-voice + style-completion families for ride/shaker/crash/
  rim/fx/sweep/perc (techno/house/breaks/dnb/trance/ambient).

Impact: vocabulary for the genre presets; wired per preset in a later
task. test_families.py PASS (validity + >=4 distinct + coverage).
2026-06-30 00:06:08 +02:00
L'électron rare 38d79f8510 feat(presets): intro/live/outro 84 skeleton
Each morceau is now decomposed into three sections (intro/live/outro)
as three separate .matrix files, replacing the single-grid presets.

Approach:
- MORCEAUX: lazy view over PRESETS; live = the existing arc, intro/outro
  resolve from INTRO_ARCS/OUTRO_ARCS registries (fallback to live) so the
  per-morceau arcs can be populated anywhere at module level.
- main() emits <morceau>_<section>.matrix (28 x 3 = 84).
- test_sections.py: section-shape gate (intro builds, outro breaks down,
  live densest) - currently RED on outros (placeholders) to drive the
  hand-written arc tasks.
- validate_presets.scd: count 28 -> 84, DEFAULTS check on peak_drop_live.

Changes:
- generate_presets.py: MORCEAUX/_sections/_Morceaux, main() loop.
- removed the 28 old single-name .matrix; wrote 84 section files.

Impact: structural base for hand-authored intro/outro arcs (Tasks 3-9)
and the new pattern families (Task 2). VALIDATE PASS 84/84.
2026-06-30 00:00:25 +02:00
L'électron rare eb42da0f31 test(presets): pattern family validity harness 2026-06-29 23:41:28 +02:00
L'électron rare 6f8903e303 fix(presets): alignment-independent contrast
CI build oscope-of / build-check (push) Has been cancelled
Busier/sparse/broken in derive_drum_colors and derive_mel_colors
now operate on the base's own rest/hit lists, not fixed i%4
positions. Stab (all hits at i%4==2) went from 4 distinct colours
(busier==broken==base, sparse EMPTY) to 6. Test strengthened with
distinctness and sparse-not-empty asserts for stab/kick/hats/acid/
shaker/pad. 28 presets regenerated; determinism confirmed (md5 zero
diff on two consecutive runs). VALIDATE PASS 28/28.
2026-06-29 21:45:17 +02:00
L'électron rare c7ba26100e test(presets): assert default colours are derived
Replace weak != property checks with equality assertions against
derive_drum_colors / derive_mel_colors. The old checks passed even
without wiring; equality fails if patterns_for reverts to raw authored
defaults.
2026-06-29 21:29:18 +02:00
L'électron rare d0a66a5fd3 feat(presets): contrasted default colours, regen
Wire derive_drum_colors/derive_mel_colors into patterns_for:
default family colours 2-6 are now derived from colour 1
(busier/broken/double/sparse/fill); authored style families
pass through unchanged. Remove dead _pick/_DRUM_VELS.
Regenerate 28 .matrix files; sclang VALIDATE PASS 28/28.
2026-06-29 21:24:09 +02:00
L'électron rare 39ac5d0ad1 feat(presets): 6-colour contrast derivation fns 2026-06-29 21:17:47 +02:00
L'électron rare e99fe1f585 fix(matrix): evolve clear + idempotent enable
CI build oscope-of / build-check (push) Has been cancelled
Fix 1: ~matClear now mirrors the zero grid into ~matBaseGrid when
evolving, preventing resurrection on the next ~matEvolveStep cycle.

Fix 2: ~matSetEvolve.(true) guards the base snapshot with a
not-yet-evolving check; re-enabling while already evolving no longer
overwrites the original baseline.

Fix 3: ~matLoadFile now calls ~matEvolvePush after load so
reconnecting web clients see the correct toggle and rate.

RED->GREEN on two new test assertions (test_matrix.scd).
2026-06-29 20:50:03 +02:00
L'électron rare 47fe6a46af feat(matrix): evolve edit/save/load + OSC routes 2026-06-29 20:31:32 +02:00
L'électron rare b254d7cf1d feat(matrix): generative per-cycle evolve core 2026-06-29 20:25:19 +02:00
L'électron rare ee4cd9b92c fix(matrix): neutral rest for position mod sources
CI build oscope-of / build-check (push) Has been cancelled
Position sources (lHandX/Y, rHandX/Y, bodyX/Y, headX/Y, bodySym)
now default to 0.5 (centre) when absent from cache instead of 0.
Magnitude sources (speed, accel, openness, span, danse, depth,
mouthOpen) keep 0 as correct rest. Fixes pitch-flat-at-boot-without-pose
and matching meter skew in matModValuesPush.
2026-06-29 19:46:05 +02:00
L'électron rare 7bd5a4f5fe feat(presets): regenerate with default mappings
Regenerate 28 .matrix presets with role-adapted voiceMods/voicePoses:
soloists (acid/arp/lead/stab/bells/melody) get hand bindings (rHandX/Y,
lHandX/Y); drums get body bindings (bodyVitesse/bodyX); fx/sweep get
danse->gate pose. Update validate_presets.scd to assert new scheme via
peak_drop (acid 4 hand bindings, kick 2 body, fx danse->gate).
2026-06-29 19:14:44 +02:00
L'électron rare cd77189c12 feat(presets): default pose-instrument mod scheme 2026-06-29 19:06:55 +02:00
L'électron rare e53ae8d94d feat(matrix): pitch modulation target 2026-06-29 18:12:21 +02:00
L'électron rare ece67bf1fb feat(matrix): res modulation target 2026-06-29 18:01:51 +02:00