-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAudioConversionHelper.cs
125 lines (105 loc) · 3.77 KB
/
AudioConversionHelper.cs
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
using System;
namespace OBSAudioMixer
{
public class AudioConversionHelper
{
private static float LogOffsetDB = 6.0f;
private static float LogRangeDB = 96.0f;
private static float LogOffsetVal = (float)-Math.Log10(LogOffsetDB);
private static float LogRangeVal = (float)Math.Log10(-LogRangeDB + LogOffsetDB);
public static float MulTodB(float num)
{
return (num == 0.0f) ? float.NegativeInfinity : (20.0f * (float)Math.Log10(num));
}
public static float dBtoMul(float num)
{
return IsFinite(num) ? (float)Math.Pow(10.0f, num / 20.0f) : 0.0f;
}
public static bool IsFinite(float num)
{
return !double.IsInfinity(num) && !double.IsNaN(num);
}
public static float CubicDefTodB(float def)
{
if (def == 1.0f)
return 0.0f;
else if (def <= 0.0f)
return -180;
return MulTodB(def * def * def);
}
public static float CubicdBtoDef(float db)
{
if (db == 0.0f)
return 1.0f;
else if (db <= -180)
return 0.0f;
return (float)Math.Pow(dBtoMul(db), (double)1 / 3);
}
public static float IECDefTodB(float def)
{
if (def == 1.0f)
return 0.0f;
else if (def <= 0.0f)
return float.NegativeInfinity;
float db;
if (def >= 0.75f)
db = (def - 1.0f) / 0.25f * 9.0f;
else if (def >= 0.5f)
db = (def - 0.75f) / 0.25f * 11.0f - 9.0f;
else if (def >= 0.3f)
db = (def - 0.5f) / 0.2f * 10.0f - 20.0f;
else if (def >= 0.15f)
db = (def - 0.3f) / 0.15f * 10.0f - 30.0f;
else if (def >= 0.075f)
db = (def - 0.15f) / 0.075f * 10.0f - 40.0f;
else if (def >= 0.025f)
db = (def - 0.075f) / 0.05f * 10.0f - 50.0f;
else if (def >= 0.001f)
db = (def - 0.025f) / 0.025f * 90.0f - 60.0f;
else
db = float.NegativeInfinity;
return db;
}
public static float IECdBtoDef(float db)
{
if (db == 0.0f)
return 1.0f;
else if (db == float.NegativeInfinity)
return 0.0f;
float def;
if (db >= -9.0f)
def = (db + 9.0f) / 9.0f * 0.25f + 0.75f;
else if (db >= -20.0f)
def = (db + 20.0f) / 11.0f * 0.25f + 0.5f;
else if (db >= -30.0f)
def = (db + 30.0f) / 10.0f * 0.2f + 0.3f;
else if (db >= -40.0f)
def = (db + 40.0f) / 10.0f * 0.15f + 0.15f;
else if (db >= -50.0f)
def = (db + 50.0f) / 10.0f * 0.075f + 0.075f;
else if (db >= -60.0f)
def = (db + 60.0f) / 10.0f * 0.05f + 0.025f;
else if (db >= -114.0f)
def = (db + 150.0f) / 90.0f * 0.025f;
else
def = 0.0f;
return def;
}
public static float LogDefTodB(float def)
{
if (def >= 1.0f)
return 0.0f;
else if (def <= 0.0f)
return float.NegativeInfinity;
return (float)(-(LogRangeDB + LogOffsetDB) * Math.Pow((LogRangeDB + LogOffsetDB) / LogOffsetDB, -def) + LogOffsetDB);
}
public static float LogdBToDef(float db)
{
if (db >= 0.0f)
return 1.0f;
else if (db <= -96.0f)
return 0.0f;
return (float)((-Math.Log10(-db + LogOffsetDB) - LogRangeVal) / (LogOffsetVal - LogRangeVal));
}
}
}