- VocaluxeSongServer: ASP.NET Core server that scans an UltraStar library and
serves the song list (ETag), single files (Range) and zip bundles; optional
API key; Dockerfile and Gitea workflow for git.disi.dev/projects/vocaluxe-song-server
- Game: config section SongServer (Url, ApiKey). At song loading, the song text
files are mirrored into a local cache that is loaded like a song folder;
without connection the last library is used
- VocaluxeLib: CSongFiles hook for all song file access; media are downloaded on
demand (covers in the background, preview audio, everything before singing
with progress in the sing screen)
- Tests for scanner, API and downloads (incl. resume); AGENTS.md for the fork
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Runtime and build
- Move all projects to .NET 10 with SDK-style project files and a shared
Directory.Build.props (WIN/LINUX, x86/x64 defines)
- Load managed and unmanaged dependencies from libs/managed and
libs/unmanaged through assembly and native library resolvers
- Compile party modes with Roslyn instead of CodeDom
- Update AppVeyor to the .NET 10 SDK and dotnet test
- Download the FFmpeg and gstreamer runtimes from the dependencies
repository during the build
- Remove the VC++ 2015-2022 runtime check, no dependency needs it anymore
Graphics and windowing
- Replace the Direct3D 9 renderer with Direct3D 11 (Vortice)
- Pace Direct3D 11 frames with a frame latency waitable swap chain
- Move window, input and message boxes to SDL3
- Replace System.Drawing with SkiaSharp and WinForms with SDL3 and a
software renderer
Video and audio
- Replace Acinerella with FFmpeg 8.1.3 (FFmpeg.AutoGen)
- Add hardware accelerated video decoding (D3D11VA, DXVA2, VideoToolbox,
VAAPI, VDPAU) with software fallback
- Convert YUV video frames to RGB on the GPU in Direct3D 11 and OpenGL
- Add the video options HardwareDecoding, GpuColorConversion,
DecoderThreads and VideoDownscaleResolution
- Update OpenAL to OpenTK 4 and NAudio recording to WasapiRecorder
Fixes
- Fix the song preview start and shorten the reporter buttons
- Fix a crash when opening the highscore without a selected song
- Use the options slide highlight in the party mode screens to avoid
brightness flicker on VRR displays
- Disable GameInput in the x86 build, SDL3 crashes in GameInputCreate
on 32-bit systems with the GameInput runtime installed
- Fix a truncation warning in PitchTracker
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
* Translate Output/Languages/en.xml in cs
100% translated source file: 'Output/Languages/en.xml'
on 'cs'.
* Translate Output/Languages/en.xml in cs
100% translated source file: 'Output/Languages/en.xml'
on 'cs'.
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
* Translate Output/Languages/en.xml in fr
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Replace the WCF webserver with an ASP.NET Core webserver (VocaluxeWeb)
- New project VocaluxeWeb: ASP.NET Core 2.3 (Kestrel) on .NET Framework 4.8.1, HTTP or HTTPS
with a self-signed certificate, REST API (/api/v1) with Swagger, live events (Server-Sent Events)
- Access to the game only through IVocaluxeRemote; requests run on the main thread once per frame
- Sessions with roles (guest, player, admin) and configurable permissions, PINs hashed with PBKDF2
- Queue as a playlist with requesters and singers, fair order (one song per person and round)
- Admin: settings, server status, logged-in devices, activate/deactivate and delete profiles
- Profile pictures: own photo or one of the Vocaluxe avatars
- Game: WebApp queue screen (song options, playlist group) to start the next song with the chosen
singers, return to it after singing, warning when the webserver is off, remote keyboard
- Old WCF server, WebserverInitalConfig and URL reservations removed; libraries moved to libs/managed
- Unit tests for PIN hashing, settings and permissions, queue order and device names
- AppVeyor: Visual Studio 2022 image and Node.js 24 (the build compiles the WebApp)
- Documentation in VocaluxeWeb/README.md
* New WebApp (Vue 3, TypeScript, Vite) replacing the old jQuery Mobile website
- Login with profile and PIN, create profiles
- Songs with search, filters, sorting and 30 second previews
- Queue: add songs with game mode, audio and singers, edit, reorder, start in the game
- Playlists: create, edit, add to the queue
- Now playing with live updates, remote control and keyboard
- Players: own profile with picture (photo or Vocaluxe avatar), roles for admins
- Admin settings: permissions, server status, devices, profiles
- Help page, responsive layout for phones, tablets and desktops, light and dark mode
- Texts in WebApp/src/locales/en.json, translated with Transifex
- Old website and PhoneGap config removed
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Improve profile and player selection screens
- Ask before deleting a profile, Delete only removes a character while editing the name
- Ask to save or discard unsaved profile changes when leaving the profile screen
- Restore the previous name with Escape and prevent empty profile names
- Stop the webcam when leaving the profile screen and discard snapshots on avatar change
- Show inactive profiles dimmed in the profile screen
- Play the missing mic/profile warning each time the player selection is shown
- Fix crash when clicking a profile after removing a player with Delete in fast selection
- Keep the duet part selection when profiles are reloaded
- Only save the player number when it has changed
* Use party mode selection look in statistics screens
- Tiles and selection use the ButtonTile skin like the party mode selection, the selected tile uses the selection color of the skin
- The detail list uses the CoverTextBackground skin, inner cards and row stripes the ButtonTile skin
- More space between the title and the columns of the best list
- Show the date in the recently sung list left aligned inside the list
* Changelog
* Improve sing screen and redesign pause menu
- Fix jumping to the old pause position after restarting or skipping a song in vocals mode
- Keep name and avatar hidden for players without a valid profile
- Show the placeholder avatar for profiles without avatar image
- Hide player information and rating popups during the start countdown
- Fix pause select slides not being shown or hidden
- Show "no more songs" only when Ctrl+S is pressed
- Select "Continue" when opening the pause menu with Escape
- Darken the game behind the pause menu
- Pause buttons as vertical list with icons, hidden buttons leave no gaps (visible buttons are placed in the slots of all pause buttons)
- New PauseButton skin with rounded corners for wide buttons, used for the pause buttons and the vocals volume selection
- Larger pause title centered above the pause panels
- Info panel with cover, title, artist, song progress and player scores
- Vocals volume selection with icon and centered caption in the full width of the info panel, showing five values
- Pause panels and icons are animated together with the pause buttons
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
- Update score and progress bar visibility when changing rounds
- Count karaoke songs as played
- Highlight the winner with a pulsing animation
- Add clickable arrows to change the round
- Reveal the rating after the progress bar animation
- Show player names in player colors and the song cover next to the title
- Stop score sounds when the screen is closed
- Remove unused ScreenSettingAnimationDirection from the theme
- Show one row per player in player order (two columns from 4 players)
- Split the points bar into notes, golden notes and line bonus with a legend
- Add ScoreTile and ScoreTileSmall skins for the player rows
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Redesign and improve option screens
- Open the options directly from the main menu with the focus on the navigation, all option screens share a navigation with all categories, song folders and credits
- Navigation and settings use rounded backgrounds like the party mode selection, the current category and setting are highlighted with the selection color of the skin
- Categories can be clicked or switched with Tab, Escape moves the focus to the navigation and leaves the options from there, choosing a category moves the focus to its first setting
- Place the action buttons (delay test, adjust screen, server address, add folder) and the webcam preview inside the settings background
- Center the restart and microphone warnings below the settings background
- Move song folder management to its own screen with a list of all folders, add and remove buttons, a scrollbar and a restart warning
- Add the tile caption option to the game options (only selectable when the song menu is set to tiles)
- Remove the old options selection screen (ScreenOptions)
- Fix configured song folders being ignored when the first entry of the config is empty
- Show the folder dialog in front of the game window
- Fix background music source being overwritten by the karaoke effect setting
- Keep the webcam configuration when no webcam is connected
- Warn when several players are assigned to the same record channel
- Show a warning when no microphone is found
- Remove cover sizes 32 and 64 and keep unknown cover sizes until changed
- Play warning sounds again each time an option screen is shown
- Ignore key pressed events in graphics and server options
- Keep the background music volume in sync in the sound options
* Fix SonarCloud issues
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Add jukebox mode
Songs can now be played without singing, e.g. as a break filler at parties.
- New Jukebox button in the main menu next to Sing and Party, locked without a profile like both of them
- Choose all songs, a category or a playlist, random or in order, and optionally only a part of each song (medley part, 30, 60 or 90 seconds)
- Video in full screen, lyrics without notes and a short song info whenever a new song starts
- Control bar with previous, pause, next, skip intro, audio mode (normal or instrumental), shuffle, repeat, lyrics on/off, queue and "Sing now"
- Queue with search: Enter puts a song next, Enter again plays it right away, songs can also be removed and reordered
- The queue adapts its size to the free space above the lyrics or the control bar
- Control bar and queue fade out after a few seconds without input and come back with the next key press or mouse move
- Works with keyboard, mouse and gamepad
- Smooth transition between songs, the next song is loaded in advance
- "Sing now" starts the current song with the player selection and returns to the jukebox afterwards
- The logo in the main menu is now centered
- New LyricsIcon and QueueRow textures in all Vocaluxe 2024 skins
* Fix SonarCloud issues
* Redesign party mode selection
- All party modes are shown at a glance as tiles with an icon and their name, sorted by their name
- The tiles look and behave like the theme buttons, the details of the selected mode (description, target audience, players, teams, microphones, author and version) are shown below
- Modes that need more microphones than configured are dimmed and can't be started
- Select with the arrow keys or the mouse, the arrow keys also reach the Start and Back buttons, a click on a tile starts it
- More than six modes are split into pages
- Icons for Challenge and Tic-Tac-Toe and a general icon for modes without their own
- Fixes the number of players shown for modes with a fixed number of players
* Highlight Sing and Party in the main menu
- Sing and Party are shown as two large buttons side by side above the other buttons
- Statistics, Profiles, Options and Exit stay in one row at the bottom
- Without a profile the missing profile warning takes the place of Sing and Party, because both are locked then, and looks like the other warnings
* Add statistics screens
- New statistics dashboard with four tiles: overview, recently sung, best list per difficulty and players
- Each tile opens a detail screen with longer lists, filters (left/right) and scrolling
- Detail lists show ranks for places 1-3, avatars, bars and alternating row backgrounds
- Players can be ranked by most songs or by best average
- Overview details: most sung songs, genres, languages and songs never sung
- Navigation help at the bottom of both screens
- New Statistics button in the main menu
- English and German texts
* Address code analysis findings in statistics screens
* Retrigger CI
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in cs
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
100% translated source file: 'Output/Languages/en.xml'
on 'cs'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fi'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fi
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fi'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Translate Output/Languages/en.xml in sv
94% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'sv'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in sv
92% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'sv'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Vocaluxe/Website/locales/en.json in de
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'de'.
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in es
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'es'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fr
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in de
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fr
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in es
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'es'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in de
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fi'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
93% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fi'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
93% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'es'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'sv'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Screen Version 5
* Add Song Folder Button
* Add Song Folder Button
* Add Song Folder Button
* Add Song Folder Button
* Add Song Folder Button
* Add Song Folder Button
* Translate Output/Languages/en.xml in de
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Add Player Select Option
* Add Player Select Option
* Add Player Select Option
* Add Player Select Option
* Theme System Version 9
* Theme System Version 9
* Theme System Version 9
* Add Player Select Option
* Add Player Select Option
* Theme System Version 9
* Theme System Version 9
* Theme System Version 9
* Add Player Select Option