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
143
144
145
146
147
148
149
ix!();

enhanced_enum![
    SSOParam {
        Shape,
        Width,
        SubWidth,
        SubLevel,
        SyncPitch,
        UniSpread,
        UniCount,
        Character,
    }
];

rt![SSOParam];

/*
control_type!{SSOParam;
    (Shape,      PercentBidirectional),
    (Width,      Percent),
    (SubWidth,   Percent),
    (SubLevel,   Percent),
    (SyncPitch,  SyncPitch),
    (UniSpread,  OscSpread),
    (UniCount,   OscCount),
    (Character,  Character),
}

value_type![SSOParam;
    (Shape,      VtFloat),
    (Width,      VtFloat),
    (SubWidth,   VtFloat),
    (SubLevel,   VtFloat),
    (SyncPitch,  VtFloat),
    (UniSpread,  VtFloat),
    (UniCount,   VtInt),  
    Character,   VtInt),
];

moverate![SSOParam;
    (Shape,     1.0),
    (Width,     1.0),
    (SubWidth,  1.0),
    (SubLevel,  1.0),
    (SyncPitch, 1.0),
    (UniSpread, 1.0),
    (UniCount,  1.0),
    (Character, 1.0),
];
*/

impl Param for SSOParam {

    fn control_group(&self) -> ControlGroup { ControlGroup::Osc } 

    fn control_type(&self) -> ControlType {
        match self {
            SSOParam::Shape     => ControlType::PercentBidirectional,
            SSOParam::Width     => ControlType::Percent,
            SSOParam::SubWidth  => ControlType::Percent,
            SSOParam::SubLevel  => ControlType::Percent,
            SSOParam::SyncPitch => ControlType::SyncPitch,
            SSOParam::UniSpread => ControlType::OscSpread,
            SSOParam::UniCount  => ControlType::OscCount,
            SSOParam::Character => ControlType::Character,
        }

    }
    fn default_value(&self) -> PData {
        match self {
            SSOParam::Shape     => PData::Float(0.0),
            SSOParam::Width     => PData::Float(0.5),
            SSOParam::SubWidth  => PData::Float(0.5),
            SSOParam::SubLevel  => PData::Float(0.0),
            SSOParam::SyncPitch => PData::Float(0.0),
            SSOParam::UniSpread => PData::Float(0.2),
            SSOParam::UniCount  => PData::Int(1),
            SSOParam::Character => PData::Int(0),
        }
    }
    fn modulateable(&self) -> bool {
        true
    }
    fn min_value(&self) -> PData {
        match self {
            SSOParam::Shape     => PData::Float(-1.0),
            SSOParam::Width     => PData::Float(0.0), 
            SSOParam::SubWidth  => PData::Float(0.0), 
            SSOParam::SubLevel  => PData::Float(0.0), 
            SSOParam::SyncPitch => PData::Float(0.0), 
            SSOParam::UniSpread => PData::Float(0.0), 
            SSOParam::UniCount  => PData::Int(1),     
            SSOParam::Character => PData::Int(0),
        }
    }
    fn max_value(&self) -> PData {
        match self {
            SSOParam::Shape     => PData::Float(1.0), 
            SSOParam::Width     => PData::Float(1.0), 
            SSOParam::SubWidth  => PData::Float(1.0), 
            SSOParam::SubLevel  => PData::Float(1.0), 
            SSOParam::SyncPitch => PData::Float(60.0),
            SSOParam::UniSpread => PData::Float(1.0), 
            SSOParam::UniCount  => PData::Int(16),    
            SSOParam::Character => PData::Int(2),
        }
    }
    fn value_type(&self) -> ValType {
        match self {
            SSOParam::Shape     => ValType::VtFloat,
            SSOParam::Width     => ValType::VtFloat,
            SSOParam::SubWidth  => ValType::VtFloat,
            SSOParam::SubLevel  => ValType::VtFloat,
            SSOParam::SyncPitch => ValType::VtFloat,
            SSOParam::UniSpread => ValType::VtFloat,
            SSOParam::UniCount  => ValType::VtInt,  
            SSOParam::Character => ValType::VtInt,
        }
    }
    fn moverate(&self) -> f32 {
        match self {
            SSOParam::Shape     => 1.0,
            SSOParam::Width     => 1.0,
            SSOParam::SubWidth  => 1.0,
            SSOParam::SubLevel  => 1.0,
            SSOParam::SyncPitch => 1.0,
            SSOParam::UniSpread => 1.0,
            SSOParam::UniCount  => 1.0,
            SSOParam::Character => 1.0,
        }
    }
}


impl SSOParam {
    #[inline] pub fn new_runtime() -> SSOParamArrayRT {
        SSOParamArrayRT::new_with(|x| match x {
            SSOParam::Shape     => SSOParamRT::new(SSOParam::Shape     ),
            SSOParam::Width     => SSOParamRT::new(SSOParam::Width     ),
            SSOParam::SubWidth  => SSOParamRT::new(SSOParam::SubWidth  ),
            SSOParam::SubLevel  => SSOParamRT::new(SSOParam::SubLevel  ),
            SSOParam::SyncPitch => SSOParamRT::new(SSOParam::SyncPitch ),
            SSOParam::UniSpread => SSOParamRT::new(SSOParam::UniSpread ),
            SSOParam::UniCount  => SSOParamRT::new(SSOParam::UniCount  ),
            SSOParam::Character => SSOParamRT::new(SSOParam::Character ),
        })
    }
}