# Interface: Series
Packed monitor samples over one shared time axis and element axis.
## Remarks
`values` is signal-major. Convert a signal, frame, and element to an index
with:
```ts
signal * time.length * elementCount + frame * elementCount + element
```
`validFrames` lets append-heavy callers load a preallocated buffer before all
frames are ready. After writing more samples, call [Monitor.extend](Monitor.md#extend) to
commit the new frame frontier.
## Example
```ts
const series: Series = {
time: Float64Array.from([0, 1, 2]),
values: new Float32Array(1 * 3 * 2),
signalCount: 1,
elementCount: 2,
validFrames: 0,
};
series.values[0 * 3 * 2 + 0 * 2 + 0] = 0.25;
```
## Properties
| Property | Modifier | Type | Description |
| :------ | :------ | :------ | :------ |
| `elementCount` | `readonly` | `number` | Number of elements sampled at each frame. |
| `ranges?` | `readonly` | `Float32Array`\<`ArrayBufferLike`\> | Optional per-signal min/max pairs: `[min0, max0, min1, max1, ...]`. |
| `signalCount` | `readonly` | `number` | Number of independent signals stored in `Series.values`. |
| `time` | `readonly` | `Float32Array`\<`ArrayBufferLike`\> \| `Float64Array`\<`ArrayBufferLike`\> | Time coordinate for each frame. |
| `validFrames?` | `readonly` | `number` | Number of frames ready to draw; omit to treat the whole series as committed. |
| `values` | `readonly` | `Float32Array` | Packed f32 samples for every signal, frame, and element. |