Tags: gdamdam/mdrone
Tags
fix(dsp): Nyquist-gated phase freeze, KS stale read index, ±1¢ played… …-note dedup (1.32.2) F14 REED/PIANO: the aliasing guard's `continue` skipped the partial's oscillator phase advance while its detune-LFO kept running, so a high partial re-entering below Nyquist on a downward pitch change resumed with a stale phase — a discontinuity click. Phases now advance unconditionally; the guard gates only the output contribution. Wrap switched -= → %= because a gated partial (freq max 8 kHz × ratio up to 14.39) can step more than one cycle per sample. Sub-Nyquist output is bit-identical (single-cycle wrap unchanged). Worklet has no node test seam; verified by reading — gated-path-only change, zero-alloc and loop structure preserved, all 101 node tests incl. dsp-smoke green. F15 TANPURA: the fractional KS read `buf[idx], buf[(idx+1)%dLen]` had no guard when a pitch change shrank dLen between blocks, leaving a stale idx ≥ dLen reading outside the loop region for one sample. Folded idx back into the new length at the per-block length-update site (zero per-sample cost). Same no-test-seam caveat as F14. F16 microtuning: mergePlayedIntervals bucketed on Math.round(cents), contradicting its documented "within 1¢" contract — 0.4 vs 0.6 kept distinct, boundary-crossing duplicates appended. Now compares abs(c - kept) < 1 against every retained value. Covered by new tests/microtuning-merge.test.mjs (both-sides window, strict-boundary, retained-vs-dropped transitivity, cap).
1.31.5 — ci: drop flaky Microsoft apt repos before playwright install
packages.microsoft.com intermittently serves unsigned InRelease files
('NOSPLIT'), and 'playwright install --with-deps' hard-fails on the
apt-get update it runs as root. Remove the azure-cli and microsoft-prod
sources first (neither is needed for chromium deps), in ci and burn-in.
1.28.9 — fix(microtonal): capped-voice cue refresh + tile treatment - The 'intended but capped' cue subscribed only to LIVE SAFE, so an adaptive-stability stage-3 voice-density cap change (or recovery) left it stale until an unrelated re-render. Now subscribes to both subscribeLiveSafe and subscribeAdaptiveStability. - Move the cue onto the actual voice tile (timbre-btn-capped: dashed border + struck label + tooltip), per the original spec — it had only landed on the active-voices summary. Summary title corrected from 'Voices currently sounding' to 'Voices the scene intends — dimmed = capped by your device'.
1.28.8 — feat(microtonal): audition degrees, cents+ratio display, app… …ly-voicing ADVANCED → MICROTONAL is now playable and legible: - Tap a resolved interval chip to audition that degree — a brief isolated preview tone via AudioEngine.auditionPitch; no scene/HOLD/share change. - Chips show cents + just-intonation ratio where known, derived by matching degree cents to a canonical ratio table (~1.5c) gated to just tunings (ratioForDegree). No invented ratios for EDO/tempered systems. - Explicit APPLY VOICING button for tunings with suggestedVoicing — applies the mix as one undoable patch (planSuggestedVoicing); tuning picks still never auto-change voices. - Pure helpers in microtuning.ts (resolveTuningRows/ratioForDegree/ planSuggestedVoicing) with focused unit tests. - DroneLivePatch gains an optional voiceLayers field for the atomic apply. - HELP/README/about note the new affordances. Share/session shape unchanged.
1.28.7 — feat(midi): soft-takeover (pickup) + short CC slew for stage… …-safe MIDI - Continuous CC targets now soft-takeover: a mapped knob only assumes control once its hardware value catches (~3/127) or crosses the current on-screen value, so a parked controller can't jump the mix after a scene/preset/random/mutate load. Pickup arming resets on those loads. - Short ~20ms rAF slew per target after pickup so 7-bit steps don't zipper; only the settled value records to undo history. - Triggers (HOLD/PANIC/RND/MUTATE/preset cycle) + formant-vowel enum keep immediate behavior. Targets whose value can't be read fall back to immediate dispatch. - Pure decision logic in new src/engine/midiPickup.ts (unit-tested); dispatch extracted to dispatchContinuous + readTargetNorm in Layout. - Default mappings, tombstones, and share/scene shape unchanged.
1.28.6 — fix(engine): seed per-voice material RNG for shared-scene de… …terminism; voice-cap UI cue; doc/comment cleanup - P1: VoiceEngine.setMaterialSeed seeds per-voice phase offsets + per-tick nudge (was raw Math.random) so shared scenes reproduce subtle layer motion. Decorrelated from the evolve seed; called on scene load. - P2: VoiceEngine.getSuppressedVoices + DroneView dim/strike voice tiles the device cap silences, mirroring FX suppressed-by-protection. - P3: drop stale worker OG-card diagnostics; fix four/seven voice-count comments (now eight); clarify README docs/parameters.md is local. - tests: setMaterialSeed determinism + getSuppressedVoices cap logic.
PreviousNext