0.16.1
Important
macOS first launch (no code signing yet). After dragging StemDeck to Applications, clear the Gatekeeper quarantine flag or macOS will say the app is damaged:
xattr -dr com.apple.quarantine /Applications/StemDeck.app
Which file do I download?
| Your setup | Download |
|---|---|
| Windows, NVIDIA GPU | StemDeck-Windows-x64.NVIDIA.zip |
| Windows, no NVIDIA GPU | StemDeck-Windows-x64.zip |
| Linux, NVIDIA GPU | StemDeck-Linux-x64.NVIDIA.tar.gz |
| Linux, no NVIDIA GPU | StemDeck-Linux-x64.tar.gz |
| macOS, Apple Silicon (M1-M4) | StemDeck-macOS-arm64.dmg |
| macOS, Intel | StemDeck-macOS-x64.dmg |
| Docker / Unraid | Nothing here - pull ghcr.io/stemdeckapp/stemdeck:0.16.1 |
Pick one. Each Windows and Linux download is complete on its own: unzip and run, no installer, no toolchain. Everything else in the asset list is used by StemDeck itself - in particular the small -app files are the updater's payload and will not run on their own.
What's new in 0.16.1
Mostly a fix release. If you are on macOS, this one matters: 0.16.0 shipped with a broken runtime and automatic song sections have not worked since.
macOS song sections work again
0.16.0's macOS package carried AppleDouble sidecar files that broke the Python runtime. matplotlib failed to import, which took the section analyser down with it, so no song ever got its sections detected automatically. The runtime is clean now.
Because the fix is inside the runtime and the updater cannot replace that, macOS users need to download this release rather than update in place.
Your library stops arguing with you
- Deleted songs stayed deleted. A delete that could not remove every file was reported as a success, the app then forgot it had ever happened, and the song was adopted back into the library on the next start. The deletion is recorded on the server now.
- Trashed songs stay in the Trash. If you had processed the same source twice, importing one copy quietly evicted the other from the Trash and it reappeared in the library after a restart.
- Your settings survive.
settings.jsonwas written by truncating the file first, so an interrupted write left it empty and unrecoverable. At least one person lost their port and network settings that way. Writes are atomic now, and a damaged file is kept aside and recovered from the mirror instead of being treated as a first run.
Playback and loops
- The footer scrub bar works. It was driving a silent copy of the track while the real clock ran elsewhere, so dragging it did nothing you could hear, and "set loop in at playhead" always wrote zero.
- Loop regions can be adjusted instead of redrawn. Drag either edge on its own, or drag the middle to slide the whole region without changing its length. From discussion #507.
- Scroll a loop bound to nudge it. Hover either time field: left of the decimal point moves seconds, right of it moves milliseconds.
Cancelling actually cancels
- A cancel that arrived in the wrong moment could strand a job at "queued" forever: invisible, still counted against capacity, its source file never freed, and re-queued on every restart.
- Cancellation now reaches every process it is meant to stop, and a force-quit no longer leaves a GPU-holding process behind.
- A cancelled or failed job tears its worker down instead of leaving a poisoned one warm for the next job.
Around the studio
- Collapse everything at once. The panel row has an "All" button that puts the three panels and the library away together, and brings them back.
- We Recommend is grouped by category and fits without scrolling, three logos that had been broken since they were listed are fixed, and r/bass is finally in the app as well as the README.
- The Click track's "Alpha" badge is gone. It has been through several releases and is no longer alpha.
Under the hood
Security and robustness work you should not have to notice: the in-app updater now refuses an installer from anywhere but GitHub, Linux FFmpeg is verified against a pinned checksum before it is run, fork pull requests can no longer execute code on the machine that builds releases, and a handful of ways to hang or exhaust the backend are closed.
Linux Rust is also compiled on every pull request now. It was previously first compiled during a release build, which is a poor moment to find out it does not.
Thanks to everyone who reported something. If you hit anything in this release, open an issue and I will take a look.