← Back to PMF
Root object
Top-level object. Five fields are required; all others are optional and engine-defined.
required:
pmf_version
engine
summary
identity
render_key
pmf_version
string
required
const "1.0"
PMF format version. Must be exactly "1.0" for this schema.
Name of the generating engine (e.g. "synthwave_engine").
engine_version
string
optional
Semver of the engine that wrote this file.
summary
string
required
maxLength 500
Engine-generated natural language description. Under 80 words. An LLM reads this first.
identity object
Who this composition is and what it sounds like. Four fields are required.
required:
seedbpmkeybars
The seed that produced this composition.
Mood preset name (engine-defined, e.g. "NightDrive").
bpm
numberrequired20 – 400
Tempo in beats per minute.
Human label for the tempo (e.g. "mid-tempo", "driving").
Key name in standard notation (e.g. "A minor", "F# minor", "C major").
Scale type: "natural_minor", "harmonic_minor", "major", "pentatonic", etc.
key_shift_semitones
integeroptional−24 – 24
Semitone offset from the engine's reference key.
Number of bars in the loop.
time_signature
stringoptional
Time signature. Default: "4/4".
render_key object
Exact rendering context. Together with identity.seed, these fields are the minimum needed to reproduce byte-identical output from a compatible engine version.
required:
sample_ratebarsstem_formatloop_modeengine_version_major
sample_rate
integerrequired8000 – 192000
Bar count for this render. Must match identity.bars.
stem_format
stringrequired
Channel layout: "mono", "stereo", or engine-defined variant.
loop_mode
stringrequiredenum
Whether the composition was rendered as a seamless loop. Allowed values: "looped" or "finite".
engine_version_major
integerrequired≥ 0
Major semver component of the engine. Determinism is stable within a major version.
palette_pack_version
integeroptional≥ 0
Version of the palette pack used, if the engine supports swappable packs.
harmony object · optional
Harmonic structure of the composition. All fields optional.
progression
string[]optional
Chord names in order (e.g. ["Am", "F", "C", "G"]).
progression_degrees
string[]optional
Scale degrees for each chord (e.g. ["i", "VI", "III", "VII"]).
progression_label
stringoptional
Human description of the progression character (e.g. "classic minor turnaround").
key_root_midi
integeroptional0 – 127
MIDI note number of the key root (A4 = 69).
bass_pattern
integer[]optional−24 – 24 each
Per-beat interval offsets from chord root in semitones.
bass_pattern_label
stringoptional
Human description (e.g. "root-root-fifth-root").
arp_pattern
stringoptional
Arp pattern name (engine-defined).
arp_pattern_label
stringoptional
Human description of the arp movement.
arp_bar_order
integer[]optional
Which arp pattern index plays each bar.
melody object · optional
Named melodic motifs. Keys are motif identifiers ("motif_a", "motif_b", or any name). Each value is a motif object — abc is the only required field.
Motif body in ABC notation. No headers — key context comes from identity.key. Example: "A2 c B A4".
intervals_semitones
integer[]optional
Interval steps in semitones. Allows LLM reasoning without ABC parsing.
Human-readable rhythm description (e.g. "half quarter quarter whole").
Human description of the motif's musical character.
active_bars
integer[]optional
Bar indices where this motif plays.
arrangement object · optional
How the composition unfolds bar by bar. All fields optional.
Arrangement template name (engine-defined).
Array of section objects. Each has: name (string, required), bars ([start, end] inclusive, required), stems_active (string[], optional).
melody_on_bars
integer[]optional
Bar indices where melody plays.
Per-stem gain arrays. Keys are stem names, values are float arrays (one per bar). Range: 0.0–2.0. Semantics: 0.0 = silent, 1.0 = full, >1.0 = boosted.
voices object · optional
Engine-defined. Per-voice synthesis parameters. Keys are voice names (e.g. "kick", "pad", "lead"). PMF specifies no fixed property schema — only the convention that semantic labels accompany raw numeric values where available. Validators accept any object.
fx object · optional
Engine-defined. Post-processing chain parameters. Common sub-keys in practice: reverb, delay, sidechain, limiter. Content and schema are engine-specific. Validators accept any object.
mix object · optional
Engine-defined. Master mix parameters: stem volume presets, tween timing, reactive control tables. Content and schema are engine-specific. Validators accept any object.
extensions object · optional
Engine-specific extensions under namespaced keys. Each key should match the engine name to avoid collisions (e.g. "synthwave_engine"). Each value is a free-form object.
Use
extensions for engine-specific data that doesn't belong in
voices,
fx, or
mix. Do not duplicate core fields here. See
docs/extensions.md for the full policy.