full diff

fm.freemix.stem

From
bafyreiewf7zqdyn5ql5xnlob5ggw5zulxkdwqcz2t6fajvvgts7mqpnfyy indexed 2026-07-26 20:07 UTC View this version
To
bafyreiadoi5sal2opt5o4f6y2qm3wvm37k2ygraw2gf3qpnsfojca3muqe 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.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.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). Top-level leaf (FM-549 s38: pulled out from under release.* ; release.stem -> stem). May optionally reference a parent track and/or a parent stems-group.",
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 "notes": {
127127 "description": "Generic freeform notes for this stem (FM-550, s41). Any purpose — processing notes, licensing caveats, or an ad-hoc credit like 'Drummer: Joey Beats'. Deliberately NOT the structured #trackCredits block: most credit roles are meaningless on a stem, so a freeform escape hatch covers the rare case. Stems carry no structured credits.",
128128 "maxLength": 1000,
129129 "type": "string"
130130 },
131131 "parentGroup": {
132132 "description": "AT URI of the parent fm.freemix.group.stems this stem belongs to (optional). FM-549 s38: stems may carry an optional parentTrack AND an optional parentGroup back-ref — the only upward refs in the model (containers otherwise point down at members).",
133133 "format": "at-uri",
134134 "maxLength": 3000,
135135 "type": "string"
136136 },
137137 "parentGroupCid": {
138138 "description": "CID of the parent stems-group record (pins to exact version).",
139139 "format": "cid",
140140 "maxLength": 200,
141141 "type": "string"
142142 },
143143 "parentTrack": {
144144 "description": "AT URI of the parent track this stem belongs to (optional for standalone stems)",
145145 "format": "at-uri",
146146 "maxLength": 3000,
147147 "type": "string"
148148 },
149149 "parentTrackCid": {
150150 "description": "CID of the parent track record (pins to exact version)",
151151 "format": "cid",
152152 "maxLength": 200,
153153 "type": "string"
154154 },
155155 "position": {
156156 "description": "Display order position (0-indexed)",
157157 "minimum": 0,
158158 "type": "integer"
159159 },
160160 "previouslyAttachedToCid": {
161161 "description": "FM-504 tombstone: CID of the former parent track record at detach time",
162162 "format": "cid",
163163 "maxLength": 200,
164164 "type": "string"
165165 },
166166 "previouslyAttachedToUri": {
167167 "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",
168168 "format": "at-uri",
169169 "maxLength": 3000,
170170 "type": "string"
171171 },
172172 "stemType": {
173173 "description": "Type/category of the stem",
174174 "knownValues": [
175175 "drums",
176176 "bass",
177177 "vocals",
178178 "synth",
179179 "guitar",
180180 "keys",
181181 "pad",
182182 "lead",
183183 "fx",
184 "other"
184 "other",
185 "808",
186 "synth-strings",
187 "vocal-sample",
188 "space-echo",
189 "plate",
190 "african-percussion",
191 "surdo",
192 "kete"
185193 ],
186194 "maxLength": 100,
187195 "type": "string"
188196 },
189197 "tags": {
190198 "description": "Freeform tags",
191199 "items": {
192200 "maxLength": 50,
193201 "type": "string"
194202 },
195203 "maxLength": 10,
196204 "type": "array"
197205 },
198206 "title": {
199207 "description": "Stem title (first-class stems). `label` remains the required human-readable name; `title` is the unified-on-title field added in FM-504",
200208 "maxLength": 300,
201209 "type": "string"
202210 }
203211 },
204212 "required": [
205213 "stemType",
206214 "label",
207215 "audioHash",
208216 "audioDurationMs",
209217 "audioFormat",
210218 "audioSizeBytes",
211219 "createdAt"
212220 ],
213221 "type": "object"
214222 },
215223 "type": "record"
216224 }
217225 },
218226 "id": "fm.freemix.stem",
219227 "lexicon": 1
220228}

Compare other versions