2015-08-30 109 views
8

我正在使用Swift在OSX上開發一個音頻效果應用程序,並且我對集成音高轉換效果感興趣。用AVAudioEngine使用Swift實時移動音高

我想實時地改變一個八度的音調。目前我只是得到一個乾燥的信號。

我不確定這是否可能,並想知道這是否甚至可能或任何人可能有任何幫助或建議。

與問題相關的現有代碼如下:

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. 
     } 
    } 


} 

回答

4
timePitch.pitch = -500 //Rude man voice 
timePitch.rate = 1.5 //In 1.5 times faster 

檢查this tutorial。並以direct link爲例來說明更多信息。

爲夫特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() 

    } 
} 
+1

非常感謝分享。 –

0
timePitch.pitch = 1000 //Filtered Voice 
timePitch.rate = 1 //Normal rate 
+0

儘管此代碼可能會回答問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文可以提高答案的長期價值。 –

+0

謝謝你的建議@唐老鴨。我將在下一次記住這一點 –