ableton-holland-mcp
MCP server for controlling Ableton Live via a remote script, capturing audio through VB-Cable, and performing music analysis with librosa.
README
Ableton Holland MCP
Capture audio en direct depuis Ableton Live via VB-Cable et analyse musicale automatique avec librosa.
Architecture
┌─────────────────┐ Voicemeeter ┌──────────────┐
│ Ableton Live │────Virtual Input──▶│ Voicemeeter │
│ (audio engine) │ │ (mixer) │
└─────────────────┘ └──────┬───────┘
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌────────────┐ ┌──────────────┐ ┌──────────────┐
│ Enceintes │ │ CABLE Input │ │ Casque / │
│ (Intel) │ │ (VB-Cable) │ │ Focusrite │
│ monitoring│ │ (capture) │ │ (optionnel) │
└────────────┘ └──────┬───────┘ └──────────────┘
│
▼
┌──────────────┐
│ CABLE Output │
│ (sounddevice)│
└──────┬───────┘
│
┌─────────┴─────────┐
▼ ▼
┌────────────┐ ┌──────────────┐
│ MCP server │ │ Dashboard │
│ (opencode) │ │ (Tkinter) │
└──────┬─────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────────────────┐
│ librosa (analyse) │
└────────────┬─────────────┘
▼
┌──────────────────────┐
│ data/analyses/ │
│ (.wav + .csv) │
└──────────────────────┘
Prérequis
| Logiciel | Rôle | |---|---|---| | Ableton Live 11+ | Station audio | | VB-Cable | Routage audio virtuel (capture) | | Voicemeeter (Vanilla ou Banana) | Mixeur virtuel (monitoring + routage) | | Python 3.12+ | Moteur d'analyse | | opencode | CLI agent MCP |
Installation
1. VB-Cable
- Télécharger depuis vb-audio.com/Cable
- Lancer
VBCABLE_Setup.exeen administrateur - Redémarrer Windows
2. Voicemeeter
- Télécharger depuis vb-audio.com/Voicemeeter
- Lancer
VoicemeeterSetup.exeen administrateur - Redémarrer Windows
3. Python
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
4. Configuration Voicemeeter
- Lancer Voicemeeter (démarrer menu ou
C:\Program Files (x86)\VB\Voicemeeter\Voicemeeter.exe) - Dans Hardware Out (colonne de droite) :
- A1 → choisir tes enceintes (Intel Display Audio, Focusrite...)
- A2 → choisir CABLE Input (VB-Audio Virtual Cable)
- Dans Virtual Input (colonne de gauche) → laisser Voicemeeter VAIO par défaut
- Régler les niveaux (A1 = monitoring, A2 = capture)
5. Configuration Ableton Live
- Options → Preferences → Audio
- Driver Type: MME / DirectX
- Audio Output Device: Voicemeeter Virtual Audio Cable (ou Voicemeeter VAIO)
- Audio Input Device: CABLE Output (VB-Audio Virtual Cable) (optionnel)
- Activer "In/Out" dans la vue Session
6. AbletonMCP Remote Script
Le Remote Script AbletonMCP_Remote_Script.py (à la racine du projet) permet à ableton-mcp de communiquer avec Ableton Live via socket.
Installation
- Copie
AbletonMCP_Remote_Script.pyet renommer dans le dossier des Remote Scripts d'Ableton :
--> "C:\ProgramData\Ableton\Live 12 Lite\Resources\MIDI Remote Scripts\AbletonMCP_init_.py"
copy /Y "C:\Users\admin\dev\ableton-holland-mcp\AbletonMCP_Remote_Script.py" "C:\ProgramData\Ableton\Live 12 Lite\Resources\MIDI Remote Scripts\AbletonMCP_init_.py"
copy /Y "ableton-mcp-extended\AbletonMCP_Remote_Script_init_.py" "C:\ProgramData\Ableton\Live 12 Lite\Resources\MIDI Remote Scripts\AbletonMCPExtended_init_.py"
- Lance Ableton Live → Options → Preferences → Link, Tempo & MIDI
- Dans Control Surface, sélectionne "AbletonMCP"
- Mets Input et Output sur "None"
- Redémarre Ableton
Le script se trouve aussi dans le dépôt GitHub original : ahujasid/ableton-mcp/AbletonMCP_Remote_Script
7. Configuration opencode
{
"mcp": {
"ableton-full": {
"type": "local",
"command": [".venv/Scripts/python", "ableton_full_mcp_server.py"],
"enabled": true
}
}
}
Le serveur ableton-full (unifié) remplace les deux anciens serveurs (ableton-mcp + music-analysis). Un seul process, outils atomiques comme capture_at_position.
Outils MCP disponibles (128 tools)
Tous les indices sont 0-based (track_index=0 = première piste après Master).
Session / Transport
| Tool | Description |
|---|---|
get_session_info() |
Tempo, signature, track count, playback state |
set_tempo(bpm) |
Changer le tempo |
start_playback() / stop_playback() |
Démarrer / arrêter |
start_playback_at(time) |
Seek + play atomique (Live reset le temps au start_playing()) |
set_arrangement_time(time) |
Positionner le playhead |
set_metronome(value) / get_metronome() |
Métronome on/off |
set_session_record(value) / get_session_record() |
Record on/off |
nudge_up() / nudge_down() |
Tempo nudge |
set_signature(numerator, denominator) |
Signature rythmique |
switch_to_arrangement_view() |
Vue Arrangement |
Pistes
| Tool | Description |
|---|---|
create_midi_track(index=-1) |
Nouvelle piste MIDI (fin de liste) |
set_track_name(index, name) |
Renommer |
delete_track(index, track_name) |
Supprimer par index ou nom |
duplicate_track(index) |
Dupliquer |
select_track(index) |
Sélectionner dans l'UI |
get_track_info(index) |
Nom, devices, clip slots, volume, pan |
get_track_color(index) / set_track_color(index, color) |
Couleur (0–255) |
get_track_deletion_status() |
Vérifier si supression possible |
Clips Session
| Tool | Description |
|---|---|
create_clip(track, slot, length) |
Nouveau clip MIDI |
create_audio_clip(track, slot, path) |
Importer audio (Live 12.0.5+) |
add_notes_to_clip(track, slot, notes) |
Ajouter notes MIDI |
get_clip_notes(track, slot) |
Lire notes MIDI |
set_clip_name(track, slot, name) |
Nommer |
fire_clip(track, slot) / stop_clip(track, slot) |
Lancer / arrêter |
duplicate_clip(track, slot) |
Dupliquer |
quantize_clip(track, slot, amount, quantize_to) |
Quantifier |
delete_session_clip(track, slot) |
Supprimer |
get_clip_color(track, slot) / set_clip_color(track, slot, color) |
Couleur (0–255) |
Arrangement
| Tool | Description |
|---|---|
get_arrangement_clips(track) |
Lister clips |
get_arrangement_clip_notes(track, clip) |
Lire notes MIDI |
set_arrangement_clip_notes(track, clip, notes) |
Écrire notes MIDI |
delete_arrangement_clip(track, clip) |
Supprimer clip |
set_arrangement_clip_name(track, clip, name) |
Renommer |
duplicate_to_arrangement(track, slot, dest_time) |
Copier session → arrangement |
duplicate_clip_to_arrangement(track, slot, dest_bar, dest_beat) |
Copier session → arrangement (bar/beat) |
create_arrangement_midi_clip(track, ...) |
Créer clip MIDI arrangement |
create_arrangement_audio_clip(track, file, ...) |
Placer fichier audio |
set_arrangement_loop(enabled, start, end, ...) |
Boucle arrangement |
set_arrangement_clip_gain(track, clip, gain) |
Gain clip audio (dB) |
set_arrangement_clip_pitch(track, clip, coarse, fine) |
Pitch (semitones/cents) |
set_arrangement_clip_warp(track, clip, on, mode) |
Warp (0=beats..5=complex-pro) |
set_arrangement_clip_markers(track, clip, start, end) |
Marqueurs (beats) |
Mixer
| Tool | Description |
|---|---|
set_track_volume(track, 0.0–1.0) |
Volume (0.85 = 0 dB) |
get_track_volume(track) |
Volume + pan actuels |
set_track_panning(track, -1.0–1.0) |
Pan |
set_track_solo(track, bool) / set_track_mute(track, bool) |
Solo / mute |
get_sends(track) / set_send(track, send, 0.0–1.0) |
Envois |
set_monitoring(track, 0=auto, 1=in, 2=off) |
Monitoring |
get_crossfader() / set_crossfader(0.0–1.0) |
Crossfader |
get_groove_amount() / set_groove_amount(0.0–1.0) |
Groove global |
Master
| Tool | Description |
|---|---|
get_master_track() |
Infos master (volume, pan, devices) |
set_master_volume(0.0–1.0) |
Volume master |
set_master_panning(-1.0–1.0) |
Pan master |
get_master_device_parameters(device) |
Paramètres d'un device master |
set_master_device_parameter(device, name, value) |
Modifier paramètre master |
load_instrument_or_effect_on_master(uri) |
Charger effet sur master |
Browser / Instruments
| Tool | Description |
|---|---|
get_browser_tree(category_type) |
Arborescence complète |
get_browser_categories(category_type) |
Catégories |
get_browser_items(path, item_type) |
Items d'un chemin |
get_browser_item(uri, path) |
Un item spécifique |
get_browser_items_at_path(path) |
Items à un chemin |
load_instrument_or_effect(track, uri) |
Charger instrument/effet par URI |
load_external_plugin(track, name) |
Charger plugin VST/AU par nom |
list_external_plugins(query) |
Lister plugins externes |
load_drum_kit(track, rack_uri, kit_path) |
Charger drum rack + kit |
Devices
| Tool | Description |
|---|---|
get_device_parameters(track, device) |
Lire tous les paramètres |
set_device_parameter(track, device, name, value) |
Modifier un paramètre |
delete_device(track, device) |
Supprimer un device |
enable_device(track, device) / disable_device(track, device) |
Activer / bypasser |
navigate_device_preset(track, device, direction) |
Preset suivant/précédent |
get_chain_info(track, device, chain) |
Chaînes dans un rack |
get_drum_pad_info(track, device) |
Pads remplis dans un Drum Rack |
Cue Points
| Tool | Description |
|---|---|
get_cue_points() |
Lister tous les cue points |
create_cue_point(bar, beat, name) |
Créer un cue point |
delete_cue_point(bar, beat) |
Supprimer un cue point |
jump_to_cue_point(direction, name) |
Sauter au suivant/précédent/par nom |
Vue
| Tool | Description |
|---|---|
set_ableton_view(view) |
Changer de vue (Arranger, Session, Detail, Browser...) |
control_arrangement_view(action, track) |
Zoom, scroll, follow, collapse/expand |
Automation / Enveloppes
| Tool | Description |
|---|---|
get_arrangement_clip_envelope(track, clip, target, is_arrangement) |
Lire envelope |
set_automation_curve(track, clip, target, points, is_arrangement) |
Écrire courbe d'automation |
manage_clip_automation(track, clip, action, parameter_name) |
Créer / effacer enveloppes |
add_clip_envelope_point(track, clip, target, time, value, duration) |
Ajouter un point |
clear_clip_envelope(track, clip, target, is_arrangement) |
Effacer enveloppe |
debug_clip_envelopes(track, clip, is_arrangement) |
Diagnostic exhaustif |
experiment_envelope(track, clip, target, is_arrangement) |
Tests automatisés |
envelope_dump(track, clip, is_arrangement) |
Dump complet état |
test_create_event(track, clip, target, time, value) |
Test signatures create_event |
Routing
| Tool | Description |
|---|---|
get_track_routing(track) |
Routing entrée/sortie |
set_track_input_routing(track, type, channel) |
Source d'entrée |
set_track_output_routing(track, type, channel) |
Destination sortie |
Projet / Système
| Tool | Description |
|---|---|
save_project() |
Sauvegarder (non dispo Live 12 Lite) |
undo() / redo() |
Annuler / rétablir |
freeze_track(track) / flatten_track(track) |
Freeze / flatten |
create_scene(index) / fire_scene(index) |
Créer / lancer une scene |
get_cpu_load() |
CPU average + peak |
get_live_version() |
Version Live + build ID |
get_tempo_follower() / set_tempo_follower(enabled) |
Tempo follower |
get_control_surfaces() |
Control surfaces actives |
show_message(text) |
Message dans la barre d'état |
reload_script() |
Hot-reload du Remote Script |
Capture & Analyse Audio
| Tool | Description |
|---|---|
capture_and_analyze(position_beats, duration_sec, output_name) |
Capture + analyse complète en un appel |
load_tool(path) |
Charger fichier audio |
analyze_full_tool(y_path) |
Tout-en-un : key, energy, spectral, tempo, tuning |
analyze_energy_tool(y_path) |
RMS, peak, dynamic range |
analyze_spectral_tool(y_path) |
Centroid, rolloff, bandwidth, ZCR |
analyze_tuning_tool(y_path) |
Cents offset |
detect_key_tool(y_path) |
Tonalité (Krumhansl-Kessler) |
tempo_tool(y_path) |
BPM |
get_duration_tool(y_path) |
Durée secondes |
beat_track_tool(y_path) |
Temps forts |
chroma_cqt_tool(y_path) |
Chromagram (12 notes) |
mfcc_tool(y_path) |
Timbre / texture spectrale |
Structure du projet
ableton-holland-mcp/
├── data/
│ ├── tests/ # Fichiers audio de test (.wav, .mp3)
│ ├── analyses/ # Résultats d'analyse (.wav + .csv)
│ └── scripts/ # Scripts utilitaires
├── dashboard/
│ └── app.py # Interface graphique (Tkinter + matplotlib)
├── ableton_full_mcp_server.py # Serveur MCP UNIFIÉ (Ableton + analyse)
├── AbletonMCP_Remote_Script.py # Remote Script Ableton (à copier)
├── music_analysis_plus.py # Serveur analyse standalone (legacy)
├── ableton_mcp_server.py # Serveur Ableton standalone (legacy)
├── opencode.jsonc # Configuration MCP
├── requirements.txt # Dépendances Python
├── AGENTS.md
├── SPEC.md
├── .gitignore
└── README.md
Écouter le monitoring audio
Quand Ableton envoie son audio vers VB-Cable → plus de son dans les enceintes. Solutions :
Méthode 1 : Windows "Listen to this device"
- Panneau de configuration → Son → Enregistrement
- Double-clic sur "CABLE Output (VB-Audio Virtual Cable)"
- Onglet "Écouter" → cocher "Écouter ce périphérique"
- Choisir Focusrite / enceintes dans la liste déroulante
- Appliquer
Avantage : sans logiciel supplémentaire. Inconvénient : léger décalage (latence WDM).
Méthode 2 : Voicemeeter (recommandée)
Route l'audio d'Ableton vers plusieurs sorties simultanément.
Configuration
- Lance Voicemeeter
- Hardware Out (colonne de droite) :
- A1 → enceintes (Intel Display Audio, Focusrite...)
- A2 → CABLE Input (VB-Audio Virtual Cable)
- Virtual Input → Ableton envoie sur Voicemeeter VAIO
- Ajuste les volumes (A1 = ce que tu entends, A2 = niveau envoyé à la capture)
Routage final
Ableton → Voicemeeter VAIO → A1: Enceintes (monitoring)
→ A2: CABLE Input → CABLE Output → capture
Avantage : monitoring temps réel, contrôle du mix, pas de latence supplémentaire. Remarque : la capture MCP continue d'écouter sur CABLE Output — inchangé.
Méthode 3 : Dashboard Python
Bouton Playback dans le dashboard après chaque capture :
python dashboard/app.py
Méthode 4 : Console Python / MCP
# Dans le dashboard
from dashboard.app import AudioAnalyzer
audio, sr = AudioAnalyzer.capture(device_id, duration)
AudioAnalyzer.save_audio(audio, sr, "mon_capture")
# Dans le serveur MCP
play_wav("data/analyses/mon_capture.wav")
Dashboard graphique
Interface native Windows (Tkinter + matplotlib, zéro dépendance supplémentaire).
python dashboard/app.py
Fonctionnalités
| Section | Contrôle |
|---|---|
| Périphérique | Menu déroulant pour choisir la source audio (CABLE Output, Focusrite...) |
| Capture | Spinbox durée (1-60s) + bouton 🎤 Capturer |
| Playback | Bouton 🔊 Playback pour réécouter la dernière capture |
| Fichier | Parcourir → sélection fichier dans data/tests/ + Analyser |
| Visualisation | Chroma CQT (heatmap) + Waveform avec onsets (lignes rouges) |
| Résultats | Durée, tempo BPM, nombre d'onsets |
Architecture du code
dashboard/app.py contient deux classes :
AudioAnalyzer— capture (sounddevice), analyse (librosa), sauvegarde (soundfile)Dashboard— interface Tkinter, appelleAudioAnalyzerdans un thread séparé
Prochaines étapes
Itération 3 — Monitoring temps réel avec Voicemeeter ✅
- [x] Installer et configurer Voicemeeter
- [x] Router Ableton → Voicemeeter → enceintes (monitoring) + CABLE Input (capture)
- [x] Valider la capture MCP inchangée
- [x] Documenter le setup final
Itération 4 — Analyse avancée
- [ ] Détection de la tonalité / key detection (
librosa.feature.tonnetz) - [ ] Analyse harmonique (accords)
- [ ] Détection de genre / voix
Itération 5 — Améliorations pipeline
- [ ] Interface web Streamlit (dashboard plus riche, graphiques interactifs Plotly)
- [ ] Streaming continu (capture + analyse en boucle, metronome visuel)
- [ ] Whisper / transcription automatique des paroles (si voix)
- [ ] Export des résultats en JSON structuré
A etudier
- Customize Ableton Live with the Live API https://www.youtube.com/watch?v=Hfq-NXEhmzs
- Ableton free packs https://www.ableton.com/en/packs/#?item_type=free
- Future Explorations. Voir pour combiener avec un VCVRack MCP comme https://community.vcvrack.com/t/mcp-server-let-claude-cursor-build-and-control-your-rack-patches-live/25607
- autre MCP ableton : https://github.com/adamjmurray/producer-pal#readme
- https://github.com/uisato/ableton-mcp-extended
Dépannage
"CABLE Output not found"
→ Vérifier que VB-Cable est installé et qu'Ableton n'est pas en mode ASIO
Capture silencieuse
→ Vérifier qu'Ableton joue bien sur la sortie "CABLE Input" → Vérifier que la piste n'est pas en mute/solo → Vérifier le volume Master
Timeout MCP
→ Le serveur utilise async def + await asyncio.sleep() pour la capture
→ Si timeout : réduire la durée de capture ou vérifier les logs du serveur
- https://mcpcat.io/guides/fixing-mcp-error-32001-request-timeout/
Device busy
→ Ableton est en mode ASIO. Passer en MME/DirectX dans les préférences Ableton
Voicemeeter ne s'affiche pas dans Ableton
→ Redémarrer Voicemeeter et/ou Ableton. Vérifier que le service Voicemeeter est lancé (icône dans la barre des tâches).
Pas de son dans les enceintes (Voicemeeter)
→ Vérifier que A1 est bien assigné à un périphérique physique dans Voicemeeter → Vérifier le niveau du slider A1 → Vérifier le bouton Mute sur la colonne Virtual Input
Capture silencieuse avec Voicemeeter
→ Vérifier que A2 pointe bien vers CABLE Input → Vérifier le niveau du slider A2 → Vérifier que VB-Cable est installé
Notes de version
Itération 5 (28 juin 2026) — Serveur unifié + capture atomique
- Serveur unifié
ableton_full_mcp_server.py(remplaceableton-mcp+music-analysis) capture_at_position(position, duration)— stop → switch → play at position → capture → stop → loadcapture_and_analyze(position, duration)— capture + analyse en un appel- Fix
start_playback_at:start_playing()PUIScurrent_song_time = X(Live reset le temps au démarrage) - Fix
load():np.mean(audio, axis=1)au lieu delibrosa.to_mono()(inversion canaux) - Documentation mise à jour (README, AGENTS, SPEC)
Itération 4 (24 juin 2026) — Remote Script arrangement
- Mise à jour du Remote Script Ableton (v1314 lignes) avec support Arrangement View
- Remote Script copié à la racine du projet (
AbletonMCP_Remote_Script.py) - Documentation de l'installation du Remote Script dans le README
- Commandes arrangement :
switch_to_arrangement_view,duplicate_to_arrangement,set_arrangement_time,get_arrangement_clips
Itération 3 (24 juin 2026) — Monitoring temps réel
- Voicemeeter installé et configuré (A1 = enceintes, A2 = CABLE Input)
- Monitoring en temps réel sans latence supplémentaire
- Documentation du routage Voicemeeter
Itération 2 (24 juin 2026) — Stabilisation
- Capture sauvegardée dans
data/analyses/avec timestamp - Dashboard graphique Tkinter (capture, analyse, visualisation, playback)
- Documentation complète (README, requirements.txt, .gitignore)
- Export WAV + CSV organisé dans
data/
Itération 1 (20 juin 2026) — Première version
- Serveur MCP
music_analysis_plus.pyavec capture async - Analyse tempo, chroma CQT, MFCC, beats
- Fix timeout MCP (
async def+await asyncio.sleep())
Licence
MIT
other mcp
- https://github.com/hidingwill/AbletonBridge , https://www.youtube.com/watch?v=I2vggJXbhrs
human voice
- https://www.youtube.com/watch?v=odSc71wYU6I
- https://www.youtube.com/watch?v=6F1BG5a5vxQ
- https://www.reddit.com/r/synthesizers/comments/13y8iid/what_are_the_best_ways_to_recreate_the_human/
- https://www.fullbucket.de/music/scrooo.html
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。