2017-04-02 6 views
0

サウンドファイルを再生してピッチを変更するプログラムをMac用に作成しようとしています。 は、私は多くのことができます以下の記事を見つけた:私はこれまでのところだのはここ Xcode 8 Swift 3 Pitch-altering soundsサウンドファイルを再生してピッチを適用する - Xcode 8 - Mac

は次のとおりです。

import Cocoa 
import AVFoundation 

let engine = AVAudioEngine() 
let audioPlayerNode = AVAudioPlayerNode() 
let changeAudioUnitTime = AVAudioUnitTimePitch() 
var file = AVAudioFile() 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 
    func applicationDidFinishLaunching(_ aNotification: Notification) 
    {do 
     { 
      if let audioFileURL = Bundle.main.url(forResource: "/Volumes/.../file", withExtension: "m4v") 
      { 
       file = try AVAudioFile(forReading: audioFileURL) 
       audioPlayerNode.scheduleFile(file, at: nil, completionHandler: nil) // File is an AVAudioFile defined previously 
      } 
     }catch let error as NSError { 
      print(error.localizedDescription) 
     } 


    } 

    func setupAudioEngine() 
    { 
     engine.attach(audioPlayerNode) 
     engine.attach(changeAudioUnitTime) 
     engine.connect(audioPlayerNode, to: changeAudioUnitTime, format: nil) 
     engine.connect(changeAudioUnitTime, to: engine.outputNode, format: nil) 
     try? engine.start() 
     audioPlayerNode.play() 
    } 

    func hitSound(value: Float) 
    { 
     changeAudioUnitTime.pitch = value 
    } 

    @IBAction func lanch(_ sender: NSButton) 
    { 
     setupAudioEngine() 
     hitSound(value: 0) 
    } 

    @IBAction func stop(_ sender: NSButton) 
    { 
     exit(0) 
    } 

    func applicationWillTerminate(_ aNotification: Notification) { 
     // Insert code here to tear down your application 
    } 
} 

しかし、ハラス、それは動作しません。 2017-04-02 01:39:44.254866 AVAudioEngine [5508:159993] [中央] 54:エラー:> avae> AVAudioEngine.mm:283:AttachNode:エラーが発生しました。必要な条件は偽です!nodeimpl-> HasEngineImpl() 2017年4月2日01:39:44.255148 AVAudioEngine [5508:159993] [一般]に必要な条件は偽です!nodeimpl-> HasEngineImpl()

誰場合私を助けることができる、私は感謝します。

+0

この行は、間違っているようだ:audioPlayerNode.scheduleFile(時ファイル、:nilに、completionHandler:ゼロ)。アプリをクラッシュさせることがあります。 – Fredo

+0

このコードではファイルを再生していますが、ピッチは適用されません。 applicationDidFinishLaunching(_ aNotification:通知) { レット・パス= "/Volumes/.../Musique/Hind/Musique indienne.m4a" URL = URL(fileURLWithPath:パスを)聞かせて { オーディオファイルは= AVAudioFileを試しください(forReading:url、commonFormat:AVAudioCommonFormat.pcmFormatInt16、interleaved:false) } NSError {print(error.localizedDescription)}のようにcatchエラーを発生させる } – Fredo

答えて

1

次のコードは機能しています。これは "path"変数で定義されたファイルを再生しており、440Hzのディアパソンから432Hzのディアパソン(詳細についてはPlatoのスケールを参照)からリアルタイムでピッチを変更できるようにするには、チェックボックスをクリックしてください。私はそれを作成するためのインターフェイスの画像を追加しました。

import Cocoa 
import AVFoundation 

let engine = AVAudioEngine() 
let audioPlayerNode = AVAudioPlayerNode() 
var changeAudioUnitTime = AVAudioUnitTimePitch() 
var audioFile = AVAudioFile() 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate 
{ 

    @IBOutlet weak var window: NSWindow! 

    @IBOutlet weak var change432: NSButton! 

    func applicationDidFinishLaunching(_ aNotification: Notification) 
    { 
    } 


    func setupAudioEngine() 
    { 
     let path = "/Volumes/.../Musique/Musique indienne.m4a" 
     let url = URL(fileURLWithPath: path) 

     do 
     { 
      audioFile = try AVAudioFile(forReading: url, commonFormat: AVAudioCommonFormat.pcmFormatInt16, interleaved: false) 
     } 
     catch let error as NSError {print(error.localizedDescription)} 

     engine.attach(audioPlayerNode) 
     engine.attach(changeAudioUnitTime) 
     engine.connect(audioPlayerNode, to: changeAudioUnitTime, format: nil) 
     engine.connect(changeAudioUnitTime, to: engine.outputNode, format: nil) 

     audioPlayerNode.scheduleFile(audioFile, at: nil, completionHandler: nil) 

     try? engine.start() 
     audioPlayerNode.play() 
    } 

    @IBAction func changeDiapason(_ sender: NSButton) 
    { 
     if change432.state == NSOnState 
     { 
      changeAudioUnitTime.pitch = -32 // = 432 Hz(valeurs admises de -2400 à 2400, une octave étant 1200 cents). 
     } 
     if change432.state == NSOffState 
     { 
      changeAudioUnitTime.pitch = 1 
     } 

    } 

    @IBAction func lancer(_ sender: NSButton) 
    { 
     setupAudioEngine() 
    } 

    @IBAction func stopper(_ sender: NSButton) 
    { 
     audioPlayerNode.stop() 
     audioPlayerNode.reset() 
     engine.stop() 
     engine.disconnectNodeInput(changeAudioUnitTime) 
     engine.disconnectNodeInput(audioPlayerNode) 
     engine.detach(changeAudioUnitTime) 
     engine.detach(audioPlayerNode) 
     engine.reset() 
     //exit(0) 
    } 

    func applicationWillTerminate(_ aNotification: Notification) 
    { 
     // Insert code here to tear down your application 
    } 
} 

Interface

関連する問題