Commit graph

176 commits

Author SHA1 Message Date
tryptz
79313e7a0a fix: address PR #523 review comments for EQ and binaural DSP
- Remove stale IIR coefficient JSDoc comment
- Reset M/S channel state on EQ import to prevent stale assignments
- Enforce strictly increasing GEQ frequencies to prevent rounding duplicates
- Guard Q calculation against zero octave spacing (Infinity/NaN)
- Export EQ from stored metadata instead of live BiquadFilterNode state
- Accept .csv in legacy GEQ import file input
- Expose public reconnect() on BinauralDSP instead of calling _connectInternal
- Dispatch binaural-mode-changed on channel count change, not just mode change
- Remove no-op channelCount/channelCountMode on MediaElementAudioSourceNode
- Add void to floating promises (toggleBinaural, notifyBinauralChannelCount, _loadBinauralSettings)
- Wrap binauralDspSettings._setAll in try/catch for QuotaExceededError
- Make generateHRTF synchronous (no awaits, was misleadingly async)
2026-04-10 16:06:04 +03:00
tryptz
5bbc36cdb1 feat: add binaural/spatial DSP with multichannel HRTF rendering
Implement a complete binaural audio processing pipeline that sits before
EQ Studio in the signal chain. Supports multichannel (5.1) HRTF
binauralization for Dolby Atmos and Apple 3D Audio content, with
crossfeed and stereo widening for regular stereo content.

New modules:
- hrtf-generator.js: Procedural HRTF impulse response synthesis using
  Woodworth head model (ITD, ILD, head shadow, pinna coloring)
- binaural-dsp.js: BinauralDSP engine with multichannel splitter,
  per-channel ConvolverNode HRTF rendering, Bauer-style crossfeed
  (low/medium/high), and M/S stereo widener

Integration:
- Audio graph: binaural block inserted before preamp/EQ, multichannel
  passthrough via MediaElementSource channelCount=6
- Storage: binauralDspSettings with full persistence (JSON in localStorage)
- UI: toggle + sub-controls (crossfeed level, HRTF preset, width slider)
  placed before EQ Studio in settings
- Player: auto-enables binaural DSP when Atmos content detected,
  shows binaural badge on Atmos tracks
