device 0.0.4

A generative engine
use super::*;

#[derive(Clone, Copy, ValueEnum)]
#[allow(clippy::arbitrary_source_item_ordering)]
pub(crate) enum Program {
  Hello,
  Busy,
  Noise,
  Expo,
  Transit,
  Radio,
  Blaster,
}

impl Program {
  pub(crate) fn add_source(self, config: &Config, tap: &mut Tap) -> Result {
    match self {
      Self::Hello => {
        let wave = tap.load_wave(&config.find_song("old generic boss")?)?;
        tap.sequence_wave(&wave, 0.0, 0.0);
      }
      Self::Busy => Score::BusySignal.sequence(tap),
      Self::Noise => Score::BrownNoise.sequence(tap),
      Self::Expo => {
        let wave = tap.load_wave(&config.find_song("expo 2000 vocode")?)?;
        tap.sequence_wave(&wave, 0.0, 1.0);
      }
      Self::Transit => {
        let wave = tap.load_wave(&config.find_song("in transit corrente")?)?;
        tap.sequence_wave(&wave, 0.0, 0.0);
      }
      Self::Radio => {
        let wave = tap.load_wave(&config.find_song("next sun")?)?;
        tap.sequence_wave(&wave, 0.0, 0.0);
      }
      Self::Blaster => {
        let wave = tap.load_wave(&config.find_song("total 4/13 maria")?)?;
        tap.sequence_wave(&wave, 0.0, 0.0);
      }
    }
    Ok(())
  }

  pub(crate) fn db(self) -> Option<f32> {
    match self {
      Self::Radio => Some(-10.0),
      Self::Blaster => Some(-15.0),
      _ => None,
    }
  }

  pub(crate) fn scene(self) -> Scene {
    match self {
      Self::Hello => Scene::Hello,
      Self::Busy => Scene::Highwaystar,
      Self::Noise => Scene::Noise,
      Self::Expo => Scene::Starburst,
      Self::Transit => Scene::Kaleidoscope,
      Self::Radio => Scene::BlackHole,
      Self::Blaster => Scene::Test,
    }
  }
}