← 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.
engine
string required
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
seed
integerrequired≥ 0
The seed that produced this composition.
mood
stringoptional
Mood preset name (engine-defined, e.g. "NightDrive").
bpm
numberrequired20 – 400
Tempo in beats per minute.
bpm_label
stringoptional
Human label for the tempo (e.g. "mid-tempo", "driving").
key
stringrequired
Key name in standard notation (e.g. "A minor", "F# minor", "C major").
key_type
stringoptional
Scale type: "natural_minor", "harmonic_minor", "major", "pentatonic", etc.
key_shift_semitones
integeroptional−24 – 24
Semitone offset from the engine's reference key.
bars
integerrequired≥ 1
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
Audio sample rate in Hz.
bars
integerrequired≥ 1
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.

abc
stringrequired
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.
rhythm
stringoptional
Human-readable rhythm description (e.g. "half quarter quarter whole").
label
stringoptional
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.

template
stringoptional
Arrangement template name (engine-defined).
sections
object[]optional
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.
bar_gains
objectoptional
Per-stem gain arrays. Keys are stem names, values are float arrays (one per bar). Range: 0.02.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.
Raw Schema
View on GitHub ↗
pmf-1.0.schema.json