create_clip
Create a new audio or MIDI clip in Ableton Live by specifying track and clip positions, with optional length control for music production workflows.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| track_index | Yes | ||
| clip_index | Yes | ||
| length | No |
Implementation Reference
- MCP_Server/server.py:293-305 (handler)MCP tool handler for 'create_clip'. Proxies the request to the Ableton remote script by sending a 'create_clip' command over socket with parameters.@mcp.tool() def create_clip(ctx: Context, track_index: int, clip_index: int, length: float = 4.0) -> str: try: ableton = get_ableton_connection() result = ableton.send_command("create_clip", { "track_index": track_index, "clip_index": clip_index, "length": length }) return f"Created new clip at track {track_index}, slot {clip_index} with length {length} beats" except Exception as e: logger.error(f"Error creating clip: {str(e)}") return f"Error creating clip: {str(e)}"
- Core implementation of clip creation in the Ableton Live remote script. Uses the Ableton API to validate indices and call clip_slot.create_clip(length) on the specified track's clip slot.def _create_clip(self, track_index, clip_index, length): """Create a new MIDI clip in the specified track and clip slot""" try: if track_index < 0 or track_index >= len(self._song.tracks): raise IndexError("Track index out of range") track = self._song.tracks[track_index] if clip_index < 0 or clip_index >= len(track.clip_slots): raise IndexError("Clip index out of range") clip_slot = track.clip_slots[clip_index] # Check if the clip slot already has a clip if clip_slot.has_clip: raise Exception("Clip slot already has a clip") # Create the clip clip_slot.create_clip(length) result = { "name": clip_slot.clip.name, "length": clip_slot.clip.length } return result except Exception as e: self.log_message("Error creating clip: " + str(e)) raise
- MCP_Server/server.py:104-110 (registration)Lists 'create_clip' as a modifying command in the server's send_command method, which applies extra timeouts and delays.is_modifying_command = command_type in [ "create_midi_track", "create_audio_track", "set_track_name", "create_clip", "add_notes_to_clip", "set_clip_name", "set_tempo", "fire_clip", "stop_clip", "set_device_parameter", "start_playback", "stop_playback", "load_instrument_or_effect", "load_browser_item" ]
- Command dispatcher in remote script's _process_command that routes 'create_clip' command to the _create_clip handler.elif command_type == "create_clip": track_index = params.get("track_index", 0) clip_index = params.get("clip_index", 0) length = params.get("length", 4.0) result = self._create_clip(track_index, clip_index, length)
- Lists 'create_clip' as a state-modifying command in the remote script's command processor, scheduling it on the main thread with response queue.elif command_type in ["create_midi_track", "create_audio_track", "delete_track", "duplicate_track", "set_track_name", "set_track_arm", "set_track_mute", "set_track_solo", "set_track_volume", "set_track_panning", "set_track_send", "create_clip", "add_notes_to_clip", "set_clip_name", "copy_clip", "delete_clip", "set_tempo", "fire_clip", "stop_clip", "fire_scene", "create_scene", "delete_scene", "start_playback", "stop_playback", "start_recording", "stop_recording", "load_browser_item", "add_device", "remove_device", "set_device_parameter", "set_device_active", "get_device_parameters"]: