full diff

fm.freemix.release.stem

From
bafyreifqsfat7swdhbpxkbmy5zrjloitnlpoo7ibomktyywvmsdl3ojcyy indexed 2026-06-25 04:44 UTC View this version
To
bafyreialxvxcydzzaoj2gnfq4okbitiihi2eizbguxkfdysqx3snntzyui indexed 2026-10-05 21:43 UTC View this version

Compatibility

breaking 1 breaking change, 0 non-breaking changes.

Breaking changes (1)
  • ConstraintTightened ConstraintTightened { vertex_id: "fm.freemix.release.stem:body.stemType", sort: "knownValues", old_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\"]", new_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\",\"808\",\"synth-strings\",\"vocal-sample\",\"space-echo\",\"plate\",\"african-percussion\",\"surdo\",\"kete\"]" }

Migration guidance

Constraint changes

  • ConstraintTightened ConstraintTightened { vertex_id: "fm.freemix.release.stem:body.stemType", sort: "knownValues", old_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\"]", new_value: "[\"drums\",\"bass\",\"vocals\",\"synth\",\"guitar\",\"keys\",\"pad\",\"lead\",\"fx\",\"other\",\"808\",\"synth-strings\",\"vocal-sample\",\"space-echo\",\"plate\",\"african-percussion\",\"surdo\",\"kete\"]" }

Changes

