Skip to content
EN

Fire vs. Clip

For each haptic Event in Hapbeat, you choose to send it as either Fire or Clip. Because multiple approaches can achieve the same haptic experience, the choice involves tradeoffs between latency, bandwidth, and flexibility. This page consolidates the decision criteria in one place.

In the manifest, the delivery method is determined by which bucket the Event is in (DEC-031).

Common nameManifest bucketOn the wirePayloadPrimary use
Fireevents (command)PLAY/STOP packet with Event IDCommand (a few bytes)Short one-shot effects
Clipstream_events (stream)STREAM_BEGIN / STREAM_DATA / STREAM_ENDAudioClip-derived PCM streamingLong-form, dynamic modulation, prototyping

Placing the same Event ID in both buckets expresses “playable as either Fire or Clip (= BOTH mode).” In Studio’s EventMap UI, toggle between FIRE / CLIP / BOTH using the radio buttons.

Up through schema 1.x, entries had a mode: "command" | "stream_clip" | "stream_source" field. In schema 2.0.0 this was replaced by bucket separation, and the mode field and stream_source mode were removed.

Fire (events bucket)Clip (stream_events bucket)
Pre-deployment requiredYes (bake WAV into install-clips on device)No
What travels over the wireEvent ID + parameters — a few bytesPCM chunks (STREAM_BEGIN / STREAM_DATA / STREAM_END)
LatencyA few ms / stableTens of ms / environment-dependent
DurationA few ms to several seconds (within Kit partition capacity)Arbitrary (tens of seconds, loopable)
Dynamic controlgain only (fixed per fire)gain / pan modulatable during playback
Stop immediacyImmediateAlready-sent buffer plays out before stopping
Wireless bandwidth usageMinimalContinuous consumption

The Kit WAV is pre-deployed to the device, and the SDK sends only an Event ID plus a small set of parameters. The device plays back the WAV corresponding to the received command from its own storage.

  • Low, stable latency — only a small command travels over the wire, so reliability is high even on congested Wi-Fi
  • Minimal wireless bandwidth — does not congest even with many simultaneous fires
  • Stop command (stop) is also immediate
  • Pre-deployment required — involves creating a Kit and writing it via Studio
  • Limited by Kit partition capacityinstall-clips/ has a capacity constraint of a few MB
  • Waveform cannot be changed dynamicallygain adjustment is possible, but the waveform itself is fixed
  • Short one-shot effects such as button press feedback, gunshots, impacts, or footsteps
  • Scenarios that require stable reproducibility: shipping games, XR interactions, mass-production exhibitions

AudioClips or similar audio on the SDK side are converted to PCM data and sent to the device as a sequence of UDP messages: STREAM_BEGIN → N × STREAM_DATASTREAM_END. No pre-deployment is needed. The device does not recognize the eventId — it receives data per stream session.

  • No deployment, instant iteration — swap waveforms and experiment freely (ideal for prototyping)
  • Arbitrary length — supports sustained haptics or loops of tens of seconds
  • Dynamic modulation during playbackgain is multiplied per chunk, so it can track dynamic parameters (distance, velocity, health, etc.)
  • Wi-Fi environment dependent — chunk drops on an unstable network cause interruptions
  • Higher latency — per-chunk buffering + transmission adds tens of ms (an order of magnitude more than Fire)
  • Stop has a small delay — already-transmitted buffer plays out before halting
  • Prototyping and verification during development
  • Long-duration sustained haptics (BGM-like background vibration, ambient effects)
  • Dynamic parameter mapping (velocity-mapped friction, distance attenuation, etc.)
Does the haptic fit within a few seconds?
├─ Yes
│ └─ Production use / congested Wi-Fi environment?
│ ├─ Yes → Fire ← standard default
│ └─ No (still prototyping) → Clip
└─ No (long-form / loop / dynamic modulation needed)
└─ Clip

Typical workflow: Prototype with Clip → once finalized, switch to Fire and commit to the Kit. Just toggle the FIRE / CLIP / BOTH radio in Studio’s EventMap — no other migration steps are needed. Leaving it on BOTH means the Kit can be played in either mode after distribution.

The gain multiplication chain is common to both modes, but in Clip mode gain is pre-multiplied per PCM chunk.

ModeWhen gain is applied
FireOnce on the device when the command is received
ClipMultiplied per PCM chunk on the SDK / Helper side → streamed

This means that in Clip mode a gain change takes effect from the next chunk (suitable for continuous modulation). In Fire mode, you cannot dynamically change intensity mid-playback — a new fire (new command) is required.

Studio displayManifest storageUnity SDK API
Fire▶ FIREevents.<id>HapbeatManager.Play(eventId, gain)
Clip♪ CLIPstream_events.<id>HapbeatManager.StreamAudioClip(clip, gain)
BOTH▶♪ BOTHSame ID in both bucketsBoth of the above (choose as appropriate)

Clip streaming works as long as the SDK sends UDP directly to the device. Helper is not required — it is an optional tool used for Studio playback testing and as a host-side relay during SDK development. The minimum runtime configuration is just the SDK + Hapbeat device.