A native macOS listener for the Contour ShuttlePRO v2 multimedia controller, written in Python. It captures input from the jog wheel, shuttle ring, and buttons, and maps them to macOS keypresses — ideal for apps like Adobe Premiere Pro, Audition, or Final Cut.
- 🌀 Shuttle ring: triggers continuous left/right keypresses at variable speed
- 🎚 Jog wheel: emits one left/right keystroke per tick
- 🔘 Buttons 1–15: configurable via
mappings.json - 💾 JSON-based config (no code changes required)
- 🧩 Built on
hidapi,pyobjc, andQuartzfor native event posting
- macOS 11 or later
- Python 3.8+
- Install dependencies:
pip install hidapi pyobjc- Grant Accessibility Permissions:
- System Settings → Privacy & Security → Accessibility
- Add your Terminal and
/usr/bin/python3
- Clone this repository:
git clone https://github.com/YOUR_USERNAME/ShuttleProV2_macOS.git
cd ShuttleProV2_macOS- Edit the key mapping config:
Create or modify mappings.json in the project root:
{
"button_1": "j",
"button_2": "k",
"button_7": "⌘+z",
"button_13": "⌘+s",
"button_14": "v",
"button_15": "c"
}- Run the listener:
python3 shuttle_listener.pyYou’ll see raw data and keystroke output as input is received.
- Regular keys:
"a","j","space","tab","return" - Arrow keys:
"left","right","up","down" - Modifiers:
⌘/cmd,ctrl,shift,alt
{
"button_1": "j",
"button_2": "k",
"button_3": "l",
"button_4": "space",
"button_5": "c",
"button_6": "v",
"button_7": "⌘+z",
"button_8": "⌘+shift+z",
"button_9": "←",
"button_10": "→",
"button_11": "return",
"button_12": "tab",
"button_13": "⌘+s",
"button_14": "v",
"button_15": "c"
}To run at login, create a LaunchAgent:
- Save as
~/Library/LaunchAgents/com.shuttlepro.listener.plist
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.shuttlepro.listener</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>/Users/YOUR_USERNAME/ShuttleProV2_macOS/shuttle_listener.py</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>- Load it:
launchctl load ~/Library/LaunchAgents/com.shuttlepro.listener.plistMIT License
Created by @psacchitella