schwung-jv880, image 1 from its README
Firmware

schwung-jv880

Hype14/100

Roland JV-880 module for Move Anything

schwung-jv880 is custom firmware for the Ableton Move, by @charlesvestal. Latest release v0.6.2 (October 2026), 14 stars on GitHub.

forAbleton Move·by@charlesvestal

Unclaimed. Is this yours? Sign in with GitHub as @charlesvestal to claim it.

Downloads
0
Stars
14
Forks
4
Commits
215
Last commit
Download v0.6.2

minijv-module.tar.gz· 127 KB

Custom license· charlesvestal/schwung-jv880·downloads come from the creator’s GitHub releases

205
Commits
17
Releases
205 commits and 17 releases in the last year
Activity · last 12 months
17 releases
  1. v0.6.2Latest1 file
    • Fixes an ~8 MB memory leak on every load/unload: the load thread is now always joined, and the large ROM buffers are mapped and returned to the system on unload (RSS flat across six load cycles, measured on a Move).
  2. v0.6.11 file
    • The documented knob layouts matched neither of the two the module actually has.

      Knobs (Patch) claimed 4 Release, 5 LFO Rate, 6 LFO Depth, 7 FX Send, 8 Level — five of eight wrong, and stale rather than merely shifted.

      There are two layouts, both defined in jv880_plugin.cpp:

      12345678
      Knob grid (patch_main contract)CutoffResonanceAttackDecaySustainReleaseFilter EnvLFO Depth
      Overlay knobs (patch_knob_keys)CutoffResonanceAttackDecayReleaseFilter EnvReverbChorus

      They are not the same eight. Both are now documented side by side, because you meet both surfaces and the difference is invisible from either one.

    • Knobs (Perf) was wrong from position 3. The part knobs are Level, Pan, Reverb, Chorus, Coarse Tune, Fine Tune, Key Lo, Key Hi. Vel Sense and Vel Max are real params on the Parts page but they are not knobs, which is now stated rather than implied.

    • Also ships #12 (state: budget against the size Schwung stores, and never answer mid-load), which was merged after v0.6.0 and had not been released yet.

    Found by cross-checking every "Knob N" claim in help.json against each level's knobs array across all 47 modules — knobs is the assignment, params is not.

  3. v0.6.01 file
    • emu thread: ask for FIFO 20, below Move's publisher, instead of inheriting
    • Add short_name to parameters for the Schwung knob grid
    • Add short_name to parameters for the Schwung knob grid
    • perf common byte 12: the bit layout was wrong, and round-tripping could not see it
    • performance mode is a mode, not a shorter patch mode
    • chore: update release.json for v0.5.0
  4. v0.5.01 file

    ROM loading no longer blocks the UI.

    create_instance runs on the SPI callback — the same thread that serves every param request Schwung's UI makes. Reading the ROMs there cost ~500 ms of eMMC I/O for ~4.5 MB, on every load, warm or cold. For that half-second the whole UI was blocked: chain positions read back empty, the module editor could not fetch its contract, and picking Mini-JV visibly stalled before the chain editor came back.

    Measured on device (host [chain-v2] load timestamps): 519 ms → 2–3 ms.

    • ROM read moved to the front of the existing load thread. The initialized guards and the deferred-state queue it needs were already there, so this adds no new thread.
    • The load thread drops itself to SCHED_OTHER. Moving the work off the callback was not enough on its own — the thread inherited SCHED_FIFO 90 from it, and two equal-priority SCHED_FIFO threads do not timeslice, so the warmup loop ran to completion while the SPI callback waited. One 203 ms pre_transfer was still showing up against a normal max of ~200 µs. Fixed and confirmed on hardware.
    • The emu thread keeps the scheduling it had before, restored explicitly rather than silently inherited — its priority affects audio and is not what this change is about.
    • The MCU object is still allocated in create_instance (no constructor, so that is an allocation and not the load), which keeps inst->mcu non-NULL on the happy path.
    • Serves is_loading. Schwung's shadow UI holds a "Loading…" screen while a component reports 1, instead of dropping into an empty editor. A failed load reports 0, so a missing-ROM install shows its error rather than waiting forever.
    • Allocation failure and pthread_create failure now surface as load errors, since the host owns the instance by the time they can happen.
  5. v0.4.131 file
    • Full patch/tone editing UI — on-device menus + graphical Remote UI (#7, @legsmechanical)
    • ~2× faster emulator thread — build flags, interrupt gate, RT thread setup, fixed-ratio resampler, sleep fast-forward (#5, @legsmechanical)
    • Per-instance tone cache; reversible link mode; lock the MIDI ring enqueue
    • O(1) mirror-buffer resampler history
    • Remove the fixed cap on the unified patch list; clarify MIDI channel requirement in patch mode (#3, @gnai)

    Thanks to @legsmechanical and @gnai. 🙏

  6. v0.4.121 file
  7. v0.4.111 file

    Mini-JV 0.4.11

    • Includes new macro knobs for controlling tone parameters (thanks @j3threejay)
    • Script updates to point at schwung-*
  8. v0.4.101 file
    • Fixed root-owned files after install that could cause permission errors
  9. v0.4.91 file
  10. v0.4.71 file
  11. v0.4.81 file
  12. v0.4.61 file
    • Disable debug logging to /tmp/jv880_debug.log (massive I/O waste, filled /tmp)
  13. v0.4.51 file
    • Fix stuck notes caused by UI tick spam flooding emulator with redundant Program Change messages
    • Add debounce for cross-expansion ROM swaps (~9ms) so rapid scrolling only triggers one swap
    • Reduce post-reset warmup from 50K to 1K cycles for faster expansion switches
  14. v0.3.111 file
    • Fix release workflow asset filename (minijv not jv880)
  15. v0.3.82 files
    • Fix preset parameter getter - add preset alias for current_patch
  16. v0.3.71 file
    • Fix error handling when ROMs are missing
  17. v0.3.61 file
    • Fix import path in ui_menu.mjs