Skip to content

VXN 0.2.0

Latest

Choose a tag to compare

@poetix poetix released this 29 Aug 22:29
· 9 commits to main since this release

vxn-2 and VXN1b now ship as one release. Until now they versioned and released separately — vxn-2 on the bare semver tag, VXN1b on vxn-1b-<version>. From 0.2.0 they share a version and a release page; this one carries both products' binaries. (vxn-1b-0.2.0 is kept as a signpost and holds the same VXN1b builds.)


vxn-2

Mostly about operator level: the amplitude path was rebuilt around a single log-domain accumulator, and a series of long-standing deviations from the DX7 were found and fixed. Patches will sound different — in most cases markedly closer to the hardware.

Operator level, rebuilt

  • One log-domain level accumulator for operator amplitude (0323). Level, key scaling, velocity and the EG now combine in one place, in the domain the hardware uses, instead of being multiplied together in linear space at three different points.
  • Velocity is a signed level offset, not a multiplier (0324) — the DX7's behaviour. Velocity now shifts an operator up or down the level ladder, so it changes timbre and not merely loudness.
  • The rendered-level ceiling was raised to give velocity its headroom (0325).
  • The EG's L-values join the level ladder, knee and all, rather than running on a separate curve.

DX7 fidelity fixes

  • The feedback ladder was 2× the hardware at every step. Feedback-heavy patches were substantially over-driven.
  • Key level scaling barely did anything — the DX7's curve is now ported properly, so the control has its real range.
  • The attack law is corrected, restoring the strike on percussive patches.
  • Pitch EG and vibrato depth are calibrated against the hardware.
  • Detune joins the note; ratio stays rational (0327).

Factory bank

Hand-designed rather than bulk-converted: 44 presets across 8 categories, including a new Brass category and two re-voiced brass ensembles, and Electric Boogaloo — an E.PIANO 1 with a stack chorus. The whole bank was re-levelled against the new level law, and the tool that levels it was fixed too (0326).

FX and web

  • Phaser stereo spread with a faceplate ping-pong toggle (0280); phaser Stereo now sits between Feedback and Mix, where it belongs.
  • Web user presets, state autosave and patch import/export (0159).

VXN1b

Faster

  • The filter cook and the mod matrix are vectorised. Both were running scalar in the per-voice hot path; the matrix is evaluated for every voice on every control block, so it was the obvious next target after the kernels.
  • cross_mod_type is read once per block rather than per sample — a runtime enum match inside the lane loop was defeating the vectoriser around it.

Shared DSP

VXN1b now uses the shared FdnReverb from the extracted vxn-core-dsp layer rather than its own copy. WetFade::reset was fixed to un-prime as part of the move: after a reset the wet mix now snaps to the incoming patch value instead of gliding from the old one, which had been audible as a brief swell on patch load.

Fixes

  • Lighting a key must never cost the note. Visual key feedback shared a path with note handling; under load that could cost the note itself.
  • Object.hasOwn dropped from the two JS handler tables — it excluded otherwise-capable older browsers from the web build for no gain.
  • The cross-language tables are now bound, or collapsed. The Rust and JS sides each carried a table that had to agree; they are now checked against each other rather than trusted to stay in step.

The parameter table is unchanged — still 185 host params, Layer 2's CLAP id still a Layer 1 id + 75. No automation re-checking needed; projects saved with 0.0.3 carry over as-is. README · parameter reference


Shared

  • A shared vxn-core-dsp layer was extracted (ADR 0002) so the two synths stop carrying two copies of the same kernels, with an asm-check codegen guard that fails the build if a hot loop stops vectorising.
  • Shared on-screen piano (shows the split, lights keys played from any source) and CPU meter.
  • rebuild() no longer resets every parameter (0296); the MIDI decoder is capability-aware (0294).

Windows VST3

0.1.1's Windows VST3s shipped hollow/OPT:REF stripped the whole-archived engine straight back out, and the link reported success. That fix (/INCLUDE:clap_entry, plus the archive as a link input) is now in the tree, so these are the first Windows VST3s the workflow produces correctly on its own.


Downloads

Product Platform CLAP VST3
vxn-2 macOS (universal) VXN2-macOS-universal.clap.zip VXN2-macOS-universal.vst3.zip
vxn-2 Windows (x64) VXN2-windows-x64.clap VXN2-windows-x64.vst3.zip
VXN1b macOS (universal) VXN1b-macOS-universal.clap.zip VXN1b-macOS-universal.vst3.zip
VXN1b Windows (x64) VXN1b-windows-x64.clap VXN1b-windows-x64.vst3.zip

Unzip and drop into your plug-in folder:

  • macOS CLAP — ~/Library/Audio/Plug-Ins/CLAP/
  • macOS VST3 — ~/Library/Audio/Plug-Ins/VST3/
  • Windows CLAP — %LOCALAPPDATA%\Programs\Common\CLAP\
  • Windows VST3 — %LOCALAPPDATA%\Programs\Common\VST3\

The macOS builds are unsigned and unnotarised; Gatekeeper will need the usual right-click → Open, or xattr -dr com.apple.quarantine on the bundle.

Note

Existing vxn-2 patches will sound different. The level, velocity, feedback and key-scaling changes are corrections toward the hardware, but they are not backward-compatible voicings — a patch saved under 0.1.1 will not render identically here. The factory bank has been re-levelled to match; your own patches may want a pass. VXN1b patches are unaffected.

Both synths also run in the browser: vxn-2 · VXN1b