DATA チュートリアル 2:
データのスケーリング

イントロダクション

このチュートリアルでは、データのスケーリングとスムージング(平滑化)の問題に焦点をあてます。その中で、リストの逐次出力を行なう iter オブジェクト、データのスケーリングとスムージングを行なう trough、peak、slide オブジェクトを紹介します。さらに、multislider オブジェクトの、紹介していなかったデータ表示オプションについても見ることにします。具体的に言うと、この機能は、範囲の最小値と最大値を設定し、ピークホールドモニタリングを行なうためのものです。様々な Max オブジェクトや物理デバイスは様々な範囲やフォーマットを持った値を出力します。入力された値のフォーマットを変更し、データセットをスケールして、出力に必要なフォーマットとスケールに合致させるというタスクは、頻繁に行なう必要がある処理の1つです。これまでのチュートリアルでは、この役割を果たすために scale オブジェクトを使うことについて述べましたが、スケーリングを行なう際の数値範囲を見つけ出すために、他のオブジェクトを使う必要があるかもしれません。このチュートリアルで紹介するオブジェクトは、プログラミング上の要求に適合させるためのスケーリング、スムージング、データ表示を行なう新しい手段を提供します。

新しいオブジェクトのテスト

チュートリアルを開いて下さい。

チュートリアルパッチを見て下さい。パッチの左側は、新しいオブジェクト(輪郭が緑色のもの)の概要です。左上端のパッチでは、iter オブジェクトの使い方を示しています。iter オブジェクトはリストを受け取り、順に個別の値として出力します。メッセージボックスをクリックすると、4つの値から作られるリストがiter に送信され、iter はこれを4つのメッセージとして出力します。それぞれのメッセージは1つの要素だけを持つリストになります。これは、リストをデータストリームに変換する最も簡単な方法です。また、(すぐ後で見ることになりますが)リストの内容をアトム化(細分化)して、リストの個々の要素によって新しいイベントをトリガしたい場合に便利です。

次のサブパッチには、through オブジェクトと peak オブジェクトの例があります。この2つは補完的な役割を果たします。どちらのオブジェクトも入力される数値のストリームを調べますが、through がこれまで受け取った内で最も低い値をキャプチャし、出力するのに対し、peak は最も高い値をキャプチャし、出力します。ナンバーボックスの値を変更すると、2つのオブジェクトは低い値と高い値をキャプチャし、それより高い値、または低い値を新規に受け取った場合に新しく出力を行ないます。

最後に、下端のパッチは slider オブジェクトの3つの使い方を示しています。slide オブジェクトは「スムージング係数(smoothing factor)」に基づいてデータをスムージングするために用いられます。値が上昇する場合と、下降する場合で個別の係数を使用します。スムージング係数の機能はかなりシンプルなものです。この値でカレント(現在)の値とその前に受け取った値の差を割ります。これにより、値が変わったことによって出力される変化量(swing)が減少します。スムージング係数は、オブジェクトに2つのアーギュメントとして与えます。第1のアーギュメントは値が上昇する場合の係数、2番目のアーギュメントは値が下降する場合の係数になります。

例えば、パッチがスタートしたとき、「1つ前の値」は 0.0 になります。これをすぐに 0.5 に変化させた場合( slide オブジェクトに接続されたナンバーボックスに値を入力すると、このようになります)、最初の slider オブジェクトが 0.01 に移動することがわかるでしょう。この場合、値が上に変化したため、第1の係数(50.0)が使われています。最初の値 0.00 と 0.50 との差は 0.50です。この差を係数(50.)で割ると 0.01 になります。

3つのslide オブジェクトは異なったスムージング係数を持っていることがわかります。最初のslide オブジェクトは上昇も下降も同じ係数を持っています。2番目の slide は上昇のスムージングを行ないません(係数 は1.0です)、3番目の slide は下降の場合、小さい係数(10.0)を持っています。値を入力するスライダは、実際にはスライダを1つだけ持ち、浮動小数点の範囲を設定されたmultislider です。これを動かしてみると、出力を受けた multislider がそれぞれ違った反応をみせることがわかります。出力のスムージングは、それぞれのslide オブジェクトが持つ、上昇と下降のスムージング係数に関連して行なわれます。

メインパッチの概要

