fm.freemix.track

lex-publisher.freemix.fm

Documentation

A music track record on FreeMix. Top-level leaf (FM-549 s38: pulled out from under the release.* prefix; release.track -> track).

main record

A music track record on FreeMix. Top-level leaf (FM-549 s38: pulled out from under the release.* prefix; release.track -> track).

Record Key tid Timestamp-based ID

Properties

aiDeclaration object Optional

Declaration of AI involvement in creation

artist string Required

Artist name

maxLength: 200 bytes
artworkSeed string Optional

FM-729: seed the generative cover placeholder is drawn from. Grammar "<title>#deck<gen>#regen<n>"; both counters recompute from this one string, so there are no separate deck/attempt fields. Optional - absent means fall back to the title (the pre-FM-729 implicit seed), which renders the existing cover unchanged. Never an empty string (an empty seed is a fixed point of the generator's LCG and collapses the art). Kept on the record even when coverArtUrl is set, so removing an uploaded cover restores the same generated art. maxLength 384 = title's 300 plus suffix headroom.

maxLength: 384 bytes
audioDurationMs integer Optional

Duration of the track in milliseconds

audioFormat string Required

Audio file format

maxLength: 100 bytes
Known values: wav, flac, mp3, aac, ogg, aiff
audioHash string Required

SHA-256 hash of the audio file content

maxLength: 200 bytes
audioSizeBytes integer Required

Size of the audio file in bytes

audioUrl string uri Optional

DEPRECATED (FM-508): no longer emitted. Full-quality audio is private (gated download only) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite.

maxLength: 3000 bytes
bpmCentis integer Optional

Beats per minute in centiBPM (multiply actual BPM by 100, e.g., 174.50 BPM = 17450)

minimum: 2000maximum: 99900
catalogNumber string Optional

Catalog number (e.g., 'VIZ-042')

maxLength: 100 bytes
clipUrl string uri Optional

FM-508: public URL to a short (~30s) truncated audio clip — the record's only public audio artifact. Tracks only; stems and samples never carry a clip. Optional.

maxLength: 3000 bytes
copyrightComposition string Optional

© line for the composition, e.g. '2026 Joshua Michaels'. FM-550.

maxLength: 256 bytesmaxGraphemes: 128 graphemes
copyrightRecording string Optional

℗ line for the sound recording, e.g. '2026 <label>'. FM-550. NOTE: label rides here + the Previously-Released fields, NOT the credits role vocabulary (s41).

maxLength: 256 bytesmaxGraphemes: 128 graphemes
coverArtHash string Optional

SHA-256 hash of the cover art

maxLength: 200 bytes
coverArtUrl string uri Optional

URL to cover art image

maxLength: 3000 bytes
createdAt string datetime Required

Record creation timestamp

maxLength: 100 bytes
credits array of object Optional

Descriptive credit lines (FM-550). Repeatable; multiple entries may share a role. Record-of-fact only — read by NO money/control code (s41). PRO-registration shape, not a split sheet: no percentages, no payout fields.

maxLength: 64 items
currency string Optional

ISO-4217 currency code. Phase 1 = USD only. INLINE sellability shape — keep in sync across sellable types.

maxLength: 3 bytes
Known values: USD
derivativeSubType string Optional

The derivative kind for Remix/Edit/Mashup uploads. Absent on Original tracks. Durable provenance — the authoritative signal that a track is a derivative, independent of source count. knownValues (not a closed enum) so future subtypes don't break existing records.

maxLength: 100 bytes
Known values: remix, edit, mashup
description string Optional

Track description

maxLength: 5000 bytes
genre array of string Optional

Genre classifications

maxLength: 5 items
isReleased boolean Optional

Whether this track was previously released outside FreeMix

isrc string Optional

International Standard Recording Code (this recording). MIGRATED from the old top-level `isrc` field (FM-549 s41); existing records carrying top-level isrc are relocated here by the T3 data migration.

maxLength: 15 bytes
iswc string Optional

International Standard Musical Work Code (the composition). FM-550.

maxLength: 15 bytes
key string Optional

Musical key (e.g., 'Am', 'F#m', 'Bb')

maxLength: 10 bytes
license string at-uri Required

AT URI to the license grant record

maxLength: 3000 bytes
noAttributableSourcesAttested boolean Optional

True only when the uploader affirmed via the upload UI that this derivative has no FreeMix-attributable source (own work, licensed, off-platform, or since-deleted). Never set automatically from source count — it is an explicit human attestation, not a computed value.

priceCents integer Optional

On-network price in integer cents (FM-549: price goes on-network; offer is public, sale is private). 0 or absent = free. Hard price floor enforced in app, not schema. INLINE sellability shape — authored identically in fm.freemix.release and fm.freemix.group.stemsGroup; keep in sync (s41).

minimum: 0
releaseDate string datetime Optional

Original release date (ISO 8601)

releaseLabel string Optional

Label name (e.g., 'Vizual Records', 'self-released')

maxLength: 255 bytes
seller string did Optional

parties.seller (s39): the single account DID that owns and sells this item (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. One-field indirection from record author. INLINE — keep in sync.

stemAccess string Optional

Who can access stems. Defaults to 'open'. Phase 1 only supports 'open' and 'community'.

maxLength: 100 bytes
Known values: open, community, request, pro
tags array of string Optional

Freeform tags

maxLength: 10 items
title string Required

Track title

maxLength: 300 bytes
View raw schema
{
  "description": "A music track record on FreeMix. Top-level leaf (FM-549 s38: pulled out from under the release.* prefix; release.track -> track).",
  "key": "tid",
  "record": {
    "properties": {
      "aiDeclaration": {
        "description": "Declaration of AI involvement in creation",
        "properties": {
          "category": {
            "description": "Level of AI involvement",
            "knownValues": [
              "none",
              "assisted",
              "augmented",
              "generated"
            ],
            "maxLength": 100,
            "type": "string"
          },
          "description": {
            "description": "Creator's description of how AI was used",
            "maxLength": 1000,
            "type": "string"
          },
          "tools": {
            "description": "AI tools used",
            "items": {
              "maxLength": 100,
              "type": "string"
            },
            "maxLength": 10,
            "type": "array"
          }
        },
        "required": [
          "category"
        ],
        "type": "object"
      },
      "artist": {
        "description": "Artist name",
        "maxLength": 200,
        "type": "string"
      },
      "artworkSeed": {
        "description": "FM-729: seed the generative cover placeholder is drawn from. Grammar \"<title>#deck<gen>#regen<n>\"; both counters recompute from this one string, so there are no separate deck/attempt fields. Optional - absent means fall back to the title (the pre-FM-729 implicit seed), which renders the existing cover unchanged. Never an empty string (an empty seed is a fixed point of the generator's LCG and collapses the art). Kept on the record even when coverArtUrl is set, so removing an uploaded cover restores the same generated art. maxLength 384 = title's 300 plus suffix headroom.",
        "maxLength": 384,
        "type": "string"
      },
      "audioDurationMs": {
        "description": "Duration of the track in milliseconds",
        "type": "integer"
      },
      "audioFormat": {
        "description": "Audio file format",
        "knownValues": [
          "wav",
          "flac",
          "mp3",
          "aac",
          "ogg",
          "aiff"
        ],
        "maxLength": 100,
        "type": "string"
      },
      "audioHash": {
        "description": "SHA-256 hash of the audio file content",
        "maxLength": 200,
        "type": "string"
      },
      "audioSizeBytes": {
        "description": "Size of the audio file in bytes",
        "type": "integer"
      },
      "audioUrl": {
        "description": "DEPRECATED (FM-508): no longer emitted. Full-quality audio is private (gated download only) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite.",
        "format": "uri",
        "maxLength": 3000,
        "type": "string"
      },
      "bpmCentis": {
        "description": "Beats per minute in centiBPM (multiply actual BPM by 100, e.g., 174.50 BPM = 17450)",
        "maximum": 99900,
        "minimum": 2000,
        "type": "integer"
      },
      "buyLink": {
        "description": "URL to purchase or stream (Bandcamp, Beatport, Spotify, etc.)",
        "format": "uri",
        "maxLength": 500,
        "type": "string"
      },
      "catalogNumber": {
        "description": "Catalog number (e.g., 'VIZ-042')",
        "maxLength": 100,
        "type": "string"
      },
      "clipUrl": {
        "description": "FM-508: public URL to a short (~30s) truncated audio clip — the record's only public audio artifact. Tracks only; stems and samples never carry a clip. Optional.",
        "format": "uri",
        "maxLength": 3000,
        "type": "string"
      },
      "copyrightComposition": {
        "description": "© line for the composition, e.g. '2026 Joshua Michaels'. FM-550.",
        "maxGraphemes": 128,
        "maxLength": 256,
        "type": "string"
      },
      "copyrightRecording": {
        "description": "℗ line for the sound recording, e.g. '2026 <label>'. FM-550. NOTE: label rides here + the Previously-Released fields, NOT the credits role vocabulary (s41).",
        "maxGraphemes": 128,
        "maxLength": 256,
        "type": "string"
      },
      "coverArtHash": {
        "description": "SHA-256 hash of the cover art",
        "maxLength": 200,
        "type": "string"
      },
      "coverArtUrl": {
        "description": "URL to cover art image",
        "format": "uri",
        "maxLength": 3000,
        "type": "string"
      },
      "createdAt": {
        "description": "Record creation timestamp",
        "format": "datetime",
        "maxLength": 100,
        "type": "string"
      },
      "credits": {
        "description": "Descriptive credit lines (FM-550). Repeatable; multiple entries may share a role. Record-of-fact only — read by NO money/control code (s41). PRO-registration shape, not a split sheet: no percentages, no payout fields.",
        "items": {
          "properties": {
            "did": {
              "description": "ATProto identity of the credited party, when on-network. OPTIONAL and load-bearing — named-but-unlinked credits are the common case.",
              "format": "did",
              "type": "string"
            },
            "ipi": {
              "description": "IPI/CAE number for PRO reconciliation. Optional.",
              "maxLength": 20,
              "type": "string"
            },
            "name": {
              "description": "Credited party's name. Required. Works for off-network parties (sampled composer, session player) with no ATProto identity.",
              "maxGraphemes": 128,
              "maxLength": 256,
              "type": "string"
            },
            "role": {
              "description": "Credit role. OPEN knownValues (not a closed enum) — off-list roles allowed without a lexicon bump; the list is UI-picker guidance.",
              "knownValues": [
                "composer",
                "lyricist",
                "composerLyricist",
                "writer",
                "arranger",
                "adapter",
                "translator",
                "performer",
                "featuredArtist",
                "vocalist",
                "producer",
                "remixer",
                "mixEngineer",
                "masteringEngineer",
                "sampledArtist",
                "originalArtist"
              ],
              "maxLength": 64,
              "type": "string"
            }
          },
          "required": [
            "role",
            "name"
          ],
          "type": "object"
        },
        "maxLength": 64,
        "type": "array"
      },
      "currency": {
        "description": "ISO-4217 currency code. Phase 1 = USD only. INLINE sellability shape — keep in sync across sellable types.",
        "knownValues": [
          "USD"
        ],
        "maxLength": 3,
        "type": "string"
      },
      "derivativeSubType": {
        "description": "The derivative kind for Remix/Edit/Mashup uploads. Absent on Original tracks. Durable provenance — the authoritative signal that a track is a derivative, independent of source count. knownValues (not a closed enum) so future subtypes don't break existing records.",
        "knownValues": [
          "remix",
          "edit",
          "mashup"
        ],
        "maxLength": 100,
        "type": "string"
      },
      "description": {
        "description": "Track description",
        "maxLength": 5000,
        "type": "string"
      },
      "genre": {
        "description": "Genre classifications",
        "items": {
          "maxLength": 50,
          "type": "string"
        },
        "maxLength": 5,
        "type": "array"
      },
      "isReleased": {
        "description": "Whether this track was previously released outside FreeMix",
        "type": "boolean"
      },
      "isrc": {
        "description": "International Standard Recording Code (this recording). MIGRATED from the old top-level `isrc` field (FM-549 s41); existing records carrying top-level isrc are relocated here by the T3 data migration.",
        "maxLength": 15,
        "type": "string"
      },
      "iswc": {
        "description": "International Standard Musical Work Code (the composition). FM-550.",
        "maxLength": 15,
        "type": "string"
      },
      "key": {
        "description": "Musical key (e.g., 'Am', 'F#m', 'Bb')",
        "maxLength": 10,
        "type": "string"
      },
      "license": {
        "description": "AT URI to the license grant record",
        "format": "at-uri",
        "maxLength": 3000,
        "type": "string"
      },
      "noAttributableSourcesAttested": {
        "description": "True only when the uploader affirmed via the upload UI that this derivative has no FreeMix-attributable source (own work, licensed, off-platform, or since-deleted). Never set automatically from source count — it is an explicit human attestation, not a computed value.",
        "type": "boolean"
      },
      "priceCents": {
        "description": "On-network price in integer cents (FM-549: price goes on-network; offer is public, sale is private). 0 or absent = free. Hard price floor enforced in app, not schema. INLINE sellability shape — authored identically in fm.freemix.release and fm.freemix.group.stemsGroup; keep in sync (s41).",
        "minimum": 0,
        "type": "integer"
      },
      "releaseDate": {
        "description": "Original release date (ISO 8601)",
        "format": "datetime",
        "type": "string"
      },
      "releaseLabel": {
        "description": "Label name (e.g., 'Vizual Records', 'self-released')",
        "maxLength": 255,
        "type": "string"
      },
      "seller": {
        "description": "parties.seller (s39): the single account DID that owns and sells this item (owner = seller = uploader; may be an org account). Charge/entitlement read THIS field. One-field indirection from record author. INLINE — keep in sync.",
        "format": "did",
        "type": "string"
      },
      "stemAccess": {
        "description": "Who can access stems. Defaults to 'open'. Phase 1 only supports 'open' and 'community'.",
        "knownValues": [
          "open",
          "community",
          "request",
          "pro"
        ],
        "maxLength": 100,
        "type": "string"
      },
      "tags": {
        "description": "Freeform tags",
        "items": {
          "maxLength": 50,
          "type": "string"
        },
        "maxLength": 10,
        "type": "array"
      },
      "title": {
        "description": "Track title",
        "maxLength": 300,
        "type": "string"
      }
    },
    "required": [
      "title",
      "artist",
      "audioHash",
      "audioFormat",
      "audioSizeBytes",
      "license",
      "createdAt"
    ],
    "type": "object"
  },
  "type": "record"
}

Lexicon Garden

@