A modern MP3 player built for macOS 14+ using SwiftUI.
β MP3 file playback from a selected folder β Individual volume for each file β Playback speed control (0.5x to 2.0x) without affecting pitch β Pitch/tuning control (-12 to +12 semitones) without affecting speed β Loop playback - set loop points on the waveform for practice/rehearsal β Advanced keyboard controls - full set of shortcuts β Start time setting - skip intros/outros β Master volume per folder
β Waveform visualization with zoom, pan, and click-to-seek β Drag & Drop to reorder songs β Favorite folders - quick switching between folders β Modern macOS design with glassmorphism effects β Sidebar navigation for folder selection β Dark/Light mode support β PDF export of the playlist for the band with custom song titles
β Persistent settings - everything is saved per folder β Automatic state restoration on app restart β Song durations - displayed in mm:ss format β Total set duration - with configurable pause between songs
- macOS 14.0+
- Xcode 15.0+
- Swift 5.9+
# Install via Homebrew
brew tap honzavaclavik/honzavaclavik
brew install --cask vaci-player
# Update
brew upgrade --cask vaci-player- Click "Cancel" when the warning appears
- Go to System Preferences β Security & Privacy β General
- Click "Open Anyway" next to the VaciPlayer message
- Or use the command:
sudo xattr -rd com.apple.quarantine /Applications/VaciPlayer.app
# Build VaciPlayer.app
./build_standalone_app.sh
# Then launch by double-clicking VaciPlayer.app# Build the project
swift build
# Run
swift run- Select a folder:
- Click "Choose Folder" in the sidebar, OR
- Use the menu "File β Open Folder..." (Cmd+O)
- Favorite folders: Folders are automatically added to favorites, click them to quickly switch
- Rename: Hover over a favorite folder and click the pencil icon
- Remove: Hover over a favorite folder and click the X icon
- Playback: Click the play icon next to the desired song
- Volume: Adjust the slider for individual songs
- Reorder: Drag songs in the list to change their order
- Playback speed: Use the +/- buttons or keys
+,-,=(reset) - Pitch/Tuning: Use the +/- buttons or keys
[,],\(reset) - Start time: Click on the time next to a song to set the start position
- PDF export: Export the playlist with custom names for the band
- Pause between songs: Set the pause between songs using the slider (0-5 minutes)
- Space: Next song (or start the first one)
- Enter: Restart current song from start time
- β/β: Previous/Next song (with loop)
- Escape: Pause
- 0-9: Jump to percentage of song (0% - 90%)
- +/-/=: Playback speed (increase/decrease/reset)
- [/]/\: Pitch tuning (decrease/increase/reset)
- Menu "VaciPlayer β Quit VaciPlayer" (Cmd+Q)
Sources/VaciPlayer/
βββ VaciPlayerApp.swift # Entry point (@main)
βββ AppDelegate.swift # Application delegate, menu commands
βββ Models/
β βββ Song.swift # MP3 file model
β βββ Playlist.swift # Playlist model
β βββ FavoriteFolder.swift # Favorite folders model
βββ Services/
β βββ AudioManager.swift # Audio playback management
β βββ FolderManager.swift # Favorite folders management
β βββ PDFExportManager.swift # PDF playlist export
βββ Views/
βββ ContentView.swift # Main view with keyboard handling
βββ SidebarView.swift # Navigation sidebar with favorite folders
βββ MainPlayerView.swift # Coordinator: playlist + waveform + controls
βββ PlaylistView.swift # Song list with drag & drop
βββ PlayerControlsView.swift # Playback controls
βββ WaveformView.swift # Waveform visualization with zoom & loop
βββ FavoriteFolderRowView.swift # Favorite folder row
- AVAudioEngine + AVAudioTimePitchEffect: Advanced audio processing with independent speed and pitch control
- AVAudioPlayerNode: Precise playback control with loop support
- AVAsset: Loading metadata and MP3 file durations
- SwiftUI + macOS 14+: Modern UI framework with the latest features
- Waveform Display: Visual waveform with zoom (1x-20x), pan, click-to-seek, and loop selection
- Hover Effects: Modern mouse interactions for better UX
- Drag & Drop: Native support for reordering
- Native macOS App: Launch without Terminal with menu bar integration
- UserDefaults: Sophisticated per-folder storage (volume, order, speed, pitch, pauses)
- File System Integration: Native integration with the macOS file system
- Real-time Calculations: Dynamic total duration calculation including pauses
- PDF Generation: Playlist export for the band
MIT License - see LICENSE file