8

Swift を使用して OSX でオーディオ エフェクト アプリケーションを開発しています。ピッチ シフト エフェクトの統合に興味があります。

リアルタイムで音色を1オクターブ上げたり下げたりしたいです。現在、ドライ信号しか受信していません。

これが可能かどうかはまったくわかりませんが、これが可能かどうか、または誰かが持っている可能性のある助けや提案があるかどうかを知りたいです.

問題に関連する現在のコードは次のとおりです。

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

2 に答える 2

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

このチュートリアルを確認してください。詳細については、チュートリアルの例への直接リンクを参照してください。

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()

    }
}
于 2015-08-30T17:36:28.427 に答える
0
timePitch.pitch = 1000 //Filtered Voice
timePitch.rate = 1 //Normal rate
于 2017-02-08T11:51:26.563 に答える