|
@@ -181,11 +181,11 @@ static float correctTime = 0.5;
|
|
|
}
|
|
|
|
|
|
- (void)tunerDidUpdate:(Tuner *)tuner output:(TunerOutput *)output {
|
|
|
-// NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
|
|
|
-// if (fabs(self.lastCorrectTime - currentTime) < correctTime) {
|
|
|
-// return;
|
|
|
-// }
|
|
|
-// self.lastCorrectTime = currentTime;
|
|
|
+ NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
|
|
|
+ if (fabs(self.lastCorrectTime - currentTime) < correctTime) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ self.lastCorrectTime = currentTime;
|
|
|
|
|
|
if (output.amplitude < 0.01) {
|
|
|
|
|
@@ -194,28 +194,43 @@ static float correctTime = 0.5;
|
|
|
|
|
|
TunerOutput *transferOutput = [tuner getTransferPitchWithA4Frequency:self.A4Frequence toneChangeRate:self.toneChangeRate output:output];
|
|
|
|
|
|
- self.plateView.gaugeView.value = (NSInteger)transferOutput.distance;
|
|
|
+ /**
|
|
|
+ 如果知道两个音a和b的频率,两个音相距的音分值n可用下列公式计算(类似分贝定义式的形式,目的是为了使指数形式的物理单位线性化,使其化为对数):
|
|
|
+
|
|
|
+ n=1200 *log2(a/b) == 3986 *log10(a/b)
|
|
|
+ */
|
|
|
+ Float32 cents = log2(transferOutput.frequency/transferOutput.midFrequence) * 1200;
|
|
|
+
|
|
|
+ if (lround(transferOutput.frequency) == lround(transferOutput.midFrequence)) {
|
|
|
+ cents = 0;
|
|
|
+ }
|
|
|
+ if (cents > 50) {
|
|
|
+ cents = 50;
|
|
|
+ }
|
|
|
+ else if (cents < -50) {
|
|
|
+ cents = 50;
|
|
|
+ }
|
|
|
|
|
|
- self.bodyView.distance = (NSInteger)transferOutput.distance;
|
|
|
+ self.plateView.gaugeView.value = (NSInteger)cents;
|
|
|
+
|
|
|
+ self.bodyView.distance = (NSInteger)cents;
|
|
|
|
|
|
// 调整频率后
|
|
|
float rate = 0.0;
|
|
|
- if (labs((int)transferOutput.distance) <= 3) {
|
|
|
+ if (labs((int)cents) <= 10) {
|
|
|
self.bodyView.frequenceCorrect = YES;
|
|
|
-// rate = 1;
|
|
|
}
|
|
|
else {
|
|
|
self.bodyView.frequenceCorrect = NO;
|
|
|
-// int distance = abs((int)transferOutput.distance) > 50 ? 50 : abs((int)transferOutput.distance);
|
|
|
-// rate = (50.0 - distance) / 50;
|
|
|
}
|
|
|
- int distance = abs((int)transferOutput.distance) > 50 ? 50 : abs((int)transferOutput.distance);
|
|
|
+ int distance = abs((int)cents) > 50 ? 50 : abs((int)cents);
|
|
|
+
|
|
|
rate = (50.0 - distance) / 50;
|
|
|
self.bodyView.rateFrequence = rate;
|
|
|
if (self.isTransfer == NO) {
|
|
|
|
|
|
self.bodyView.nomalPitch.text = output.pitch;
|
|
|
- self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", output.pitch, output.octave, output.frequency];
|
|
|
+ self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", output.pitch, output.octave, output.midFrequence / 440 *self.A4Frequence];
|
|
|
self.bodyView.preFrequence.text = [NSString stringWithFormat:@"%@%zd",output.prePitch, output.preOctave];
|
|
|
self.bodyView.nextFrequence.text = [NSString stringWithFormat:@"%@%zd",output.nextPitch, output.nextOctave];
|
|
|
}
|
|
@@ -224,7 +239,7 @@ static float correctTime = 0.5;
|
|
|
self.bodyView.transferNomalPitch.text = transferOutput.pitch;
|
|
|
self.bodyView.transferDesc.text = self.settingView.transferPicthDesc;
|
|
|
self.bodyView.transferPitch.text = [NSString stringWithFormat:@"%@",transferOutput.transferPitch];
|
|
|
- self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", transferOutput.transferPitch, transferOutput.transferOctave, transferOutput.frequency];
|
|
|
+ self.bodyView.pitchFrequenceLabel.text = [NSString stringWithFormat:@"%@%zd:%.0fHz", transferOutput.transferPitch, transferOutput.transferOctave, transferOutput.midFrequence];
|
|
|
self.bodyView.preFrequence.text = [NSString stringWithFormat:@"%@%zd",transferOutput.prePitch, transferOutput.preOctave];
|
|
|
self.bodyView.nextFrequence.text = [NSString stringWithFormat:@"%@%zd",transferOutput.nextPitch, transferOutput.nextOctave];
|
|
|
}
|