蟹喰いたい

会社の電話を転送に設定、いつ追加の電話がくるかハラハラしてます。明日確認とって一足先に正月もらっちゃお。

そんなわけで、一日中ボケッ〜っとTV観てました。
つまらんね。お正月用の番宣かねた再放送ばっかし。紅白はもちろん隠し芸も観たいわけでもないし、年取ったせいでしょうかナイナイの岡村が火に突っ込んでも面白くもなんともないよね。

話は変わって、
音声入力をヴィジュアルにする実験第一弾。任意の周波域の取得。

audioinput.jpg

楽勝、MIDIの取得も覚えたのであとは絵づくりのみ。


[v4-その11]マウス情報の取得

インタラクティブな物を作る上で、まず取り掛かれるのがマウスに反応するパッチ。

今回はマウス情報の取得について。
マウス位置取得マウス位置へCircleを描く
まずは位置を取得する方法、Renderer(GDI)上でのマウス位置はRenderer(GDI)ノードのOutputPinの右の二つX:とY:より知ることが出来る。取り出せる数値は[v4-その5]簡単グラフィックで覚えたようにPixel単位ではないので注意。とは言えここにCircle等のノードのX:、Y:にコネクトすればマウス位置へ描画できるので扱いは簡単だ。

マウスボタン情報もう一つがマウスボタンの状態。これはRendererノードのLeft Button:、Middle Button:、Right Button:から出力されている。On/Offな情報だけどv4ではOnの状態が1、Off状態が0であらわされる、なので出力を表示したい場合はIOBox(Value Advance)でOKだ。これで何かをOn/Offすることが可能になる。例えばLFOノードのReset:ってInputPinがあったでしょ。あれにコネクトすればマウスクリックでリセットとかが可能になる。


[v4-その10]LFO出力の加工

また結構間をあけてしまった。復習しながらやってる始末、、、

今回は前回説明したノコギリ波しか出さないLFOの出力の加工について。
増幅とオフセット
まず簡単なところでは0から1の出力を例えば0から2にしたい場合。これはものすごく簡単でLFOの出力に単純に2を乗算(掛け算)するだけ、0から5の間なら5を乗算しておけばOK。

じゃ、簡単なところをもう一つ、-5から5の間にしたい時どうするか、LFOの出力に10を乗算して更にその出力から-5する。実に簡単。高校の時に習わなかったっけ、

y=ax+b

ってやつ、これに似てるね。



WaveShaperによる加工
次はちょっとレベルアップ。今ノコギリ状に変化する値を滑らかな波型にしたい場合。
この場合は新しくWaveShaper(Value)ノードを用意する。使い方はLFOの出力をWaveShaperノードのInputPin Input:へコネクトし、右上にあるInputPin Shape:をマウス右クリックで選択する。例えばSineにすればLFO出力をサイン波(正弦波)に加工してくれる。他に選択できるものはLinear,Inverse,Triangle,RectangleでLinearは変化なし、Inverseは逆転、Triangleはノコギリ形状に似てはいるけどちょっと違う。Rectangleは入力が0と1の間でへんかしてるなら、その最小と最大、つまり0と1しか出力しないパルスのようなデジタルな波に仕立て上げることが出来る。

とりあえずは説明するよりも実際に使ってみたほうが分かりやすい。図では結果をIOBoxへ出力しているけど、Pointのx:とかCircleの半径とかにコネクトしてGDIへ描画するともっとよく分かると思う。

また、図でWaveShaperのShape:へコネクトしている左端に逆三角のついたノードはIOBox(Enumerations)ってヤツで列挙型といわれるIOBox。説明してる本人も良く分かっていないが、右クリックでプルダウンするタイプのInputPinにこれをコネクトするとそれに応じたメニューを作ってくれるらしい。あくまでインターフェース的な使い方しか現状は出来ないッポイ。

話はそれたが、工夫次第でなんでもできるようになった。サイン波同士を加算なんてのも出来るしあらゆる波を作成できるじゃないか。
サイン波があってコサインは何故無いんだって単純な疑問も思いつくけどコサインはサインの90度位相がずれた状態なので、入力元のLFOのInputPin Phase:に0.5または-0.5を入力してやればよい。

値のリマッピング
後もう一つMap(Value)ノードって便利なヤツがある。
説明にぴったりな用語を知らないので言いにくいけど、Source Min:Source Max:上にある入力値を改めてDistination Min: Distination Max:上の値へリマッピングするノード? んー説明しづらいな。図で書けばわかりやすいかな。冒頭で説明した5を乗算したり、10掛けて5引くなんて操作にも代用できる。ケースバイケースだけど最小値、最大値が決定している場合に使うには便利なノードだ。

最後に簡単なサンプル、秒をサークルの大きさでカウントするカウンター(count.zip)

GDIはつまらなくなって来たなぁ。DX9も使ってみるか


[v4-その9]動きをつける

ほったらかしにしていたv4の続き。

Spreadより先にこっちを先に説明したほうが良かったな。

アニメーションといえばLFO(Animation)がないと始まらない(たぶん)。直訳すれば低周波発振子?アニメーションの動力源になるノード。もちろんLFOがなくてもマウスに反応するアニメーションや、音に反応して動作するアニメーションも作れる、この場合はマウスや音が動力源って言えばいいのかな。

LFOは一定時間の周期で数値を生成するノードってのが正しい説明。

とにかく作ってみよう。
パッチウィンドウに作った瞬間からLFOは動き出す。OutputPinの左をマウスオーバーさせてみよう数値がめまぐるしく変化しているはず。
少しこのLFOを置いておいてRenderer(GDI)へ点(Point)を描くパッチを近くに作ろう。GDIウィンドウの中心にぽつんと点が描かれる。
で、PointノードのInputPinのY:へLFOのOutput:をコネクト!
LFOを繋げる
Pointが上へ動き出す。Y=1.0に到達するとY=0.0に出現し、また上に向かって動き始める。これを延々と繰り返す。LFOノードの役割はこれだけ。0.0から1.0の間を一定周期で繰り返す。
ホントにこれだけの働き。


InputPinを調べると分かるけど、

  • Period:は周期(秒)
  • Pause:はポーズ、ここに1が入るとLFOは停止する。
  • Reverse:は逆、つまり1.0から0.0を繰り返す。
  • Reset:はリセット0.0へリセットされる。ついでにOutputPinにCycles:って言う何周期繰り返したかをカウントし出力するPinがあるがこれも0へリセットされる。
  • Phase:は初期位相。

出力される値のイメージを図で書くと下のようなものになる。ノコギリ波と一般に呼ぶ。

LFO時間-出力

一番下のPhaseの説明はちょっとわかりにくいかな。このノコギリを時間軸方向へずらすもんだと覚えておけばいいかな。ちょっと違うけど、、、。0.0から1.0の範囲で値が変化することに変わりは無いけど、一周期の始まりと終わりの値が変わることに注意。

こんな簡単なもんで複雑なアニメーションがつくれんのかいって感じやけど、もちろんこれだけじゃダメ。
例えば0.0から10.0まで変化させたいときどうする。とか、更に小数点はいらない整数で変化させたいとか。もっとこぅ、滑らかな波が来ないとノリノリになれん!、とか。いろいろあると思うけどそれも全てこのLFOが出発点になる。

次回は”LFOの出力を加工する”。について。