A professional macOS app and VST/AU plugin for detecting musical key, Camelot notation, and BPM from audio files — with live audio input for real-time analysis from any source (Spotify, YouTube, Ableton, etc.).
Real-time key and BPM detection from system audio. Just play music from any app.
┌─────────────────────────────────────────────────┐
│ [LIVE] [FILE] │
├─────────────────────────────────────────────────┤
│ │
│ C Minor │
│ │
│ 124.0 │
│ BPM │
│ │
│ ● Listening │
└─────────────────────────────────────────────────┘
Drop audio files and view detailed results with album art and waveform overview.
┌─────────────────────────────────────────────────┐
│ ART │ TRACK │ KEY │ CAMELOT │ BPM │ DUR │
├───────┼───────────┼──────┼─────────┼─────┼──────┤
│ [🖼] │ Track.mp3 │ Cm │ 8A │124.0│ 6:54 │
└─────────────────────────────────────────────────┘
Live analysis, file loading, and export — directly in your DAW.
┌─────────────────────────────────────────────────┐
│ [LIVE] [FILE] [EXPORT] │
├─────────────────────────────────────────────────┤
│ │
│ C Minor │
│ │
│ 8A | 124.0 │
│ │
│ [ ANALYZE ] │
└─────────────────────────────────────────────────┘
- Live Audio Input: Analyze key/BPM from any source playing on your Mac (Spotify, YouTube, Ableton, etc.) — no file export needed
- Batch Processing: Analyze multiple files at once
- Album Art Display: Shows embedded artwork from audio files
- Waveform Overview: Visual representation of audio content
- Enhanced Accuracy: 16K FFT with harmonic weighting (~90-95% accuracy)
- Camelot Wheel: Perfect for harmonic mixing
- Prominent Key Display: Large, readable key notation at all times
- Professional Algorithms: Krumhansl-Schmuckler key detection
- Minimal Dark UI: Clean, distraction-free interface with monospace fonts
- Multiple Formats: MP3, WAV, M4A, FLAC, AIFF
- Export to DJ Software: Rekordbox XML, Serato CSV, Traktor NML, Engine DJ, Virtual DJ, iTunes XML
- Live Analysis: Real-time key/BPM detection in your DAW (Ableton, Logic, FL Studio, etc.)
- Tabbed Interface: LIVE, FILE, and EXPORT modes in one plugin
- Same Accuracy: Uses identical algorithms as desktop app
- Pass-Through: Doesn't affect audio, only analyzes
- Background Thread Processing: Analysis runs off the audio thread to prevent glitches
- macOS 13.0 or later
- Xcode 15.0 or later
- Swift 5.9 or later
- Open Terminal and navigate to the project directory
- Build and run using Swift Package Manager:
swift build
swift runTo open in Xcode for easier development:
open Package.swiftOr generate an Xcode project:
swift package generate-xcodeproj
open KeyFinder.xcodeproj- Launch the app
- Drag and drop one or multiple audio files onto the window
- App automatically analyzes all files in sequence
- View results in table format:
- Album art (if embedded)
- Track name
- Musical key
- Camelot notation
- BPM
- Drop more files to add to the batch
- Click "CLEAR ALL" to start fresh
- Build the VST (see
KeyFinderVST/README.md) - Load in your DAW on any audio track
- Play the track
- Click "ANALYZE" to capture 5 seconds of audio
- View results directly in plugin window
Uses enhanced Krumhansl-Schmuckler key-finding algorithm:
- 16,384-point FFT for high frequency resolution (2x typical)
- Harmonic weighting: Bass frequencies (80-200 Hz) weighted 2.5x
- Correlates pitch class profile with major/minor key templates
- Returns best matching key from all 24 possibilities
- ~90-95% accuracy on clear tracks (see ACCURACY.md)
Implements onset-based tempo detection:
- Calculates spectral flux for onset detection
- Applies autocorrelation to find periodicity
- Detects tempo peaks in 60-180 BPM range
- MP3
- WAV
- M4A
- FLAC
- AIFF/AIF
The audio analysis engine is extracted into a reusable Swift Package used by both the standalone app and the VST/AU plugin.
KeyFinderEngine/ # Shared Swift Package
├── Sources/KeyFinderEngine/
│ ├── KeyDetector.swift # Krumhansl-Schmuckler key detection (16K FFT)
│ ├── BPMDetector.swift # Onset-based tempo detection
│ ├── BeatGridDetector.swift # Beat positions, phase, downbeats
│ ├── AudioProcessor.swift # Orchestrates full analysis
│ ├── FFTManager.swift # Reusable FFT plan singleton
│ └── WindowCache.swift # Pre-computed Hann/Hamming windows
Sources/KeyFinder/
├── AudioAnalysis/ # ← Moved to KeyFinderEngine
├── Views/
│ ├── EnhancedBatchView.swift # LIVE/FILE tabbed main view
│ ├── LiveInputView.swift # Live key/BPM meters
│ ├── TrackDetailView.swift # Album art + prominent key display
│ └── MiniWaveformView.swift # Waveform overview
├── Models/
│ └── AudioAnalysisModel.swift # Batch processing + @AppStorage persistence
└── KeyFinderApp.swift # App entry point, commands, mode persistence
KeyFinderVST/
├── Source/
│ ├── PluginProcessor.h/cpp # Audio buffering + async analysis
│ ├── PluginEditor.h/cpp # Tabbed UI (LIVE/FILE/EXPORT)
│ ├── KeyDetector.h/cpp # C++ key detection
│ └── BPMDetector.h/cpp # C++ BPM detection
└── KeyFinderVST.jucer # JUCE project file (open in Projucer)
- Open
KeyFinderVST.jucerin Projucer (part of JUCE) - Click Xcode export format
- Click Generate Project
- Open the generated
.xcodeprojin Xcode - Build for MacOSX (VST3) or AU target
If you are running macOS via OpenCore Legacy Patcher (OCLP) or using older, unsupported Apple hardware, you may encounter specific build and execution blocks.
1. App Store blocks Xcode download
OCLP spoofs macOS version numbers, which can cause the Mac App Store to block the full Xcode download. Since xcode-select --install does not provide the full toolchain required for swift build, you can bypass the App Store entirely by installing the standalone Swift toolchain via Homebrew:
brew install swift2. Application displays a prohibitory "Strikethrough" icon
If the app builds successfully but displays a strikethrough icon in Finder ("application is not supported on this Mac"), this is a LaunchServices OS/Hardware block, not a Gatekeeper/Quarantine issue. Standard workarounds like Right-Click -> Open or removing quarantine flags will not work.
This occurs because the app's Info.plist requires a minimum macOS version of 13.0, which triggers strict hardware checks on patched older machines.
To resolve this manually:
- Open the built
KeyFinder-v1.9.dmgfile. - Important: Drag
KeyFinder.appout of the.dmgand into your/Applicationsfolder (or Desktop). Do not try to edit it inside the.dmgor you will get a "read-only file system" error. - Right-click the extracted
KeyFinder.appand select Show Package Contents. - Navigate to
Contents/Info.plistand open it in a text editor. - Locate the minimum system version key:
<key>LSMinimumSystemVersion</key>
<string>13.0</string>- Change
13.0to12.0and save the file. - The strikethrough icon should disappear (you may need to relaunch Finder or move the app to refresh the icon cache), and the app will now launch successfully.
MIT