マウスやキーボードに限らず、あらゆるユーザー入力をアプリ上の任意のコントロールにアサインしたい。タブレットの筆圧、MIDIコン、ゲームパッド、はたまたLeap Motionまで。

いわば、DAW(音楽制作アプリ)やVJソフトのような操作感をイメージしています。

  1. 入力デバイスのUI上の任意のパラメーターやコマンド実行に割り当てられる
  2. 入力データに対して何らかの変換操作が行える
    1. 値のマップ
      1. MIDIスライダーの 0-127 という値を 0-100% に再割当てする
      2. 筆圧 - ブラシサイズの対応関係をカーブ指定
    2. 型キャスト
      1. 0.0-1.0 の範囲をとるfloat型スライダーを value >= 0.5 という条件式で boolに変換
      2. bang(ボタンを押した瞬間だけ発火するイベント型)を入力にトグルすることでbool型に変換
    3. 時間軸方向を考慮した入力イベントの変換
      1. データの平滑化。マウス座標を滑らかにするなど
      2. debounce, throttle(連続したイベントの間引き操作。Webで頻用)

Untitled

Untitled

(VDMXの例)

こうしたアサインの仕組みを、関数型言語におけるモナドを用いて上手に抽象化してあげられないか考えてみます。ちなみに、僕はモナドを雰囲気でしか理解できていません。


ユーザー入力をモナド的に扱う

モナドは僕にも説明が難しいので(≒ しゃんと分かってない)、Haskellなどのコードを持ち出すことなく、無理やりTypeScriptだけで説明しきってみます。

ユーザー入力を扱うイベント・ドリブン型のコードというと、こういうイディオムが見慣れているかもしれません。

objectToWatch.addEventListener('eventname', event => {
	// ...
})