Skip to main content
The digital file holds one row per change. Between one row and the next the outputs stay as they are, so a thousand-step signal usually fits in a few dozen rows.

Structure

  • The first column is the step where the change happens.
  • The rest are the value of each channel, in timeline order, with the channel name as the header.

Reading rules

A new row appears only if some channel changed value. Repeating the previous state would add nothing.
If the last change happened before the end, a row is added with the final step and the values still in force. That way the total length is inside the table and not a separate piece of data.
A divided channel produces rows at positions like 3.333333. They are written with up to six decimals.
A channel split into thirds and another into quarters do not share a grid. At a time point that is not its own, a channel carries forward its last known value instead of being read at a position it does not have.

With metadata

At the end of the file, after a blank line:

How to play it back

The idea is straightforward: read a row, set the outputs to those values, wait until the step of the next row, and repeat. The time per step comes from STEP_TIME if you exported the metadata; otherwise you set it in the code. The full example, reading from a microSD card, is in Generate the signal with an ESP32.