2015-08-30 11 views
8

Я разрабатываю приложение для аудиоэффектов на OSX с помощью Swift, и меня интересует интеграция эффекта сдвига тона.Pitch Shifting в режиме реального времени с использованием 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 к примеру из учебника для получения дополнительной информации.

Пример для 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() 

    } 
} 
+1

спасибо за сравнялась. –

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

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. –

+0

благодарим вас за предложение @ Donald duck. я буду помнить об этом в следующий раз –