navigateTo() was passing the tab id to the navigation store but never
setting the local homeTab state that HomeView reads. Editor's Picks
and For You always landed on Tab-Home.
Backend now sends 512 spectral bands (from 4096-point FFT).
SpectralRibbon was still expecting 190, causing the length check
to fail and silently discard all spectral data.
Add linebed to the per-panel FPS settings dropdown in Settings.
Add per-panel default override system to fpsConfig so linebed
defaults to 60fps while other panels stay at 15fps.
Translations already existed in all 5 locale files.
Terrain extends vertically from 12% to 88% of canvas height (76%
spread). Width contained: back 48%, front 72%. 200 lines fill
the tall rectangle with visible spacing between them.
Three issues from user feedback:
1. Right side empty: 512 log bands span 20Hz-20kHz but musicvid only
goes to ~1752Hz. Now display first 350 bands (~3.5kHz), cutting
the dead treble zone that wasted 60% of visual width.
2. Viewpoint too low: terrain vertical spread reduced to 33% of height
(was 54%), centered on canvas. This simulates a much higher camera
looking down at the table rather than crouching at table level.
3. Mountains too tall: maxAmplitude 0.35 → 0.18. Peaks should be
modest bumps on the terrain surface, not towering spikes.
Also reduced to 150 lines for more visible spacing between them.
User feedback with annotated screenshot identified three issues:
1. Perspective (red): Was infinite conveyor belt (back 20%, front 105%).
Now table shape: back 50%, front 82%, contained within canvas.
2. Peak distribution (green): Exponential 6/3 with per-frame normalization
crushed everything except loudest bin. Reduced to 3.5/1.8 so moderate
peaks stay visible across the full spectrum width.
3. Back edge (blue): Opacity faded to 0.06 at back, hiding where lines
begin. Now 0.45 minimum — all lines clearly visible including back edge.
Also: thinner uniform lines, moderate amplitude (0.35 vs 0.55).
The 3D mountain effect in musicvid comes from many temporally-close
lines stacking in perspective. At 15fps with 120 lines, adjacent lines
differed too much — no "body" to the mountains.
- NUM_LINES 120 → 200 (match musicvid)
- Remove frame throttle, render at full rAF rate (~60fps)
so adjacent lines are ~17ms apart, creating solid ridges
- Perspective: backY 0.25, frontY 0.98, depth power 1.8
packs back lines tightly (2-3px apart) for solid terrain surface
Implement transformToVisualBins() with power 2.5 exponent from
musicvid.org to spread bass energy across full visual width instead
of clustering in the first ~30 bins. Add edge tapering (10 bands)
to eliminate staircase/square artifact at spectrum boundaries.
Based on frame analysis of musicvid.org's actual LineBed rendering:
- Revert isometric angle to centered symmetric trapezoid perspective
(vanishing point at center-top, NOT upper-right offset)
- Increase to 120 lines for denser terrain surface
- Lower temporal smoothing from 0.35 to 0.05 (musicvid uses 0.03)
for much more responsive, detailed peaks
- Push snapshots every frame instead of every 2nd for fluid scroll
- Wider front lines (110% canvas width) for edge-to-edge coverage
- Higher amplitude (0.45 * height) for dramatic mountain peaks
Replace centered symmetric perspective with angled isometric view:
- Vanishing point at upper-right (75%, 8%) matching camera(-80,150,-10)
- Lines converge from lower-left toward upper-right vanishing point
- Front line extends beyond left edge for full-width coverage
- Non-linear depth curve (pow 1.8) for realistic compression
- Eliminates the "square" artifact from symmetric convergence
New spectrum data now appears at the BACK (top/horizon) and scrolls
toward the FRONT (bottom/viewer), creating the "audio flowing from
far away toward you" effect. Previously data flowed bottom-to-top
which looked like the terrain was moving away from the viewer.
Also slightly increased amplitude scaling for more dramatic peaks.
3D terrain-style frequency visualization using stacked spectrum lines
with perspective. Uses viz:spectral (190 bands) for high-resolution
terrain, with quadratic curve smoothing and black occlusion fill for
depth. Track info displayed bottom-right matching other panels.
TrackRow, AlbumDetailView header, and ImageLightbox were loading artwork
directly via WebKitGTK HTTPS, which fails on systems with TLS database
issues. Switch all three to use:cachedSrc action to proxy through the
Rust backend image cache, matching the pattern used by other components.
is_disc_folder() was matching any folder name containing "Disc N" or
"CDN" anywhere in the name. This caused albums like "100 Popular
Classics, Disc 1" or "Now 75 - CD1" under Various Artists to be treated
as disc subfolders, collapsing all tracks into a single album group.
Now is_disc_folder() only returns true when the folder name consists
exclusively of disc-related tokens (disc/cd/disk, digits, and modifiers
like "bonus"). Album names with extra words are correctly left as-is.
Users must re-scan their library for the fix to take effect.
- dependabot.yml: target pre-release branch for npm and cargo updates
- redirect-pr-to-prerelease.yml: auto-redirect PRs to main → pre-release
with a friendly comment explaining the workflow