EXP
Status
| Field | Value |
|---|---|
| Extension(s) | .exp |
| Common ecosystem | Melco and some Bernina workflows |
| Format family | Expanded stitch stream |
| Satin Studio status | Planned |
| Open / import | No |
| Export | No |
| Confidence | High for base Melco-style stream; sidecars vary. |
What it is
EXP is a compact expanded stitch format associated with Melco. The base stitch stream has no header: it is a sequence of relative movement records and control markers.
Bernina workflows may also use EXP-style files with companion color or metadata sidecars, so an .exp file alone may not describe the whole design handoff.
Satin Studio direction
Satin Studio plans to treat EXP as a preserved stitch stream and handle sidecar color information when it is present and understood.
Versions and variants
EXP has at least Melco-style and Bernina-style workflow differences. Support must track the main stitch stream and any sidecars separately.
File identification notes
The base EXP stream uses signed 8-bit relative x, y movement bytes. Normal movement is two bytes. A first byte of 0x80 introduces a control event, with the second byte identifying the command.
Known command pairs include:
0x80 0x80: end.0x80 0x04: jump; the followingx, ybytes give the jump movement, and the command must be repeated for each jump segment.0x80 0x01: color change / stop in common files.0x80 0x02: reported stitch/control marker in some files.
Maximum single-byte movement is in the signed 8-bit range. Longer travel must be split.
Observed structure notes
- Observed EXP trim records use
0x80 0x80followed by two payload bytes; common writers use0x07 0x00there. - Observed color-change records use
0x80 0x01followed by two payload bytes, commonly0x00 0x00. If those payload bytes contain movement, readers may apply it after the color change. - Observed jump records use
0x80 0x04followed by signeddx, dymovement. Observed0x80 0x02is sometimes accepted as a stitch/control marker but should not be emitted without a target reason. - Observed writers do not need an end record for base EXP; they commonly stop at end-of-file after the last command.
- Observed writers use maximum single-record movement of 127 units for stitch and jump deltas and split longer travel before writing.
Structure sketch
Represent the base stream as records with no required file header:
struct ExpStream<'a> {
records: &'a [ExpRecord<'a>], // no required file header in base EXP
}
enum ExpRecord<'a> {
Stitch { dx: i8, dy: i8 },
End, // 0x80 0x80
ColorChange, // 0x80 0x01 in common files
Jump { dx: i8, dy: i8 }, // 0x80 0x04 followed by movement bytes
VendorControl { command: u8, payload: &'a [u8] },
}
What we still need
Melco and Bernina validation files, sidecar names and encodings, control-code coverage, and movement-limit tests.