2026-04-10 16:06:04 +03:00
tryptz
44e811f56d feat: per-band Mid/Side EQ, context menus, shelf presets, performance fix
- Add per-band M/S processing with full encoder/decoder matrix in Web Audio API
- Right-click context menu on EQ nodes for filter type and channel switching
- Right-click empty graph space to add nodes
- Remove nearest-node snap-click interaction
- Replace IIR shelf filters with native BiquadFilter for glitch-free updates
- Add 6 M/S showcase presets with research-informed mastering values
- Add 5 shelf-based stereo presets (Warm, Bright, Hi-Fi, Dark, Radio Ready)
- Standard presets now reset all bands to stereo/peaking
- Graph contrast fix for light themes using color-mix()
- Colored help button and rewritten how-to documentation
- Default graph zoom changed to ±16 dB
2026-04-10 16:06:04 +03:00
tryptz
4192263176 style: auto-fix linting issues 2026-04-10 16:06:04 +03:00
tryptz
a16d489b9f fix: address CodeRabbit review - array padding, storage validation, Q accuracy
- Pad band arrays when import/AutoEQ has fewer filters than MIN_BANDS
- Early return in applyAutoEQBands for zero enabled bands
- Persist interpolated gains before audio rebuild on band count change
- Derive export Q from actual octave spacing between adjacent bands
- Validate inputs in all GEQ storage setters
2026-04-10 16:06:04 +03:00
tryptz
91eaa1f1dc feat: configurable band count and frequency range for legacy graphic EQ
- Add Bands/Min Hz/Max Hz controls to legacy EQ section
- Dynamic frequency generation with log spacing and auto-scaling Q
- Import/export handles variable band counts, Q optional for shelves
- Custom presets interpolate across different band counts
- Update legacy EQ tutorial for new controls
2026-04-10 16:06:04 +03:00
a
1edbcc454e
fix: enable mobile fullscreen visualizer (#517) 2026-04-06 15:15:20 -04:00
Nohan-V2
2fac783542 Handle NaN in numeric settings parsing
Replace usages of parseFloat(... ) || default and parseInt(... ) || default with explicit parse + isNaN checks to avoid treating valid numeric zeros as falsy. Changes in js/settings.js and js/storage.js update parsing for replayGain preamp, playback speed, scrobble percentage, equalizer band count, and font size so only NaN triggers the fallback value and valid 0 values are preserved.
2026-04-06 18:34:04 +02:00
Samidy
d7642ff78e test: Add first row of tests for the site 2026-04-06 15:55:30 +03:00
tryptz
da6c2e2dd9 fix: address CodeRabbit review issues from PR #502
Android:
- Fix stale wake lock detection by checking isHeld() before reacquiring
- Wrap startForegroundService in try-catch to handle launch exceptions
- Add START/STOP intent actions to prevent stop/start race condition

HTML/Accessibility:
- Convert preset and preamp spans to proper <label> elements
- Add aria-controls to database collapse button
- Sync aria-expanded state when toggling database panel

JavaScript:
- Guard auto-resume with source check to avoid resuming when not playing
- Add _calculateQ() fallback in fast-path EQ filter updates
- Persist graphic EQ gains and preamp to storage from setters
- Include 'legacy' in EQ mode restoration check
- Clear container before rebuilding GEQ bands for idempotency
- Use AbortController for document-level listener cleanup
- Apply gain calculation for non-parametric modes in touch snap
- Validate stored GEQ values are finite numbers

CSS:
- Remove non-standard appearance: slider-vertical property
2026-04-05 20:07:39 +03:00
tryptz
d09e3aa72a feat: AutoEQ, speaker EQ enhancements, and audio performance fixes
- Add 16-band graphic equalizer with legacy EQ mode
- Add speaker measurement and room correction EQ
- Fix audio skipping with AutoEQ on Android background
- Improve audio performance to prevent skipping under CPU load
- Fix dual EQ applied when switching between legacy and parametric modes
- Remove redundant Equalizer settings tab
- Improve mobile EQ band layout and collapsible database section
2026-04-05 20:07:39 +03:00
Daniel
648e47e1d8 fix(linting): fix js linting issues 2026-04-04 01:37:47 +03:00
edideaur
2183610df1
further:allow right clicking blocked content for easier unblocking 2026-04-02 18:44:13 +00:00
edideaur
8ceaffe757
tilt settings 2026-04-02 16:09:58 +00:00
edideaur
c8b7a9cd17
tilting, rounding, and new trackerapi instance 2026-04-02 12:08:05 +00:00
edideaur
e71c989319
editor pick changes 2026-04-02 09:09:13 +00:00
tryptz
0652aa4866 style: auto-fix linting issues 2026-04-02 11:05:12 +03:00
tryptz
782e98061b fix: address all CodeRabbit review findings from PR #477
Engine & algorithm:
- Use default shelf Q (1/√2) in calculateBiquadResponse for shelf filters
- Compute normalization offset on measurement frequency grid to avoid bias
- Try stale cache for all fetch errors in autoeq-importer, not just timeouts

Audio pipeline:
- Pass postProcessingQuality (preserves Dolby Atmos override) in api.js
- Persist custom band frequencies in equalizerSettings storage
- Restore custom frequencies on _loadSettings instead of regenerating defaults
- Export clamped preamp value in applyAutoEQBands text output
- Propagate filter type and Q values through equalizer import chain
- Update freqRange after importing custom filter frequencies
- Remove return in finally block that hid LOSSLESS fallback failures

Data consistency:
- Normalize artist IDs with String() in blockArtist/unblockArtist

Lint & code quality:
- Annotate empty catch blocks (Atmos codec probes)
- Remove unused catch parameters

Accessibility:
- Add aria-label and for attributes to all AutoEQ form controls
- Add role="status" aria-live="polite" to feedback spans
- Update filter type documentation to reflect shelf support
- Hide parametric-only sections by default to match active tab

UI:
- Move AutoEq button directly under graph
- Hide shared button in Parametric/Speaker modes
- Replace hardcoded white legend dot with theme-adaptive color-mix
- Add pointer-events:none and focus-within to profile delete button
2026-04-02 11:05:12 +03:00
tryptz
d4d1fe8494 feat: AutoEQ and speaker EQ enhancements
Adds AutoEQ integration with interactive parametric EQ graph,
speaker/room correction with shelf filters, and improved EQ
persistence via IndexedDB.
2026-04-02 11:05:12 +03:00
edideaur
c8f64a52e8
tilting + background play fixes 2026-04-01 14:47:37 +00:00
Samidy
edc0b5d1bd Fix(Blocked Content): Manage System Not Working 2026-03-29 18:05:05 +03:00
Daniel
9c34dd4b9d feat(downloads): add check box for atmos, and fallback to desired quality if unavailable 2026-03-28 15:26:55 -05:00
Eduard Prigoana
e809d1443f fix trackers, remove AI slop 2026-03-28 01:04:30 +02:00
Eduard Prigoana
b962853b69 weights 2026-03-26 20:36:42 +02:00
Daniel
397fc53a46 feat(downloads): add local media folder bulk download options and folder template paths
This also implements a ModernSettings class for a more streamlined settings API.
2026-03-20 18:00:14 -05:00
edidealt
ab11ff6a37 multi-track selection 2026-03-20 22:28:08 +00:00
edidealt
7bcb9e1fb5 listenbrainz love on like 2026-03-20 18:07:06 +00:00
Daniel
e2a09b9b32 refactor: externalize svg images and add new vite plugin
The plugin runs all imported SVG files through svgo.

For index.html, you can use the following syntax:
```html
<use svg="file.svg" size="24" />
```

For scripts, use the `?svg` import query
```javascript
import SVG_FILE from './file.svg?svg&size=24
```

Note: size is shorthand for specifying both width and height individually.  You can also set any property of the base SVG element.

You can also use the `?svg&icon` query to return a function that allows dynamically resizing the SVG string.
2026-03-19 15:28:33 -05:00
Nohan-V2
a18e865906 Fix settings persistence: ReplayGain Pre-Amp and Gapless Playback 2026-03-17 22:13:02 +01:00
Samidy
b7aaa37578 add new pinkhamster instance 2026-03-16 23:46:27 +03:00
edideaur
5c7776abb7 actually refresh instances on refresh... 2026-03-16 19:41:01 +00:00
edideaur
6e39cad73d fix (remove spotisaver blacklist) 2026-03-16 16:16:57 +00:00
Samidy
99debbb7b2 feat(APIs): custom api instances 2026-03-14 02:58:22 +03:00
edideaur
b31be7dc80 Fix bulk download edge cases and improve robustness
- FolderPickerWriter: throw AbortError on cancel instead of returning null
- FolderPickerWriter: add try/catch with abort() to release file locks on failure
- ZipNeutralinoWriter: move writeBinaryFile after response.body validation
- bulkDownloadSettings: migrate legacy key and validate stored values
- download-utils: catch ffmpeg cancellation via signal.aborted
- downloads.js: use consistent Neutralino detection with bridge module
- download-utils: use strict equality for flac extension check
2026-03-12 19:35:23 +00:00
edideaur
a776e24aee
Merge pull request #303 from DanTheMan827/copilot/extract-duplicated-code-to-ts
Extract shared download utilities and abstract bulk download handlers + new folder picker support
2026-03-12 21:18:47 +02:00
Samidy
3fc74738a5 this barely ever worked anyways lets just remove smooth scrolling 2026-03-12 10:16:38 +03:00
Daniel
b04019f282 fix(downloads): mp4 files with flac audio are now tagged
This is resolved by using ffmpeg to copy the audio data into a new mp4 container file before passing it to taglib.
2026-03-12 06:43:45 +00:00
Daniel
c1552980eb feat: extract bulk download handlers into bulk-download-writer.ts and add folder picker + settings 2026-03-12 06:04:59 +00:00
Daniel
3f2651633b
feat(downloads): add custom download formats 2026-03-11 19:26:05 +00:00
Samidy
473e5ba8b6 feat(recommendations): Infinite Radio 2026-03-10 04:58:17 +03:00
Samidy
83c705a60a Merge branch 'main' of github.com:monochrome-music/monochrome 2026-03-09 03:03:59 +03:00
Julien Maille
473d63c899 reorganize settings menu, add playback speed reset and instances tab 2026-03-08 18:35:07 +01:00
Samidy
4762dea607 feat(visualizer): visualizer dimming 2026-03-08 02:55:51 +03:00
edideaur
f967d29c52 donate and about page changes 2026-03-03 20:47:49 +00:00
edideaur
b29160385a keybind rebinding 2026-03-03 12:20:42 +00:00
edidealt
5e437d4019 fullscreen mode settings 2026-03-02 20:14:25 +00:00
edidealt
5cac487c0f pitch shit 2026-03-01 10:52:03 +00:00
Daniel
07422debb9
feat(downloads): add lossless container option
This uses ffmpeg to ensure that the downloaded lossless audio is in the desired container format.
2026-02-27 21:23:33 +00:00
Samidy
7d4294f906 my free trial ran out 2026-02-24 19:58:19 +03:00
Julien Maille
bf346f756e Add multi-disc ZIP folders and fix playlist extension paths 2026-02-22 00:32:45 +01:00