Skip to content

Version Release; 0.2.0

Latest

Choose a tag to compare

@UnknownSuperficialNight UnknownSuperficialNight released this 01 Oct 07:06
· 1 commit to main since this release
3710a48

Warning

RhythmiRust does not support going back to previous versions there may be breaking changes and backwards compatibility is not guaranteed

Caution

If you are updating from version 0.1.8, please execute the migrate_config inside the config directory to upgrade the database.
Configs are located at:

  • Linux: $XDG_CONFIG_HOME or $HOME/.config/RhythmiRust_config
  • Windows: {FOLDERID_LocalAppData}/RhythmiRust_config or C:\Users\<YourUsername>\AppData\Local\RhythmiRust_config
  • Default: Next to the .exe in folder RhythmiRust_config.

🎵 RhythmiRust Updates - 0.2.0 (2025-10-01 04:14)

Commit Statistics

  • 58 commit(s) contributed to the release.
  • 78 day(s) passed between the first and last commit.
  • 58 commit(s) parsed as conventional.
  • 0 linked issue(s) detected in commits.
  • 78 day(s) passed between releases.

🚀 Features

Add download repo link to the about section

Create new audio stream per song for bit-perfect playback

  • Implement dynamic sample_rate and channel_count when building streams, allowing playback of any sample rate or channel count (e.g., 6 channels, not just stereo)
  • Optimise seek performance for the fallback Opus decoder
  • Redesign music player backend: now creates a new stream for each song, ensuring the stream matches the song's properties (previously, a single stream was reused at 44.1kHz stereo)

Default to using 48 kHz sample rate

  • Default it was using 44.1 kHz now forced 48 kHz on stream creation

Add Ctrl+Shift functionality for cell selection in Metadata Editor

  • Implemented logic to select matching cells based on the starting cell when Ctrl+Shift is pressed, allowing for more efficient selection
  • Used eq_ignore_ascii_case for case-insensitive comparison of cell values
  • Optimized by locking selected_cells once before the loop to reduce overhead

Add !! syntax support for Column Searches

  • Support queries like (language:!!) to find rows where the language column is NULL
  • Searching for any non-null value is done with (language:)

Add Enter to search to the Metadata Search bars

Set edit bar value when selecting a single cell in the Metadata Editor

  • Selecting one cell now updates the edit bar to that cell's value
  • If multiple cells are selected, the edit bar resets
  • This improvement makes it easier to add to a pre-existing value without needing to retype the entire text

Implement search fields for Folder and Song, and add shortcut for quick song access in metadata

  • Added Folder and Song search fields to filter metadata effectively
  • Enabled right-click functionality on the rating button for quick access to the song in the Metadata Editor

Increased the maximum volume AGC can go to

  • AGC (Automatic Gain Control) can now go to a max amplitude of 7 from 5

Added Commandline Arguments and download-headless

  • Added a commandline parser to handle commandline arguments
  • Added download-headless or -d argument to execute the downloader directly without GUI (Good for scripts)

Add tracking for seekbar state

  • Seekbar will now be remembered and remain in the same state apon next restart

Cleaned up the UI to be more consistent

  • Now buttons try to fill the available width to make everything look tidier

Add controls for speed via keyboard

  • Added Ctrl+ArrowKeys to control speed via the keyboard

Discord RPC status_display_type to show the current playing song

  • Show the current playing song on server lists instead of the
    application name

Implement Discord RPC progress bar

  • Add state storage fields to DiscordRpcClient to remember last RPC parameters
  • Add update_timing_only method that reuses stored state to avoid code duplication
  • Add TimeUpdate variant to RpcUpdateType enum for timing-only updates
  • Modify custom_rpc to accept update_stored_state flag controlling state persistence
  • Update execute_once to handle TimeUpdate variant and process timing updates
  • Enable Discord progress bar updates when users seek to different song positions
  • Remove the old timer based method

