Skip to main content
Glama

add_notes_to_clip

Insert MIDI notes into Ableton Live clips by specifying track, clip, and note parameters for music production automation.

Instructions

Add MIDI notes to a clip.

Parameters:

  • track_index: The index of the track containing the clip

  • clip_index: The index of the clip slot containing the clip

  • notes: List of note dictionaries, each with pitch, start_time, duration, velocity, and mute

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
track_indexYes
clip_indexYes
notesYes

Implementation Reference

  • MCP tool handler for 'add_notes_to_clip'. Forwards the parameters to the Ableton remote script via socket command and returns success message.
    @mcp.tool()
    def add_notes_to_clip(
        ctx: Context, 
        track_index: int, 
        clip_index: int, 
        notes: List[Dict[str, Union[int, float, bool]]]
    ) -> str:
        """
        Add MIDI notes to a clip.
        
        Parameters:
        - track_index: The index of the track containing the clip
        - clip_index: The index of the clip slot containing the clip
        - notes: List of note dictionaries, each with pitch, start_time, duration, velocity, and mute
        """
        try:
            ableton = get_ableton_connection()
            result = ableton.send_command("add_notes_to_clip", {
                "track_index": track_index,
                "clip_index": clip_index,
                "notes": notes
            })
            return f"Added {len(notes)} notes to clip at track {track_index}, slot {clip_index}"
        except Exception as e:
            logger.error(f"Error adding notes to clip: {str(e)}")
            return f"Error adding notes to clip: {str(e)}"
  • Core implementation in Ableton remote script that adds MIDI notes to the specified clip using Live API: clip.set_notes()
    def _add_notes_to_clip(self, track_index, clip_index, notes):
        """Add MIDI notes to a clip"""
        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]
            
            if not clip_slot.has_clip:
                raise Exception("No clip in slot")
            
            clip = clip_slot.clip
            
            # Convert note data to Live's format
            live_notes = []
            for note in notes:
                pitch = note.get("pitch", 60)
                start_time = note.get("start_time", 0.0)
                duration = note.get("duration", 0.25)
                velocity = note.get("velocity", 100)
                mute = note.get("mute", False)
                
                live_notes.append((pitch, start_time, duration, velocity, mute))
            
            # Add the notes
            clip.set_notes(tuple(live_notes))
            
            result = {
                "note_count": len(notes)
            }
            return result
        except Exception as e:
            self.log_message("Error adding notes to clip: " + str(e))
            raise
  • Input schema defined in the tool docstring, describing parameters: track_index (int), clip_index (int), notes (list of dicts with pitch, start_time, duration, velocity, mute). Type hints also provide schema.
    """
    Add MIDI notes to a clip.
    
    Parameters:
    - track_index: The index of the track containing the clip
    - clip_index: The index of the clip slot containing the clip
    - notes: List of note dictionaries, each with pitch, start_time, duration, velocity, and mute
    """
  • Remote script recognizes 'add_notes_to_clip' as a modifying command requiring main thread scheduling.
    elif command_type in ["create_midi_track", "set_track_name", 
                         "create_clip", "add_notes_to_clip", "set_clip_name", 
                         "set_tempo", "fire_clip", "stop_clip",
                         "start_playback", "stop_playback", "load_browser_item"]:
  • Command dispatcher in remote script that routes 'add_notes_to_clip' to the _add_notes_to_clip method.
    elif command_type == "add_notes_to_clip":
        track_index = params.get("track_index", 0)
        clip_index = params.get("clip_index", 0)
        notes = params.get("notes", [])
        result = self._add_notes_to_clip(track_index, clip_index, notes)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ahujasid/ableton-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server