7.6.Basic constructs (Since 1.1.0)

7.6.1.Sequence A | B

Items placed in order on one timeline, separated by automatic gaps (§7.5).

7.6.2.Gloss NAME, NAME(speed), NAME(speed,label)

Places the resolved gloss (§7.4). speed MUST be a number > 0 (default 1); speed 2 plays in half the native length. label is an optional display caption for the placed item; it does not affect P and MUST NOT contain ; (an error) or any other reserved separator.

7.6.3.Pause $pause, $pause(N)

Holds the neutral pose for N frames, rounded. N MUST be ≥ 1; a bare $pause holds 15. A pause is a timed item: it has automatic gaps on both sides and carries no keyframes.

7.6.4.Shift $shift(x,y,z,twist), $reset

A stateful marker that offsets every following gloss until the next $shift or $reset (or the end of a $spell block, §7.6.6). Every axis is optional and defaults to 0; a bare $shift (all zero) is the same as $reset. For each keyframe the gloss itself authored:

each result clamped to [−1, 1]. Dimensions a gloss does not author are not created. A fixed_position gloss is not shifted. The offset is applied to the placed keyframes; P's definitions are unchanged.

7.6.5.Group [A | B](speed,gap,label)

Members placed as one unit, connected at a fixed gap instead of the automatic gap. speed MUST be > 0 (default 1) and applies to members whose own speed is 1; a member's own speed wins. gap MUST be ≥ 0 (default 3) and is rounded; the next member starts max(1, gap) frames after the previous member's last frame. Members are glosses or $spell runs; a $spell member is expanded into its letters with the shift ladder of §7.6.6 baked into them, without changing the shift state outside the group. Groups MUST NOT nest. An empty group, or any other member kind, is an error. The group is one unit for captions (label, or the member names).

7.6.6.Spelling run $spell(x,y,z,twist,label){A | B | …}

A fingerspelling run with its own shift ladder. The shift defaults to (0.1, 0, 0, 0). Members are glosses or [ ] groups; a group counts as one letter. For letter i of N (0-based), the active shift is the start shift scaled by (N − 1 − i)/(N − 1): the first letter is at the full shift and the last at zero. A single letter keeps the full shift. After the block, the shift state is zero (an earlier $shift is not restored). With a label, the run is one unit for captions. An empty block is an error.

7.6.7.Expressions @name(alpha,rampIn,rampOut), @none, @break

@name opens an expression range on the first free of 3 reference lanes, starting at the start of the next timed item. alpha is the peak gain and MUST satisfy 0 < α ≤ 1 (default 1). rampIn/rampOut are frames ≥ 0, rounded; when omitted, the consumer's expression ramp applies (6 frames unless configured). A fourth concurrent expression is an error. @break closes the most recently opened range and @none closes all open ranges, at the start of the next timed item. A range left open ends at the end of the last item it covers (not at the tail-out). A range that covers no frames is dropped. A lane freed and reopened at the same frame starts one frame later. In a sequence the ranges are references: the expression's deltas are applied at decode as clamp(pose ⊕ Σ αᵢ·expressionᵢ) over h b f m (§3.3) and are never written into the pose keyframes. (A composed gloss bakes them instead, §7.4.)