FilmStripContinuousControl

A continuous control that displays frames from a filmstrip sprite sheet, supporting the industry-standard bitmap-based control representation.

FilmStripContinuousControl is a continuous control that displays frames from a filmstrip sprite sheet. It supports the widely-used industry standard for control representation: bitmap sprite sheets (filmstrips).

While bitmap-based visualization is more constrained than SVG (no dynamic theming, fixed visual appearance), this component shares the same layout, parameter model, interaction, and accessibility as other controls (vector, raster, and control primitives); see the Raster introduction.

The frame displayed is determined by the normalized value (0-1 maps to frame 0 to frameCount-1).

Note:

No Theming Support: This component does NOT support themable props (color, roundness, thickness) as visuals are entirely determined by the image content.

Props

NameTypeDefaultRequiredDescription
valuenumberYesCurrent value of the control
onChange(event: AudioControlEvent<number>) => voidNoHandler for value changes
minnumberNoMinimum value (ad-hoc mode)
maxnumberNoMaximum value (ad-hoc mode)
stepnumberNoStep size for value adjustments
bipolarbooleanfalseNoWhether the component should operate in bipolar mode (centered at zero)
labelstringNoLabel displayed below the component
frameWidthnumberYesWidth of a single frame in the filmstrip (pixels)
frameHeightnumberYesHeight of a single frame in the filmstrip (pixels)
frameCountnumberYesTotal number of frames in the filmstrip sprite sheet
imageHrefstringYesURL to the sprite sheet/filmstrip image
orientation"vertical" | "horizontal"verticalNoOrientation of the filmstrip (frames stacked vertically or horizontally)
frameRotationnumber0NoOptional frame rotation in degrees
invertValuebooleanfalseNoIf true, inverts the normalized value (0.0 -> 1.0 and 1.0 -> 0.0). Useful for filmstrips where frame 0 represents the maximum value
valueAsLabel"labelOnly" | "valueOnly" | "interactive"labelOnlyNoControls how the label and value are displayed
adaptiveSizebooleanfalseNoWhether the component stretches to fill its container
size"xsmall" | "small" | "normal" | "large" | "xlarge"normalNoSize of the component
parameterContinuousParameterNoAudio Parameter definition (Model). If provided, overrides min/max/step/label/bipolar from ad-hoc props
valueFormatter(value: number, parameterDef: AudioParameter) => string | undefinedNoCustom renderer for the value display
interactionMode"drag" | "wheel" | "both"bothNoInteraction mode
interactionDirection"vertical" | "horizontal" | "circular" | "both"NoDirection of interaction
interactionSensitivitynumberNoSensitivity multiplier for interactions (default varies by control type)

Basic Usage

FilmStripContinuousControl requires a filmstrip sprite sheet image and frame dimensions:

BasicFilmStrip.tsx

Filmstrip Configuration

Filmstrips are bitmap sprite sheets containing multiple frames stacked vertically (default) or horizontally. Each frame represents a different value state.

Frame Dimensions

Specify the dimensions of a single frame:

FrameDimensions.tsx

Orientation

Control whether frames are stacked vertically or horizontally:

Orientation.tsx

Frame Rotation

Rotate the entire filmstrip container:

FrameRotation.tsx

Value Inversion

Invert the value mapping for filmstrips where frame 0 represents the maximum value:

ValueInversion.tsx

Value Mapping

The component maps continuous values (0-1 normalized) to frame indices (0 to frameCount-1):

  • Value 0.0 (min) → Frame 0
  • Value 1.0 (max) → Frame (frameCount - 1)
  • Intermediate values are linearly interpolated

Parameter Model

Use a parameter model for integration with audio parameter systems. The following example uses ad-hoc props; with the full library you would use createContinuousParameter and the parameter prop:

FilmStripParameterModel.tsx

Adaptive Sizing

The FilmStripContinuousControl component supports both fixed sizes and adaptive sizing. By default, the size of the component is driven by the Size System and their size attribute:

FilmStripSizing.tsx

Adaptive sizing allows the component to adapt to the size of its parent container, adjusting its dimensions intelligently without causing distortion (scaleToFit display mode). The fill display mode makes the component fill the entire container, potentially distorting it.

FilmStripContinuousAdaptiveSize.tsx

Interaction Modes

Control how users interact with the filmstrip:

FilmStripInteraction.tsx

Common Use Cases

VU Meter

VUMeter.tsx

Rotary Knob

RotaryKnob.tsx

Filmstrip Image Format

Filmstrip images should follow these conventions:

  • Vertical orientation (default): Frames stacked top to bottom
  • Horizontal orientation: Frames stacked left to right
  • Frame dimensions: All frames must have identical dimensions
  • Frame count: Total number of frames in the sprite sheet
  • Compatibility: Works with filmstrips exported from WebKnobMan and other VST development tools

Next Steps