iOSでピッチ解析(2)

BY TOMOHIRO NAGASAKI

前回の続きで、Pure DataをiOS上で動作させるlibpdを使って、音のピッチ解析をしてみます。PdからApp側に値を送るところを実装してみます。

iOSでピッチ解析(2)

3. ピッチ解析用のPdパッチを作成
4. PdからAppへ値の受け渡し

3. ピッチ解析用のPdパッチを作成

ピッチ解析用のPdパッチを作ります。こんな感じです。

pitchdetection

パッチの内容は簡単に

adc~ : iOS端末のマイク入力を取得します。
sigmund~ : ピッチ解析をします。様々なオプションがありますが、「pitch」「env」を指定すると、入力された音のピッチ(MIDIノートナンバー)とボリュームが解析出来ます。
mtof : MIDIノートナンバーを周波数に変換します。
send : オブジェクト同士を接続せずに値を送信するオブジェクトです。接続の識別のために名前を付けます。この仕組みを使ってPdパッチからAppへピッチ情報を送ります。

出来たパッチを pitchdetection.pd という名前で保存し、PdTest01プロジェクトに追加します。

4. PdからAppへ値の受け渡し

ピッチ情報を受け取るコードを実装します。Pdパッチを読み込む部分は、ファイル名変更だけでOKです。

PdTest01AppDelegate.m – application:didFinishLaunchingWithOptions: 内

Pdパッチから送信されるsend オブジェクトの値は、コールバックで受け取れます。以下の3行を追加します。デリゲートをセットし、どのメッセージを受け取るかを決めます。subscribe: はPdパッチのsendオブジェクトに指定した名前を設定します。

コールバックは受け取る値の形式によっていくつかメソッドが用意されています。sigmund~のピッチ情報はfloat値で送信されるので

を使います。以下のようにメソッドを追加します。

Pdパッチのsendオブジェクトに設定した名前と値がセットで受け取れるので、文字列で判別して使います。その後、その値を表示してみました。

PitchDetection on iPhone

今回は数値をそのまま表示しましたが、得られた数値を使ってグラフィックを変えたり、音の生成に使ったり、など、いろいろ出来そうです。
また、libpdに含まれていないPdオブジェクトも、ケースバイケースではありますが、iOSでも使える場合があるので、ソースコードを眺めてみるのもいいかもしれません。