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.
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.
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.
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.
| Key | Action |
|---|---|
| Space | Play / pause |
| Ctrl+Left / Ctrl+Right | Previous / next |
| Ctrl+Up / Ctrl+Down | Volume |
| S / R / M / E | Shuffle / repeat / mute / equalizer |
| Ctrl+F | Search the playlist |
| Enter / Delete | Play / 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.
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:
| File | What it does |
|---|---|
| MainWindow.xaml/.cs | Main window: playlist, playback logic, shuffle and repeat, FTP browser |
| FtpProfileWindow | Add/edit server dialog with the connection test |
| EqualizerWindow | Equalizer window |
| Services/AudioEngine.cs | Playback, seeking and media-key integration |
| Services/EqualizerSampleProvider.cs | The sound processing chain |
| Services/FtpService.cs | Browsing, downloads and the cache |
| Services/AudioFiles.cs, MetadataReader.cs, SettingsStore.cs | File 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.