メインパッチでは気象データを素材として使っています。このデータは multislider の表示を変化させています。同時に、このデータを使って4音によるコードを作成し、コンピュータの内部 MIDI シンセサイザで演奏させています。パッチ内にある2つの coll オブジェクトをダブルクリックして、その内容をよく確認して下さい。2つとも12行のデータを持っていて、片方の coll の出力は、もう片方のインデックスとして使用されます。toggle オブジェクトを使ってmetro(パッチの最上部にあります)をスタートさせると、bang メッセージを使ってカレンダー情報が作成されます。具体的には、counter の出力(これが日数を数えます)がcoll による小さなデータベースのクエリ(問い合わせ)に使用され、この値が1年の何日目であるかによって、その該当する「月」を出力します。例えば、1年の90日目は4月(April)の最初の日にあたります。この「月」の値(1 から 12 の範囲)は、weather.txt というファイルから値をロードしている coll に対するクエリに使用されます。このcoll には4つの都市(ニューヨーク、パリ、ブエノスアイレス、東京)の月間平均気温が格納されています。このデータは unpack され(データは、coll からリストの形で出力されるためです)、4つの float オブジェクトに送信されます。その後、metro が float オブジェクトに bang を送り、出力のストリームを作ります。

このやり方は、入力されるデータが一定のスピードで生成されるわけではないけれども、一定のクロックで何かを動作させる必要があるというシステムで使用するには、よいテクニックであると言えます。この例では、気温のリストは月が変わったときにだけ coll オブジェクトから出力されます。

float オブジェクトからの出力は、slide オブジェクトに送られます。この slide オブジェクトは上昇、下降の両方で、スムージング係数が 15.0 に設定されています。これは、同じ値が31回送信される間に(1か月は最高31日であるため)、スムージングされた出力が実際の値に追いつくまで徐々に変化し続けるということを意味します。4つの slide オブジェクトの出力は共に pack されてmultislider に送信され、そこで表示されます。この新しく作成されたデータセットはまた、multislider から出力され、(iter オブジェクトによって)それぞれ個別に分けられ、シンセサイザが演奏する4つの音を作るために使用されます。

このmultislider は、データ表示の際にいくつかの新しいテクニックを使っています。multislider のオブジェクトインスペクタを開くと、Slider Style アトリビュートが Bar に設定されていることがわかると思います。これによって、塗りつぶされた棒グラフが表示されています。また、Candycane というオプションが動作しているため、インスペクタの色指定に基づいて棒グラフに色がつけられています。最後に、Peak Hold オプションが設定されています。この機能は、値が達した最高点の位置に小さなバーを置くようにするものです。これによって4つの都市それぞれの値の最高値が視覚的に示されます。

peakhold オプションのオン、オフを設定できるメッセージボックスがあり、toggle が接続されています。これは、インスペクタ型のメッセージを使ってオブジェクトの機能をコントロールする良い例です。peakhold アトリビュートに何らかの変更が合った場合には、ピークトラッキング(ピーク値の追跡)を一度リセットしなければなりません。そのため、toggle が変更されたときにこのピーク値をリセットするメッセージ(peakreset)が、すぐ後に続けられています。

最大値/最小値セクション

このパッチのもう一つの部分は調べる価値があります。これは、メインパッチのちょうど左側で、パッチのセットアップを行なっています。パッチのこのセクションの唯一の目的は、表示の適切なスケーリングを行なうためにmultislider をセットアップすることです。bang メッセージ(button をクリックして送信するか、loadbang メッセージによって生成されます)は最初にtrough オブジェクトと peak オブジェクトを、それぞれ非常に高いスレッショルド(閾値)と非常に低いスレッショルドに設定します。こうしておくことによって、どのような新しい値が送信されたとしても、自動的に新しい標準値がオブジェクトに設定されることが保証されます。その後、bang は coll オブジェクトに対するdump メッセージをトリガします。これによって、coll オブジェクトから一回に1つのリストという形で、すべてのエントリ(項目)が次々と出力されます。

出力はリストの形で行なわれるため、iter オブジェクトによる処理を行なって、リストを1つの値だけを持つメッセージに切り分けます。この値が trogh と peak オブジェクトによって調べられ、データセット中の最小値と最大値(それぞれ、32と81 になります)が取得されます。値が取得されると、pak オブジェクトによって値のリストが生成され、prepend によってsetminmax というメッセージがリストの先頭に追加されて、multislider に送信されます。このメッセージは表示される領域を変更するため、multislider の表示は、coll が出力する気温の最大値と最小値の実質的な範囲に制限されます。

この方法を使えば、multislider の表示は、weather.txt というファイルに格納されている気温に対して自動的に調整されます。

結び

このチュートリアルでは、データストリームを(iter、trough、peakを使って)分析する方法、そして、その出力を(slide)を使ってスムージング(平滑化)する方法について見てきました。また、自動的に UI(ユーザインターフェイス)要素を設定する場合に便利なプログラミングパターンや、必要な頻度に比べて少ない量のデータしか送られてこない場合でも適切なデータ出力を行なうことができる便利なプログラミングパターンを見てきました。最後に、柔軟なmultislider オブジェクトについてさらに調べてみました。そこでは、棒グラフの表示、ピーク値の保持、フルカラーによる表示が使われていました。

参照

iter リストを数値の連続に変換します。
peak 数値のストリームから最大値を見つけます。
trough 数値のストリームから最小値を見つけます。
slide float の値によるスムージング処理