String Generator
Generate formatted text strings from templates and expressions.
What it does
String Generator builds text strings procedurally rather than transforming existing ones. Template mode interpolates ${...} expressions (frame, time, index, count, and wired inputs) into a pattern. Counter mode formats a running number as decimal, hex, roman numerals, ordinals or letters. Random mode draws a seeded random string from a character set. Sequence mode cycles through a list of values. DateTime mode formats wall-clock time, timeline time, or an incoming number of seconds as a timecode. CharMap mode looks each character of a source string up in a table, for Morse code or NATO-alphabet spellouts.
Inside an Iterator the node becomes instance-aware: it outputs a list with one string per instance, using per-instance indices, counts and, optionally, per-instance random seeding.
When to use it
A frame counter or shot/version label burned into a title: Counter mode
A one-off ID, filename suffix or randomised label: Random mode
A caption, tag or name cycled through a fixed list per frame or per instance: Sequence mode
A timecode overlay, SMPTE or custom: DateTime mode
A string built from other node outputs: Template mode with
${...}expressionsA string translated character-by-character into another alphabet or code: CharMap mode
| Parameter | Type | Default | What it does |
|---|---|---|---|
mode | String | "Template" | String generation method. One of: Template, Counter, Random, Sequence, DateTime, CharMap. |
input | Any | — | Value to inject as {input} in templates, or source string for CharMap mode |
input_1 | Any | — | Value to inject as {input_1} in templates |
template | String | "${frame}" | Template with ${...} expression islands. Variables: frame, time, index, count, normalized, input, input_1, random — e.g. ${pad(frame, 4)}, ${upper(input)}, ${frame * 2}. Legacy {frame:04} syntax is auto-migrated. |
counter_start | Number | 1 | Starting number (offset by frame or index) |
counter_step | Number | 1 | Increment per frame (or per instance in Iterator) |
number_format | String | "Decimal" | Number formatting style. One of: Decimal, Hex, Octal, Binary, Roman, Ordinal, Alpha. |
min_digits | Number | 1 | Minimum digits, zero-padded (e.g., 3 produces '007') |
prefix | String | "" | String prepended before the number |
suffix | String | "" | String appended after the number |
charset | String | "ABCDEFGHIJKLMNOPQRSTUVWXYZa..." | Characters to draw from |
random_length | Number | 8 | Number of characters to generate |
seed | Number | 0 | Seed for reproducible randomness. Same seed + frame + index = same output. |
random_vary | String | "Per Frame" | Per Frame: new string each frame. Constant: same string always. Per Instance: unique per Iterator instance, stable across frames. One of: Per Frame, Constant, Per Instance. |
sequence_items | String | "A,B,C,D" | Comma-separated values to cycle through |
sequence_delimiter | String | "," | Delimiter separating sequence items |
sequence_index_source | String | "Frame" | What drives the sequence index. One of: Frame, Input, Instance Index. |
sequence_wrap | String | "Wrap" | Behavior when index exceeds sequence length. One of: Wrap, Clamp, Ping-Pong. |
datetime_format | String | "SMPTE" | Format: SMPTE for timecode, or %H:%M:%S.%f for custom. Tokens: %H=hour, %M=min, %S=sec, %f=ms |
datetime_source | String | "Timeline" | Wall Clock: real-time. Timeline: from frame/fps. Input Seconds: treat input as seconds. One of: Wall Clock, Timeline, Input Seconds. |
fps | Number | 30 | Frames per second for SMPTE timecode and timeline source |
char_map | String | "" | Character mapping table. Format: 'A=Alpha,B=Bravo'. Unmapped chars pass through. |
map_delimiter | String | "," | Delimiter between mapping entries |
map_separator | String | "=" | Separator between key and value in each mapping entry |
Gotchas
Random mode's Vary setting decides stability. Per Frame gives a new string every frame, Constant freezes it, and Per Instance keeps it stable across frames but unique per Iterator instance. Use Constant or Per Instance for a random-looking ID that does not flicker on playback.
In CharMap mode, any character not found in the mapping table passes through unchanged, so only the characters to be translated need listing.
Template mode understands ${...} expression islands (${pad(frame, 4)}, ${upper(input)}, ${frame * 2}) with variables frame, time, index, count, normalized, input, input_1 and random. Older-style {frame:04} patterns are auto-migrated; write new templates with ${...}.
Counter mode advances by frame outside an Iterator and by instance index inside one. There is no separate switch, so moving a Counter generator into or out of an Iterator changes what drives it.
Worked example
Add a String Generator and leave it in Template mode.
Set Template to
Frame ${pad(frame, 4)}for a zero-padded frame label likeFrame 0042.Wire a value into Input, then reference it as
${input}in the template to fold live graph data into the string.Switch Mode to Counter, set Number Format to Roman and Min Digits, and wire the result into a text layer for chapter numbering.
See also
String Manipulation · Random · Convert · Numbers, signals & audio