この記事は【Max】matrixctrlでドラムマシンを作るの続きです。
前回[matrixctrl]を使用してドラムマシンを制作しました。今回は[matrixctrl]のパラメータをランダムに設定する処理を作っていきましょう。
目次
[matrixctrl]の編集
ランダム化する前に[matrixctrl]をメッセージで編集する方法を知りましょう。
「列 行 オン・オフ」 の形でメッセージを送るとセルを編集できます。
特定のセルをオンにする
オンにする場合は、列と行を指定し最後に「1」を付けます。
特定のセルをオフにする
オフにする場合は、列と行を指定し最後に「0」を付けます。
全てのセルを削除する
全てのセルを削除するには「clear」を送ります。
各ステップでランダムに鳴らすサンプルを選ぶ
各ステップでサンプルが重ならないように、ランダムにする方法を作っていきましょう。
16ステップを各サンプルに振り分ける
まずはbangをクリックしたらランダムにサンプルを指定する処理を作ります。
16連続で出力させる
[uzi]にbangを送ると、第3アウトレットから指定した数値までのインデックス値を出力します。ただし「1」始まりなことに注意してください。
[matrixctrl]は0始まりなので、使用する時は出力された数値を-1します。
第1アウトレットからは指定した数値分のbangを出力します。
ランダムにサンプルを選択する
[random]を使用して、bangが来たら0~2をランダムに出力するようにします。
メッセージフォーマットを整える
2つの処理を合わせ、[matrixctrl]に送るメッセージにするようにフォーマットを整えます。
それぞれの処理を[pack 0 0 1]に送ります。メッセージフォーマットは「列 行 オン・オフ」で、今回の処理では全てがオンになるようにするため、[pack]では最後の値を「1」にします。
処理をそのまま接続しました。[uzi]のインデックス値を[pack]の第1インに、ランダム化した数値を第2インに送りました。
メッセージのフォーマットは「列 行 オン・オフ」なので、列を見ると0~15の順になっており、行はランダム、オン・オフは必ず1なので間違っていないようです。ですがこの状態ではメッセージの順番が間違っており、パッチを立ち上げた最初のランダムで必ず、0列目は0行が選ばれるようになっています。
Maxではアウトレットの一番右から出力されるのですが、uziを見るとインデックス値が最初に送られます。[pack]は第1インレットに数値を受けるとすぐに数値を出力します。その数値は、uziからきた0列目、そしてpackに初期値として指定されている「0 1」が合わさり「0 0 1」が出力します。
メッセージの順序を修正
[print]の前に[swap]を挟みました。[swap]は第1インに入った数値を第2アウトに、第2インに入った数値を第1アウトに出力します。そして第1インにメッセーが来るまで出力しません。
その機能を利用して、インデックスの値が第2インに入って、ランダム値が第1インに入るまで出力しない状態にします。見た目もスッキリして分かりやすくなります。
ランダム処理を送る前にclearする
処理は殆ど完成ですが[matrixctrl]をランダム化する際、前回の情報が残ったままだとデータが重なってしまうので、事前に消去する処理を作ります。
最初のbangの後に[t b clear]を挟みます。[t]は[trigger]の略で、何かメッセージが来たら指定した値を出力します。この場合は第1アウトからbang、第2アウトから「clear」メッセージを出力します。これでランダム処理の前に「clear」メッセージを出力できるようになりました。
リズムマシンと組み合わせる
処理が完成したのでリズムマシンと組み合わせます。
先程作った[t b clear]の第2アウトと、ランダム処理最後の[pack]のアウトを[matrixctrl]に接続します。これで完成です。
ランダム処理のbangを押してみてください。パラメータがランダムになれば成功です。