Ableton Live 9 is finally shipping! Of the many new and cool features, the inclusion of Max for Live into Live 9 Suite is a welcome addition that is driving many new users to the world of Max for Live and our community at maxforlive.com. The fact that M4L is now free if you own the Suite isn't the only new thing though. Check out a full list of new things in Max for Live in Live 9! (Note M4L in Live 9 requires Max 6.1 or greater is installed).
New features in the Live Object Model or "LOM". Please see below in this blog post for a full list of LOM changes.
API: retrieve all notes in a midiclip without selecting
device width: settable
Devices: improved patcher loading time
live.dial: narrower in tiny mode
LiveAPI: get AudioClip file path
LiveAPI: misc improvements & changes
LivePack: resolve file path
MFL devices: all devices are Max Projects. Among many benefits, this now allows developers to include both the Win and Mac versions of externals when Freezing devices to make them cross platform. See the "Max for Live Device Projects" Vignette in the Max doc for full details.
MFL keyboard focus: fixed various issues
MFL parameters: enabled ordering of automatic mapping of on external MIDI controllers
Rye Pluggo MFL device: minor gain improvments
startup: improved Max for Live startup time
textedit: un-focussing device un-focuses textedit
undo events: events during a mouse down are merged into a single event
New Max for Live Devices
The new "Max for Live Essentials" pack includes:
Convolution Reverb (including a device to create your own IRs!)
What's new in the Live Object Model (LOM)
The following are new additions to the LOM taken from LOMChanges.pdf by Cycling74. This document only reflect the state of the LOM at the time of writing, for uptodate documentation and more explanation of these specific properties and functions, please refer to the LOM documentation included in Max for Live.
open_dialog_count Get/listen to the number of dialog boxes shown.
current_dialog_message Text of the current message box; empty if none is shown at the moment.
current_dialog_button_count Number of buttons on the current message box.
press_current_dialog_button(index) Press the button with the given index on the current dialog box.
scroll_view for the “Browser” view
toggle_browse() Reveals the device chain, the browser and starts hot swap for the selected device. Calling this function again stops hot swap.
browse_mode True if HotSwap mode is active for any target
create_scene(index) Index determines where the scene is added; it is only valid between 0 and len(song.scenes); 1 will add the new scene at the end of the list
swing_amount 0.0 1.0; right now only affects midi recording quantization and direct calls to Clip.quantize(...).
capture_and_insert_scene() Optional argument that can either be 'Song.CaptureMode.all' or 'Song.CaptureMode.all_except_selected'; the latter will capture all playing clips except for the selected one, leaving the slot of the selected track free in the new scene.
session_record Get/set/listen to the state of the session overdub button.
arrangement_overdub Get/set/listen to the state of the arrangement overdub button.
session_record_status An integer that changes when the state of Live's new session recording button changes. Can be observed but not set.
create_return_track() Adds a new Return track at the end.
delete_track(track_index) Delete the track in the 'tracks' property at the given index
stop_all_clips now has an optional argument 'quantized' (default is true). Calling the function with false will stop all clips immediately, independent of the launch quantization.
session_automation_record Get/set/listen to the state of the new Automation Arm button in Live
re_enable_automation_enabled Get/listen to the state of the 'Back to Session Automation' button.
re_enable_automation() Trigger 'Back to Session Automation', reactivating automation in all running session clips.
delete_scene(index) Deletes the scene at the given index. Raises an error when there is no scene at given index or the index is invalid.
trigger_session_record (optional: record_length) Starts recording in either the selected slot or the next empty slot, if track is armed. If record_length is provided, the slot will record for the given length in beats. If triggered while recording, it will stop recording and start to play back the clip.
delete_device(device_index) Delete the device in the 'devices' property at the given index
duplicate_clip_slot(index) Works like 'Duplicate' in a clip's context menu;
device_insert_mode Get/set/listen to where a device will be inserted when loaded from the browser. Can be 'default' (add device at the end), 'selected_left' (add device to the left of the selected device), or 'selected_right' (add device to the right of the selected device).
create_clip(length) Length is given in beats, must be bigger than 0.0; can only be called on empty clip slots in MIDI tracks.
delete_clip() Deletes the contained clip
fire(record_length, launch_quantization) The resulting clip will be refired after the given record_length; launch_quantization overrides the global quantization if provided.
is_playing, is_recording, will_record_on_start will now return the respective state of the contained clip if there is one (they used to throw errors in that case)
Reminder: Note format is (pitch, time, duration, velocity, is_muted)
get_notes(from_time, from_pitch, time_span, pitch_span) Returns a list of notes that start in the given area just like get_selected_notes
remove_notes(from_time, from_pitch, time_span, pitch_span) Deletes all notes that start in the given area
set_notes(list_of_notes) Will apply the given notes to the clip, overwriting existing notes Note: Accessing these properties if is_midi_clip is false will generate an error
duplicate_loop Makes the loop two times longer by moving loop_end to the right, and duplicates both the notes and the envelopes. If the clip is not looped, the clip start/end range is duplicated. The function has no parameters. Available for MIDI clips only.
is_overdubbing Get/listen to whether the clip is overdubbing
file_path Get the location of the audio file represented by the clip Note: Accessing this property will generate an error if is_audio_clip is false
quantize(quantization_grid, amount) Quantizes all notes in the clip to the quantization_grid (one of Live.Song.RecordingQuantization) taking the song's swing_amount into account; throws a runtime error if called on an audio clip.
start_marker Get/set/listen to the clip's start marker in beats, independent of the loop state. Raises an error if set behind the end marker.
start_time The time the clip has been started, relative to the global song time, the value is in beats
end_marker Get/set/listen to the clip's end marker in beats, independent of the loop state. Raises an error if set before the start marker.
gain Get/set/listen to the clip's gain setting; range is 0.0 to 1.0. Raises an error if called on a MIDI clip.
gain_display_string Get the clip's gain display value as a string (e.g., “1.3 dB”). Raises an error if called on a MIDI clip.
available_warp_modes Returns the list of indexes of the warp modes available for the clip; Raises an error if called on a MIDI clip.
warp_mode Get/set/listen to the clip's warp mode as an integer index. Raises an error if called on a MIDI clip. Note: Available warp modes are 0(Beats), 1(Tones), 2(Texture), 3(Repitch), 4(Complex), 5(Rex), 6(ComplexPro).
clear_envelope(device_parameter) Removes the clip's automation for the given parameter.
clear_all_envelopes Removes all automation in the clip.
has_envelopes Get/listen to whether the clip has any automation.
quantize_pitch(pitch, quantization_grid, amount) Same as quantize(quantization_grid, amount), but only for notes in the given pitch.
grid_is_triplet Get/set whether the clip is displayed with a triplet grid
grid_quantization The grid quantization; possible values can be found in Live.Clip.GridQuantization
show_loop If the clip is visible in Live's detail view, this function will make the current loop visible there
can_have_drum_pads (only true for drum racks)
drum_pads Read/listenable list of all 128 DrumPads for the top most drum rack, inner drum racks return a list of 0 entries).
visible_drum_pads Read/listenable list of all 16 visible DrumPads for the top most drum rack, inner drum racks return a list of 0 entries).
class_display_name Get the device's original name (e.g., Operator, Auto Filter).
type The device's type. Possible types are 0(undefined), 1(instrument), 2(audio_effect), 3(midi_effect).
Device.View (readonly, of type Live.Device.Device.View)
drum_pads_scroll_position (int) Lowest row of pads visible, range: 0 28 Note: Accessing this property will generate an error if can_have_drum_pads is false or the drum rack is nested
selected_chain The currently selected Chain (only available in instrument racks)
selected_drum_pad The currently selected DrumPad (only available in drum racks)
chains Read/listenable list of contained chains
solo Read/write/listenable, exclusivity needs to be maintained manually, same as in tracks
delete_device(device_index) Delete the device in the 'devices' property at the given index.
Added has_audio_input, has_audio_output, has_midi_input, and has_midi_output all readonly.
fire and fire_as_selected now have an optional argument 'force_legato' (default is false). Calling these functions with true will launch all clips immediately in legato, independent of their launch mode.
fire(force_legato, can_select_scene_on_launch) now has a second parameter can_select_scene_on_launch (default is True). If set to False/0, the scene is fired without selecting it.
is_empty Is true if none of the slots in the scene is filled.
The Push control surface now has functions that allow Max for Live to use its controls more easily.
get_control_names() Returns the list of alls controls' names.
get_control(name) Returns the control with the given name.
grab_control(control) Releases all Push functionality from the control so that it can be used exclusively from Max for Live.
release_control(control) Reestablishes the Push functionality for the control.