Automatically generates MIDI files that trigger ProPresenter 7 lyric slides in sync with live worship music in Ableton Live.
- Drop-in Ableton project loading — reads
.alsfiles for tempo, audio stems, and existing MIDI references - ProPresenter 7 integration — fetches slides and arrangements via REST API
- AI-powered lyrics alignment — forced alignment using stable-ts (local) or AutoLyrixAlign (remote server)
- Smart timing — anticipates slide transitions, handles music breaks, configurable gap thresholds
- Standard MIDI export — SMF Type 0 files with playlist/item/slide triggers for ProPresenter's MIDI mapping
- Manual fallback — tap-along mode for songs where AI alignment struggles
- macOS 14.0+
- Apple Silicon Mac
- ProPresenter 7.9+ (for REST API)
- Ableton Live 11+ (for
.alsproject files) - Python 3.12+ (auto-installed for forced alignment)
- Download the latest
.zipfrom Releases - Extract and move
MIDI Automation.appto/Applications - First launch: System Settings → Privacy & Security → click "Open Anyway"
- Load Ableton Project — drag an
.alsfile onto the app - Get Slides — app auto-matches the song in ProPresenter and loads slides
- Align Lyrics — click "Align Lyrics" to run forced alignment against the backing vocal stem
- Export MIDI — save the
.midfile into the Ableton project folder
- ProPresenter — host/port, auto-connect toggle, library picker for song matching
- ALA Server — host/port for the remote AutoLyrixAlign server (Ubuntu)
- Slide Anticipation — how far ahead of the first word to trigger a new section's slide
- Transition Gap — offset from the last word of the previous slide for back-to-back transitions
- Music Break Wait — delay after lyrics end before showing a blank slide
- Gap Threshold — minimum gap between slides to use first-slide logic vs transition logic
# Install XcodeGen
brew install xcodegen
# Generate Xcode project
cd "MIDI Automation"
xcodegen generate
# Build
xcodebuild -project MIDIAutomation.xcodeproj -scheme MIDIAutomation -configuration Release buildMIDIAutomation/
├── App/
│ ├── MIDIAutomationApp.swift # Entry point, Sparkle setup
│ └── AppState.swift # Central state + business logic
├── Models/
│ ├── MIDIMarker.swift # Trigger point (time, slide, confidence)
│ ├── SlideInfo.swift # ProPresenter slide
│ ├── SongProject.swift # Persistence model
│ ├── TimedWord.swift # Word + timestamps
│ └── Version.swift # App version
├── Services/
│ ├── ProPresenterAPI.swift # Pro7 REST client
│ ├── ForcedAlignmentService.swift # stable-ts Python integration
│ ├── RemoteAlignmentService.swift # ALA server HTTP client
│ ├── MIDIFileWriter.swift # MIDI file generator
│ ├── SlideAligner.swift # Fuzzy text matching
│ ├── AudioFileLoader.swift # AVAudioFile wrapper
│ ├── AbletonProjectParser.swift # .als XML parser
│ └── TranscriptionService.swift # WhisperKit transcription
├── Views/
│ ├── MainView.swift # Main UI (sidebar + 4 steps)
│ ├── WaveformView.swift # Audio waveform + markers
│ ├── SlidesView.swift # Slide arrangement editor
│ └── ...
├── Resources/
│ ├── align_lyrics.py # Bundled forced alignment script
│ └── Assets.xcassets # App icons
├── project.yml # XcodeGen spec
└── test_data/ # Alignment research (57+ approaches)
See CREDITS.md