Skip to content

honzavaclavik/Vaci-Player

VaciPlayer for macOS

A modern MP3 player built for macOS 14+ using SwiftUI.

Features

🎡 Playback & Controls

βœ… 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

πŸ“± UI & Organization

βœ… 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

πŸ’Ύ Persistence & Automation

βœ… 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

System Requirements

  • macOS 14.0+
  • Xcode 15.0+
  • Swift 5.9+

Installation & Running

Homebrew (recommended):

# Install via Homebrew
brew tap honzavaclavik/honzavaclavik
brew install --cask vaci-player

# Update
brew upgrade --cask vaci-player

⚠️ Important - first launch: On first launch of the Homebrew-installed app, a warning about an unverified application will appear. To allow the app:

  1. Click "Cancel" when the warning appears
  2. Go to System Preferences β†’ Security & Privacy β†’ General
  3. Click "Open Anyway" next to the VaciPlayer message
  4. Or use the command:
    sudo xattr -rd com.apple.quarantine /Applications/VaciPlayer.app

Standalone macOS app (development):

# Build VaciPlayer.app
./build_standalone_app.sh

# Then launch by double-clicking VaciPlayer.app

From the command line (development):

# Build the project
swift build

# Run
swift run

Usage

Basic Controls

  1. Select a folder:
    • Click "Choose Folder" in the sidebar, OR
    • Use the menu "File β†’ Open Folder..." (Cmd+O)
  2. Favorite folders: Folders are automatically added to favorites, click them to quickly switch
  3. Rename: Hover over a favorite folder and click the pencil icon
  4. Remove: Hover over a favorite folder and click the X icon
  5. Playback: Click the play icon next to the desired song
  6. Volume: Adjust the slider for individual songs
  7. Reorder: Drag songs in the list to change their order

Advanced Features

  1. Playback speed: Use the +/- buttons or keys +, -, = (reset)
  2. Pitch/Tuning: Use the +/- buttons or keys [, ], \ (reset)
  3. Start time: Click on the time next to a song to set the start position
  4. PDF export: Export the playlist with custom names for the band
  5. Pause between songs: Set the pause between songs using the slider (0-5 minutes)

Keyboard Shortcuts

  • 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)

Quit

  • Menu "VaciPlayer β†’ Quit VaciPlayer" (Cmd+Q)

Architecture

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

Key Technologies

Audio Engine

  • 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

UI & UX

  • 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

Persistence & Data Management

  • 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

License

MIT License - see LICENSE file

About

No description, website, or topics provided.

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors