-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMeterTableOC.m
More file actions
90 lines (63 loc) · 1.87 KB
/
MeterTableOC.m
File metadata and controls
90 lines (63 loc) · 1.87 KB
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
//
// MeterTableOC.m
//
#import "MeterTableOC.h"
float inMinDecibels = -80.0;
size_t inTableSize = 400;
float inRoot = 2.0;
@implementation MeterTableOC
-(double)dbToAmp:(double)inDb
{
return pow(10.0, 0.05 * inDb);
}
-(void)setupWithMinDB:(float)minDB tableSize:(size_t)inTableSize root:(float)aRoot{
mMinDecibels = minDB;
mDecibelResolution = mMinDecibels / (inTableSize - 1);
mScaleFactor = 1.0 / mDecibelResolution;
NSAssert((inMinDecibels <= 0.0),@"MeterTable inMinDecibels must be negative");
mTable = [NSMutableArray arrayWithCapacity:inTableSize];
double minAmp = [self dbToAmp:inMinDecibels];
double ampRange = 1.0 - minAmp;
double invAmpRange = 1.0 / ampRange;
double rroot = 1.0 / aRoot;
for (size_t i = 0; i < inTableSize; ++i) {
double decibels = i * mDecibelResolution;
double amp = [self dbToAmp:decibels];
double adjAmp = (amp - minAmp) * invAmpRange;
[mTable addObject:[NSNumber numberWithFloat:pow(adjAmp, rroot)]];
}
}
-(id)initWithMinDB:(float)minDB tableSize:(size_t)aTableSize root:(float)aRoot
{
self = [super init];
if (self) {
[self setupWithMinDB:minDB tableSize:aTableSize root:aRoot];
}
return self;
}
-(id)initWithMinDB:(float)minDB
{
self = [super init];
if (self) {
[self setupWithMinDB:minDB tableSize:inTableSize root:inRoot];
}
return self;
}
-(id)init{
self = [super init];
if (self) {
[self setupWithMinDB:inMinDecibels tableSize:inTableSize root:inRoot];
}
return self;
}
-(float)valueAt:(float)inDecibels
{
if (inDecibels < mMinDecibels) return 0.0;
if (inDecibels >= 0.0) return 1.0;
int index = (int)(inDecibels * mScaleFactor);
if (index < mTable.count) {
return [[mTable objectAtIndex:index] floatValue];
}
return 1.0;
}
@end