Skip to content

Commit 80dd5eb

Browse files
committed
Added DecibelParameter and RangPower.
1 parent 9f65ba1 commit 80dd5eb

5 files changed

Lines changed: 114 additions & 17 deletions

File tree

AudioPlugSharp/AudioPluginParameter.cs

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

JackHostTest/Program.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ internal class Program
88
{
99
static void Main(string[] args)
1010
{
11+
var dec = new DecibelParameter
12+
{
13+
ID = "gain",
14+
Name = "Gain",
15+
//MinValue = -20,
16+
//MaxValue = 20,
17+
DefaultValue = 0,
18+
ValueFormat = "{0:0.0}dB"
19+
};
20+
21+
double denorm = dec.GetValueDenormalized(0.5);
22+
23+
1124
JackHost<SimpleExamplePlugin> host = new JackHost<SimpleExamplePlugin>(new SimpleExamplePlugin());
1225

1326
host.Run();

MidiExample/MidiExamplePlugin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public override void Process()
7070
{
7171
base.Process();
7272

73-
linearGain = AudioPluginParameter.DbToLinear(gainParameter.ProcessValue);
73+
linearGain = AudioPluginParameter.DBToLinear(gainParameter.ProcessValue);
7474

7575
Span<double> outSamples = monoOutput.GetAudioBuffer(0);
7676

@@ -96,7 +96,7 @@ public override void Process()
9696
// If we need to update our gain paramter, get the sample-accurate interpolated value
9797
if (needGainUpdate)
9898
{
99-
linearGain = AudioPluginParameter.DbToLinear(gainParameter.GetInterpolatedProcessValue(i));
99+
linearGain = AudioPluginParameter.DBToLinear(gainParameter.GetInterpolatedProcessValue(i));
100100
}
101101

102102
outSamples[i] = Math.Sin(((double)samplesSoFar * 2 * Math.PI * freq) / Host.SampleRate) * noteVolume * linearGain;

SimpleExample/SimpleExamplePlugin.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,14 @@ public override void Initialize()
3030
InputPorts = new AudioIOPort[] { monoInput = new FloatAudioIOPort("Mono Input", EAudioChannelConfiguration.Mono) };
3131
OutputPorts = new AudioIOPort[] { monoOutput = new FloatAudioIOPort("Mono Output", EAudioChannelConfiguration.Mono) };
3232

33-
AddParameter(new AudioPluginParameter
33+
AddParameter(new DecibelParameter
3434
{
3535
ID = "gain",
3636
Name = "Gain",
37-
MinValue = -20,
38-
MaxValue = 20,
39-
DefaultValue = 0,
37+
MaxValue = 12,
38+
//MinValue = -20,
39+
//MaxValue = 20,
40+
//DefaultValue = 0,
4041
ValueFormat = "{0:0.0}dB"
4142
});
4243
}
@@ -50,7 +51,7 @@ public override void Process()
5051
Host.ProcessAllEvents();
5152

5253
double gainDb = GetParameter("gain").ProcessValue;
53-
float linearGain = (float)AudioPluginParameter.DbToLinear(gainDb);
54+
float linearGain = (float)AudioPluginParameter.DBToLinear(gainDb);
5455

5556
ReadOnlySpan<float> inSamples = monoInput.GetAudioBuffer(0);
5657
Span<float> outSamples = monoOutput.GetAudioBuffer(0);

WPFExample/WPFExamplePlugin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public override void Process()
7070
int currentSample = 0;
7171
int nextSample = 0;
7272

73-
double linearGain = AudioPluginParameter.DbToLinear(gainParameter.ProcessValue);
73+
double linearGain = AudioPluginParameter.DBToLinear(gainParameter.ProcessValue);
7474
double pan = panParameter.ProcessValue;
7575

7676
do
@@ -84,7 +84,7 @@ public override void Process()
8484
{
8585
if (needGainUpdate)
8686
{
87-
linearGain = AudioPluginParameter.DbToLinear(gainParameter.GetInterpolatedProcessValue(i));
87+
linearGain = AudioPluginParameter.DBToLinear(gainParameter.GetInterpolatedProcessValue(i));
8888
}
8989

9090
if (needPanUpdate)

0 commit comments

Comments
 (0)