ochalog

RubyとMediaWikiとIRCが好き。

Domino のイベントグラフで放物線

MIDI シーケンサー Domino のイベントグラフに放物線を描くときの曲線の式を求めた。通常の「ゆるやかな曲線」や「はやい曲線」では変化が急すぎるときに。

直線

カスタム曲線は「ツール→カスタム→編集」から編集できる。解説中には例として直線の式が以下のように書かれている。

y1 + xf * (y2 - y1)

ここで、各変数は

xf
横軸の相対位置。0 ≤ xf ≤ 1。
y1
始点の縦位置。
y2
終点の縦位置。

を意味する。

Domino イベントグラフ:直線
図 1 直線

始点を頂点とする放物線

xfxf2 にしたら始点を頂点とする放物線となった。設定する曲線の式は

y1 + xf * xf * (y2 - y1)

Domino イベントグラフ:始点を頂点とする放物線
図 2 始点を頂点とする放物線

終点を頂点とする放物線

逆に終点を頂点とする放物線を描くにはどのような式を設定するか。少し上記の式を弄ってみたがなかなかうまくできなかった。始点の縦位置がなぜか y2 となってしまったりして(^^;) 計算して求めた曲線の式はこちら。

y1 + (-xf * xf + 2 * xf) * (y2 - y1)

Domino イベントグラフ:終点を頂点とする放物線
図 3 終点を頂点とする放物線

証明

放物線は 2 次曲線なので

$$ f(x_\mathrm{f}) = y_1 + (a{x_\mathrm{f}}^2 + bx_\mathrm{f} + c)(y_2 - y_1) $$

とおく。

曲線は始点を通るから \( f(0) = y_1 \) である。これより

$$ f(0) = y_1 + c(y_2 - y_1) = y_1 \\ \therefore c = 0 $$

したがって

$$ f(x_\mathrm{f}) = y_1 + (a{x_\mathrm{f}}^2 + bx_\mathrm{f})(y_2 - y_1) $$

次に、曲線は終点を通るから \( f(1) = y_2 \) である。これより

$$ f(1) = y_1 + (a + b)(y_2 - y_1) = y_2 $$

\[ \therefore a + b = 1 \tag{1} \]

また、曲線の頂点は終点であるから、\( f(x_\mathrm{f}) \) は \( x_\mathrm{f} = 1 \) で極値をとる。\( f(x_\mathrm{f}) \) を微分すると

$$ f'(x_\mathrm{f}) = (2ax_\mathrm{f} + b)(y_2 - y_1) $$

であるから、

$$ f'(1) = (2a + b)(y_2 - y_1) = 0 $$

\[ \therefore 2a + b = 0 \tag{2} \]

(1) と (2) を連立させて解くと、\( a = -1,\ b = 2 \)。以上から

$$ f(x_\mathrm{f}) = y_1 + (-{x_\mathrm{f}}^2 + 2x_\mathrm{f})(y_2 - y_1) $$