Skip to content

Commit 0b8cb83

Browse files
committed
Add 37 new LiveAPI tools (159 → 196 total) - COMPLETE LiveAPI COVERAGE
MAJOR EXPANSION: Near-complete coverage of Ableton Live's API HIGH PRIORITY (17 tools): 1. Clip Automation Envelopes (6 tools): - get_clip_automation_envelope: Get automation envelope for parameter - create_automation_envelope: Create automation for parameter - clear_automation_envelope: Clear automation - insert_automation_step: Add automation breakpoint - remove_automation_step: Remove automation breakpoint - get_automation_envelope_values: Get all automation values 2. Track Freeze/Flatten (3 tools): - freeze_track: Freeze track to reduce CPU - unfreeze_track: Unfreeze frozen track - flatten_track: Flatten frozen track to audio 3. Clip Fade In/Out (4 tools): - get_clip_fade_in: Get clip fade in time - set_clip_fade_in: Set clip fade in time - get_clip_fade_out: Get clip fade out time - set_clip_fade_out: Set clip fade out time 4. Scene Color (2 tools): - get_scene_color: Get scene color index - set_scene_color: Set scene color index 5. Track Annotations (2 tools): - get_track_annotation: Get track annotation text - set_track_annotation: Set track annotation text MEDIUM PRIORITY (11 tools): 6. Clip Annotations (2 tools): - get_clip_annotation: Get clip annotation text - set_clip_annotation: Set clip annotation text 7. Track Delay Compensation (2 tools): - get_track_delay: Get track delay in samples - set_track_delay: Set track delay in samples 8. Arrangement View Clips (3 tools): - get_arrangement_clips: Get list of arrangement clips - duplicate_to_arrangement: Duplicate session clip to arrangement - consolidate_clip: Consolidate arrangement clips in time range 9. Plugin Window Control (2 tools): - show_plugin_window: Show device/plugin window - hide_plugin_window: Hide device/plugin window 10. Metronome Volume (2 tools): - get_metronome_volume: Get metronome volume - set_metronome_volume: Set metronome volume (0.0 to 1.0) LOW PRIORITY (9 tools): 11. MIDI CC/Program Change (2 tools): - send_midi_cc: Send MIDI CC message to track - send_program_change: Send MIDI Program Change to track 12. Sample/Simpler Operations (3 tools): - get_sample_length: Get audio sample length - get_sample_playback_mode: Get Simpler/Sampler playback mode - set_sample_playback_mode: Set Simpler/Sampler playback mode 13. Clip RAM Mode (2 tools): - get_clip_ram_mode: Get clip RAM mode setting - set_clip_ram_mode: Set clip RAM mode (RAM vs disk streaming) 14. Device Utilities (2 tools): - get_device_class_name: Get device class name - get_device_type: Get device type Implementation: - Added 37 new tool methods to liveapi_tools.py - Added 37 new action routes in __init__.py - Updated get_available_tools() list with all new tools - Full error handling and validation for all tools Documentation: - Updated all references from 159 to 196 tools - Updated README.md with expanded tool categories table (14 new categories) - Updated docs/ARCHITECTURE.md with expanded mermaid diagram (all 40 categories) - Updated all example scripts and documentation - Updated CONTRIBUTING.md, GITHUB_SETUP.md, docs/INSTALLATION.md Tool Categories: Now covering 40 distinct categories across the entire LiveAPI: Session Control, Track Management, Clips, MIDI, Devices, Scenes, Automation, Routing, Browser, Transport, Groove, Monitoring, Locators, Project, M4L, Master/Return Tracks, Audio Clips, Follow Actions, Crossfader, Track Groups, View/Navigation, Colors, Groove Pool, Racks/Chains, Clip Automation, Track Freeze/Flatten, Clip Fades, Scene Color, Annotations, Track Delay, Arrangement, Plugin Windows, Metronome, MIDI Messages, Sampler/Simpler, Clip RAM Mode, Device Info Total tools: 159 → 196 (+37 new tools) This represents near-complete coverage of Ableton Live's Python API, providing comprehensive programmatic control over all aspects of music production.
1 parent 7e1d870 commit 0b8cb83

7 files changed

Lines changed: 910 additions & 16 deletions

