O-Hands User Guide
Control synthesizers and creative software using natural hand gestures
Getting Started
Quick Start (5 Minutes)
- Launch O-Hands and allow camera access when prompted
- Select your webcam from the dropdown in the header
- Position your hand in front of the camera — you should see a skeleton overlay
- Select a MIDI device in Settings → MIDI
- Create a mapping: Click + Add in the Mappings panel
- Choose a feature (e.g., Palm Y) and a MIDI CC number
- Move your hand — your DAW should respond!
System Requirements
| Requirement | Details |
|---|---|
| Camera | Any webcam (built-in or external) |
| MIDI | Virtual MIDI driver or hardware MIDI interface |
| Lighting | Moderate room lighting (video enhancement available for low-light) |
Interface Overview
Main Window Layout
┌─────────────────────────────────────────────────────────┐
│ O-Hands [Camera ▼] [Refresh] [⚙ Settings] │
├─────────────────────────────────────────────────────────┤
│ │ │
│ │ SETTINGS │
│ HAND TRACKING AREA │ PANEL │
│ (Camera + Hand Skeleton) │ │
│ ├────────────────┤
│ │ │
│ │ PRESETS │
│ │ PANEL │
├────────────────────────────────────────┴────────────────┤
│ MAPPINGS PANEL │
│ Direct Mappings | Gesture Mappings │
└─────────────────────────────────────────────────────────┘
Panel Overview
| Panel | Purpose |
|---|---|
| Hand Tracking | Shows camera feed and hand skeleton overlay |
| Settings | Configure camera, MIDI, appearance, and license |
| Presets | Save and load mapping configurations |
| Mappings | Create and manage hand-to-output connections |
Camera Setup
Selecting a Camera
- Click the camera dropdown in the header
- Select your webcam from the list
- Click Refresh if your camera doesn't appear
Optimizing Tracking
For best results:
- Lighting: Face a light source (window or lamp) — avoid backlight
- Background: Plain backgrounds work best
- Distance: Keep your hand 1-3 feet from the camera
- Position: Center your hand in the frame
Settings for Better Tracking
| Setting | Location | Purpose |
|---|---|---|
| Smoothing | Settings → General | Reduce jitter (higher = smoother, slower) |
| Video Enhancement | Settings → General | Improves low-light tracking |
| Mirror View | Settings → General | Flip display for intuitive control |
Creating Direct Mappings
Direct mappings connect a single hand feature to a MIDI/OSC output.
Creating a Mapping
- Click + Add in the Direct Mappings section
- Select Left or Right hand
- Choose a Feature from the dropdown
- Select an Output Type (CC, Note, Pitch Bend, Aftertouch, or OSC)
- Configure the output settings
- Click Save
Available Features
Palm Position
| Feature | Description |
|---|---|
| Palm X | Hand position left ↔ right |
| Palm Y | Hand position down ↔ up |
| Palm Z | Hand distance from camera |
Finger Curl (0 = straight, 1 = curled)
| Feature | Description |
|---|---|
| Thumb Curl | Thumb bend amount |
| Index Curl | Index finger bend |
| Middle Curl | Middle finger bend |
| Ring Curl | Ring finger bend |
| Pinky Curl | Pinky finger bend |
Hand State
| Feature | Description |
|---|---|
| Hand Openness | Overall hand spread (opposite of curl average) |
| Pinch Distance | Distance between thumb and index fingertips |
Rotation
| Feature | Description |
|---|---|
| Roll | Wrist rotation (tilting hand left/right) |
| Pitch | Hand tilting forward/backward |
| Yaw | Hand rotating around vertical axis |
Velocity
| Feature | Description |
|---|---|
| Velocity X | Horizontal movement speed |
| Velocity Y | Vertical movement speed |
| Velocity Z | Forward/backward movement speed |
Output Types
CC (Control Change)
Standard MIDI continuous controller messages.
- CC Number: 0-127 (check your synth's MIDI implementation)
- Range: Set min/max output values (default 0-127)
- Response Curve: Shape the output response
- Channel: MIDI channel 1-16
Note
Trigger MIDI notes based on hand position.
- Mode: Trigger (single note) or Repeater (continuous)
- Threshold: Feature value that triggers the note
- Note Source: Fixed note, feature-based, or random from scale
- Velocity: Fixed, trigger speed, or feature-based
Pitch Bend
14-bit pitch bend messages for smooth pitch control.
- Neutral Zone: Deadzone around center (prevents unwanted bend)
- Curve Strength: Response curve intensity
Aftertouch
Channel pressure messages for expressive control.
- Range: Min/max pressure values
- Response Curve: Shape the pressure response
OSC
Send Open Sound Control messages over UDP.
- Address: OSC address pattern (e.g.,
/synth/filter/cutoff) - IP: Target IP address (use
127.0.0.1for local) - Port: UDP port number (common: 9000, 8000, 57120)
- Value Type: Float or Integer
Response Curves
| Curve | Best For |
|---|---|
| Linear | 1:1 response, equal sensitivity throughout |
| Exponential | Filter cutoff, volume — slow start, fast end |
| Logarithmic | Pitch, frequency — fast start, slow end |
| S-Curve | Crossfaders — gentle at extremes, responsive in middle |
Tracking Loss Behavior
Configure what happens when your hand leaves the camera view:
| Behavior | Description |
|---|---|
| Hold | Keep the last value until hand returns |
| Fade to Center | Gradually return to center value (64 for CC) |
| Fade to Custom | Fade to a specific value you choose |
Settings:
- Timeout: How long before hand is considered "lost" (50-500ms)
- Fade Duration: Time to reach the target value
- Re-entry Blend: Smoothing when hand returns
Creating Gesture Mappings
Gesture mappings let you capture specific hand poses and interpolate between them for expressive control.
How It Works
- Capture 2-10 hand poses (called "anchors")
- Assign output values to each anchor
- Perform: O-Hands smoothly interpolates between anchors based on your current hand position
Creating a Gesture Mapping
- Click + Add in the Gesture Mappings section
- Select Left or Right hand
- Click Capture Pose
- Hold your hand steady during the 3-second countdown
- Repeat for each pose you want to capture
- Click Add Output to define what this gesture controls
- Set target values for each anchor
- Click Save
Anchor Management
- Single-click a thumbnail to edit its target values
- Double-click to view an enlarged preview
- Drag thumbnails to reorder
- Delete anchors you don't need
Gesture Settings
| Setting | Description |
|---|---|
| Smoothing | How smoothly to transition between anchors (0-1) |
| Dead Zone | Snap to nearest anchor when very close (0-1) |
| Nearest Count | How many anchors to blend (2 or 3) |
Example: Filter Control with Hand Open/Closed
- Capture Pose 1: Hand fully open → Set filter cutoff to 127
- Capture Pose 2: Hand closed (fist) → Set filter cutoff to 0
- Capture Pose 3: Half-open hand → Set filter cutoff to 64
- Move your hand between poses — the filter smoothly follows!
MIDI Configuration
Selecting a MIDI Device
- Open Settings (gear icon)
- Find the MIDI section
- Select your MIDI output from the dropdown
- The status shows "Connected to: [device name]"
Testing MIDI Output
Click Test CC to send a test message (CC#1, value 64, Channel 1). If your DAW receives it, MIDI is working.
Virtual MIDI Drivers
If you don't have a hardware MIDI interface, use a virtual MIDI driver:
| Platform | Recommended Driver |
|---|---|
| macOS | IAC Driver (built-in) — Enable in Audio MIDI Setup |
| Windows | loopMIDI (free) |
| Linux | ALSA virtual ports |
Refreshing MIDI Devices
Click the refresh button next to the MIDI dropdown if you connect a new device while O-Hands is running.
OSC Configuration
O-Hands can send OSC messages to creative applications like:
- Max/MSP
- TouchDesigner
- Pure Data
- SuperCollider
- Resolume
- Processing
Setting Up OSC
- Create a mapping with OSC output type
- Set the Address (e.g.,
/hand/x) - Set the Target IP (use
127.0.0.1for same computer) - Set the Port (must match your receiving app)
- Choose Value Type (float or integer)
Common OSC Ports
| Application | Default Port |
|---|---|
| Max/MSP | 9000 |
| TouchDesigner | 9000 |
| SuperCollider | 57120 |
| Pure Data | 9000 |
Presets
Presets save all your mappings so you can switch between configurations.
Saving a Preset
- Configure your mappings
- Click Save As in the Presets panel
- Enter a name
- Click Save
Loading a Preset
Click any preset in the list to load it. If you have unsaved changes, you'll be asked to confirm.
Managing Presets
| Action | How |
|---|---|
| Save changes | Click Save (overwrites current preset) |
| Save copy | Click Save As (creates new preset) |
| Delete | Hover over preset, click the delete button |
| Export | Click Export to save as JSON file |
| Import | Click Import to load from file |
| Export All | Click Export All for ZIP backup |
Performance Mode
O-Hands offers three view modes for different situations:
Full UI (Cmd/Ctrl+1)
All panels visible — for setup and configuration.
Performance Mode (Cmd/Ctrl+2)
Minimal interface — for live performance.
Toggle what's visible:
Cmd+C: Show/hide cameraCmd+H: Show/hide hand skeletonCmd+M: Show/hide mappings panel
Blackout Mode (Cmd/Ctrl+3)
App hidden — mappings continue running. Perfect for live shows where you don't want the app visible.
Overlay Mode (Cmd/Ctrl+Shift+O)
Combines fullscreen + transparency + click-through. The app floats over other windows and clicks pass through — great for overlaying on video or other apps.
Customizing the Display
Background Color
Choose from preset colors or pick a custom color:
- Open Settings → Appearance
- Click a color swatch, or
- Click the color picker for custom colors
- Recent colors are saved automatically
Skeleton Appearance
Customize the hand visualization:
| Setting | Description |
|---|---|
| Show Lines | Toggle skeleton lines on/off |
| Line Color | Color of the skeleton lines |
| Line Width | Thickness (1-8px) |
| Line Glow | Add glow effect to lines |
| Show Nodes | Toggle joint dots on/off |
| Node Size | Size of joint dots (2-12px) |
| Node Color | Color of joint dots |
| Node Glow | Add glow effect to nodes |
Transparency Mode
Make the app window see-through:
- Enable Transparency in Settings → Appearance
- Use
Cmd/Ctrl+Shift+Tto toggle on/off - Enable Click-through to let mouse clicks pass to apps behind
Fullscreen
Cmd/Ctrl+Shift+F: Toggle fullscreen- Settings → Display: Choose which monitor for fullscreen
- Launch in Fullscreen: Start the app fullscreen automatically
Keyboard Shortcuts
Global Shortcuts
| Shortcut | Action |
|---|---|
Cmd/Ctrl+1 |
Full UI mode |
Cmd/Ctrl+2 |
Performance mode |
Cmd/Ctrl+3 |
Blackout mode |
Cmd/Ctrl+Shift+F |
Toggle fullscreen |
Cmd/Ctrl+Shift+T |
Toggle transparency |
Cmd/Ctrl+Shift+O |
Toggle overlay mode |
Escape |
Exit fullscreen |
Performance Mode
| Shortcut | Action |
|---|---|
Cmd+C |
Toggle camera visibility |
Cmd+H |
Toggle hand skeleton |
Cmd+M |
Toggle mappings panel |
Troubleshooting
Camera Issues
Camera not detected
- Check if another app is using the camera
- Click the Refresh button next to the camera dropdown
- Try unplugging and reconnecting USB cameras
Poor tracking
- Improve lighting (face a light source)
- Use a plain background
- Enable Video Enhancement in Settings
- Move closer to the camera
Jittery output
- Increase Smoothing in Settings
- Reduce sudden hand movements
- Check lighting conditions
MIDI Issues
No MIDI output
- Verify your MIDI device is connected
- Click Refresh in the MIDI section
- Check that your DAW is receiving on the correct channel
- Use Test CC to verify the connection
Wrong values
- Check the output range in your mapping
- Try a different response curve
- Verify the CC number matches your synth
OSC Issues
App not receiving OSC
- Verify the IP address (use
127.0.0.1for local) - Check the port number matches your app
- Ensure no firewall is blocking UDP
- Try a different port if 9000 is in use
Performance Issues
Low frame rate
- Close other camera-using apps
- Reduce video resolution in your camera settings
- Close resource-intensive applications
License Issues
License won't activate
- Check your internet connection
- Verify the license key format (OUA-XXXX-XXXX-XXXX)
- Contact [email protected] if problems persist
Offline activation
- Export your Machine ID from Settings → License
- Email it to [email protected]
- Import the license file you receive