w1n5t0n
74c52fadc7
feat(nisps-core,vcv): complete Phases 6 + 7 — persistence, derived outputs
...
Phase 6 — State persistence:
- Full state serialization: version, weights (3D), examples (features+labels),
mlpConfig, noiseLevel, slewMs, output/input ranges
- Validation on load: version check, graceful missing field handling
- .nisps preset save/load via right-click menu (osdialog file dialogs)
- Param values included in preset files
Phase 7 — Derived outputs:
- Mean, STD, delta computed on audio thread (trivial cost)
- Novelty/confidence: nearest_example_distance() computed on background
thread after each training/perturbation job, cached for audio thread
- Defaults with 0 examples: novelty=10V, confidence=0V
nisps-core IML additions:
- get_weights() / set_weights() for MLP weight serialization
- get_example_features/labels() / load_examples() for dataset serialization
- nearest_example_distance() for novelty/confidence metric
- get_example_count() / get_max_examples() for UI display
2026-03-28 01:27:19 +02:00
w1n5t0n
6a76f15736
feat(vcv): complete Phases 3, 4, 5 — RL feedback, display, configurability
...
Phase 3 — RL feedback system:
- Background worker thread with job queue, condition variable, atomic flags
- Thumbs up/down buttons + CV trigger inputs (Schmitt triggers)
- Learn enable toggle + gate input (OR logic)
- Noise level tracking (decay on +, increase on −, spread-dependent cap)
- Post-change output crossfade (configurable slew, default 10ms)
- Rapid feedback queueing with coalescing (max depth 1)
- Graceful thread shutdown (shouldStop flag, joins in destructor)
Phase 4 — Visual feedback:
- NanoVG bar graph display (12 hue-coded bars, noise level, TRAIN indicator)
- 12 output level LEDs, LEARN LED (green), training LED (yellow)
Phase 5 — Configurability:
- RATE knob: exponential decimation from block-rate to audio-rate
- Per-output range: unipolar (0-10V) / bipolar (±5V) via context menu
- Per-input range: unipolar / bipolar via context menu
- 12 attenuverter trimpots (-1 to +1)
- SPREAD CV input for knob modulation
- CLEAR button with 1-second long-press guard
- Output slew configurable via context menu (0-100ms)
- State serialization (ranges, noise, slew) via dataToJson/dataFromJson
Note: double-buffering uses direct IML access (not shadow copy) pending
IML weight get/set API (filed as meml-ft7).
2026-03-28 01:04:07 +02:00
w1n5t0n
d2f6ffc65e
test(vcv): add smoke test harness — 7/7 pass
...
Standalone test exercising IML inference pipeline without VCV runtime:
- Basic inference: all 12 outputs valid in [0,1]
- Input responsiveness: 12/12 outputs change between corners
- Randomize: weights change produces different output mapping
- Spread parameter: measurably different distributions at 0 vs 1
- Expressiveness: 6/6 corner pairs distinct, full range utilized
- Smoothness: 100% of sweep steps are smooth (no binary jumps)
Finding: spread sigmoid saturation effect is architecture-dependent
with small [16,24,16] network (filed as meml-l5a for investigation).
2026-03-28 00:50:36 +02:00
w1n5t0n
e52b800a92
feat(vcv): complete Phase 2 — core engine wired up
...
- IML<float> with [16,24,16] hidden layers as module member
- CV inputs read, clamped 0-10V, normalized to [0,1]
- MLP inference in process(), 12 outputs scaled to 0-10V
- SPREAD knob (0-1, default 0.6) controls weight initialization
- RAND button randomizes weights using current spread value
- Panel: knob + button + 2 inputs + 12 outputs in 2x6 grid
2026-03-28 00:38:58 +02:00
w1n5t0n
d0ba1faaea
feat(nisps-core,vcv): complete Phase 0 + Phase 1
...
Phase 0 — spread-aware API ported to nisps-core C++:
- MLP::DrawWeightsSpread(T spread) — interpolate uniform↔Xavier per layer
- MLP::MoveWeightsSpread(T speed, T spread) — per-layer noise + weight decay
- IML::randomise_weights(Float spread) and IML::move_weights(speed, spread)
- 5 unit tests (10/10 total pass)
Phase 1 — VCV Rack 2 plugin skeleton:
- Makefile with C++20, nisps-core include path
- plugin.json manifest
- Empty MEMLNaut module: 2 inputs, 12 outputs, placeholder SVG panel
- static_assert verifies nisps-core headers resolve
- C++20 confirmed working in VCV SDK (8 existing plugins use it)
2026-03-28 00:36:46 +02:00
w1n5t0n
9040886e16
docs(vcv): third review — input ranges, CV modulation, lifecycle, smoke test
...
- Add per-input range configuration (unipolar/bipolar) for LFO vs envelope compat
- Add SPREAD CV input for automated exploration/precision control
- Add background thread graceful shutdown (shouldStop flag + join timeout)
- Document multi-instance behavior (per-instance threads, ~80KB each)
- Add integration smoke test milestone after Phase 2 (go/no-go gate)
- Note OSC library dependency for Phase 8
- Fix 30HP layout: acknowledge density, defer validation to Phase 9
2026-03-28 00:22:43 +02:00
w1n5t0n
b4340c7f34
docs(vcv): fix 7 issues from second fresh-eyes review
...
1. Rename derived output SPREAD → STD to avoid collision with SPREAD knob
2. Route thumbs-down through background thread (was mutating inference
MLP directly — data race). Establish single-writer threading invariant.
3. Add rapid feedback queueing with coalescing (max queue depth 1)
4. Document slew-on-slew interaction (decimation + crossfade compose cleanly)
5. Cut compact (20HP) panel — physically impossible to fit 22 jacks
6. Define derived output defaults with 0 examples (NOVELTY=10V, CONFIDENCE=0V)
7. Initial random output is intentional (shows liveness, gives RL starting point)
2026-03-27 23:39:56 +02:00
w1n5t0n
9dfa1429d0
docs(vcv): address spec gaps from fresh-eyes review
...
- Fix licensing: nisps-core is MPL-2.0, VCV SDK is GPLv3
- Fix VCV Rack 2 description: Community Edition is free, Pro is paid
- Add Phase 0: port spread-aware drawWeights/moveWeights to nisps-core C++
- Detail threading model: two MLP instances, atomic swap flag, memory cost
- Add configurable output slew (default 10ms) for post-training crossfade
- Add input signal handling: mono channel 0, hard-clamp out-of-range CV
- Add .nisps file format version field for forward compatibility
- Document dataset capacity (100 max, FIFO forgetting)
- Specify novelty/confidence computation strategy (training thread, cached grid)
- Add open questions: novelty grid scaling, C++20 toolchain, expander protocol
2026-03-25 12:25:21 +02:00
w1n5t0n
412782ed0e
docs(vcv): add VCV Rack module specification
...
Full spec for MEMLNaut VCV Rack module based on interview:
- 2-8 configurable CV inputs, 12 raw + 5 derived CV outputs
- RL feedback via panel buttons + CV triggers with learn gate guard
- nisps-core C++ engine with background thread training
- User-configurable inference rate (block to audio rate)
- Bidirectional state transfer with companion webapp (file + OSC)
- 10-phase development plan from skeleton to distribution
2026-03-25 12:17:24 +02:00