2018/10/20, 21と2日間に渡って行われた
TOKYO BLOCKS HACKATHON 2018 で3位に入賞しました!
去年も参加してるのでどういうイベントか・・・という話は割愛
参考: TOKYO BLOCKS ハッカソンで入賞しました! #tbh2017

今回はebi1000と二人でチームとして参加して、
こんな作品を開発しました。

動画だけだとわかりにくいですが、
これはシンセ・・・ではなくてエフェクターです。
Max for Live用のオーディオエフェクターとして動くプラグインを開発しました。

動画に出てない機能もありますが、
機能としてはこんな感じです

https://devpost.com/software/loooper

オーディオ入力を1拍ずつ取り込んで表示し、 Lightpad blocksで指定した箇所のループ演奏を行います。

タッチのY座標 ・・・ ループ開始/終了位置(終了位置が開始位置より左にくると逆再生) タッチのX座標・・・ピッチの変更 Lightpad blocksを横につなげると波形を複数台で表示・演奏することができます。 さらに、Seaboadなどのmpe対応midiキーボードを接続することで、 ピッチの変化を鍵盤で行うことができます。

一番今回の開発で悩んだのは、

Lightpad blocksを横につなげると波形を複数台で表示・演奏することができます。

地味にここだったりします。
BlocksのMax用公式オブジェクトはかなり直感的に使いやすいものになってはいるんですが、
どちらかというとMaxの仕様上やりにくくて。。。

blocksを複数接続すると、例えばこんな感じで接続情報をdictで取得できるんですが、、

{
    "blocks" : [        {
            "type" : "lightpad",
            "buttons" : 1,
            "ledrowcount" : 0,
            "statusledcount" : 0,
            "index" : 0,
            "order" : 1,
            "uid" : "12345678",
            "batterylevel" : 100,
            "width" : 2,
            "height" : 2
        }
,       {
            "type" : "lightpad",
            "buttons" : 1,
            "ledrowcount" : 0,
            "statusledcount" : 0,
            "index" : 1,
            "order" : 2,
            "uid" : "23456789",
            "batterylevel" : 100,
            "width" : 2,
            "height" : 2
        }
 ],
    "connections" : [       {
            "index1" : 0,
            "index2" : 1,
            "uid1" : "12345678",
            "uid2" : "23456789",
            "edge1" : "west",
            "edge2" : "east",
            "edgeindex1" : 3,
            "edgeindex2" : 2,
            "portindex1" : 0,
            "portindex2" : 1
        }
,       {
            "index1" : 0,
            "index2" : 1,
            "uid1" : "12345678",
            "uid2" : "23456789",
            "edge1" : "west",
            "edge2" : "east",
            "edgeindex1" : 3,
            "edgeindex2" : 2,
            "portindex1" : 1,
            "portindex2" : 0
        }
 ]
}

この blocks.type == "lightpad" なものをカウント・・・
といったような条件付きの演算がMaxだとすごくやりにくい。。
結局一部でjsを使ってなんとかすることにしました。

function blocks() 
{
    count = 0;
    for(i=0; i<arguments.length; i++){
        d = new Dict(arguments[i])
        keys = d.getkeys();
        if (keys != null){
            if(d.get('type') == "lightpad"){
                count++;
            }
        }
    }
    outlet(0, count)
}

なんかもっとい方法ないんすかね。

あと、地味にハマったのが、
僕がもともと持っていた初期型のLightPadBlockと、
現行型(M)とで感圧の感度が全然ちがうってところです。
もうここに関しては両方に対して調整かけるのはきついなと思って諦めました。
さっきのdictにもLightPadBlocksのバージョン書いてないし。。もうムリ

と、開発のグチみたくなってしまいましたが、
ちゃんと動きのあるものを作れたときの達成感は本当にいいものです。
今後ライブでも使えるし。

来年も開催されるようでしたら是非参加したいです!