Skip to content

v0.8.1

Choose a tag to compare

@github-actions github-actions released this 17 Oct 00:59
· 44 commits to main since this release

Download

Installer
Windows FSVR-Windows-Installer.exe Run it; it asks for admin rights to install into Program Files
macOS FSVR-MacOS-Installer.zip Unzip and open FSVR-MacOS-Installer; it is not signed, so right-click it and choose Open the first time
Linux FSVR-Linux-Installer chmod +x FSVR-Linux-Installer, then run it

The installer puts every format in place (VST3, CLAP, VST2, the 32-bit VST2 with its DXi, AU and the standalone) and can keep FSVR up to date. To install one format by hand instead, take its own zip from the list below, FSVR-<OS>-<format>.zip. FSVR-MacOS-Update is for the updater, not for downloading.


FSVR v0.8.1: the effects and the filter as plain C++, no JIT; the effect LFOs measured on the unit; 32 filtered voices and a 14-bit bend.

This round lands WouterVanNifterick's pitch bend, inverted ranges and sum bus fixes (#43, #44, #45) and mkruselj's editor pages (#38), and answers WouterVanNifterick's and rgwan's reports of effect LFOs running too fast and rgwan's of the LCD keeping a performance's old name. The effect LFO and DSP RAM rules come from sessions 40 and 41 on rgwan's unit; the C++ port of the effect and filter programs is jameshansen's.

The effects and the filter are C++, and the JIT is gone. All 27 programs the firmware uploads to the YSS236 chips are ported to C++ (src/effects/, src/filters/), checked bit for bit against the chip interpreter over every reverb, variation, insertion and filter type before the interpreter, the JIT, AsmJit and the VOP3 microcode left the tree (moved to musicastudio/VOP3). The filter is a voice filter rather than a chip program: one 4-pole ladder per voice, identical slot by slot to the firmware's program. The 15 demo songs render byte-identically to the chip emulation, in the unit's mode and FSVR's. dsp_bench runs in 1.1 us per sample on x86-64 against the JIT's 3.2 on the same bench, 5% of a core, output hash unchanged. Everything builds as C++17, and 32-bit builds and hosts without executable memory run the same code as everyone else. The C++ namespace is fsvr.

The filters render the same bits on every OS. The filter LFO's sine and the filter EG's k went through libm, and MSVC, Apple libm and glibc each rounded differently. Both are now computed in double and rounded to float, identical across all 1,086,918,620 sine arguments and all 256 rate bytes on glibc, Apple libm, MSVC x64 and x86.

Effect LFOs run at the unit's rate and shape (WouterVanNifterick, rgwan). A 1 kHz sine through eight modulation effects on the unit (session 41) showed every effect LFO at twice its rate. The waves are now the unit's unipolar shapes (saws 0..1, triangle 0..1..0, LFO direction 0x8000 centring), and the Rotary SP's LFO readers match the unit to 2%. The DRAM word clips at +-32, not +-8, which brings Vokodrone's flanger depth to 0.0028 against the unit's 0.0030 (0.0051 before). Variation Chorus's FM step: 11.10 Hz on the unit, 11.08 here.

DSP RAM reads from session 40. A read and a write at the same slot offset return this pass's word, and a capture takes a transfer 5 to 11 steps back. Of 384 factory performances 379 are unchanged; 29, 70, 88, 94 and 298 (insertion program 13) move by -13 to -19 dB of peak, as the unit does.

32 filtered voices, on by default. The unit filters only 16 channels, so a part with its filter on gets 16 voices; FSVR filters all 32. Options > Special > 32 Filtered Voices off gives the unit's 16, bit-identical to v0.8.0 on all fifteen demo songs.

Pitch bend (WouterVanNifterick, #43). Source PB is the unit's -128..127, where the engine had half of it, and the bend word keeps the LSB's top bits, so the pitch moves in the unit's 256 steps. FSVR also keeps the 14-bit LSB between those steps (16,384 positions); an LSB of 0 is exactly the unit's word.

Algorithms 65 and 80 fan out (WouterVanNifterick, #45). The sum bus kept clearing on every read, so only the first reader was modulated; t1 bit 1 is the clear, and the editor draws the fan-out. Inferred from the table, not yet captured.

Inverted key and velocity ranges play as on the FS1R (WouterVanNifterick, #44).

Key-synced operator phase. Voiced operator byte 0x1C is a key-synced oscillator's initial phase, a Phase box beside Key Sync on the operator page. Every factory voice has it at 0 and renders unchanged.

The editor's pages (mkruselj, #38): tabs reordered, captions spelled out, the Parts page's lamp before the name, MIDI Ch menus and regrouped pots. The operator pane's EG plot is the model plot with zoom, pan and fit. The LCD names the performance a sysex bulk brings (rgwan), Key Sync's caption no longer runs under its lamp, and the matrix's selected ring is drawn whole.

OP Att in dB. The operator page's carrier level correction (voice 0x2D to 0x34), a raw 0 to 15 captioned "Carrier" in the Freq EG row, is OP Att, the owner's manual's name: in Amplitude under EG Bias, 0.0 to -22.5 dB in 1.5 dB steps, and a column beside Level on the All Operators page. Amplitude's columns now stand centred under Voiced and Noise.

Checks. CI passed every engine and plug-in leg on 3b63474, the version bump (Windows x64 and x86, Linux, macOS, with check_plugin and check_gui); OP Att's commit after it passed build.bat plugin, check_plugin and check_gui on Windows, 64- and 32-bit, and the tag's own run builds every leg and the installers again. Locally on Linux, ctest's engine selftest and dsp_check pass and dsp_bench hashes 17e6de66cc884bdb at 1.1 us per sample. regress.py passed its 19 cases at the namespace change. The plug-in was not built locally, and the delay, modulation and insertion programs beyond the LFO probes are still not checked against a recording.