@@ -14,8 +14,9 @@ public class AudioPluginParameter : INotifyPropertyChanged
1414 public int ParameterIndex { get ; internal set ; }
1515 public string ID { get ; set ; }
1616 public string Name { get ; set ; }
17- public double MinValue { get ; set ; }
18- public double MaxValue { get ; set ; }
17+ public virtual double MinValue { get ; set ; }
18+ public virtual double MaxValue { get ; set ; }
19+ public double RangePower { get ; set ; } = 0 ;
1920 public double DefaultValue { get ; set ; }
2021 public string ValueFormat { get ; set ; }
2122
@@ -61,7 +62,7 @@ public double EditValue
6162 }
6263 }
6364
64- public string DisplayValue { get { return String . Format ( ValueFormat , editValue ) ; } }
65+ public virtual string DisplayValue { get { return String . Format ( ValueFormat , editValue ) ; } }
6566
6667 public double NormalizedProcessValue
6768 {
@@ -83,19 +84,28 @@ public AudioPluginParameter()
8384 ValueFormat = "{0:0.0}" ;
8485 }
8586
86- public static double DbToLinear ( double db )
87+ public static double DBToLinear ( double db )
8788 {
8889 return Math . Pow ( 10.0 , 0.05 * db ) ;
8990 }
9091
91- public double GetValueNormalized ( double value )
92+ public static double LinearToDB ( double linear )
9293 {
93- return ( value - MinValue ) / ( MaxValue - MinValue ) ;
94+ return 20.0 * Math . Log10 ( linear ) ;
9495 }
9596
96- public double GetValueDenormalized ( double value )
97+ public virtual double GetValueNormalized ( double value )
9798 {
98- return MinValue + ( ( MaxValue - MinValue ) * value ) ;
99+ double rangeVal = ( value - MinValue ) / ( MaxValue - MinValue ) ;
100+
101+ return ( RangePower > 0 ) ? Math . Pow ( rangeVal , RangePower ) : rangeVal ;
102+ }
103+
104+ public virtual double GetValueDenormalized ( double value )
105+ {
106+ double rangeVal = ( RangePower > 0 ) ? Math . Pow ( value , 1 / RangePower ) : value ;
107+
108+ return MinValue + ( ( MaxValue - MinValue ) * rangeVal ) ;
99109 }
100110
101111 double prevParamValue ;
@@ -161,4 +171,77 @@ public void OnPropertyChanged(string name)
161171 }
162172 }
163173 }
174+
175+ public class DecibelParameter : AudioPluginParameter
176+ {
177+ public override double MinValue
178+ {
179+ get => base . MinValue ;
180+ set
181+ {
182+ base . MinValue = value ;
183+
184+ linearMin = DBToLinear ( value ) ;
185+ }
186+ }
187+
188+ public override double MaxValue
189+ {
190+ get => base . MaxValue ;
191+
192+ set
193+ {
194+ base . MaxValue = value ;
195+
196+ linearMax = DBToLinear ( value ) ;
197+ }
198+ }
199+
200+ double linearMin ;
201+ double linearMax ;
202+
203+ public DecibelParameter ( )
204+ {
205+ MinValue = double . NegativeInfinity ;
206+ MaxValue = 0 ;
207+ DefaultValue = 0 ;
208+ RangePower = 1.0 / 4.0 ;
209+ ValueFormat = "{0:0.0}dB" ;
210+ }
211+
212+ public override string DisplayValue
213+ {
214+ get
215+ {
216+ if ( double . IsNegativeInfinity ( EditValue ) )
217+ return "-inf dB" ;
218+
219+ return base . DisplayValue ;
220+ }
221+ }
222+
223+ public static double LinearToLog ( double linear )
224+ {
225+ return Math . Pow ( linear , .25 ) ;
226+ }
227+
228+ public static double LogToLinear ( double log )
229+ {
230+ return Math . Pow ( log , 4 ) ;
231+ }
232+
233+ public override double GetValueNormalized ( double value )
234+ {
235+ double rangeVal = ( DBToLinear ( value ) - linearMin ) / ( linearMax - linearMin ) ;
236+
237+ return ( RangePower > 0 ) ? Math . Pow ( rangeVal , RangePower ) : rangeVal ;
238+ }
239+
240+ public override double GetValueDenormalized ( double value )
241+ {
242+ double rangeVal = ( RangePower > 0 ) ? Math . Pow ( value , 1 / RangePower ) : value ;
243+
244+ return LinearToDB ( linearMin + ( ( linearMax - linearMin ) * rangeVal ) ) ;
245+ }
246+ }
164247}
0 commit comments