# fm.freemix.sample

> Published by [lex-publisher.freemix.fm](https://lexicon.garden/identity/did:plc:bt7c6cqevgefnvej5cmgke4g)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.sample)
- [Documentation](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.sample/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:bt7c6cqevgefnvej5cmgke4g/fm.freemix.sample/examples)

## Definitions

### `fm.freemix.sample`

**Type**: `record`

A sample: a first-class leaf audio record (FM-549 s38: promoted from a DB-only concept to a real ATProto record). A building block — samples carry a 0% royalty by tier principle and no structured credits/notes (s41).

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `tags` | `array` | No | Freeform tags. |
| `label` | `string` | Yes | Human-readable name (e.g., '808 Kick', 'Vinyl Crackle', 'Amen Break Chop'). |
| `title` | `string` | No | Sample title. `label` remains the required human-readable name; `title` mirrors the stem lexicon's unified-on-title field. |
| `genres` | `array` | No | Genre classifications. Plural `genres` (it IS an array), matching the stem lexicon convention. |
| `license` | `string` (at-uri) | No | AT URI of the license grant record. License lives on the leaf (s40). |
| `audioUrl` | `string` (uri) | No | DEPRECATED-by-default (FM-508 parity): sample audio is private (gated download / app-served preview), not surfaced in the portable record. Samples never carry a public clip. Optional, tolerated for compatibility. |
| `audioHash` | `string` | Yes | SHA-256 hash of the sample audio content. |
| `bpmCentis` | `integer` | No | Centi-BPM (BPM x 100), integer — decode as bpmCentis/100 on read. Mirrors the track/stem lexicons. Relevant for loops. |
| `createdAt` | `string` (datetime) | Yes | Record creation timestamp. |
| `musicalKey` | `string` | No | Musical key (e.g., 'Am', 'F#m', 'Bb'). Named musicalKey (collision-proof), matching the stem lexicon's intentional divergence from track's `key`. |
| `sampleType` | `string` | Yes | Category of the sample. Note: one-shot vs loop/snippet matters for the sampling royalty cap at the product layer (one-shot 0%, loop/snippet capped) — but samples as an UPLOAD type carry 0% royalty by the tier principle. |
| `audioFormat` | `string` | Yes | Audio file format. |
| `coverArtUrl` | `string` (uri) | No | URL to cover art image. |
| `description` | `string` | No | Sample description. |
| `parentGroup` | `string` (at-uri) | No | AT URI of a parent group/release this sample belongs to (optional). Samples are referenceable as release/collection/samplePack members. |
| `aiDeclaration` | `object` | No | Declaration of AI involvement in creation. |
| `audioSizeBytes` | `integer` | Yes | Size of the audio file in bytes. |
| `audioDurationMs` | `integer` | Yes | Duration of the sample in milliseconds. |

## Raw Schema

```json
{
  "id": "fm.freemix.sample",
  "defs": {
    "main": {
      "key": "tid",
      "type": "record",
      "record": {
        "type": "object",
        "required": [
          "sampleType",
          "label",
          "audioHash",
          "audioDurationMs",
          "audioFormat",
          "audioSizeBytes",
          "createdAt"
        ],
        "properties": {
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 50
            },
            "maxLength": 10,
            "description": "Freeform tags."
          },
          "label": {
            "type": "string",
            "maxLength": 100,
            "description": "Human-readable name (e.g., '808 Kick', 'Vinyl Crackle', 'Amen Break Chop')."
          },
          "title": {
            "type": "string",
            "maxLength": 300,
            "description": "Sample title. `label` remains the required human-readable name; `title` mirrors the stem lexicon's unified-on-title field."
          },
          "genres": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 50
            },
            "maxLength": 10,
            "description": "Genre classifications. Plural `genres` (it IS an array), matching the stem lexicon convention."
          },
          "license": {
            "type": "string",
            "format": "at-uri",
            "maxLength": 3000,
            "description": "AT URI of the license grant record. License lives on the leaf (s40)."
          },
          "audioUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 3000,
            "description": "DEPRECATED-by-default (FM-508 parity): sample audio is private (gated download / app-served preview), not surfaced in the portable record. Samples never carry a public clip. Optional, tolerated for compatibility."
          },
          "audioHash": {
            "type": "string",
            "maxLength": 200,
            "description": "SHA-256 hash of the sample audio content."
          },
          "bpmCentis": {
            "type": "integer",
            "maximum": 99900,
            "minimum": 2000,
            "description": "Centi-BPM (BPM x 100), integer — decode as bpmCentis/100 on read. Mirrors the track/stem lexicons. Relevant for loops."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime",
            "maxLength": 100,
            "description": "Record creation timestamp."
          },
          "musicalKey": {
            "type": "string",
            "maxLength": 10,
            "description": "Musical key (e.g., 'Am', 'F#m', 'Bb'). Named musicalKey (collision-proof), matching the stem lexicon's intentional divergence from track's `key`."
          },
          "sampleType": {
            "type": "string",
            "maxLength": 100,
            "description": "Category of the sample. Note: one-shot vs loop/snippet matters for the sampling royalty cap at the product layer (one-shot 0%, loop/snippet capped) — but samples as an UPLOAD type carry 0% royalty by the tier principle.",
            "knownValues": [
              "oneShot",
              "loop",
              "snippet",
              "fx",
              "other"
            ]
          },
          "audioFormat": {
            "type": "string",
            "maxLength": 100,
            "description": "Audio file format.",
            "knownValues": [
              "wav",
              "flac",
              "mp3",
              "aiff"
            ]
          },
          "coverArtUrl": {
            "type": "string",
            "format": "uri",
            "maxLength": 3000,
            "description": "URL to cover art image."
          },
          "description": {
            "type": "string",
            "maxLength": 5000,
            "description": "Sample description."
          },
          "parentGroup": {
            "type": "string",
            "format": "at-uri",
            "maxLength": 3000,
            "description": "AT URI of a parent group/release this sample belongs to (optional). Samples are referenceable as release/collection/samplePack members."
          },
          "aiDeclaration": {
            "type": "object",
            "required": [
              "category"
            ],
            "properties": {
              "tools": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 100
                },
                "maxLength": 10,
                "description": "AI tools used."
              },
              "category": {
                "type": "string",
                "maxLength": 100,
                "description": "Level of AI involvement.",
                "knownValues": [
                  "none",
                  "assisted",
                  "augmented",
                  "generated"
                ]
              },
              "description": {
                "type": "string",
                "maxLength": 1000,
                "description": "Creator's description of how AI was used."
              }
            },
            "description": "Declaration of AI involvement in creation."
          },
          "audioSizeBytes": {
            "type": "integer",
            "description": "Size of the audio file in bytes."
          },
          "audioDurationMs": {
            "type": "integer",
            "description": "Duration of the sample in milliseconds."
          }
        }
      },
      "description": "A sample: a first-class leaf audio record (FM-549 s38: promoted from a DB-only concept to a real ATProto record). A building block — samples carry a 0% royalty by tier principle and no structured credits/notes (s41)."
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1
}
```
