簡易アタック検出を行う External Object をつくってみた:Max/MSP, Max SDK, DSP

簡易アタック検出オブジェクトをつくってみた

Max SDKで、まずは手短に実装できてライブで役に立ちそうな物を練習がてら作ってみました。「オーディオを読み込んでアタック部分を検出するオブジェクト」です。上記の動画がデモになります。右下のリストに、アタック部分の開始タイミング(ms)が入り、選択すると音の頭から再生が始まっています。

今回のエクスターナルオブジェクトの作成で、Max SDKを使えば、非リアルタイムにバッファをいじって、1サンプル毎の処理をかけるという事も確かめられました。

プログラムの簡単な解説

  1. 音声バッファをフレームに分割
  2. フレーム毎に振幅の最大値を計算
  3. フレーム間の振幅の差分を計算
  4. 差分がある一定の大きさ以上であればアタック

という結構簡単な処理で上記のような結果を得られました。

ただし楽曲などの複雑なオーディオ信号の場合は失敗してしまいます。もっと精度の良い検出をしたければ、各フレームに対してFFTを使って周波数領域にした上で、振幅や位相の変化から検出したりすると精度があがるようです。今後やってみたいです。

参考文献

Max SDK のサンプルプロジェクトから自分のプロジェクトをつくる:Max/MSP, Max SDK, Xcode

プロジェクトを作ってみよう

前回はMax SDK 付属のサンプルプロジェクトをコンパイルし、エクスターナルオブジェクトが作成できる事を確認しました。今回は、サンプルプロジェクトから自分のプロジェクトを作成してみます。

プロジェクトフォルダのコピー

スクリーンショット 2013-01-25 17.01.57

/MaxSDK-6.0.4/example/basics 内のsimplemax等のフォルダをコピペします。そのコピーしたフォルダ名を好きなオブジェクト名に変更してください。(例えば mirrorboy.object ちなみに接頭語としてmirrorboyをつけたのは自分のオブジェクトであることを認識しやすいようにです。 )

プロジェクト名の変更

スクリーンショット 2013-01-25 17.06.02

そのフォルダ内のプロジェクトを開きます。まだ以前のプロジェクト名になっているので、左のリストからプロジェクトのトップを選択後、右上の方にあるIdentity → Project Name の設定欄から、プロジェクト名を mirrorboy.object などの名称に変更します。

参考:Xcode 4でプロジェクトの名称変更

 

オブジェクト名の変更

エクスターナルオブジェクトの名称は、*.c ファイルの class_new の第一引数で設定されているので、ここを”mirrorboy.object”等に変更します。ここまで出来ればコンパイルが通り,名称変更後のエクスターナルオブジェクトが作成されます。*.c ファイル内の変数名や.maxhlepファイルも置換で直しておくとより良いです。

 

Max.app 上でオブジェクトを作成し確認

スクリーンショット 2013-01-25 17.17.27

自分のプロジェクトでコンパイルしたエクスターナルオブジェクトがインスタンス化できる事を確認しました。あとは好き勝手に開発するだけでOKです。

Max SDK のサンプルプロジェクトから External Object を作成:Max/MSP, Max SDK, C

Max/MSPを使ったアプリケーションを実装する際に、音に関して非リアルタイム && 1sample毎に信号処理したい(例えば、読み込んだ音声波形を再生する前にグリッチしたり、音のアタック部分だけを分析したりといった事。)欲求が高まってきました。期待をいだいて GEN や Max in JavaScript に手をだしたんですが、それらでは不可能だったので遂にMax SDKに手を出し始めましたよ!

これからMax SDKを使ったエクスターナルオブジェクト作成について書いてみたいと思います。ちなみにMac OS 10.8 / Xcode 4 の環境でやります。またJavaじゃなくてC言語なのは、少し前にArduinoをやってC言語を勉強したからです。

準備

SDKのダウンロード先 →  Max SDK

ダウンロードしたフォルダ MaxSDK-6.0.4を適当な場所に置きます。自分は /Document/Max 以下に置きました。Maxのサーチパス下に置くとコンパイルしたオブジェクトをMaxが認識してくれるので都合がいいです。

Xcodeプロジェクトを開く

