1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
ix!();

enhanced_enum![DualDelayParam {
    Left,
    Right,
    Feedback,
    CrossFeed,
    LowCut,
    HighCut,
    Rate,
    Depth,
    Pan,
    Mix,
    Width,
    ReturnLevel,
}];

rt![DualDelayParam];

impl Param for DualDelayParam {
    fn control_group(&self) -> ControlGroup { ControlGroup::Fx } 
    fn control_type(&self) -> ControlType {
        match self {
            DualDelayParam::Left        => ControlType::EnvTime,
            DualDelayParam::Right       => ControlType::EnvTime,
            DualDelayParam::Feedback    => ControlType::Amplitude,
            DualDelayParam::CrossFeed   => ControlType::Amplitude,
            DualDelayParam::LowCut      => ControlType::FreqAudible,
            DualDelayParam::HighCut     => ControlType::FreqAudible,
            DualDelayParam::Rate        => ControlType::LfoRate,
            DualDelayParam::Depth       => ControlType::Detuning,
            DualDelayParam::Pan         => ControlType::PercentBidirectional,
            DualDelayParam::Mix         => ControlType::Percent,
            DualDelayParam::Width       => ControlType::DecibelNarrow,
            DualDelayParam::ReturnLevel => ControlType::Percent,
        }
    }
    fn default_value(&self) -> PData {
        match self {
            DualDelayParam::Left        => PData::Float(-2.0),
            DualDelayParam::Right       => PData::Float(-2.0),
            DualDelayParam::Feedback    => PData::Float(0.0),
            DualDelayParam::CrossFeed   => PData::Float(0.0),
            DualDelayParam::LowCut      => PData::Float(-24.0),
            DualDelayParam::HighCut     => PData::Float(30.0),
            DualDelayParam::Rate        => PData::Float(-2.0),
            DualDelayParam::Depth       => PData::Float(0.0),
            DualDelayParam::Pan         => PData::Float(0.0),
            DualDelayParam::Mix         => PData::Float(1.0),
            DualDelayParam::Width       => PData::Float(0.0),
            DualDelayParam::ReturnLevel => PData::Float(0.5),
        }
    }
    fn modulateable(&self) -> bool {
        //true for all
        true
    }
    fn min_value(&self) -> PData {
        match self {
            DualDelayParam::Left        => PData::Float(-8.0),
            DualDelayParam::Right       => PData::Float(-8.0),
            DualDelayParam::Feedback    => PData::Float(0.0),
            DualDelayParam::CrossFeed   => PData::Float(0.0),
            DualDelayParam::LowCut      => PData::Float(-60.0),
            DualDelayParam::HighCut     => PData::Float(-60.0),
            DualDelayParam::Rate        => PData::Float(-7.0),
            DualDelayParam::Depth       => PData::Float(0.0),
            DualDelayParam::Pan         => PData::Float(-1.0),
            DualDelayParam::Mix         => PData::Float(0.0),
            DualDelayParam::Width       => PData::Float(-24.0),
            DualDelayParam::ReturnLevel => PData::Float(0.0),
        }
    }
    fn max_value(&self) -> PData {
        match self {
            DualDelayParam::Left        => PData::Float(5.0),
            DualDelayParam::Right       => PData::Float(5.0),
            DualDelayParam::Feedback    => PData::Float(1.0),
            DualDelayParam::CrossFeed   => PData::Float(1.0),
            DualDelayParam::LowCut      => PData::Float(70.0),
            DualDelayParam::HighCut     => PData::Float(70.0),
            DualDelayParam::Rate        => PData::Float(9.0),
            DualDelayParam::Depth       => PData::Float(2.0),
            DualDelayParam::Pan         => PData::Float(1.0),
            DualDelayParam::Mix         => PData::Float(1.0),
            DualDelayParam::Width       => PData::Float(24.0),
            DualDelayParam::ReturnLevel => PData::Float(1.0),
        }
    }
    fn value_type(&self) -> ValType {
        match self {
            DualDelayParam::Left        => ValType::VtFloat,
            DualDelayParam::Right       => ValType::VtFloat,
            DualDelayParam::Feedback    => ValType::VtFloat,
            DualDelayParam::CrossFeed   => ValType::VtFloat,
            DualDelayParam::LowCut      => ValType::VtFloat,
            DualDelayParam::HighCut     => ValType::VtFloat,
            DualDelayParam::Rate        => ValType::VtFloat,
            DualDelayParam::Depth       => ValType::VtFloat,
            DualDelayParam::Pan         => ValType::VtFloat,
            DualDelayParam::Mix         => ValType::VtFloat,
            DualDelayParam::Width       => ValType::VtFloat,
            DualDelayParam::ReturnLevel => ValType::VtFloat,
        }
    }
    fn moverate(&self) -> f32 {
        match self {
            DualDelayParam::Left        => 1.0,
            DualDelayParam::Right       => 1.0,
            DualDelayParam::Feedback    => 1.0,
            DualDelayParam::CrossFeed   => 1.0,
            DualDelayParam::LowCut      => 1.0,
            DualDelayParam::HighCut     => 1.0,
            DualDelayParam::Rate        => 0.33,
            DualDelayParam::Depth       => 1.0,
            DualDelayParam::Pan         => 1.0,
            DualDelayParam::Mix         => 1.0,
            DualDelayParam::Width       => 1.0,
            DualDelayParam::ReturnLevel => 1.0,
        }
    }
}

impl DualDelayParam {

    #[inline] pub fn new_runtime() -> DualDelayParamArrayRT {
        DualDelayParamArrayRT::new_with(|x| match x {
            DualDelayParam::Left        => DualDelayParamRT::new(DualDelayParam::Left     ),
            DualDelayParam::Right       => DualDelayParamRT::new(DualDelayParam::Right    ),
            DualDelayParam::Feedback    => DualDelayParamRT::new(DualDelayParam::Feedback ),
            DualDelayParam::CrossFeed   => DualDelayParamRT::new(DualDelayParam::CrossFeed),
            DualDelayParam::LowCut      => DualDelayParamRT::new(DualDelayParam::LowCut   ),
            DualDelayParam::HighCut     => DualDelayParamRT::new(DualDelayParam::HighCut  ),
            DualDelayParam::Rate        => DualDelayParamRT::new(DualDelayParam::Rate     ),
            DualDelayParam::Depth       => DualDelayParamRT::new(DualDelayParam::Depth    ),
            DualDelayParam::Pan         => DualDelayParamRT::new(DualDelayParam::Pan      ),
            DualDelayParam::Mix         => DualDelayParamRT::new(DualDelayParam::Mix      ),
            DualDelayParam::Width       => DualDelayParamRT::new(DualDelayParam::Width    ),
            DualDelayParam::ReturnLevel => DualDelayParamRT::new(DualDelayParam::ReturnLevel),
        })
    }
}