Gravity Feed data model

What DAWs and plugins send and receive: coordinates, beats, tracks, targets, alternatives, motions and actions.

This page describes exactly what a DAW or plugin sends to Gravity Feed and what it gets back, field by field, together with the coordinate system and timebase every adapter must use. It applies to schema version 1.0.

Coordinates and time

ItemConvention
FrameX forward, Y left, Z up
AzimuthDegrees, 0 is straight ahead, positive is to the left, range -180 to 180
ElevationDegrees, 0 is ear level, positive is up, range -90 to 90
DistanceNormalized 0 to 1, where 1 is the far edge of the plugin's range
TimeQuarter-note beats from the start of the project

Gravity Profiles convert from these neutral values to each plugin's own units. If a plugin measures azimuth clockwise, its profile flips the sign; your adapter never has to.

What you send

FieldRequiredDescription
schema_versionYes"1.0"
request_idYesYour idempotency key, 1 to 64 characters from A-Z a-z 0-9 _ . : -
session.idYesA stable, pseudonymous id for the project. Do not send the file name if it identifies a client
session.revisionYesA non-negative integer that changes when the session changes
session.tempo_mapYesUp to 64 points { beat, bpm }, first at beat 0, BPM 20 to 400
session.meter_mapNo{ beat, numerator, denominator } points
session.selectionYes{ start_beat, length_beats }, up to 128 beats
session.sectionsNoUp to 32 { label, start_beat, end_beat }
contextNogenre, key and mood, each { value, source }
intentNoUp to 500 characters of direction, such as "open the chorus upward"
stylesNoAny of restrained, expressive, cinematic; all three by default
targetsNoUp to 32 plugin instances the plan may write to
tracksYesUp to 32 tracks
privacyYesExactly { "mode": "metadata_only", "audio_uploaded": false }

Tracks

FieldDescription
idYour stable track id
nameOptional display name, up to 60 characters
role{ value, source }, for example { "value": "pad", "source": "host" }
target_idThe target this track's positions can be written to
anchortrue keeps the track still, typically the lead vocal
locked_parametersAny of azimuth, elevation, distance, position, effects
positionCurrent { azimuth_deg, elevation_deg, distance? }
featuresOptional numbers or short strings your host already computed, such as loudness or note density

Every labeled value carries a source: user (typed by a person), host (read from the DAW), model (guessed by software) or unknown. The planner sees the source of every label, so a role typed by a person is not confused with a guess.

Targets

FieldDescription
idYour id for this plugin instance
profile_idA Gravity Profile from GET /v1/profiles
live_writetrue if your adapter can send values while playing
automation_committrue if your adapter can write automation
source_indexRequired for index-based profiles such as ICST AmbiEncoder

What you get back

FieldDescription
plan_idUnique id of this plan
statusAlways proposal; nothing is applied until your adapter writes it
kindinference
preconditionssession_id, session_revision and input_hash the plan was built for
expires_at600 seconds after creation
timebase, coordinate_systemThe conventions above, restated
versionsModel, compiler and profile versions used
alternativesOne per requested style
audio_checksnot_evaluated for mono compatibility and phase, because no audio is sent
confidenceAlways null. Gravity Feed does not invent a quality score

Each alternative

FieldDescription
stylerestrained, expressive or cinematic
summaryOne line describing the idea
sceneEvery track with current position, new position, changed and reason
motionsMovements with shape, start_beat, end_beat, intensity, easing, curve points and a reason
effect_suggestionsEffect ideas with kind, intent and executable: false
actionsWritable automation for bound targets
unsupported_actionsWhat could not be applied and why
validationdropped items with reasons, and respected_locks

Style bounds

StyleTracks that may moveMaximum intensityMaximum elevation
Restrained10.435 degrees
Expressive30.7560 degrees
Cinematic61.085 degrees

Motion shapes and effect kinds

Motion shapes: rise, sink, sweep, circle, spiral_up, fly_over, come_close, move_away, wander. Each is computed by fixed formulas, then clamped to the style bounds and the plugin's range.

Effect kinds: reverb, delay, filter, width, dynamics, synth. They are ideas for a person or an adapter to apply.

Actions

{
  "action_id": "pad.azimuth",
  "track_id": "pad",
  "target_id": "enc-1",
  "profile_id": "iem_stereoencoder_candidate_v1",
  "parameter": "azimuth",
  "unit": "degrees",
  "range": [-180, 180],
  "mode": "automation_commit",
  "kind": "curve",
  "interpolation": "linear_between_points",
  "points": [{ "beat": 64, "value": 30 }, { "beat": 72, "value": 22.5 }],
  "osc": { "address": "/StereoEncoder/azimuth", "args": ["value:float"], "source_index": null },
  "conversion_verified": false
}

Values are in the plugin's own units. conversion_verified: false means nobody has confirmed in a real session that the plugin moves in the expected direction; run the fixture test in Gravity Profiles before trusting it.

Privacy

Gravity Feed never accepts audio. A request without audio_uploaded: false is rejected. Spatial9 keeps a hash of the request, the track count, timings, the transport and the returned plan, not the request body itself.

Go deeper on the blog