w1n5t0n
aec58537db
feat(pattern): add midiNote field + trigger-aware merge
...
Replace the pitch*127 encoding hack with a dedicated midiNote field on
pattern steps. IntervalLock now writes integer MIDI notes to step.midiNote
while preserving the original [0,1] pitch for other consumers. The clock
and sequencer bridge pass midiNote through the event pipeline.
Also reworks mergePatterns to be trigger-aware: when only one generator
fires at a step, use its values directly instead of averaging with the
other generator's defaults.
2026-04-06 23:28:01 +01:00
w1n5t0n
d40711eb77
fix(shapeseq): fix 6 bugs found in fresh-eyes review
...
1. Pitch pipeline: IntervalLock stores midiNote/127, sequencer now
converts back via pitch*127. Removed pitch RangeMap from projection
presets (was double-mapping already-quantized values).
2. Clock step duration: changed from quarter-note grid (60/bpm) to
16th-note grid (60/bpm/4). 8 steps at 120 BPM now = 1 second.
3. Method name: drawWeights → randomiseWeights (matching WasmIML API).
4. Dirty-check: setSequenceInputs now skips re-evaluation when inputs
haven't changed (epsilon 1e-5). Avoids 60fps chain evaluation.
5. SwingGroove: swingGrid param now functional — selects 8th note
(period 2), 16th note (period 4), or triplet (period 3) swing grid.
6. IntervalLock base octave: starts from C3 (MIDI 48) instead of C0,
so default output is in a playable range.
2026-03-24 11:42:25 +02:00
w1n5t0n
efcf6d2c06
feat(shapeseq): implement Layer 2 — all 8 primitives and chain runner
...
primitives.js (505 lines): All 8 sequencing primitives extending
Primitive base class:
- EuclideanRhythm: Bjorklund-distributed trigger patterns
- ProbabilityGate: PRNG-based trigger filtering + accent assignment
- PitchWalker: stateful constrained random walk with gravity
- Ratchet: probabilistic step subdivision (1-4x)
- SwingGroove: alternating-step timing offsets (max triplet feel)
- DensityMorph: trigger placement with clustering control
- IntervalLock: 11-scale pitch quantizer (chromatic→diminished)
- VelocityShaper: 5 curve types with depth/phase control
Includes PRIMITIVE_REGISTRY for chain builder UI.
chain.js (319 lines): Sequential pipeline chain evaluator.
Buckets primitives by category (generators→processors→converters→
timing), forks deterministic PRNG per primitive, merges multiple
generators via additive (OR) or multiplicative (AND) mode
(configurable in real time). Flat param distribution by chain
position. Full state serialization for freeze support.
2026-03-24 02:06:17 +02:00