Manual
Appendix B — The Command Catalog
Every operation in Zammoth is a command with a stable key. Your clicks, the menus, the shortcuts, the Command Palette, the agent, and OSC remotes all invoke the same catalog — 322 commands, 292 of which the agent can invoke. This is the reference for power users (the palette searches names, keys, and categories) and for OSC control (/cmd/<key>).
Markers: [user] = user-only, refused on the agent path (30) · [confirm] = the agent must ask you first (18, plus two that ask per call, noted where they apply) · args in braces.
Transport
transport.play_pause (Space) · transport.play_continue (⇧Space) · transport.stop · transport.return_to_start · transport.seek {position_s}
Agent
agent.run — start a mix pass on the brief · agent.cancel · agent.undo (⌥⌘Z; the feed's undo run passes its gesture) · agent.auto_mix {brief?} · agent.advise {brief} · agent.transpose {tonic} · agent.reference {path}
Session
session.save (⌘S) · session.export {format, stems?, file?, bit_depth?, sample_rate?, dither?, normalize_db?, trim_silence?, range?} [confirm] — with no args it opens the Export dialog
Tracks
track.add {path} · track.add_blank {name?} (⌘T) · track.add_midi {name?} (⇧⌘T) · track.add_drum_kit {name?, kit?:"gm"|"empty"} · track.duplicate {track?} · track.delete {track} · track.rename {track?, name} (⌘R) · track.select {track} · track.select_all (⌘A) · track.solo {track?, on?} (S) · track.mute_toggle {track?, on?} (0) · track.set_mute {track, muted} · track.set_gain {track, gain_db} · track.set_pan {track, pan} · track.set_width {track, width} (0 = mono, 1 = unchanged, 2 = 2x; a track or a bus — the master and returns have no channel width and are refused) · track.set_delay {track?, delay_ms} · track.keep_latency {track?, on?} · track.set_colour {track, colour} · track.set_input {track, input} · track.set_midi_input {track, input} (a MIDI track's MIDI FROM: one device name, all, or none) · track.set_monitor {track, monitor} (MONITOR, per track: in · auto · off) · track.set_output {track, output} (AUDIO TO: master · a bus id · track:<name> · sends_only · ext:<device id>; on the master it is the Main Out, and pointing that at a hardware device asks first) · audio_input.configure {channel, stereo?, enabled?} (pair/unpair a hardware input channel) [confirm] · track.set_instrument {track, instrument} · track.freeze {track, on?} · track.fold_height {track?} · track.fold_toggle (U) [user] · track.unfold_all (⌥U) [user] · track.bounce {track?, start_s?, end_s?} (⌘B; the range must lie inside the project, plus a 30 s tail) · track.separate {track?, stems?} · track.spectrogram {track?, window_s?} · track.stop_clips {track} · track.set_arp {track, on?, style?, rate_beats?, octaves?, gate?, swing?, repeats?, chance?, vel_decay?, shift?, scale?, key?, hold?, retrigger?, bypassed?}
Edit
edit.undo (⌘Z) · edit.redo (⇧⌘Z)
Clips
clip.move {track, clip, start_s} · clip.trim {track, clip, start_s?, end_s?} · clip.split {track, clip, at_s} (⌘E — at_s must sit at least a 64th note, and never less than 50 ms, inside both edges; a nearer cut is refused rather than left as a clip too short to hear or grab) · clip.duplicate (⌘D) · clip.delete (⌫) · clip.copy (⌘C) · clip.cut (⌘X) · clip.paste (⌘V) · clip.fade {fade_in_s?, fade_out_s?} (⌘⌥F) · clip.gain {track, clip|scene, gain_db} · clip.normalize {target_db?} · clip.reverse (R) · clip.pitch {track, clip|scene, semitones} · clip.warp {on?} · clip.warp_all {on?} · clip.warp_marker {source_s, warp_s} · clip.warp_move {index, warp_s} · clip.warp_remove {index?} · clip.add_effect {type: filter|step_volume|invert|make_mono|tape_stop, freq_hz?, highpass?} · clip.remove_effect {index} · clip.consolidate (⌘J) · clip.crop (⇧⌘J) · clip.match_key {track, clip|scene} · clip.auto_pitch {track, clip, on?, root_note?} · clip.stretch_mode {track, clip, mode} · clip.pitch_correct {strength?, min_cents?} · clip.set_groove {template?, strength?} · clip.extract_groove {name?, apply?} · clip.to_slot {track, clip, scene, copy?}
Takes & comping
take.select {track, clip, take} · take.show {on?} · take.delete_unused · comp.set_segment {start_s, end_s, take} · comp.flatten
Time (all tracks)
time.insert (⌘I) · time.cut (⇧⌘X) · time.copy (⇧⌘C) · time.paste {at_s?} (⇧⌘V) · (the time.* family spans every track and defaults to the time selection) · time.duplicate (⇧⌘D) · time.delete (⇧⌘⌫)
Grid & arrange view
grid.narrower (⌘1) · grid.wider (⌘2) · grid.toggle_triplet (⌘3) · grid.toggle_snap (⌘4) · grid.toggle_mode (⌘5) · arrange.zoom_selection (Z) · arrange.zoom_back (X) [user] · arrange.zoom_in/zoom_out (=/−) [user] · arrange.fit_width (W) [user] · arrange.fit_height (H) [user] · arrange.toggle_follow (⌥⇧F) [user] · arrange.loop_selection (⌘L) [user] · arrange.select_loop (⇧⌘L) [user] · arrange.playhead_left/right (←/→) [user] · arrange.playhead_bar_left/bar_right (⇧←/⇧→) [user] · arrange.playhead_home/end (Home/End) [user] · arrange.draw_mode (B) [user] · nav.up/nav.down (↑/↓) [user] · arrangement.build {replace?, sections:[…]}
Markers & sections
marker.add {position_s?, name?} · marker.remove {index} · transport.go_to_marker {index} · section.add {name, start_s, end_s} · section.remove {index} · section.set {index, name?, start_s?, end_s?, color?}
Tempo & key
tempo.set {bpm} · tempo.add {at_s (> 0), bpm, curve?} (inserts a point; the base tempo is tempo.set's) · tempo.move {index, at_s?, bpm?} · tempo.remove {index} · tempo.set_time_sig {numerator, denominator, at_s?} (1–32 over 1, 2, 4, 8, 16 or 32; anything else is refused) · key.set {tonic, scale?, at_s?} · chord.set {chords, beats_per_chord?}
Automation & modulation
automation.edit_toggle (A) · automation.record {armed?, track?, mode?: read|touch|latch|write} · automation.write {track, points: [{t_s, value, curve?}], replace?, target?, param?} · automation.set_curve {track, index, curve, param?|target?} · automation.clear {track, param|target} · modifier.add {track, target, type?, shape?, sync?, rate…, depth?, …} · modifier.clear {track, target}
Recording & metronome
record.arm {track, on?} (C) · transport.record (F9) · record.punch {on?} · record.retrospective {armed_only?} (⌥⌘R) · record.count_in {bars} · metronome.set {on?} (O) · metronome.set_rhythm {rhythm} · metronome.set_sound {sound} · metronome.set_record_only {on?}
Mixer & routing
route.stem {stem, bus?} · group.create {stems} (⌘G) · bus.remove {id} [confirm] · bus.route {bus, target?} · bus.rename {bus, new_name} · return.add {kind?} · return.remove {id} [confirm] · return.set_prefader {id, pre_fader} · return.set_level {id, gain_db} · return.rename {id, new_name} · send.set {source, return, gain_db} · duck.set_key {stem, key?} · vca.create {name?, members} · vca.set {name, gain_db} · vca.assign {name, track} · vca.unassign {track} · vca.rename {name, new_name} · vca.remove {name} · device.set {track, target, value} or device.set {track, params:{target: value, …}} (many at once, one undo, all-or-nothing) · device.enable {track, device, on?} (the box's ⏻; absent on toggles) · device.move_to_track {type, occ?, from?, to, copy?} · master.limiter {on?} (⌥⌘L — the master safety limiter; the agent may switch it on, never off, and may not bypass or move it off the master)
Loop Deck
scene.add {name?} · scene.rename {scene, name} · scene.duplicate {scene} · scene.delete {scene} · scene.launch {scene} · scene.to_arrangement {scene, start_s?, copy?} · scene.from_sections · slot.set_clip {track, scene, source?, length_beats?} · slot.clear · slot.launch · slot.stop · slot.audition · slot.duplicate · slot.move {…, dest_scene, dest_track?, copy?} · slot.set_play_mode {loop?, auto_tempo?} · slot.set_follow_action {action, after_loops?} · slot.set_loop_region {start_beats?, length_beats?} · slot.record {track, scene, bars?} · slot.to_arrangement {…, start_s?, copy?} · slot.launch_selected (Return) [user] · transport.play_clips · transport.stop_clips · transport.back_to_arrangement {track?} · launcher.capture {on?} · launcher.record · launcher.set_loop_length {bars} · launcher.loop_8_bars…loop_1_bar, launcher.loop_free (⌘6–⌘0) [user] · launcher.snapshot_save {name?} · launcher.snapshot_recall {snap} · launcher.snapshot_rename {snap, name} · launcher.snapshot_delete {snap}
Library & projects
library.add {path, name?, description?} · library.search {query} · library.import {id, track?, scene?, length_beats?} · library.remove {id} [confirm] · edit.new {name?} · edit.open {id} [confirm] · edit.rename {id, name} · edit.duplicate {id, name?} · edit.delete {id} [confirm] · project.peek {dir} · project.switch {dir} [confirm] · project.import_track {dir, track} [confirm] · project.import_chain {dir, track, onto} [confirm] · project.import_dawproject {path, into?} [confirm]
Plug-ins & racks
plugin.add {track, name} · plugin.remove {track, plugin} · plugin.enable {track, plugin, on?} (the box's ⏻ — bypass, state kept; absent on toggles) · plugin.move {track, plugin, to} (reorder among the track's hosted plug-ins) · plugin.set_param {track, plugin, param, value} · plugin.set_program {track, plugin, program?|name?} · plugin.set_sidechain {track, plugin, source: track|none} · plugin.trust {name} [confirm] · plugin.quarantine {name} [confirm] · rack.create {track, plugins, parallel?, name?} · rack.wrap {track, parallel?} · rack.group {track, devices:["eq"|"comp#1"|"plugin:0"|"<name>"…], name?} (⌘G) · rack.ungroup {rack} (⇧⌘G) · rack.rename · rack.chain_add/remove/set · rack.plugin_add/remove/move · rack.device_add/remove/move · rack.macro_add/set · rack.macro_map {rack, macro, chain, target | slot + param, min?, max?} (target = a native device's knob, "comp.threshold_db"; slot + param = a hosted plug-in's parameter) · rack.macro_unmap {rack, macro, chain, target | slot + param} · rack.preset_save {rack, name} (asks first over an existing name) · rack.preset_load {track, name}
MIDI & instruments
midi.add_clip {track, start_s?, length_s?} (a span an existing MIDI clip already covers hands back THAT clip's index with existing: true, rather than stacking a second one over it) · midi.insert_at_selection (⇧⌘M) · midi.add_note / midi.add_notes · midi.remove_note · midi.add_cc {controller, points, replace?} · midi.quantize {grid, strength?, swing?} (⌘U) · midi.set_velocity {value?, scale?, add?, humanize?, pitch?, start_beat?, end_beat?} · midi.set_mpe {on?} · midi.arpeggiate {chord, pattern?, rate_beats?, octaves?, …} · step.program / step.set_cell · sampler.add_sound / set_sound / replace_sound / remove_sound · drum_rack.promote {track?} · pad.device_add {track?, note, device|name} · sampler.set {track, param, value, note?} · sampler.slice {sensitivity?, at?, note?} · sampler.slice_to_midi {note?} · sampler.crop {track, note?} · sampler.add_layer {track, path, lo_note?, hi_note?, lo_vel?, hi_vel?, root_note?, gain_db?, key_fade?, vel_fade?, note?} · sampler.set_layer {track, index, …} · sampler.remove_layer {track, index, note?} (note = a drum pad's own Simpler) · instrument.set_param {track, param, value} · instrument.set_modulation {track, source, target, depth?, clear?} · instrument.load_sample {track, path, root_note?} (reports truncated_to_s past 60 s) · note.audition {track, note, velocity?} (prehear one note — the pad click) · midi_input.arm {track, on?} · midi_input.set {device, enabled?, channels?, force_channel?, note_low?, note_high?, velocity_override?, adjust_ms?, min_length_ms?, record_mode?, input_quantize?} [confirm] · midi_output.set {track, device?} · midi_learn.listen/map/unmap (listen {cancel: true} ends an unanswered arm) · midi_sync.set {device?, clock?, timecode?, mmc?} [confirm] · control_surface.set {name, enabled?, midi_in?, midi_out?} [confirm] · osc.set {enabled?, port?} [confirm]
Grooves
groove.list · groove.create {name, notes_per_beat, latenesses, parameterized?} · groove.import {path} · groove.export {name, path?} [confirm] · groove.set_amount {amount}
View
view.toggle_browser {on?} (⌘⌥B — read back as browser_open) · view.toggle_engineer {on?} (⌥⌘E — its state is engineer_open in what the agent reads) · view.session_rail {on?} (⌥⌘S) · view.toggle_launcher (Tab) · view.toggle_dock {on?} (read back as dock_open; mixer_width too) · view.device_zoom {type?} (read back as device_zoom) · view.device_fold {device, folded?} (read back as folded_devices) · view.audio_clip_editor · view.sampler_editor {track?, note?} · view.drum_rack {track?} · view.computer_keyboard {on?, octave?, velocity?} (⌘K) · view.mixer_width {mode?} · view.meter_style {style} · view.meter_history {track?, history?} · view.comp_scope {scope?} · view.gate_tape {tape?} · view.mb_tapes {tapes?} · view.sat_cards {cards?} · view.sat_tape {tape?} · view.delay_tape {tape?} · view.rev_tape {tape?} · view.ir_print {print?} · view.width_field {field?} · view.spectrogram_view {picture?, under?, full?} · view.ott_tapes {tapes?} · view.clip_scope {scope?} · view.od_scope {scope?} · view.tempo_lane {on?} · view.time_ruler {on?} · view.tooltips {on?} · view.io_section {on?} (⌥⌘I) · view.track_delay {on?} (⌥⌘D) · view.track_height_inc/dec (⌥=/⌥−) [user] · browser.search_focus (⌘F) [user] · view.command_palette (⌘/; also bound to ⇧⌘/, which macOS usually keeps) [user] · view.shortcuts (the Keyboard Shortcuts editor) [user]
The rules of the catalog: commands that take arguments act on your current selection (or open their own dialog) when triggered from the keyboard; the agent passes explicit arguments. User-only commands protect your viewport and your loop. Confirm-gated commands are the ones no undo can reverse — a real dialog appears, and an unattended session refuses them. Agent moves in one chat turn share one undo transaction. Every command checks its arguments before it runs: a number must be a real, finite number of a plausible size, and a file or folder (path, dir, into, file) must be an absolute path (~/… counts) — a relative one is refused rather than looked up in whatever folder the app happened to start in.
A command is known by its key and nothing else.
Zammoth is a DAW for Apple silicon Macs with an AI audio engineer built in. The beta opens soon.
Join the beta