Utiliser une webcam comme contrôleur MIDI : guide complet de configuration
Oui, vous pouvez transformer une webcam standard en un contrôleur MIDI expressif grâce à la vision par ordinateur. Elle ne remplacera pas un clavier ou un MPC, mais elle permet un contrôle unique basé sur les gestes pour la performance, le sound design ou l'accessibilité.
Composants requis
- Webcam : 720p+ @ 30 fps. Logitech C920, Razer Kiyo, ou webcam intégrée d'ordinateur portable.
- Logiciel de suivi des mains : Convertit la vidéo en points de repère de la main (21 points par main).
- Couche de mappage MIDI : Traduit les gestes en messages MIDI (CC, Note, Pitch Bend).
- DAW / Instrument virtuel : Reçoit le MIDI (Ableton, Logic, Reaper, VCV Rack, etc.).
Options logicielles (gratuites et multiplateformes)
A. MediaPipe Hands + Python (le plus flexible)
- MediaPipe de Google : squelette de main à 21 points en temps réel.
- Script Python qui mappe les points de repère vers le MIDI via
python-rtmidioumido. - Exemple : position Y de l'index → CC1 (modulation) ; distance de pincement → vélocité de note.
- S'exécute localement, sans cloud, entièrement personnalisable.
B. HandMIDI (prêt à l'emploi)
- Application Electron open source. MediaPipe + interface graphique de mappage MIDI.
- Préréglages pour Ableton, VCV Rack, etc. Mappez les gestes sur les paramètres visuellement.
- Windows/macOS/Linux.
C. Wekinator + ml5.js (approche par apprentissage automatique)
- Entraînez des mappages geste → MIDI personnalisés par l'exemple (sans code).
- Idéal pour des mappages complexes et personnalisés.
D. Commercial : Ultraleap (Leap Motion)
- Caméra stéréo IR dédiée (pas une webcam). Précision sub-millimétrique, 120 fps, suivi bimanuel.
- Vastement supérieur pour une utilisation sérieuse. 200 $+ d'occasion.
Pas à pas : MediaPipe + Python (chemin de code le plus simple)
# pip install mediapipe opencv-python python-rtmidi
import cv2, mediapipe as mp, rtmidi
midiout = rtmidi.MidiOut()
midiout.open_port(0) # ou open_virtual_port("WebcamMIDI")
mp_hands = mp.solutions.hands.Hands(max_num_hands=1, min_detection_confidence=0.7)
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret: break
frame = cv2.flip(frame, 1)
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = mp_hands.process(rgb)
if results.multi_hand_landmarks:
for hand in results.multi_hand_landmarks:
# Bout de l'index (point 8) Y → CC1 (0-127)
y = hand.landmark[8].y
cc_val = int((1 - y) * 127)
midiout.send_message([0xB0, 1, cc_val]) # Canal 1, CC1
# Retour visuel
cv2.circle(frame, (int(hand.landmark[8].x*640), int(y*480)), 10, (0,255,0), -1)
cv2.imshow('Webcam MIDI', frame)
if cv2.waitKey(1) & 0xFF == 27: break
cap.release()
cv2.destroyAllWindows()
Mappages de gestes pratiques
| Geste | Message MIDI | Utilisation musicale |
|---|---|---|
| Index vertical | CC1 (Modulation) | Cutoff de filtre, profondeur de vibrato |
| Pincement (distance pouce-index) | Note On/Off + Vélocité | Déclencher notes, batterie |
| Rotation de la main (roll) | Pitch Bend | Glissandos expressifs |
| Écartement des doigts | CC74 (Brillance) | Résonance de filtre, position de table d'ondes |
| Centre de la paume X/Y | CC16/17 (Contrôles macro) | Pad XY pour macros de synthé |
Limitations et conseils
- Latence : 30–60 ms (webcam + traitement). Acceptable pour modulation lente, pas pour la batterie.
- Éclairage : Lumière frontale uniforme améliore drastiquement le suivi.
- Arrière-plan : Uni, peu encombré.
- Occultation : Doigts qui se croisent perturbent les modèles à une main.
- Stabilité : Lissez la sortie MIDI avec moyenne mobile (5–10 images).
Le MIDI par webcam est un terrain de jeu créatif — idéal pour modulation ambiante, synchronisation audio-visuelle live, ou interfaces musicales accessibles. Pour la précision, investissez dans Ultraleap ou un contrôleur dédié.
