Real-time Pitch Shift Using AVAudioEngine Using Swift

I am developing the Sound Effects application on OSX using Swift, and I'm interested in integrating the tone shift effect.

I would like to change the tone up or down by an octave in real time. Currently, I only receive a dry signal.

I am not sure if this is possible at all, and would like to know if it is possible or any help or suggestions that anyone might have.

The current code related to the problem is as follows:

import Cocoa import AVFoundation class ViewController: NSViewController { var engine = AVAudioEngine() var timePitch = AVAudioUnitTimePitch() override func viewDidLoad() { timePitch.pitch = 1200 // Setup engine and node instances var mixer = engine.mainMixerNode var input = engine.inputNode var output = engine.outputNode var format = input.inputFormatForBus(0) var error:NSError? engine.attachNode(timePitch) engine.connect(input, to: timePitch, format: format) engine.connect(timePitch, to: output, format: format) engine.startAndReturnError(&error) super.viewDidLoad() } override var representedObject: AnyObject? { didSet { // Update the view, if already loaded. } } } 
+8
swift avfoundation pitch pitch-shifting
source share
2 answers
 timePitch.pitch = -500 //Rude man voice timePitch.rate = 1.5 //In 1.5 times faster 

Check this tutorial . And a direct link to an example from a textbook for more information.

Example for Swift 2.0:

 import UIKit import AVFoundation class ViewController: UIViewController { var engine: AVAudioEngine! var player: AVAudioPlayerNode! var file = AVAudioFile() override func viewDidLoad() { super.viewDidLoad() engine = AVAudioEngine() player = AVAudioPlayerNode() player.volume = 1.0 let path = NSBundle.mainBundle().pathForResource("in", ofType: "caf")! let url = NSURL.fileURLWithPath(path) let file = try? AVAudioFile(forReading: url) let buffer = AVAudioPCMBuffer(PCMFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length)) do { try file!.readIntoBuffer(buffer) } catch _ { } let pitch = AVAudioUnitTimePitch() // pitch.pitch = -500 //Distortion pitch.rate = 1.5 //Voice speed // engine.attachNode(player) engine.attachNode(pitch) engine.connect(player, to: pitch, format: buffer.format) engine.connect(pitch, to: engine.mainMixerNode, format: buffer.format) player.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Loops, completionHandler: nil) engine.prepare() do { try engine.start() } catch _ { } player.play() } } 
+4
source share
 timePitch.pitch = 1000 //Filtered Voice timePitch.rate = 1 //Normal rate 
0
source share

All Articles