Max+oFでOSCをしてみる

## [01] はじめに＆セットアップ
MaxとopenFrameworksを使って音と同期するアニメーションを作ってみます。
Maxの勉強がてら記事を書いているので、使い方や説明など至らない点もあると思いますが
生温かく見守って下さい。

### Maxとは
> サンフランシスコのソフトウェア企業Cycling '74が開発・保守している音楽とマルチメディア向けのグラフィカルな統合開発環境（ビジュアルプログラミング言語）である。
引用元: [Wikipedia - Max（ソフトウェア）](http://ja.wikipedia.org/wiki/Max_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)

### openFramewokrsとは
> openFrameworks（オープンフレームワークス 略称oF）とは、"「創造的なコーディング」のためのC++のオープンソースツールキット"である。
引用元: [Wikipedia - Max（ソフトウェア）](http://ja.wikipedia.org/wiki/Max_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)

### 何が出来るのか
![alt](http://i.vimeocdn.com/video/500922896_640.jpg)
[Subroutine from Devin Powers on Vimeo](https://vimeo.com/115029466#at=1)

このように音と映像を同期させたり、様々なセンサーと組み合わせることで素晴らしい作品を作ることが出来ます。

### 制作環境

- Mac OSX 10.10.1 Yosemite
- XCode 6.1.1
- Max 7
- openFrameworks 0.8.4


### インストール

oFはこちらからダウンロードし、環境に合わせてセットアップして下さい。
http://openframeworks.jp/download/

Maxは製作元のCycling74のサイトからダウンロードできます。
シェアウェアですが1ヶ月はトライアルで使用できます。
https://cycling74.com/downloads/

▼ 参考
oF: http://qiita.com/WizowozY/items/91afd8d07e6c5d6cf465
Max6: http://qiita.com/shu223/items/38a14ad3efd260faafe0
※ 一つ前のバージョンでUI等異なるので注意

使い方・詳しいインストール方法については別途記事、書籍等を参考にして下さい。

## [02] Maxで音を再生する

mp3ファイルをドラッグするとサウンドが再生するパッチを作ってみます。
調べてみたところ、音を再生するのは`sfplay~`というオブジェクト（でいいのか？）を使うようです。
それで出来たのがこちら。

![006.png](https://qiita-image-store.s3.amazonaws.com/0/36929/5dce86a9-9c21-dce9-7579-3f98b698ee06.png)


Maxで素晴らしいなと思うのはHelp機能が充実しているので、
それっぽい関数を見つけたらとりあえず右クリックでヘルプを見るのが良いと思います。（コピペ最高！）

![003.png](https://qiita-image-store.s3.amazonaws.com/0/36929/dc7b51b9-536f-e72b-51c8-ca71c5181e09.png)


また、ファイルをドラッグドロップするには`dropfile`というオブジェクトを使います。

パッチ画面内にある、**「drag and drop a file here...」**や**「Only mp3 file」**という文字列は`comment`オブジェクトでテキストを配置しています。
名前の通りプログラムにおけるコメント的な扱いですかね。

このバッテンのアイコンはトグルボタンです。
オブジェクト名は`toggle`、クリックするとOn/Offが切り替わります。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/36929/e4c43f1a-a84d-4870-bba0-736d62e6786c.png)

そしてこちらが、`message`オブジェクトです。
ボタンがtrue or falseを送るのに対し、`message`は文字列などを送ります。（ここ適当に書いてます。誰か詳しい人..）
![005.png](https://qiita-image-store.s3.amazonaws.com/0/36929/74e369fa-ac30-d231-8ca9-687af663502c.png)

さらに続きます。
こちらが本家`button`。押してる時だけONになる（のではないでしょうか）。
![008.png](https://qiita-image-store.s3.amazonaws.com/0/36929/afcda73f-1ebb-873f-a35b-916dc8d3bdd2.png)

このいかにも音を再生します感溢れるボタンですが、これは`ezdac~`というもので、詳しくはこちらのWebサイトをご覧ください。開いているMaxパッチ全体の音のON/OFFかなと思います。
http://www.s-musiclab.jp/mmj_docs/max5/msp/msp_tutorial/max5_mstu03.html
![009.png](https://qiita-image-store.s3.amazonaws.com/0/36929/3e51071b-dfba-f54d-c46f-14d4ea321a4d.png)

これはゲージです。ステレオの。と思いきやスライダーを移動するとゲイン（入力信号の大きさ）を変更出来ます。ギターアンプとかにあるGainと一緒ですね。
オブジェクト名は`live.gain`です。上のメニューの**Max for Live Object**の中にあります。
![010.png](https://qiita-image-store.s3.amazonaws.com/0/36929/41d82e5e-8a03-82e1-ec11-b61328a4048e.png)


パッチの組み方はMax内にある`sfplay`のサンプルをそのまま持ってきているので、それぞれにどんな意味があるのがよくわかっていません。ごめんなさい。

#### 使ったオブジェクト
ざっくりですがまとめます。

-`dropfile`: ファイルをドラッグドロップで開く
-`sfplay~`: 音源の再生に使う
-`comment`: コメント
-`message`: メッセージ（信号）を送る
-`toggle`: ON / OFFの切り替え
-`button`: 押してる時だON
-`ezdac~`: 全体のサウンドのON/OFF
-`live.gain`: 入力信号の大きさ変える


## [03] Maxでmp3のFFTデータを取得

一応これが完成図です。
なんかすごく無駄がある気もしないでもないですが、
とりあえずmp3のFFTデータが取得できてOSCで通信もできています。

![007.png](https://qiita-image-store.s3.amazonaws.com/0/36929/a226c711-e3c9-8c21-bd33-67e30a4591ae.png)


`live.gain`のアウトから`pfft~`というオブジェクトでFFTを取得できます。
`pfft~`についてはこちらのページに詳しくまとめられているので、詳しく知りたい方はご覧ください。
http://www.shonan.ne.jp/~hiro-s/mmj_docs/msp/msp_tutorial/mstu26.html

そういえば、FFTとOSCの説明をしていなかったのでWikipediaの注釈置いておきますね。

**FFTとは**
高速フーリエ変換（こうそくフーリエへんかん、英: Fast Fourier Transform、FFT）とは、離散フーリエ変換 (Discrete Fourier Transform、DFT) を計算機上で高速に計算するアルゴリズム。

**OSCとは**
OpenSound Control（OSC）とは、電子楽器（特にシンセサイザー）やコンピュータなどの機器において音楽演奏データをネットワーク経由でリアルタイムに共有するための通信プロトコルである。

簡単にいうとFFTはアナログ→デジタルへの変換を高速にしたもの、それにより逐次データを解析出来るのでリアルタイムでビジュアライズ出来るね！OSCはもともと電子楽器の連携のために使われた通信規格だけど便利だから普通のデータ通信にも使えるね！という認識で良いかと。

本題に戻り、MaxでFFTまでは出来たので、次はそれをoFに飛ばします。
それには、`udpsend`というオブジェクトを使います。

```lang:Max
udpsend IPアドレス ポート番号
```

という形式でオブジェクトを作成します。
ここはデフォルトの通り、IPアドレスは`127.0.0.1`でポートは`7400`で大丈夫だと思います。
ただし他のアプリなどで同じIPとポートを使っているとうまく動作しないので、動かない場合は適宜変更してください。

その際、OSCがきちんと動いているかチェックするのには、ファイルメニューから「Extras -> UDP Tester」を使うとデバッグが楽です。
![011.png](https://qiita-image-store.s3.amazonaws.com/0/36929/ceffc159-0d56-c542-d4c4-38e27473445d.png)

OSCで値がきちんと送られているのを確認出来たら、Maxでの実装は完了です。

## [04] oFでOSCを受信する

oFについては、ここで説明するよりも素晴らしいリソースがあるのでそちらをご覧下さい。
yoppa氏のこの記事が参考になります。
http://yoppa.org/ma2_10/2279.html

また、**openFramewokrs/examples/addons/oscReceiveExample** をそのまま使っても良いと思います。

## 04) 出来上がり
Maxパッチで音を再生しながら、oFのプロジェクトをビルドすると下の画像の用に真ん中の球の大きさが音に同期して変わります。
ビジュアライズがクソしょぼいのは見なかったことにして下さい。
（心の声：なるべくコードをシンプルにしたかった！）

![012.png](https://qiita-image-store.s3.amazonaws.com/0/36929/8dd2ed0f-0cac-efa2-1bfd-6584e40b9106.png)


## [05] GitHub
Max7用のパッチとoFのXcodeプロジェクトをアップしました。
中に入っているmp3はご自由にお使い下さい。
https://github.com/hisahayashi/Max-to-oF-OSC-Sample

以上