GitHub - evanhu1/transposify: Sing along to any Spotify song in your range — real-time pitch shifting (Rubber Band R3) as a macOS menu-bar app. · GitHub
/" data-turbo-transient="true" />
Skip to content
Search or jump to...
Search code, repositories, users, issues, pull requests...
-->
Search
Clear
Search syntax tips
Provide feedback
--><br>We read every piece of feedback, and take your input very seriously.
Include my email address so I can be contacted
Cancel
Submit feedback
Saved searches
Use saved searches to filter your results more quickly
-->
Name
Query
To see all available qualifiers, see our documentation.
Cancel
Create saved search
Sign in
/;ref_cta:Sign up;ref_loc:header logged out"}"<br>Sign up
Appearance settings
Resetting focus
You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.
Dismiss alert
{{ message }}
evanhu1
transposify
Public
Notifications<br>You must be signed in to change notification settings
Fork
Star
main
BranchesTags
Go to file
CodeOpen more actions menu
Folders and files<br>NameNameLast commit message<br>Last commit date<br>Latest commit
History<br>7 Commits<br>7 Commits
Resources
Resources
Sources
Sources
docs
docs
tools
tools
.gitignore
.gitignore
LICENSE
LICENSE
Package.swift
Package.swift
README.md
README.md
install.sh
install.sh
make-app.sh
make-app.sh
probe.swift
probe.swift
View all files
Repository files navigation
Transposify
A macOS menu-bar app that lets you sing along to any Spotify song in your<br>range — shift the key up or down by semitones in real time, pitch without<br>tempo change. It stays out of the way: a small 𝄞 +2 / 𝄞 −3 / 𝄞 0 in the<br>menu bar, and a popup when you click it. Settings are remembered per song.
Install
You build it on your own Mac with one script. Because it's compiled locally,<br>macOS doesn't quarantine it — no Apple Developer account, no notarization, no<br>"unidentified developer" warning.
git clone https://github.com/evanhu1/transposify.git<br>cd transposify<br>./install.sh
That builds the app, ad-hoc-signs it, installs it to /Applications, and<br>launches it. On first launch macOS asks for Microphone access — that's the<br>permission Core Audio uses to capture Spotify's audio; it never touches your<br>real microphone. Click Allow , then look for the 𝄞 in your menu bar.
Requirements: macOS 14.4 or later, the Spotify desktop app, and Apple's<br>command-line tools (xcode-select --install if swift isn't found).
Uninstall:
rm -rf /Applications/Transposify.app && tccutil reset Microphone com.evanhu.transposify
Using it
Click the menu-bar item to open the popup:
Now playing — current track + artist.
Transpose — − / value / +, or the slider (±12 semitones). Reset<br>(↺) appears when shifted.
Reduce vocals (karaoke) — experimental center-channel cancellation to duck<br>the original lead vocal; works best on stereo tracks.
Remember key for this song — on by default; your setting auto-applies when<br>that track plays again. New songs start at the original key.
Launch at login — register as a login item via SMAppService.
The menu-bar item (treble clef + signed value) always reflects the current<br>offset, at fixed width so it never shifts. The app auto-adjusts when you switch<br>output devices (e.g. plug in headphones) and engages only while Spotify is<br>playing.
How it works
Spotify's desktop client never exposes its decoded audio — it's DRM-protected,<br>so no injected code (Spicetify etc.) can touch the stream for DSP. The only way<br>to pitch-shift it is to capture Spotify's audio output and process it before<br>your speakers:
Spotify ─► Core Audio process tap (muted-when-tapped) ─► ring buffer<br>popup sets semitones ─► [vocal reduce] ─► Rubber Band R3 ◄── source node<br>└─► default output device
Capture : a Core Audio process tap (AudioHardwareCreateProcessTap,<br>macOS 14.4+) grabs only Spotify's audio — no virtual device, no extension. The<br>tap is created muted-when-tapped, so Spotify's untouched output is silenced<br>and you hear only the processed copy.
Transpose : the Rubber Band Library<br>R3 ("finer") engine in real-time mode — a state-of-the-art music pitch<br>shifter, run directly in the audio render callback. Latency is higher than<br>Apple's built-in unit, but that's irrelevant here (you sing along to the<br>output, so there's no monitoring loop). Verified accurate to Pristine passthrough at 0 : the pipeline engages only while Spotify is<br>playing and there's something to do (pitch ≠ 0 or karaoke on). At 0 with<br>karaoke off the tap is fully torn down, so Spotify plays untouched —<br>bit-perfect, zero added latency. It also disengages when you pause.
Now playing / per-song memory : read from Spotify's PlaybackStateChanged<br>distributed notification (instant, no polling), keyed by track ID.
Diagnostics & tests
swift probe.swift # OSStatus of each Core Audio tap...