Add on_hover tooltip for the Rating Popup

While Song Rating is processing colour it in yellow

  • While Song Rating is writing the rating to database and embedding into the song colour the button in yellow until processing is finished

Implement a user_rating option in the Music UI

  • Added logic to the Music Player UI to allow users to set a rating for a son
  • Stored the current song rating in a UI data structure
  • When a user clicks on a rating button, the rating is updated in the UI and a background thread is spawned to update the database and metadata
  • Displayed a popup menu when a user clicks over the rating button to allow them to choose a rating
  • Added logic to prevent the user from setting the rating while its setting a previous one

Add 7 more IMAGE_EFFECTS

  • Add (SoftDiagonalGlitch, CrystalShatter, PlasmaEnergy, FractalTessellation, LiquidMetalFlow, GeometricTunnelsGlitched3D, WaveInterference)

🐛 Bug Fixes

Propagate errors for failing set user_rating in the metadata

  • GUI notification for user_rating failing using the rating button
  • Propagate errors up from the metadata backend to let the UI handle the notification
  • Skip songs if they fail to (open,parse,load)
  • Rename notification for search cache generation
  • Import thiserror zero-cost abstraction crate

Implement fallback for audio stream creation

  • The audio stream will attempt to match the song sample_rate and channel_count but if your system is old and does not support either then it will fallback to whatever your system supports
  • Add debug for audio stream config

Increase the allocation limit for metadata to 256MB

  • Before it was not applying this increase from the default 16MB to 256MB allocation increase on each thread thus causing errors importing large music files

Metadata Search was locking up apon a search that had multiple matches

  • It was killing the metadata thread when finding multiple results and no exact or case-insensitive matches
  • Now it handles ambiguous matches without killing the thread

Implement case-sensitivity matching on Metadata Search and resolve panic apon available_tables acquisition

  • Background thread was acquiring the available_tables and causing a potential panic
  • Match quick search terms in order of (case-sensitive) -> (case-insensitive) -> (len == 1)

Execute a search upon refresh after saving in the Metadata Editor

  • The Metadata Editor refreshes the tables after saving, but it was not applying the search. This change triggers the search again to ensure the displayed results are updated

file_watcher was not killing the previous thread

  • file_watcher was not killing the previous thread when the user changed targeted directories
  • file_watcher was not waiting for the previous thread to die thus causing 2 threads to spawn and undefined behaviour

Windows subsystem crate updated

  • windows-sys updated and broke down some features into seperate feature flags thus i need to import Win32_System_Threading

Update Discord RPC to reflect playback speed

  • Adjusted the update logic to account for song playback speed
  • Ensures Discord RPC remains accurate, preventing drift from the actual playback speed
  • Triggers an update every 2 seconds only if the playback speed differs from the default (1.00)

Prevent Discord RPC from overwriting queued song title updates

  • Implemented a check to disable the seekbar updates in Discord RPC when a song title update is queued
  • This ensures the song title is updated before allowing any seekbar edits

Spelling mistake and remove currently playing suffix

  • Fix spelling mistake on GUI duplicate_finder_and_batch_remove
  • Remove (Currently Playing) suffix
  • Add 15 second timeout to database transactions for downloader incase the user skips a song

Rework metadata regeneration to not panic and handle smoothly

  • Remove all edits to a table if it just got queued for regeneration (No point queueing edits when there is nothing to edit as its regenerating)
  • Disable the central UI to prevent editing tables that are queued for regeneration
  • Logic is purely event based for efficiency

Rename default download argument values to fit the new standard

Preserve special columns in escape_special_characters

  • Previously, special characters in column names like user_rating were escaped, breaking search. Now these columns remain unchanged to keep them queryable

Offset 'Song Rating' button to not overlap with the scrollbar

  • Scrollbar was slightly overlapping the Song Rating button causing it to be slightly harder to click

