FSVR v0.3.1
FSVR v0.3.1: the Yamaha FS1R as a plugin and a standalone with the front panel as its GUI, its firmware logic rewritten from the decompiled ROM. Thanks to rgwan/fs1r_firmware_RE for the firmware and ROM dumps everything here is built on.
The factory patches are built in
The 1408 preset voices, the 384 preset performances and all 90 preset formant sequences are packed into the binary. The patch browser and the front panel work out of the box with no EPROM image: pick a category and a bank to narrow the voice list, exactly as the hardware's [SEARCH] does, or pick a performance and it loads with the four part voices it names and the Fseq it plays, the way the hardware does from its own ROM. An EPROM image still loads and is read in preference; it just is not needed for anything any more. Import .syx now adds every voice in a file to the browser as a "Usr" bank instead of loading only the first.
Three bank mappings were wrong, and are now read out of the ROM
- The voice banks were backwards. The part's BANK NUMBER byte mapped PrA..PrI to the DX7 voices and PrJ, PrK to the native ones. It is the other way round: PRESET A and B are the FS1R's own 128 voices each, and PRESET C through K the nine banks of DX-series voices (owner's manual page 21). Every factory performance was loading the wrong voices. The performance "FundaBass" asks for bank 2 program 41, which is the voice "FundaBass" and was resolving to "E.Piano 15". Across all 384 performances the corrected reading puts 439 parts on FS1R voices against 48, matches the performance's own category on 71% of them against 10%, and names 94 performances after their own part 1 voice against none.
- The performance table is 384 entries at 0x20A000, the three preset banks in order A, B, C. It was read as 360 entries starting 24 in, which silently dropped Preset A 001-024 and mislabelled every bank. Preset C is confirmed independently by the manual's own description of it on page 21 - the G50 guitar controller bank, receive channels no higher than A6 and pitch bend range -12..+12 - which is exactly what entries 256-383 hold and nothing else does.
- A 512 frame Fseq bulk cannot state its own length. It is 25632 data bytes and the dump's byte count is 14 bits, which is why the Data List says "FSeq Bulk does not interpret Byte Count". The loader now takes the length from the header's frame count, so the ten long preset sequences load at all.
The panel's interface comes from the firmware now, not the manual's prose
The FS1R keeps one 40-byte record per cursor stop in the EPROM, holding the two display lines for that stop. Those records are the authority on what the interface does, and docs/interface_from_firmware.md is what came out of them.
- PART = ALL, the PLAY screen. Its own eight cursor stops, the performance's category under BANK/PGM# rather than a number, and no FLT or INS icon. VALUE on its bank and program pair steps the performance, which is how the unit is used in every demo of it. The PART buttons walk ALL, 01, 02, 03, 04.
- The PART ASSIGN cursor walks the firmware's twelve stops in its own order, which is not the order the labels are printed in. Rcv Max and Dry Lvl were missing entirely, Filter was sixth rather than second to last and pointed at the filter switch instead of the cutoff offset, and PART was a cursor stop the hardware has not got.
- The selected icon is reverse video. The manual says twice that a small triangular pointer appears above it; a real v1.20 unit shows a filled block with the glyphs knocked out and no pointer anywhere.
- MIDI View shows the channel message the firmware's own tables name, and nothing for the five stops whose records are blank.
- The controller set is the firmware's per-CC handler table. CC 93 is the variation send, not 94, and CC 71, 72, 73 and 74 drive filter resonance, EG release time, EG attack time and filter cutoff, none of which were handled at all.
Panel fixes
The four controller knobs are the selected part's own ATTACK, RELEASE, FORMANT and FM parameters, so they follow the part instead of staying wherever they were last left. The white specular arc on each knob cap stays put while the cap turns, since it is a highlight on a cylinder rather than a mark painted on it. The volume knob sits between the panel's left edge and the display. Loading any patch silences what is sounding first, leaving the effect tails to ring out as they do on the hardware.
The downloads
FS1R.emu-0.3.1-Standalone-win64.zip: the standalone app,FS1R.emu.exe, with thepresets/folder. Unzip anywhere and run it. Options > Audio/MIDI Settings picks the audio and MIDI devices; with the default Windows Audio device type the buffer is the driver's 10 ms, so choose Windows Audio (Exclusive Mode) or DirectSound if you want to set a size. No EPROM image is needed any more.FS1R.emu-0.3.1-VST3-win64.zip:FS1R.emu.vst3, a bundle folder. Copy the whole folder intoC:\Program Files\Common Files\VST3\and rescan in the DAW.FS1R.emu-0.3.1-CLAP-win64.zip:FS1R.emu.clap, one file. Copy it intoC:\Program Files\Common Files\CLAP\and rescan.fs1r_emu-0.3.1-console-win64.zip: the command-line console,fs1r_emu.exe, on the same engine: MIDI in and out over WinMM, offline WAV and MIDI file rendering, the self checks. It asks once for a MIDI input and remembers it infs1r_emu.inibeside the exe;fs1r_emu.exe -llists the ports.
All four are 64-bit Windows builds of the same commit. There are no Linux or macOS downloads: the Linux CI job cannot configure JUCE without the X11, GTK, FreeType and libcurl development packages, which the runner does not install, and the release job that would upload the other platforms' bundles is skipped when any leg of the build fails. Both build fine locally, and cmake -B build -S . builds the engine, the console and the self checks anywhere with a C++17 compiler.
Not yet: calibration against a real unit. The chip-side models (EG shape, formant window, filter, effect algorithms) are still inferred, and every constant behind them sits in namespace cal so that calibrating is one table edit.
SHA-256
FS1R.emu-0.3.1-Standalone-win64.zipbc65ef936a8fbb2ba29a774c71d3ce1957e308338bba13eb6579d727aa6745c7FS1R.emu-0.3.1-VST3-win64.zip41b3dde1909bb82b44f815b66e0db888dface691729cb7c2c6b70618719ced09FS1R.emu-0.3.1-CLAP-win64.zipd60f06c3add5a3458b6ea2dc5f4c358699fc67ececac1039a27e8ff097a34606fs1r_emu-0.3.1-console-win64.zip4082d72b98217f3cea5b531a39da9383c833a353d563679b8b8f5d42acbbd830