11{
22 "$type": "com.atproto.lexicon.schema",
33 "defs": {
44 "main": {
55 "description": "A stem (isolated track component) belonging to a parent track",
66 "key": "tid",
77 "record": {
88 "properties": {
99 "aiDeclaration": {
1010 "description": "Declaration of AI involvement in creation",
1111 "properties": {
1212 "category": {
1313 "description": "Level of AI involvement",
1414 "knownValues": [
1515 "none",
1616 "assisted",
1717 "augmented",
1818 "generated"
1919 ],
2020 "maxLength": 100,
2121 "type": "string"
2222 },
2323 "description": {
2424 "description": "Creator's description of how AI was used",
2525 "maxLength": 1000,
2626 "type": "string"
2727 },
2828 "tools": {
2929 "description": "AI tools used",
3030 "items": {
3131 "maxLength": 100,
3232 "type": "string"
3333 },
3434 "maxLength": 10,
3535 "type": "array"
3636 }
3737 },
3838 "required": [
3939 "category"
4040 ],
4141 "type": "object"
4242 },
4343 "audioDurationMs": {
4444 "description": "Duration of the stem in milliseconds",
4545 "type": "integer"
4646 },
4747 "audioFormat": {
4848 "description": "Audio file format",
4949 "knownValues": [
5050 "wav",
5151 "flac",
5252 "mp3"
5353 ],
5454 "maxLength": 100,
5555 "type": "string"
5656 },
5757 "audioHash": {
5858 "description": "SHA-256 hash of the stem audio content",
5959 "maxLength": 200,
6060 "type": "string"
6161 },
6262 "audioSizeBytes": {
6363 "description": "Size of the audio file in bytes",
6464 "type": "integer"
6565 },
6666 "audioUrl": {
6767 "description": "DEPRECATED (FM-508): no longer emitted. Stem audio is private (gated download / app-served preview) and is never surfaced in the portable record. Field kept (optional) to tolerate pre-FM-508 records without a putRecord rewrite. Stems never get a public clip.",
6868 "format": "uri",
6969 "maxLength": 3000,
7070 "type": "string"
7171 },
7272 "bpmCentis": {
7373 "description": "Centi-BPM (BPM × 100), integer — the Lexicon model has no float type; decode as `bpmCentis / 100` on read. Mirrors `fm.freemix.release.track`.",
7474 "maximum": 99900,
7575 "minimum": 2000,
7676 "type": "integer"
7777 },
7878 "coverArtUrl": {
7979 "description": "URL to cover art image",
8080 "format": "uri",
8181 "maxLength": 3000,
8282 "type": "string"
8383 },
8484 "createdAt": {
8585 "description": "Record creation timestamp",
8686 "format": "datetime",
8787 "maxLength": 100,
8888 "type": "string"
8989 },
9090 "description": {
9191 "description": "Stem description",
9292 "maxLength": 5000,
9393 "type": "string"
9494 },
9595 "detachedAt": {
9696 "description": "FM-504 tombstone: when the parent link was severed",
9797 "format": "datetime",
9898 "maxLength": 100,
9999 "type": "string"
100100 },
101101 "genres": {
102102 "description": "Genre classifications. Deliberately plural `genres` (it IS an array), NOT the track lexicon's singular `genre` — singular-for-an-array is misleading. Intentional divergence.",
103103 "items": {
104104 "maxLength": 50,
105105 "type": "string"
106106 },
107107 "maxLength": 10,
108108 "type": "array"
109109 },
110110 "label": {
111111 "description": "Human-readable name (e.g., 'Main Vocal', 'Acid Line', '808 Kit')",
112112 "maxLength": 100,
113113 "type": "string"
114114 },
115115 "license": {
116116 "description": "AT URI of the license grant record. For child stems this is the parent track's license, copied down at creation (FM-504)",
117117 "format": "at-uri",
118118 "maxLength": 3000,
119119 "type": "string"
120120 },
121121 "musicalKey": {
122122 "description": "Musical key (e.g., 'Am', 'F#m', 'Bb'). Deliberately named `musicalKey`, NOT the track lexicon's `key`: `key` is dangerously overloaded in a data layer (record keys, rkeys, map keys), so `musicalKey` is collision-proof and self-documenting. Intentional divergence.",
123123 "maxLength": 10,
124124 "type": "string"
125125 },
126126 "parentTrack": {
127127 "description": "AT URI of the parent track this stem belongs to (optional for standalone stems)",
128128 "format": "at-uri",
129129 "maxLength": 3000,
130130 "type": "string"
131131 },
132132 "parentTrackCid": {
133133 "description": "CID of the parent track record (pins to exact version)",
134134 "format": "cid",
135135 "maxLength": 200,
136136 "type": "string"
137137 },
138138 "position": {
139139 "description": "Display order position (0-indexed)",
140140 "minimum": 0,
141141 "type": "integer"
142142 },
143143 "previouslyAttachedToCid": {
144144 "description": "FM-504 tombstone: CID of the former parent track record at detach time",
145145 "format": "cid",
146146 "maxLength": 200,
147147 "type": "string"
148148 },
149149 "previouslyAttachedToUri": {
150150 "description": "FM-504 tombstone: AT URI of the former parent track, set when this stem was detached (parent deleted, keep-stems path). Preserves remix-tree placement + royalty-lineage reconstructability",
151151 "format": "at-uri",
152152 "maxLength": 3000,
153153 "type": "string"
154154 },
155155 "stemType": {
156156 "description": "Type/category of the stem",
157157 "knownValues": [
158158 "drums",
159159 "bass",
160160 "vocals",
161161 "synth",
162162 "guitar",
163163 "keys",
164164 "pad",
165165 "lead",
166166 "fx",
167 "other"
167 "other",
168 "808",
169 "synth-strings",
170 "vocal-sample",
171 "space-echo",
172 "plate",
173 "african-percussion",
174 "surdo",
175 "kete"
168176 ],
169177 "maxLength": 100,
170178 "type": "string"
171179 },
172180 "tags": {
173181 "description": "Freeform tags",
174182 "items": {
175183 "maxLength": 50,
176184 "type": "string"
177185 },
178186 "maxLength": 10,
179187 "type": "array"
180188 },
181189 "title": {
182190 "description": "Stem title (first-class stems). `label` remains the required human-readable name; `title` is the unified-on-title field added in FM-504",
183191 "maxLength": 300,
184192 "type": "string"
185193 }
186194 },
187195 "required": [
188196 "stemType",
189197 "label",
190198 "audioHash",
191199 "audioDurationMs",
192200 "audioFormat",
193201 "audioSizeBytes",
194202 "createdAt"
195203 ],
196204 "type": "object"
197205 },
198206 "type": "record"
199207 }
200208 },
201209 "id": "fm.freemix.release.stem",
202210 "lexicon": 1
203211}

Compare other versions