チュートリアル33:
確率テーブル

ヒストグラムの作成

ヒストグラムとは頻度分布のグラフのことで、様々なイベントの相対的な発生数を表示します。histo オブジェクトは受信するすべての数値情報を把握し、同時に、個々の数値が何回受信されたかを内部のヒストグラムに記録します。

histo オブジェクトは、左インレットで 0 〜 127 の値を受信するごとに、その数値を内部のヒストグラムに追加し、その数値を受信した回数を右アウトレットから、その数値自体を左アウトレットから送信します。この出力を直接 table に送ることによって、継続的にヒストグラムのグラフィック表示を行なうことができます。table のアドレスは、histo によって受信された数値に対応し、table の値は個々の数値の頻度を表します。

数値ごとの頻度分布(どの数値が最も多く受信されたかを比較した表示)は table のグラフィックウィンドウに表示されます。

確率分布

table オブジェクトの左インレットへの bang メッセージは特別な機能を持っています。格納した数値を送信する代わりに、tableはアドレスを送信します。ある特定のアドレスが送信される確率は、tableの中の他の値と比較した場合の、そのアドレスに格納されている値に直接比例します。あるアドレスに格納されている値が他のアドレスに格納されている値よりも大きい場合、bang を受信したときにアドレスが送信される確率は高くなります。table オブジェクトにおける bang による効果についてのより詳しい記述は、このマニュアルの Quantile を参照して下さい。

訳注:Max トピックスマニュアルの Quantile を参照して下さい

tableのこの機能は、確率分布を格納するために絶好のものです。各アドレスには table が bang を受信した際に送信される可能性をそれぞれ割り当てることができます。table オブジェクトの中の値が、上で述べたような histo オブジェクトによって供給される場合、table からある数値が送信される可能性は、その数値が histo オブジェクトで何回受信されたかに基づいて決まります。

この組み合わせを用いることにより、数値の発生する確率を、その数値が発生した過去の履歴に基づくように設定することができます。過去においてより多く発生した数値ほど、将来に発生する可能性もより高くなります。

演奏の履歴を記録する

サンプルパッチでは、histo とtableを使って、シンセサイザで演奏されたノートのピッチとベロシティの確率分布を記録しています。これらの table オブジェクトは演奏されたピッチとベロシティのヒストグラムを格納しています。

ここでは stripnote オブジェクトが非常に重要です。これがないと、ピッチ毎のノートオフ・メッセージによってピッチを2重に数えてしまうことになり、ベロシティ 0 が通常のベロシティよりはるかに多くなってしまうためです。

・ピッチとベロシティのヒストグラムを保持しているテーブルエディタウィンドウを開き、シンセサイザを演奏して、分布が格納されるようすを観察して下さい。

リズムの分析

パッチの中では、演奏されたリズムのヒストグラムを保持するために簡単なリズム分析の方法を用いています。timer を使用してノートオンの間の時間を取得し、その時間を 30 で割ってリズムを得ています。ノート間の経過時間は30 ミリ秒のパルスの数になります。

2つのノートの間の時間が 1 パルス( 30 ミリ秒 ) より小さい場合、2番目のノートは実質的に前のノートと同時であるとみなし、分析には含めません。ノート間の時間が 96 パルス(2880 ミリ秒)より大きい場合には、演奏者が演奏を中止した、もしくは極端に長いノートが保持されているとみなします。どちらの場合にも、これをヒストグラムには含めません。このため stripnote オブジェクトは、 1 〜 96 パルスのまで長さのリズムしか通さず、これらのリズムが table オブジェクトに格納されます。

記憶を用いたインプロヴィゼーション(即興演奏)

パッチャーウィンドウ の左下隅にある metro オブジェクトがオンにされると、bang メッセージを PassPct オブジェクト(チュートリアル29で作成したパッチ)に送信し、bang メッセージの95%が3つの table オブジェクトに渡されます。格納されている確率分布(奏者によって演奏されたヒストグラム)に基づいた選択によって、ピッチ、ベロシティ、リズムが送信されます。ベロシティとピッチは、直ちにシンセサイザへ送信されます。リズムは 30 を掛けることによってミリ秒単位の時間に戻され、その後 metro オブジェクトに送信されて新しいスピードを設定します(さらに、次の音の新しいデュレーションを設定するために、 makenoteにも送信されます)。

「インプロヴィゼーション ( 即興演奏 )」の結果は、MIDI キーボードで演奏されたものと同じピッチ、ベロシティ、リズムを使用しているため、何らかの類似点をもったものになりますが、インプロヴァイザ・パッチ(即興演奏パッチ)はこれらのパラメータをランダムに再結合します。PassPct オブジェクトが存在することより、インプロヴァイザは全体の時間の約 5 % 程度休止します。

ユーザインターフェイス