/MaxSDK-6.0.4/examples/basics/ 以下にサンプルプロジェクト(*.xcodeproj)がいくつか入っているので、例えばsimplemax.xcodeproj 開いてみると、Xcodeが立ち上がります。

.xcconfig の修正

スクリーンショット 2013-01-25 4.18.32

このままだとコンパイルが通らないので、/MaxSDK-6.0.4/maxmspsdk.xcconfig の33,34行目を

[javascript]
SDKROOT = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
MACOSX_DEPLOYMENT_TARGET = 10.8
[/javascript]

へと変更します。Mountain Lionには10.6のSDKが入ってないためです。

コンパイル

左上の三角ボタンを押して、コンパイルが完了です。/MaxSDK-6.0.4/sdk-build 以下に simplemax.mxo が作成されている事が確認できます。

Max6を起動

スクリーンショット 2013-01-25 4.23.19

/MaxSDK-6.0.4/sdk-buildフォルダがMaxのサーチパス内に入っていれば、Max6を起動し、simplemaxオブジェクトをインスタンス化する事が出来ます。すでにMaxが起動していた場合は、一旦Max.appを落としてから起動しなおしてください。せっかく作ったこのsimplemaxオブジェクト、実は何も入力を受け付けないオブジェクトなので、何もできないです。

/example 以下には、沢山のサンプルプロジェクトがあるので色々試して見てください。ちなみに全てのサンプルプロジェクトにヘルプパッチ(*.maxhelp)が付いているので、パッチの説明・使用例が見られます。

まとめ

今回は、Max SDK をダウンロードして、Xcodeにてサンプルプロジェクトのコンパイルを行ない、External Objectの作成を行ないました。

補足

プロジェクトフォルダ内になる *.def と *.vcproj は、Win用の開発環境であるVisual Studio 用のファイルのようですので、Macの方は気にしなくて良いようです。

ハッピーチャネル出演するよ〜:Max/MSP

upload

コバルト爆弾αΩで出演させて頂きます。TMUGに通っていたので、まさか自分が出演する事になるとは!アキバ系(?)DVJの文脈をブチ込みに行きたいと思います!

ハッピーチャネル @ SuperDelux

日時 2013.01.19 (sat)
開場 18:00 / 開演 19:00
料金 予約1500円 / 学生1000円 要学生証 / 当日1800円

出演者:
ダブラ彦 (DUB-Russell × 谷口暁彦)
コバルト爆弾αΩ
ふんわりちゃん × 田所 淳

DJ:
しんなりちゃん

転換芸:
FunkyBomberYeah

出展:
POWDER BOX
Flip Driven Theater/ 書籍型インターフェース
いのちの食べ方

“use strict” が有効であるかを確認:Max/MSP, JavaScript

スクリーンショット 2012-12-27 4.38.18

ECMAScript 5 で導入されている “use strict” / strict モードは、JavaScript の機能を制限する代わりにエラーチェック機能やらセキュリティが提供されるモードとの事です。機能の1例としては、var を付けないで変数を宣言するとエラーがでます。というわけで早速 Max6 で “use strict” が使えるか調べてみました。

コード

[javascript]

"use strict"
autowatch = 1;

//strictモードが有効である場合
//関数内ではthisがundefinedになる。

//以下の関数は即時関数であり、宣言時に一度実行され
//結果がhasStrictModeに代入される

var hasStrictMode = (function () {
"use strict";
return this === undefined
}());

function bang() {

//trueが出力され"use strict"が有効である事が確認できる
post("hasStrictMode:" + hasStrictMode);
value = hasStrictMode; //JavaScript Referenceエラーが発生
outlet(0, value); //出力はされない
};

[/javascript]

結果 – Max6で”use strict” は利用可能

実行結果の画像を見ると hasStrictMode : true が出力されており、”use strict” が利用可能である事が確認できます。 var を付けてない value を利用しようとした所で、ちゃんとエラーがでてプログラムが止まっています。加えて、strict モードでない場合も試したのですが、1が出力される事を確認しました。

参考資料

  • JavaScript 第6版 – hasStrictMode のコードは p.117 5.7.3 “use strict” 文より利用させて頂きました。