Skip to main content

EXP

Status

FieldValue
Extension(s).exp
Common ecosystemMelco and some Bernina workflows
Format familyExpanded stitch stream
Satin Studio statusPlanned
Open / importNo
ExportNo
ConfidenceHigh 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 following x, y bytes 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 0x80 followed by two payload bytes; common writers use 0x07 0x00 there.
  • Observed color-change records use 0x80 0x01 followed by two payload bytes, commonly 0x00 0x00. If those payload bytes contain movement, readers may apply it after the color change.
  • Observed jump records use 0x80 0x04 followed by signed dx, dy movement. Observed 0x80 0x02 is 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.