Novation Launchpadのmonome EmulatorをGoogle Codeに移しました。

monomeemu02


www.maxforlive.comを使わせてもらってるけど、だんだんメンテが厳しくなってきたので、最新安定版のダウンロードとコメントの機能は残してGoogle Codeに移しました。


http://code.google.com/p/monomeemu/


monomeのフォーラムだとここがメインです。
英語オンリーな雰囲気ですが・・・。


[更新]v0.9.3
パラメータのlive setへの保存。
monome256のエミュレートpatchの追加。
複数台のlaunchpadのサポート(少しだけ)。

[更新]v0.9.5a1
AutoConfigrationのサポート(AutoConfigrationの仕様はここここ
AutoConfigrationに対応してるsevenUpのテスト版はここ


要望が多かったのでmonorouteみたくLaunchpad1台で複数のアプリを動かすように拡張して、ユーザさんにテストしてもらってます。機能実装が落ち着いたら、プリセットの保存あたりでしょうか。user1のモードだとMax for LiveでButton_Matrixのイベントを拾えんのですが仕様なんでしょうか?って、こんなの誰に聞けばいいのか(苦笑

ちゃちゃっと作って放流して終了のはずが、何だか引き際が見つからず。

launchpadのmonomeエミュレータを地味にアップデート

monomeEmu091


ユーザ2以外のモード(セッションとかミキサーとか)に切り替えても、LEDとボタンの反応が反映されっぱなしで、遊べるけど実務的には使い物にならんかったので対策しました。monomeお試し版みたいな感じだから、そのままちょっと不便なくらいでも良かったんだけど。。。あと、OSCのポートを変更できるようにしたり、少しGUIを調整。

http://www.maxforlive.com/library/device.php?id=141


monomeの掲示板で紹介してくれてるみたいですが。恐縮ですというか、すんませんというか・・・。気に入ったらmonomeかPICnome買ってね。

Novation Launchpadのためのmonome Emulator

DSC00328


う、何か久しぶりに書くなー。


なんとなく冷やかし半分でNovation Launchpadを買っちゃったけど、いつ壊れても惜しくないお値段と小さくて軽いサイズなんで、(あまり物体として愛着の無いのも含めて)出先でちょっと使うにはイイかも。自分のPICnomeは木製でめちゃ重いのです。それに不用意に持ち出すと壊われそう。。。


Max for LiveのLive Object Model(LOM)の練習とLaunchpad制御のテストとして丁度良いので、monomeとして動作させるMax for LiveのPatchをさくっとつくってみた。maxforlive.comさんとこにアップしときましたので、使ったろーという人はどうぞ。DLにアカウント必要だから違うところのほうが良かったかな・・・。
http://www.maxforlive.com/library/device.php?id=141


monomeEmuDevice


まだ、あんまりちゃんと動作検証してないんでちょっと挙動が怪しいかもです。
strettaさんのmaxforlive monome suiteだと、polygome64だけちゃんと動かないです。
最新版ではstrettaさんのもSevenUpも同時にバッチリ動いとります。


Control SurfaceでLaunchpad選んでUser2モードにしたら動きます。あとはmonomeアプリにあわせてOSCのPrefixを指定してください。strettaさんのやつはアプリ側が/sys/prefixで動的な値を指定してくるので勝手に変わります。もちろん、アプリ側はMax for Liveとか関係ないので、OSC対応なら何でもOKー。
UDPの設定はmonomeの初期値
Launchpad:8080
アプリ:127.0.0.1 8000
で固定です。今のところ。


すでに、monomeエミュレータはpiclaeさんのnonomeとかmax4live.infoさんとこのNomePadとかあるんだけど、M4Lとして使いたいとか、できるだけGUI小さくとか、ボタン同時押しすると挙動が怪しいとか、ちょこちょこ不満があったりなかったり。


CNMATのOSC-routeだと別途DLしてインストールして・・・が煩わしいので、James Drakeさんのoscroute.jsを使わせてもらっとります。便利ですー。

Max for Live とか Live Object Model とか

DSC00213


Max for LiveでLive api使うには専用のMax object(live.object, live.path, live.observer, live.remote~)を使ってPatchでやる方法とMax js objectでjavascriptでやる方法が用意されてる。


PatchでやるほうはHelpも充実してて迷うことも無いけど、javascriptの方はドキュメントにサンプルコードも無くて放置ぎみなので、探り探りやったことまとめ。※以下はLive8.1 b7とb8のもので書いてます。


APIはLive Object Modelとして階層構造になってて、Rootはlive_appとlive_songで、トラック、クリップ、デバイスとかよく使いそうなのはlive_songの中にあります。詳細はMax5.1以降のドキュメントに図があります。Max for LiveのドキュメントはLive側が起動してないと見れないです。


1. API Objectの生成

//空のAPIの生成
var api = new LiveAPI(this.patcher);

//Path指定でAPIの生成(例はトラック1)
var api = new LiveAPI(this.patcher, "live_set", "tracks", 1);
//または
var api = new LiveAPI(this.patcher, "live_set tracks 1");

//ObserverのCallbackを指定してのAPI生成
var api = new LiveAPI(this.patcher, callback);


コンストラクタでPathの引数の書き方が変だと実行時にMaxごと落ちることがあります。API生成後にPath指定することもできます。こっちはPathの書式ミスってもMax落ちないです。


2.Pathの指定

//トラック1の最初のクリップを指定する
api.path = "live_set tracks 0 clip_slots 0 clip";
//または
api.goto("live_set tracks 0 clip_slots 0 clip");


3.Propertyのget/set

//クリップの名前を取得
var name = api.get('name');

//クリップの再生状態を1(つまり再生)にする
api.set('is_playing', 1);


4.Functionの呼び出し

//クリップを再生する
api.call('set_fire_button_state', 1);
//こっちはダメ
//api. set_fire_button_state(1);


ObjectごとのPropertyやFunctionはドキュメントに全部あります。


5.ObserverのCallback

var api = new LiveAPI(this.patcher);
api.path = "live_set tracks 0 clip_slots 0 clip";
//Observerの監視対象にする
api.property = "playing_status";

var callback = function (args) {
	post(args, "\n");
	post("property is", this.property, "\n");
}


上の実装でやると、Callbackが呼ばれるタイミングで2回実行されるのがちょっと謎。根本的に何か間違ってるかも・・・。


6.Children

//トラック1
api.path = "live_set tracks 0";

//戻り値はcanorical_parent ckip_slot devices ......
post(api.children , "\n");

//この戻り値はc
post(api.children[1][0]);

//ということで、戻り値は残念ながらStringです
post(typeof(api.children[1]));

//InstとかEffectをアサインしてるとその数が出ます
post(api.getcount("devices"), "\n");

//デバイスのAPIに対して何かする
var path = "live_set tracks 0";
api.path = path;
for (var i=0; i<api.getcount(api.children[2]); i++) {
	api.path = path + " " + api.children[2] + " " + i;
	//何か処理
	post(api.getcount("parameters", "\n"));
	
	//こっちはダメ。pathのpropertyは「"」入った値になってる
	//api.path += " " + api.children[2] + " " + i;
}


ドキュメントに「Live objects have children identified by name. 」ってあるんですけど、LiveAPIとかその配列が返されると思ったのでちょっと残念。このままだと再帰的に使うときに面倒。

//ソングの再生
var start = function() {
	new LiveAPI(this.patcher, "live_set").call("start_playing");
	//こっちはダメ。goto()の戻り値が0。
	//new LiveAPI(this.patcher).goto("live_set").call("start_playing");
}

//ソングの停止
var stop = function() {
	new LiveAPI(this.patcher, "live_set").call("stop_playing");
}

//トラックのミュート
var mute = function(trackNumber) {
	new LiveAPI(this.patcher, "live_set", "tracks", trackNumber).set("mute", 1);
}

VUSB-MIDI

DSC00197


これを参考にというか、USB-MIDIのDevice DescriptorとConfiguration Descriptorのコードをそのまま拝借しつつ、手元にあったAtmega88pでテスト。実装環境はAVR StudioとAVRISPMkIIをVmware Fusionで。


他のサンプルでも同じだけど、何故かAtmega88でビルドしないとダメな以外は、まぁ、普通に動く。挿したら動く。
電源アダプタ&ドライバ不要は手軽でいいなぁ。


DSC00216


サンプルだとダイオード2本で3.3Vにしてるのを、3.3Vの3端子レギュレータで。
あとは何かやらかす可能性が高いので、ホスト側の保護にUSBの5Vにポリスイッチを入れました。


買ってから分かったけど、このミニBのUSBコネクタはユニバーサル基盤にハンダ付け出来そうにない。どうするんですかね、これ・・・。普通サイズのBタイプ・メスのはこれを参考にさせて頂きました。


簡単なMIDIコン以上のことをVUSBでやるのは厳しいだろうと思いつつ、次はホスト側からのMIDI INをどうにかしてみる。

PICnomeのための木製の箱を作る

DSC00058


家に帰るまでが遠足というか、箱に詰めるまでが工作らしいので、ちょっと頑張って作ってみた。
ちなみに最後にノコギリを使ったのは中学生のときだ(苦笑


材料は

  • 木枠は何となく色で選んだラワン材。性質はよく知らん。800円。
  • 底面は加工しやすそうなMDF材。200円。
  • 3Mのネジ。全部で300円くらい。
  • 防振ゴム。ネジで止めるタイプ。178円。
  • 基盤浮かすスペーサ(高ナット)。プラは気分が盛り下がるので真鍮。300円。

知り合いの家具職人さんには、加工しやすくて縮みが少ないチーク材使えって教わったけど近所のホームセンターにはなかった。トップのフェイスプレートはもちろんthworksさんのやつ。


塗料は

最終的な質感は木目の具合と着色で決まる感じですね。調達はギャラップで。木材もここで探せばよかった。


使った道具は

  • ノコギリ
  • ソーガイド
  • 圧着する道具いろいろ(クリップ、クランプとかベルトのやつとか)
  • ドリルと木工用ドリルビット(使ったのは3mmと5mm)
  • 木工ボンド
  • ヤスリ、耐水ペーパー(#400、#2000あたり)

買いそろえると材料の数倍金かかりますね。


斜め45度の切断はソーガイド使ったけど、ガイドのネジ止めが1度未満のズレでも切断面は結構ズレるので調整しながら試し切り必須ですね。ドリルビットは木工用を使った方が後が奇麗。でも、見えないところならダイソー100円の金属用とかでも十分だった。接着は圧着保持すれば多少面が歪んでようが普通の木工ボンドだけでも十分くっついた。荷重がほぼ無いし、このサイズならダボとか不要。1ヶ月後に崩壊してるかもしれんので、多分。としておく。木枠の圧着は下の写真にあるベルトで角を止めるやつが便利です。それ以外のところはクリップかクランプで。圧着保持の時間は2〜3時間。ボンドの完全硬化まで12時間。圧着するときにギュウギュウやりすぎると歪むので注意。ちゃんと角度が維持してるかチェックしないと残念なことになります。てか、なった(泣


接着で失敗して歪んだのでテーブルトップで使うとガタガタする。
無念なので作り直したいけど、とりあえずこれで・・・。


picnome_enclosure DSC09933

DSC09944 DSC00050

DSC00051 DSC00052

DSC00060 DSC00059

LiveControl使ってmonomeをAPC40にする


monomeで使うアプリってMaxのが多いのだけど、DAWで使うならAbleton Liveが抜群に相性がいい。(そもそもLiveごときの音質でDAWとか言うの?とか異論反論あろうとは思うけど。まぁ、個人的に。)


Live Controlを使うことでmonomeをAPC40とほぼ同等に使えるようになる。OSC=>MIDIの面倒くさい変換も不要だし、いつになったら出るのかも分らんMax for Liveも不要。ステキ。先日、ドキュメントが最新Verに対応してpythonスクリプトソースコード見なくも使えるようになった。対応するLiveのバージョンは7以降です。


例えば、上のセッションビューの画像の構成だとmonome側のLEDは

ってなって、左上から6×6のボタンパッドがClipのシーン配置に対応する。再生中のClipはLED点滅になる。セッションビューのカーソル位置にも追従するのはAPCと同じ。ただし、赤い枠が出ない。他のボタンパッドの機能割り当てはここ。カーソルのトラック移動、シーン移動もmonome側から操作可能だしRecも出来るから、Clipだけ配置したら後はmonomeに没入できます。


簡単な導入方法。


[1]ダウンロード
ここのdownload =>Midi Remote Scriptからダウンロードしてくる。
※2009.9.16時点でtrunk_LiveControl-r50.zipが最新。


[2]インストール
trunk_LiveControl-r50.zipを解凍した/LiveControlを/MIDI Remote Scriptsにコピー。
macだと右クリックで「パッケージの内容を表示」を選択した先の/Contents/App-Resourcesの中です。


[3]設定ファイル
※monome64を普通に使う場合は設定ファイル不要です。たぶん。
livecontrol.txtを
Macなら/Users//
Winなら C:\documents and settings\\
に置く。
設定ファルの雛形は/LiveControl/Supportにあります。
書式の説明はここにあるんだけど、2台使うとかじゃないなら、widthとheight以外は特に気にしないでいいと思う。128を横置きで使う(トラック数を多めに表示する)場合はwidth = 16 height = 8だし、縦置きして使う(シーン数を多めに表示する)ときはwidth = 8 height = 16とする感じです。2台以上を機能を振り分ける場合はドキュメント参照してください。[MultiMode0-1]のところをちょいちょいと書き換えるだけだけど。


[4]Live側のMIDI設定
Live側のPreferenceは(Macだと)以下の感じ。
MIDI鍵盤の機能とか使わないならIAC Driverの設定は不要です。monome繋いでLive起動したら使えてます。

以上でセットアップ終わり。あとは使うだけっす。

ClipLauncher以外のボタンパッドの機能割り当てはドキュメント参照してください。


もともとAbletonLiveapiっていうのがあって、サード製の対応フィジコンもLiveapiを使うPythonスクリプトでUIとLiveの機能のバインドを定義してる。自作デバイスとか非対応MIDIコンからLiveの機能と同期させる手段として、細かいこと無しでデバイス繋げば使えるってのはMax for Liveには無いアドバンテージかも。設定手順が長いと、まさかの現場で動かない状態とか多いし。。。