Desktop app

Local Music Player

A music player for Windows 10 and 11 that plays music from your PC and from FTP servers such as a NAS, a home server or a hosting account. Dark Windows 11 look, an FTP browser in the sidebar, the playlist in the middle and the player at the bottom.

← Back to projects Get in touch about desktop apps

What is it?

Local Music Player is a desktop app written in C# as a .NET 10 WPF app. It plays local files and music stored on an FTP server in one shared playlist – without copying anything over first.

The app is a single file, LocalMusicPlayer.exe, of about 25 MB. It needs the .NET 10 Desktop Runtime and remembers everything between sessions: the playlist, the current song, servers, volume, shuffle/repeat, equalizer, window size and sidebar width.

Platform
Windows 10 / 11
Single .exe file
≈ 25 MB
Desktop Runtime
.NET 10
Equalizer
10 bands
  • Local music and FTP/FTPS servers in the same playlist
  • 10-band equalizer with 15 presets
  • Media keys and the Windows media pop-up with cover art
  • Dark Windows 11 look built into WPF

Local music

Add files, whole folders including subfolders, or .m3u/.m3u8 playlists – or just drag them onto the window. Files opened with “Open with…” or passed on the command line are added and start playing.

The main window: FTP servers in the sidebar, the playlist with title, artist, album, length and source in the middle, and the player with cover art, controls, timeline, equalizer and volume at the bottom.

It plays whatever formats Windows can decode: MP3, AAC/M4A, FLAC, WAV, WMA and ALAC. Title, artist, album, length and cover art are read from each file’s tags in the background, so the playlist never waits on large folders.

  • Files, folders (with subfolders) and .m3u/.m3u8 playlists
  • Drag and drop and “Open with…” from File Explorer
  • Tags and cover art read in the background
  • Ogg/Opus via Microsoft’s free Web Media Extensions

FTP servers

Save as many servers as you like, using plain FTP, explicit FTPS or implicit FTPS. Self-signed certificates and anonymous login can be allowed per server, and “Test connection” checks the settings before you save them.

Adding a server with host, port, login, encryption type, the self-signed certificate option and a start folder. “Test connection” tries the connection before saving.

Browse folders on the server and double-click a song to play it, or add selected songs, a folder or a whole folder tree. Songs download to a local cache before they play, and while one song plays, the next one downloads in the background – so tracks change without a pause.

  • FTP, explicit FTPS and implicit FTPS
  • Passwords encrypted with your Windows account (DPAPI)
  • Next song downloads in the background – no gap between tracks
  • Cache capped at 2 GB; least recently used files go first

Playback and playlist

Play/pause, next/previous, seek, volume and mute. Shuffle avoids songs you heard recently, and Previous in shuffle mode goes back through what you actually heard. Repeat can be off, all or one.

If a song can’t play – a missing file, an unsupported format or a failed download – it’s marked in the playlist with the reason and the player skips ahead. After repeated failures it gives up rather than looping forever.

Keyboard shortcuts
KeyAction
SpacePlay / pause
Ctrl+Left / Ctrl+RightPrevious / next
Ctrl+Up / Ctrl+DownVolume
S / R / M / EShuffle / repeat / mute / equalizer
Ctrl+FSearch the playlist
Enter / DeletePlay / remove the selected song
Backspace (FTP list)Parent folder
  • Search by title, artist, album or filename
  • Reorder with Alt+Up/Down, remove with Delete, right-click to open the file location
  • Save the local songs as an .m3u8 playlist
  • Shows the song count, total length and how many songs come from FTP

Equalizer

10 bands from 31 Hz to 16 kHz, each ±12 dB, plus preamp and left/right balance. There are 15 presets – including Bass boost, Loudness, Vocal, Rock and Small speakers – plus Custom as soon as you move a slider yourself.

The equalizer on the Bass boost preset: preamp on the left, 10 bands from 31 Hz to 16 kHz and balance at the bottom. Double-click a slider to reset it.

Changes apply instantly while music plays, and a limiter stops heavy boosts from crackling.

  • 10 bands, 31 Hz – 16 kHz, ±12 dB
  • Preamp and balance
  • 15 presets plus Custom
  • Limiter against distortion

How the sound gets to your speakers

Audio goes through one chain, whether the file is local or downloaded from FTP:

audio file (local or cached FTP download)
  → Media Foundation decoder (NAudio)
  → preamp → 10 EQ filters per channel → volume → balance → limiter
  → speakers

The equalizer is written by hand: ten standard filters per channel, the usual building block for audio EQs. Moving a slider sends new settings to the audio thread, which picks them up on its next chunk of audio, so there are no clicks or glitches. Volume changes are smoothed out the same way.

Media keys and a change of audio engine

Media keys work even when the app is in the background, and the Windows media pop-up shows the current track and cover art. NAudio doesn’t connect to Windows’ media controls, so the app keeps a hidden, silent Windows media player purely to get them – and tells it the title, artist, artwork and whether it’s playing.

The first version played through Windows’ own media engine, which gave media keys and the pop-up for free. When the equalizer came up, it turned out that engine only offers a basic 4-band EQ. Playback was moved to NAudio, and the media keys were kept through the hidden player.

Code layout

The code is split into windows, services and models:

FileWhat it does
MainWindow.xaml/.csMain window: playlist, playback logic, shuffle and repeat, FTP browser
FtpProfileWindowAdd/edit server dialog with the connection test
EqualizerWindowEqualizer window
Services/AudioEngine.csPlayback, seeking and media-key integration
Services/EqualizerSampleProvider.csThe sound processing chain
Services/FtpService.csBrowsing, downloads and the cache
Services/AudioFiles.cs, MetadataReader.cs, SettingsStore.csFile scanning and playlists, tag reading, saving settings
Models/Songs, servers, equalizer and app settings

Settings are saved to %AppData%\LocalMusicPlayer\settings.json and the FTP cache is in %LocalAppData%\LocalMusicPlayer\Cache.