device 0.0.4

A generative engine
use {
  super::*,
  fundsp::hacker32::{brown, constant, lfo, pink, ramp_hz, shape_fn, sine_hz, white},
};

#[derive(Clone, Copy, ValueEnum)]
pub(crate) enum Score {
  BrownNoise,
  BusySignal,
  ClickTrack,
  PinkNoise,
  Silence,
  WhiteNoise,
}

impl Score {
  pub(crate) fn sequence(self, tap: &mut Tap) {
    match self {
      Self::BusySignal => tap.sequence(
        (sine_hz(480.0) + sine_hz(620.0)) * lfo(|t| if t % 1.0 < 0.5 { 1.0 } else { 0.0 }) * 0.25,
        f64::INFINITY,
        0.0,
        0.0,
      ),
      Self::BrownNoise => {
        tap.sequence(brown() * 0.25, f64::INFINITY, 0.0, 0.0);
      }

      Self::ClickTrack => tap.sequence(
        (ramp_hz(2.0 / 3.0) >> shape_fn(|x: f32| if x < 0.010 { 1.0 } else { 0.0 }))
          * brown()
          * 0.5,
        f64::INFINITY,
        0.0,
        0.0,
      ),
      Self::PinkNoise => {
        tap.sequence(pink() * 0.25, f64::INFINITY, 0.0, 0.0);
      }
      Self::Silence => tap.sequence(constant(0.0), f64::INFINITY, 0.0, 0.0),
      Self::WhiteNoise => {
        tap.sequence(white() * 0.25, f64::INFINITY, 0.0, 0.0);
      }
    }
  }
}