- π¨ Real Winamp skins β load any classic
.wszskin and the entire app reskins: sprites, bitmap fonts, playlist colors, visualizer palette - π Gapless CUE playback β one FLAC +
.cuebecomes individual tracks with sample-accurate, gapless transitions - π 10-band equalizer with preamp, presets, and a live frequency-response curve
- π Real-time spectrum analyzer β 32-bin FFT via Accelerate, skinnable via
viscolor.txt - β‘ Jump to File β incremental search over 10k-track playlists in under 16 ms
- π First-class macOS citizen β media keys, Control Center "Now Playing", menu bar tray, full state restore
- Classic transport β play, pause, stop, previous, next, seek
- Volume and balance sliders with real-time response
- Retro LCD time display with seven-segment digits and scrolling track title
- Double Size mode (
ββ§D) β the whole window scales 2Γ, pixel-perfect - Always-on-top pin (
ββ§T) and a minimize-to-tray menu
Wamp parses the original Winamp 2.x skin format β a .wsz archive of bitmap
sprites and INI files β and renders it faithfully:
main.bmp,cbuttons.bmp,eqmain.bmp,pledit.bmpsprite sheets- Bitmap fonts from
text.bmp/nums.bmpfor the LCD and titles - Playlist colors from
pledit.txt, visualizer palette fromviscolor.txt - Interactive mini-transport baked into the skinned playlist corner β just like 1999
- Hardened loader: corrupt archive entries are skipped, decompression is capped
against zip bombs, malformed
region.txtfails soft - Skins load atomically off the main thread; Unload Skin returns to the built-in look instantly
A few classics to try live in skins/: base-2.91, Blue Plasma,
OS8 AMP β Aquamarine, Radar Amp.
πΌοΈ Skins showcase coming soon β same player, four very different outfits.
- Drag & drop files, folders,
.m3u/.m3u8and.cuestraight from Finder - Multi-select like a real Mac app β Shift-click ranges, Cmd-click toggles,
βA, Backspace removes - Instant search box + Jump to File (
βJ) with prefix β word-boundary β substring ranking - Shuffle and repeat (off / track / playlist) with auto-advance
- Import from Music Libraryβ¦ β pulls local tracks and playlists from Music.app
(via
ITLibrary, with aniTunes Music Library.xmlfallback); streaming-only and missing files are skipped and counted - Skinned scrollbar, skin-correct row colors, live track-count/duration footer
Drop a .cue next to a FLAC (or open a FLAC with an embedded CUESHEET
Vorbis comment) and the album splits into individual virtual tracks:
- Gapless transitions between consecutive tracks via chained
scheduleSegmentcalls - External
.cuewins over embedded CUESHEET - Encoding detection: UTF-8, Shift-JIS, CP-1251, CP-1252
- Absolute Windows/Unix
FILEpaths resolve by basename β same behavior as foobar2000 - CRLF files, hostile timecodes, and malformed input all fail soft, never crash
| Playback | View | ||
|---|---|---|---|
Space |
Play / Pause | β1 |
Show Player |
β. |
Stop | β2 |
Toggle Equalizer |
ββ / ββ |
Next / Previous | β3 |
Toggle Playlist |
βR |
Repeat | ββ§D |
Double Size |
βS |
Shuffle | ββ§T |
Always on Top |
Return |
Play selected track | ββ§S |
Load Skin⦠|
β β |
Navigate playlist | βO / ββ§O |
Open File / Folder |
βJ |
Jump to Fileβ¦ | βA |
Select All |
Plus hardware media keys (play/pause, next, previous) and the macOS Now Playing widget in Control Center.
| Audio | Playlists |
|---|---|
| MP3 Β· AAC Β· M4A Β· FLAC Β· WAV Β· AIFF | M3U Β· M3U8 Β· CUE (external & FLAC-embedded) |
Requirements: macOS 26.3+, Xcode 26+
git clone https://github.com/wishval/wamp.git
cd wamp
# Build
xcodebuild -project Wamp.xcodeproj -scheme Wamp -configuration Debug build
# Or just open in Xcode and hit βR
open Wamp.xcodeprojRun the tests (they cover the models, CUE parsing, and persistence):
xcodebuild -project Wamp.xcodeproj -scheme Wamp -destination 'platform=macOS' test| Language | Swift 5 |
| UI | AppKit β 100% programmatic, no storyboards, no XIBs |
| Audio | AVFoundation / AVAudioEngine |
| DSP | Accelerate (vDSP FFT for the spectrum analyzer) |
| Media keys | MediaPlayer (MPNowPlayingInfoCenter) |
| State | Combine + debounced JSON persistence |
| Dependencies | None. Zero. Nada. |
AppDelegate (nib-less bootstrap, owns the singletons)
βββ AudioEngine PlayerNode β 10-band EQ β Mixer β Output, FFT tap
βββ PlaylistManager track list, shuffle, repeat, auto-advance
βββ StateManager debounced JSON persistence, restores on launch
βββ SkinManager atomic .wsz load β publishes a SkinProvider
β βββ SkinModel sprites, regions, colors, bitmap fonts
βββ CueSheet parser + encoding detection + FLAC extractor
β βββ CueResolver expands a cue into virtual Tracks
βββ MainWindow 275px-wide borderless stack
βββ MainPlayerView LCD, transport, sliders, spectrum
βββ EqualizerView 10 bands + presets + response curve
βββ PlaylistView drag-drop, search, keyboard nav
Views bind to models through Combine β @Published fires, views redraw.
No delegates, no notification spaghetti.
Wamp is a local player. It will not stream Spotify or Apple Music catalog tracks β both route audio through a system-managed graph that bypasses our DSP, so the EQ and spectrum analyzer would be lying to you. Details in docs/non-goals.md.
Made with nostalgia and Swift on macOS.
Inspired by Winamp 2.x. An independent project, not affiliated with or
endorsed by the original Winamp authors. Skins in skins/ belong to their
original artists.
π¦