File tree

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ ln -s "$(pwd)/ClaudeMCP_Remote" "$HOME/.ableton/User Library/Remote Scripts/Clau
119119
```
120120
ClaudeMCP_Remote/
121121
├── __init__.py # Main Remote Script entry point
122-
└── liveapi_tools.py # 159 LiveAPI tools implementation
122+
└── liveapi_tools.py # 196 LiveAPI tools implementation
123123
124124
docs/
125125
├── ARCHITECTURE.md # System architecture

ClaudeMCP_Remote/__init__.py

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,108 @@ def _process_command(self, command):
616616
elif action == 'set_chain_solo':
617617
return self.tools.set_chain_solo(command.get('track_index', 0), command.get('device_index', 0), command.get('chain_index', 0), command.get('solo', True))
618618

619+
# Clip Automation Envelopes
620+
elif action == 'get_clip_automation_envelope':
621+
return self.tools.get_clip_automation_envelope(command.get('track_index', 0), command.get('clip_index', 0), command.get('param_name', ''))
622+
elif action == 'create_automation_envelope':
623+
return self.tools.create_automation_envelope(command.get('track_index', 0), command.get('clip_index', 0), command.get('parameter_object'))
624+
elif action == 'clear_automation_envelope':
625+
return self.tools.clear_automation_envelope(command.get('track_index', 0), command.get('clip_index', 0), command.get('param_name', ''))
626+
elif action == 'insert_automation_step':
627+
return self.tools.insert_automation_step(command.get('track_index', 0), command.get('clip_index', 0), command.get('param_name', ''), command.get('time', 0.0), command.get('value', 0.0))
628+
elif action == 'remove_automation_step':
629+
return self.tools.remove_automation_step(command.get('track_index', 0), command.get('clip_index', 0), command.get('param_name', ''), command.get('time', 0.0))
630+
elif action == 'get_automation_envelope_values':
631+
return self.tools.get_automation_envelope_values(command.get('track_index', 0), command.get('clip_index', 0), command.get('param_name', ''))
632+
633+
# Track Freeze/Flatten
634+
elif action == 'freeze_track':
635+
return self.tools.freeze_track(command.get('track_index', 0))
636+
elif action == 'unfreeze_track':
637+
return self.tools.unfreeze_track(command.get('track_index', 0))
638+
elif action == 'flatten_track':
639+
return self.tools.flatten_track(command.get('track_index', 0))
640+
641+
# Clip Fade In/Out
642+
elif action == 'get_clip_fade_in':
643+
return self.tools.get_clip_fade_in(command.get('track_index', 0), command.get('clip_index', 0))
644+
elif action == 'set_clip_fade_in':
645+
return self.tools.set_clip_fade_in(command.get('track_index', 0), command.get('clip_index', 0), command.get('fade_time', 0.0))
646+
elif action == 'get_clip_fade_out':
647+
return self.tools.get_clip_fade_out(command.get('track_index', 0), command.get('clip_index', 0))
648+
elif action == 'set_clip_fade_out':
649+
return self.tools.set_clip_fade_out(command.get('track_index', 0), command.get('clip_index', 0), command.get('fade_time', 0.0))
650+
651+
# Scene Color
652+
elif action == 'get_scene_color':
653+
return self.tools.get_scene_color(command.get('scene_index', 0))
654+
elif action == 'set_scene_color':
655+
return self.tools.set_scene_color(command.get('scene_index', 0), command.get('color_index', 0))
656+
657+
# Track Annotations
658+
elif action == 'get_track_annotation':
659+
return self.tools.get_track_annotation(command.get('track_index', 0))
660+
elif action == 'set_track_annotation':
661+
return self.tools.set_track_annotation(command.get('track_index', 0), command.get('annotation_text', ''))
662+
663+
# Clip Annotations
664+
elif action == 'get_clip_annotation':
665+
return self.tools.get_clip_annotation(command.get('track_index', 0), command.get('clip_index', 0))
666+
elif action == 'set_clip_annotation':
667+
return self.tools.set_clip_annotation(command.get('track_index', 0), command.get('clip_index', 0), command.get('annotation_text', ''))
668+
669+
# Track Delay Compensation
670+
elif action == 'get_track_delay':
671+
return self.tools.get_track_delay(command.get('track_index', 0))
672+
elif action == 'set_track_delay':
673+
return self.tools.set_track_delay(command.get('track_index', 0), command.get('delay_samples', 0.0))
674+
675+
# Arrangement View Clips
676+
elif action == 'get_arrangement_clips':
677+
return self.tools.get_arrangement_clips(command.get('track_index', 0))
678+
elif action == 'duplicate_to_arrangement':
679+
return self.tools.duplicate_to_arrangement(command.get('track_index', 0), command.get('clip_index', 0))
680+
elif action == 'consolidate_clip':
681+
return self.tools.consolidate_clip(command.get('track_index', 0), command.get('start_time', 0.0), command.get('end_time', 4.0))
682+
683+
# Plugin Window Control
684+
elif action == 'show_plugin_window':
685+
return self.tools.show_plugin_window(command.get('track_index', 0), command.get('device_index', 0))
686+
elif action == 'hide_plugin_window':
687+
return self.tools.hide_plugin_window(command.get('track_index', 0), command.get('device_index', 0))
688+
689+
# Metronome Volume
690+
elif action == 'get_metronome_volume':
691+
return self.tools.get_metronome_volume()
692+
elif action == 'set_metronome_volume':
693+
return self.tools.set_metronome_volume(command.get('volume', 0.5))
694+
695+
# MIDI CC/Program Change
696+
elif action == 'send_midi_cc':
697+
return self.tools.send_midi_cc(command.get('track_index', 0), command.get('cc_number', 0), command.get('cc_value', 0), command.get('channel', 0))
698+
elif action == 'send_program_change':
699+
return self.tools.send_program_change(command.get('track_index', 0), command.get('program_number', 0), command.get('channel', 0))
700+
701+
# Sample/Simpler Operations
702+
elif action == 'get_sample_length':
703+
return self.tools.get_sample_length(command.get('track_index', 0), command.get('clip_index', 0))
704+
elif action == 'get_sample_playback_mode':
705+
return self.tools.get_sample_playback_mode(command.get('track_index', 0), command.get('device_index', 0))
706+
elif action == 'set_sample_playback_mode':
707+
return self.tools.set_sample_playback_mode(command.get('track_index', 0), command.get('device_index', 0), command.get('mode', 0))
708+
709+
# Clip RAM Mode
710+
elif action == 'get_clip_ram_mode':
711+
return self.tools.get_clip_ram_mode(command.get('track_index', 0), command.get('clip_index', 0))
712+
elif action == 'set_clip_ram_mode':
713+
return self.tools.set_clip_ram_mode(command.get('track_index', 0), command.get('clip_index', 0), command.get('ram_mode', True))
714+
715+
# Device Utilities
716+
elif action == 'get_device_class_name':
717+
return self.tools.get_device_class_name(command.get('track_index', 0), command.get('device_index', 0))
718+
elif action == 'get_device_type':
719+
return self.tools.get_device_type(command.get('track_index', 0), command.get('device_index', 0))
720+
619721
# Unknown action
620722
else:
621723
return {

0 commit comments

Comments
 (0)