読者です 読者をやめる 読者になる 読者になる

ミライスタート TECH系ブログ

株式会社ミライスタートのエンジニア達が気になったTECH系の記事等をアップしています!

【swift】【使ってみた】AudioKit 3.1.3

こんにちは。ミライスタートVB(A)erの石井です。

最初は、全部のライブラリを自作で全て作る!
くらいの意気込みでいたのですが、飽きてきm
効率良くアプリを開発を作成するためには妥協を辞さないという
考えにシフトしてきました。

そこで、【備忘】シリーズに引き続き、
【使ってみた】シリーズも掲載していこうと思います。

まずは、AudioKitというものを使ってみました。
github.com
(とりあえず、CocoaPodsはインストールされている前提で記載します。)
1.xcodeの「File」→「New」→「Project」を選択し、プロジェクトを作成する。
 ここでは、AudioKitSampleとして作成します。
f:id:miraistart:20160815151621p:plain

2.プロジェクト作成ディレクトリで、pod installを実行します。
 用意するPodfileファイルの中身は、以下の通りです。

target 'AudioKitSample' do
pod 'AudioKit'
end
f:id:miraistart:20160815153906p:plain

3.生成されたAudioKitSample.xcworkspaceをオープンする。

4.Main.storyboardの最初に表示されるViewControllerに以下を施します。
 
  + ViewControllerにAudioKitをインポート
  + ViewにViewを貼り付け、貼り付けたViewをEZAudioPlotに変更
  + 貼り付けたEZAudioPlotをViewControllerにaudioInputPlotという名前で関連づける
 以上の操作を行ったのが以下のショットとなります

f:id:miraistart:20160816002723p:plain

5.4で追加した行を踏まえて、ViewControllerを以下のように編集
 (サンプルとほぼ同じですが、ラベルに関する処理は排除してます。)

import UIKit
import AudioKit
class ViewController: UIViewController {

    @IBOutlet weak var audioInputPlot: EZAudioPlot!
    
    var mic: AKMicrophone!
    var tracker: AKFrequencyTracker!
    var silence: AKBooster!
    var plot:AKNodeOutputPlot!
    
    let noteFrequencies = [16.35,17.32,18.35,19.45,20.6,21.83,23.12,24.5,25.96,27.5,29.14,30.87]
    let noteNamesWithSharps = ["C", "C♯","D","D♯","E","F","F♯","G","G♯","A","A♯","B"]
    let noteNamesWithFlats = ["C", "D♭","D","E♭","E","F","G♭","G","A♭","A","B♭","B"]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        AKSettings.audioInputEnabled = true
        mic = AKMicrophone()
        tracker = AKFrequencyTracker.init(mic, minimumFrequency: 200, maximumFrequency: 2000)
        silence = AKBooster(tracker, gain: 0)
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        AudioKit.output = silence
        AudioKit.start()
        setupPlot()
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateUI), userInfo: nil, repeats: true)
    }
    
    func setupPlot() {
        plot = AKNodeOutputPlot(mic, frame: audioInputPlot.bounds)
        plot.plotType = .Rolling
        plot.shouldFill = true
        plot.shouldMirror = true
        plot.color = UIColor.blueColor()
        audioInputPlot.addSubview(plot)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func updateUI() {
        
        if tracker.amplitude > 0.1 {
            
            var frequency = Float(tracker.frequency)
            while (frequency > Float(noteFrequencies[noteFrequencies.count-1])) {
                frequency = frequency / 2.0
            }
            while (frequency < Float(noteFrequencies[0])) {
                frequency = frequency * 2.0
            }
            
            var minDistance: Float = 10000.0
            
            for i in 0..<noteFrequencies.count {
                let distance = fabsf(Float(noteFrequencies[i]) - frequency)
                if (distance < minDistance){
                    minDistance = distance
                }
            }
        }else{
            plot.color = UIColor.blueColor()
            
        }
    }
}

実行するとこんな感じ。
f:id:miraistart:20160816005944p:plain

とりあえず、これを時間がある時に弄ってみようと思います。
また何か試したら書いてみます。