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
Only changes are written
Only changes are written
A new row appears only if some channel changed value. Repeating the previous
state would add nothing.
The total length travels in the last row
The total length travels in the last row
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.
Steps can be fractional
Steps can be fractional
A divided channel produces rows at positions like
3.333333. They are
written with up to six decimals.Each channel only contributes its own sub-steps
Each channel only contributes its own sub-steps
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 fromSTEP_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.