Pitch Shifting is not working on my code
Hi, I'm trying to make simple Pitch Shifting demo using TheAmazingAudioEngine.
i just came from http://forum.theamazingaudioengine.com/discussion/778/how-to-create-a-pitch-shifting-whammy-effect/p1
Here are my code parts to create AEAudioController and control Pitch Shifting.
1. AEAudioController
AEAudioController* audioController;
audioController = [[AEAudioController alloc] initWithAudioDescription:AEAudioStreamBasicDescriptionNonInterleavedFloatStereo inputEnabled:YES];
audioController.preferredBufferDuration = 0.005;
audioController.useMeasurementMode = YES;
[audioController start:NULL];
- Play sound
(IBAction)actionPlayer:(id)sender{
filePath = [[NSBundle mainBundle] pathForResource:@heart ofType:@wav];
if (isPlaying) {
[audioController removeChannels:@[self.player]];
self.player = nil;
[self.imgPlayer setImage:[UIImage imageNamed:@play.png]];
isPlaying = NO;
}else{
NSURL* fileUrl = [NSURL fileURLWithPath:filePath];
NSError* error = nil;
self.player = [[AEAudioFilePlayer alloc] initWithURL:fileUrl error:&error];
if (!self.player) {
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@alert message:@Couldn't open playback preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
return;
}
self.player.removeUponFinish = YES;
__weak ViewController* weakSelf = self;
self.player.completionBlock = ^{
ViewController* strongSelf = weakSelf;
[strongSelf.imgPlayer setImage:[UIImage imageNamed:@pause.png]];
weakSelf.player = nil;
};
[audioController addChannels:@[self.player]];
isPlaying = YES;
}
}
- Pitch Shifting Mode
(IBAction)actionPitchSlide:(id)sender{
UISlider* slider = (UISlider*)sender;
float pitchValue = slider.value;
if (pitchValue >= self.pichSlider.maximumValue) {
pitchValue = self.pichSlider.maximumValue;
}
if (pitchValue <= self.pichSlider.minimumValue) {
pitchValue = self.pichSlider.minimumValue;
}
currentPitchValue = pitchValue;
[self.lblPitchValue setText:[NSString stringWithFormat:@%.1f cents,pitchValue]];AEAudioUnitFilter* pitchFilter = [[AEAudioUnitFilter alloc] initWithComponentDescription:AEAudioComponentDescriptionMake(kAudioUnitManufacturer_Apple, kAudioUnitType_Effect, kAudioUnitSubType_NewTimePitch) preInitializeBlock:nil];
[pitchFilter setupWithAudioController:audioController];
OSStatus status = AudioUnitSetParameter(pitchFilter.audioUnit, kNewTimePitchParam_Pitch, kAudioUnitScope_Global, 0, pitchValue, 0);
if (status == noErr) {
NSArray* array = audioController.channels;
id channel = audioController.channels[0];
[audioController addFilter:pitchFilter];
}
}
Currently I'm using Xcode7.1. Above code is not changing pitch. And it's taking several errors like memory.
There are the log for that:
2016-01-19 13:31:47.776 PitchShift[12942:811774] TAAE: Setting audio session category to AVAudioSessionCategoryPlayAndRecord
2016-01-19 13:31:47.778 PitchShift[12942:811774] TAAE: Audio session initialized (input available, audio route '') HW samplerate: 44100
2016-01-19 13:31:47.790 PitchShift[12942:811774] TAAE: Input status updated (2 channel, non-interleaved)
2016-01-19 13:31:47.831 PitchShift[12942:811774] TAAE: Engine setup
2016-01-19 13:31:47.831 PitchShift[12942:811774] TAAE: Buffer duration 0.0029, 128 frames (requested 0.005s, 221 frames)
2016-01-19 13:31:47.832 PitchShift[12942:811774] TAAE: Starting Engine
2016-01-19 13:32:13.576 PitchShift[12942:811940] TAAE: Warning: render took too long (0.001728s, 59.53% of budget). Expect glitches.
2016-01-19 13:32:14.344 PitchShift[12942:811774] TAAE: Warning: Maximum number of callbacks reached
2016-01-19 13:32:14.366 PitchShift[12942:811774] TAAE: Warning: Maximum number of callbacks reached
2016-01-19 13:32:43.577 PitchShift[12942:811940] TAAE: Warning: render took too long (0.001742s, 60.02% of budget). Expect glitches.
So, i think currently Pitch Shifting engine is not working on my code.
Please help me how can i fix this issue.
Thanks
Alex Adam
Comments
Hi Michael
Can you help me?
Hi Alex,
Try removing this line:
[pitchFilter setupWithAudioController:audioController];
and replacing it with this line:[audioController addFilter:pitchFilter];
You can also remove that if statement.Check out AENewPitchTimeFilter. It's just a wrapper for this Audio Unit, but it's a bit easier to work with.