Toggle Menu

2.2 rocket_sync lib - Variable values at a given time

Summary

The sync lib works standalone, the Rocket editor is not needed.

Its purpose is to represent the tracks and key values, and provide the interpreted value of a given track at the current time.

It is a #![no_std] crate so that it can be included in a replay utility which wants to avoid the Rust standard lib for a small executable binary size.

Code Overview

It is about ~200 sloc, see lib.rs.

The main interface is via SyncDevice which really just represents the data needed to keep the sync moving.

pub struct SyncDevice {
    /// sync tracks (the vertical columns in the editor)
    pub tracks: SmallVec<[SyncTrack; 64]>,
    /// rows per beat
    pub rpb: u8,
    /// beats per minute
    pub bpm: f64,
    /// rows per second
    pub rps: f64,
    pub is_paused: bool,
    /// current row
    pub row: u32,
    /// current time in milliseconds
    pub time: u32,
}

Then there is SyncTrack which holds a vector of TrackKey. A key has row, value and key_type (interpolation type).

The whole thing will be ticking at the same speed as in the Rocket Editor because the interpolation types are the same.

impl SyncTrack {
    pub fn value_at(&self, row: u32) -> f64 {
        // ...
        match cur_key.key_type {
            Step => return a,

            Linear => return a + b * t,

            Smooth => return a + b * (t*t * (3.0 - 2.0 * t)),

            Ramp => return a + b * t*t,

            NOOP => return 0.0,
        }
        // ...
    }
}

And now let’s see some graphics moving!