Repository navigation
Releases: silasmariusz/TuneThatHue
Release list
TuneThatHue 0.9.11
TuneThatHue is freeware from this release on, under the TuneThatHue Freeware Licence 1.0 (LICENSE). Releases up to and including 0.9.10 were published under the Apache License 2.0 and stay under it. The effects engine in effects/ is Music Assistant's code and keeps the Apache License 2.0 (effects/LICENSE); qnap/build_ffmpeg.sh is under the GPL (COPYING).
- The author is written "Silas, Mariusz Grzybacz" in the QNAP package, the web page's footer, the DLNA renderer and Music Assistant player details, and the Windows plug-ins and installers.
- The QNAP package carries the licence files in
app/and works as in 0.9.10: upgrading keeps the settings and the bridge pairing.
x86_64 models, QTS 6.0 / QuTS hero 6.0 and newer. Details: CHANGELOG.md, docs/decisions.md (D2).
TuneThatHue 0.9.10
A fix release of the QNAP package. The app itself is unchanged; the service script that QTS runs is rewritten.
App Center's Open shows the panel again
After the app was switched on in App Center, QTS wrote its own proxy rule for /TuneThatHue above the package's own, and that rule sent every request under /TuneThatHue/ to the app as //.... The app answered "Not Found" until the next plain start. The package's panel path is now /TuneThatHue/, so QTS's rule and the package's rule lead to the same place in either order.
Switched off means off
- The app starts only while it is switched on in App Center (Enable = TRUE in
/etc/config/qpkg.conf). The two-minute watchdog andrestartused to start it when it was switched off. - Stopping ends only this package's own daemon.
- Uninstalling leaves nothing outside the package folder: no proxy rule, no cron line, no run marker.
Files
config/(the paired bridge's keys) and the log are readable by the administrator only. QTS runs package scripts with umask 0000, and 0.9.8 left them open to every user.- The old stop left root's
/etc/config/crontabwritable by every user. 0.9.10 sets it back to 0644 when it is installed. - The log is cut at 8 MiB; the last 1 MiB stays in
tunethathue.log.1. A large log from an older version is cut at the first start.
Upgrading keeps the settings and the bridge pairing. x86_64 models, QTS 6.0 / QuTS hero 6.0 and newer.
Details: docs/qnap-service.md and docs/decisions.md (D1).
TuneThatHue 0.9.8
Six weeks of work on the one thing that decides whether any of this looks good: the beat.
0.9.2 found a tempo and then drifted off it. This one holds a grid, counts bars against the
schedule it actually played, and rides through the parts of a track that have no drum in them
at all.
The beat grid
- No duplicate beats. The tracker emits past a frontier, so a re-latch cannot replay beats
it has already sent. Measured duplicate rate went from 25–29 % to zero, and F-measure against
a click track from 0.45 to 0.99. - The downbeat stops moving. Absolute-frame phase, three-vote hysteresis and a clear-win
margin, instead of re-deciding on every candidate. - Tempo traps. Metrical candidates on an interpolated comb, a median anchor, and a
prior-gated family snap (5/4, 4/3, 3/2, 2, 3) that only ever moves toward the more probable
dance tempo. This is what fixes a 4/3 delay reading as the tempo, and the 150→75 octave slip. - DJ sets. A breakdown no longer goes dark: the grid coasts for 64 bars, and a weak refine
can confirm the living grid without being allowed to extend the coast or move the anchor.
Over 27 sets, about nine hours, total dark time is 378 s — and the two biggest gaps are
genuinely beatless interludes. - The bar counter reads the schedule, not an extrapolation, so a perfect grid replays as a
strict 1, 2, 3, 4.
When there is no beat
New setting, When the beat disappears: ghost (keep pulsing at the last tempo, dimmed),
breathe (a slow swell) or onsets. Full silence drifts into an idle look after three seconds
and wakes on audio. A stream that never had a beat keeps the look it had before.
Two bugs that made the box look dead
- The render clock followed the Sendspin server clock whenever a server was merely
connected, so a local input's timestamps landed in the wrong epoch and the engine saw
permanent silence. The server clock is now used only while Sendspin is the source. - One VBAN sender at a time. Two senders on the port used to interleave and reset the
tracker on every packet. The first sender owns the port until it is quiet for two seconds.
Lights
Decaying tails now end in true black. Below about 2 % drive some bulbs mix their LEDs badly
and a dying purple flashed green; the engine stops emitting under that floor instead.
The panel
A real VU face with the needle hung from its own pivot, needles across the full width, the
meter row height pinned so the artwork stops growing the panel, and source marks that are the
right marks — Snapcast's staircase, Sendspin's wordmark, a filled WLED.
Install
QNAP — download TuneThatHue_0.9.8.qpkg, App Center → Install Manually. Configuration
survives the upgrade. The panel is on http://<nas>:58091/.
Verified on QuTS hero and on QTS 6.1. Windows, macOS and Linux packages for this version are
not in this release; build them from source with build-windows.ps1 or
install/linux/install.sh.
You need a Philips Hue bridge with an Entertainment area. Not affiliated with, endorsed by or
sponsored by Signify / Philips Hue.
TuneThatHue 0.9.2
The panel, redrawn from the feedback — and the meters carry the artwork they were meant to.
Downloads
| You have | File |
|---|---|
| QNAP NAS | TuneThatHue_0.9.2.qpkg — App Center → Install Manually |
| Windows 10/11 | TuneThatHue-daemon-0.9.2-setup.exe |
| Linux, Raspberry Pi, macOS | TuneThatHue-0.9.2-unix.tar.gz |
| Docker | docker pull silasmariusz/tunethathue:0.9.2 |
Player plug-ins are the separate installers below. The README has a step-by-step for
Raspberry Pi and Linux.
The panel
- The VU meters are the supplied face: the artwork ships as drawn, and the needle
hangs from its ownpointX— the pivot the file marks below the glass. The sweep is
read off the artwork's end ticks. The displays around the needles sit lower. - The bridge card is a grid: address above the room, Pair above Sync, the keys one
fixed width. Nothing moves when a label changes. - A switch reads Off | On with the live side lit, and the settings header reads
Basic | Advanced the same way. One CSS class was dressing both the switches and the
palette swatches, which is why OFF glowed and BASIC stayed lit on the advanced view. - Every label on a dark plate prints in the light ink. The settings labels were
silkscreened in the aluminium ink and vanished. - Sources drop the borrowed badges; the VBAN lamp moved to the module's rail; latency
calibration takes the full width, which closes the dead space under Sources. - Selects, the LED-count well and the palette scrollbar are machined like the rest.
- The footer carries the real marks — Winamp, foobar2000, Squeezebox, Sendspin, DLNA,
QNAP, Raspberry Pi, Linux, Docker, macOS — one grey at rest, lifted on hover.
Network note
The container needs host networking (or macvlan) for discovery to work; the bridge
network cannot carry it. The image says so in its log when it finds itself on a bridge,
and the README and Docker Hub description carry the port table and the macvlan recipe.
Known limits
Unchanged from 0.9.1: 32-bit Raspberry Pi OS has no NumPy for Python 3.14, so the tempo
will not lock there; the macOS install script has not been run on a real Mac.
TuneThatHue 0.9.1
Daemon installers for every platform — the thing that was missing from the last release.
Downloads
| You have | File |
|---|---|
| QNAP NAS | TuneThatHue_0.9.1.qpkg — App Center → Install Manually |
| Windows 10/11 | TuneThatHue-daemon-0.9.1-setup.exe |
| Linux, Raspberry Pi, macOS | TuneThatHue-0.9.1-unix.tar.gz |
| Docker | docker pull silasmariusz/tunethathue |
Player plug-ins are the separate installers below. The README has a step-by-step for
Raspberry Pi and Linux.
It is a service everywhere now
Windows installs a real service — automatic start, no sign-in needed — matching the
systemd unit on Linux and the launchd agent on macOS. It runs under WinSW, because
Windows expects a service to check in within thirty seconds and a Python process never
does; a plain registration produced a service Windows killed at every start.
Settings on Windows moved to ProgramData. A service runs as LocalSystem, whose AppData
no user can reach, so a bridge paired in the panel would have looked unpaired to the
daemon.
The panel
Rebuilt around one rule: the control is the state. A dark key is off, a lit key is
on, and the colour says which kind of on — blue for listening on the network, green for
linked, amber for light going out. Pressing a lit key turns that thing off. All the
labels repeating what a control already showed are gone.
- Bridge card is four things: address, Pair, room, Sync. The address field takes an
address and nothing else. - Calibration gained instruments: tempo, beat of the bar, and five lamps for what the
engine hears — beat, bar, rise, drop, break — read from the effects engine's own
structure detector. - The VU meters are a real VU scale: black glass, cream face, red from 0 VU, percentage
scale inside, every mark computed from the movement rather than placed by hand. - Empty screens say what is true — No signal, No beat, No output — instead of
showing a blank.
Also
- WLED strips can be driven from the same frames as the bridge
- The bundled ffmpeg is an LGPL build, and all eight decoders are checked before it ships
- Container images for
amd64andarm64
Known limits
- 32-bit Raspberry Pi OS: the tempo will not lock. NumPy publishes no 32-bit ARM
build for Python 3.14 and the beat tracker needs it. Use the 64-bit image. - macOS: the install script has not been run on a real Mac.