私たちは、奏者がどの程度インプロヴァイザ・パッチをコントロールすべきか、また、どのようにコントロールが実装されるべきかを決める必要がありました。 インプロヴァイザはモジュレーションホイールを 0 以外の任意の場所に動かしたとき、あるいは、toggle オブジェクトをクリックしたときにオンになるように決めてあります。

また、演奏者がインプロヴァイザのメモリにあるパラメータのすべて、あるいはパラメータの1つだけを消去することができるようにしたいとも考えました。これによって、新しい情報でメモリを満たすことが可能になります。そのためには、histo および table オブジェクトに clear メッセージを送って、その値をすべて 0 にする必要があります。マウスによるコントロールはすべて別ウィンドウに置き、同様にモジュレーションホイールからの自動的なオン/オフができるようにすることにしました。[controls] サブパッチウィンドウのほとんどのオブジェクトとパッチコードは非表示にしてあるため、メインパッチとサブパッチの通信がどのように行なわれているかを見たい場合には、[controls] ウィンドウをアンロックする必要があります。

ctlinから送られるデータはサブパッチの中の toggleに送信され、その後、メインパッチに戻ります。これによって、toggle を、モジュレーション・ホイールからのオン/オフ状態の表示のためと、実際にマウスによるオン/オフのコマンドを送信するために使用できます。

オン/オフの状態( 0あるいは非0)は togedgeに送信されます。togedgeは受信した数値が 0 から非 0、あるいは非 0から 0 へ変化した場合にのみ、アウトレットからbang を送信します。左アウトレットは 0 から非 0 への変化した場合、右アウトレットは非 0 から 0 へ変化した場合に使われます。コントロールデータを直接 metro に送信した場合、metro はモジュレーションホイールから非 0 の値を受け取るごとに再スタートしてしまいます。togedge は、0 から 非 0 へ、あるいは非 0 から 0 へという、本質的なコントロールデータのみの検出を可能にしてくれます。

togedge toggle オブジェクトからオンの状態を受信した場合、metro オブジェクトをオンにします。0を受信した場合、metro オブジェクトをオフにし、コントロールウィンドウ内のすべてのメッセージボックスに bang を送信します。それぞれの clear メッセージは route によって適切な histotable オブジェクトにルーティングされます。またリズムをクリアすることによって metro の時間をリセットし、 makenote のデュレーションを 720に設定し直します。

3つの異なるメッセージボックスを使用して別々に clear メッセージを送信している理由は、特定のメッセージボックスをクリックして1つのパラメータのメモリだけをクリアするオプションをユーザに提供するためです。インプロヴァイザ・パッチをオフにすると、すべてのメモリを一度にクリアすることができます。

このインプロヴァイザ・パッチを、実際に、他のユーザが使用する完全な Max プログラムの中で使用したいと思う場合、おそらくコントロール(および、ユーザに対して何をするかを説明するためのいくつかのコメント)を除いてすべてを非表示にするでしょう。ここでは、パッチを調べることができるように、ほとんどのものを表示したままにしてあります。

まとめ

histo は受信した数値の内部的なヒストグラムを記録します。左インレットで数値を受信すると、histo は内部のヒストグラムに数値を加え、右アウトレットからはその数値を受信した回数を報告し、左アウトレットからはその数値自体を送信します。

histo オブジェクトの出力は直接 tableに送信することができ、それによって histo から報告された個々の数値の発生頻度は、tableの中の値として格納されます。table オブジェクトのグラフィックウィンドウ を開いてヒストグラムを見ることができます。

histo あるいは table の左インレットへ clear メッセージを送ると、すべての値は 0 に設定されます。table の左インレットへ bang を送ると、値ではなくアドレスを出力します。特定のアドレスが出力される確率は、table の中の他の値と比較した場合の、そのアドレスに格納されている値によって決まります。アドレス内に格納された数値がより大きい場合には、bang を受信した際にアドレスが送信される確率はより高くなります。table のこの機能は確率分布として使用することができます。

ヒストグラム(histo オブジェクトから受信した過去の数値の頻度分布)を含む tableに bang を送信すると、過去の発生頻度に基づいた確率によって tableから数値を出力させることができます。

togedgeは、入力される数値の 0/非0 の状態の変化を検出するために使用されます。数値が 0から非 0 へ変化した場合、左アウトレットから bang が出力され、数値が非 0 から 0 へ変化した場合、右アウトレットから bang が送信されます。

route を使用して、特定のセレクタ(メッセージの中の最初の要素)を検出し、メッセージを様々な行き先へ送ることができます。

参照

histo 受信した数値のヒストグラムを作成。
Quantile 確率分布のための table オブジェクトの使用。
table 配列を格納し、グラフィカルに編集。
テーブル table オブジェクトのグラフィック・エディタ・ウィンドウを使用。
togedge 0 /非0 の状態の変化を報告します。