soft_diagonal_glitch was not accounting for the entire image

  • Changed diagonal_range from -(height - 1)..=(width - 1) to -(width - 1)..=(height - 1)
  • Ensures all diagonals are processed, including those covering the top-right corner
  • Fixes issue where top-right part of the image was previously unaffected

Add better error handling to tagged_file instead of a panicking

Give Backend Panel its own unique ID and clean up the UI

🔧 Maintenance

Add compile script to fully automate release compilation

  • Add a gitignore rule to prevent commiting the release builds
  • Add Compile.sh script for automated compilation, uploading to VirusTotal, and changelog/readme generation

Clippy fixes

📎 Other

Add error handling if a table is not found in the downloader

  • Added a error for if adding a value to a table that does not exist
  • Added a error notification for the error

Update cliff to allow clippy chore

♻️ Refactor

Replace Discord Invite with Github Link

Improve Music Player backend to display errors in GUI

  • Added AudioPlaybackError enum to handle various potential errors
  • Added notify_error closure to handle printing error messages to GUI and stderr

enable_high_resolution_images is on by default

Remove Clear time on next song Buttons for Discord RPD

  • This is no longer needed as we use the playbar instead of the timer so there is no time to clear on the next song

Update styling and comments for the metadata_editor

  • Updated styling and comments for the entire metadata_editor backend and frontend

Major overhaul of global memory structure and data organization

  • Rename all structures and re-design them to be easier to maintain and understand

Add tooltips to checkboxes for Settings -> Images

Remove dither effect applied on all images

Implement scaling to screen size for 7 image_padding effects

  • Standardise image per pixel calculations into process_image_simd function to setup the groundwork for simd instructions and parallelize and chunk the pixel calculations
  • Add calculate_exponentiated_screen_ratio_from_base_value function to adjust the intensity of effects based on the screen size
  • Remove cloning the original image instead allocate a empty image and process the source image copying each completed chunk into the empty image filling it up
  • Fix GUI locking on selecting randomizer effects
  • Allow dependencies to have CDLA-Permissive-2.0 license

Add error handling for stream builder

  • Audio stream builder now will print a error if it fails with a error code

⚡ Performance

Enable Symphonia (audio decoder) to use SIMD operations

  • On profiles with avx or sse enabled it will also compile symphonia with those intructions
  • Added support for features flags per profile on the Compile.sh script

Replace unreachable_unchecked with safe unreachable!() in Search Backend

  • Use the safe unreachable!() macro to indicate unreachable code paths, allowing the compiler to optimize checks while avoiding undefined behavior risks

Set database cache_size to 64 MB

Keep rolling a count of actions to perform

  • For optimal GUI rendering we need a amount of actions to perform however previously this was calculated each frame on the UI thread now instead we keep a rolling count

Performance improvement: - Before: O(n) iteration through all nested
HashMaps on every UI frame - After: O(1) atomic load operation

Add SIMD operations for resizing

  • Added the resize_rgb_image_simd function for standardisation efficient SIMD image resizing (3 seconds to 100ms)
  • Allow ImageProcessingError to support ImageError and StringError
  • Add comments to all functions in image_padder lib
  • Support debug_mode in more parts of image_padder

Remove cloning the image from 5 image padders

  • Instead of cloning the a huge image make a empty image and fill it in in parallel

Optimise image-padder and image loading

  • Image-padder now uses rgb8 instead of rgba8
  • Instead of storing and passing around a Vec<u8> raw bytes pass around a RgbImage type this reduces 6 conversions to just 2 conversions (i.e. convert to rgb and convert to a texture)
  • Remove duplicates

Tip

The year number in the releases relates to when the optimisations that binary has so if your computer is around 2020 use that version etc.
If that fails go back to the next lowest year to find a version that works
The 2020 version would be the most common version

Important

Windows Defender may flag the executable as a potential threat because I do not upload executables to their database. If you have concerns about viruses, please refer to the README.md file. It contains checksums and links to VirusTotal for your peace of mind.