DrumMonitor is a macOS SwiftUI app for MIDI drum timing practice.
It helps you train how accurately your pad hits line up with a metronome by combining real-time visual feedback, scoring, and practice modes.
- MIDI source selection and connect/disconnect
- Internal metronome with:
- tempo control (
60...180 BPM) - subdivision support (
1/4,1/8,1/16) - ghost mode (
Nbars on /Nbars off) - beat indicator synchronized to subdivision ticks
- BPM estimate from incoming pad hits when metronome is stopped
- Timing feedback views:
Phase View(beat-aligned early/late hit display per pad)Deviation Meter(instant early/late placement with rolling stats)Hit Scatter Timeline(deviation over time)Timing Accuracy Score(bucketed scoring + streak)Pad Stats(per-pad average and consistency)- Optional auditory feedback for hits outside a deviation threshold
- Persistent UI settings:
- window size and position
- phase view history mode/settings
- metronome BPM and volume
- Swift 5
- SwiftUI
- CoreMIDI
- AVFoundation
- Combine
- macOS (Xcode project target is configured in
DrumMonitor.xcodeproj) - Xcode with SwiftUI and CoreMIDI support
- A MIDI drum source (hardware or virtual)
- Clone the repository:
git clone https://github.com/dirkclemens/DrumMonitor.git
cd DrumMonitor- Open the project:
open DrumMonitor.xcodeproj- Select the
DrumMonitorscheme and run on macOS.
- In
MIDI Source, connect to your drum controller. - Start the metronome and set tempo/subdivision.
- Use
Practice Controlsto choose:
- focus pad (or all pads)
- normal vs ghost mode
- auditory feedback threshold
- Watch timing quality across:
Phase Viewfor immediate early/late alignmentDeviation Meterfor recent timing spreadHit Scatter Timelinefor drift and trendsTiming Accuracy Scorefor measurable progress
DrumMonitor/DrumMonitorApp.swift: app entry pointDrumMonitor/MIDIManager.swift: MIDI client, source management, message publish/notifications, shared practice settingsDrumMonitor/ContentView.swift: main layout + window size/position persistenceDrumMonitor/MetronomeView.swift: metronome audio, subdivisions, ghost mode, hit BPM, auditory feedbackDrumMonitor/OscilloscopeView.swift: beat-aligned phase viewDrumMonitor/DeviationMeterView.swift: deviation meterDrumMonitor/HitScatterTimelineView.swift: scatter timelineDrumMonitor/TimingAccuracyScoreView.swift: score + streakDrumMonitor/PadStatsView.swift: per-pad statsDrumMonitor/PracticeControlView.swift: training mode controls
- Timing visuals use incoming MIDI Note On events with velocity
> 0. - Most views rely on metronome tick notifications for alignment; start the metronome for best results.
- Some experimental/legacy views still exist in the codebase but are not currently part of the main screen.
