この連載ではノウハウ0の状態からMax9で制作に関するプログラムの自作を目指します!試行錯誤をしながら一緒に無限の可能性を探っていきましょう。※Max for Liveについてはこちらの過去記事をご覧ください。
こんにちわ。タムラです。
引きつづき私のちょっとしたストレスを解消する為だけのデバイスを作ります。
まずは方向性を詳細に固める為にシンプルにオクターブあげる(+12)パッチを組んでみようと思います。
#5-2でも触れましたが今まで触ってきたオブジェクトでは歯が立ちません。なぜならlive.miditool.inから辞書形式で出力される為です。で、辞書形式って結局何?
そこで

『dict.print』オブジェクトを使ってデータの中身を見てみます。
辞書の中身をコンソールに出力するオブジェクトです。
いつものピッチ、ベロシティの他に選択している各ノートを識別する固有の番号としてnote_idが振られています。さらにすでに配置されているノートをいじるわけですからどの位置の配置されているのかも記録されています。
とにかく情報が多いです。これらを辞書形式とし、一気にlive.miditool.outに渡しているというわけでした🤷
とはいえやることはシンプルです。
この辞書の中の『Pitch』の項目を+12するだけで良いのです。
というわけでこんな感じのパッチを組んでみました。

結論として、うまく行かなかったのでざっくりの説明ですが、『dict.unpack』でノート情報とそれ以外で辞書データを分割、array.mapで反復してノート情報を書き換えたのち『dict.pack』で再び辞書化って作戦でした。
現状、上記のパッチではarray.mapで何も処理させずにスルーさせてますが

タイムアウトするんですよね…
live.miditool.の都合上、処理に時間がかかることは#5-2で触れた注意事項に該当します。
さらに反復の書き換え処理を想定していたので結構厳しそうです。
本当に間に合っていないのか、何かの処理を間違えてるのか、そもそもこのやり方では無理なのか….
考えても分らないので次の作戦です。
自分の能力を範疇を越えることはあまりしたくないのですが、ここはコードをAIに書かせてサクッと解決することにしました。
Max / mspの場合は『js』オブジェクトを使うとオブジェト内にjsコードを仕込むことができます。
しかし私のjsコードの知識は入門書の冒頭3ページほど。
ところが昨今のAIの普及により経験無しの自称プログラマーがここに爆誕してしまいました。
パッチはこんな感じ

なんてシンプルなんでしょう。
AIに書いてもらったコード/補足はこんな感じです。
function dictionary(dictName) {
// 1. 入力された辞書(Dictionary)の参照IDを受け取り、JSONオブジェクトに変換
var inDict = new Dict(dictName);
var jsonObj = JSON.parse(inDict.stringify());
// 2. 辞書内からノート情報を取り出す
var notes = jsonObj.notes;
if (notes) {
// 3. ノートが複数選択されている場合(配列として処理)
if (Array.isArray(notes)) {
for (var i = 0; i < notes.length; i++) {
// ピッチに12を足し、MIDIの最大値である127を超えないように制限する
notes[i].pitch = Math.min(notes[i].pitch + 12, 127);
}
}
// 4. ノートが1音だけ選択されている場合(単一のオブジェクトとして処理)
else if (notes.pitch !== undefined) {
notes.pitch = Math.min(notes.pitch + 12, 127);
}
}
// 5. 同期エラーを防ぐため、名前を持たない「匿名辞書」を新しく作成して結果を格納
var outDict = new Dict();
outDict.parse(JSON.stringify(jsonObj));
// 6. live.miditool.out に向けて即座に出力
outlet(0, "dictionary", outDict.name);
}
『js』オブジェクトをダブルクリックすると仕込めるので、保存した後LiveのTransformを押すと無事オクターブ上がりました。
ここまできたらあとはノートを移動させる条件を複数仕込むだけです。
そうであって欲しい…上手くいくといいな…
ではまた次回。
最初Geminiに書かせてましたがどうしてもタイムアウト問題が解決しませんでした。そこでM4L周辺資料を大量にインプットしたNotebook LMを使ったところタイムアウトせずに動作するコードを出力することができました。
通常のコード記述では気にしないMax / mspならでは色々細かいルールがあるのでしょうか。
店頭でお声がけ頂けましたらLMを共有いたしますのでお気軽にどうぞ!