Αφροδιτηさん、刺激的な(むろん良い意味でです)書き込み、ありがとうございます。 そして私は今、Αφροδιτηさんにとっても感謝しています。 というのもこの書き込みのお陰で、私はブレイクスルーを得たからです。
> たとえば V0V127:1a1 と書いたとき、理想的には音量がどんな変化をすべきかについて、 > a の発音時刻に 0、止音時刻に127 を通る直線であるべきとするならば、 > Eleken さんの四捨五入方式が最も誤差の少ない実現と考えられます。
本当にそうだろうか? ちょっと気になったので、横軸に時間、縦軸に音量の階段状の図を描いてみました。 以下のような図です。
/┛ /┛ /┛ /┛ /┛ /┛ ┛
現在の仕様は、発音時刻で0、止音時刻で127になっており、 それを結ぶ直線上にきっちり階段の角(谷でなく山の方です)が乗りました。 つまり、現仕様が最も誤差が少ない(理論上ゼロ)という事になります。
「誤差が少ない事と実用性が高い事は、必ずしも一致する訳ではないんだなぁ〜」 などという感慨を持ちながらこの図を眺めていたその時です。
閃きました! \(^O^)/
四捨五入とか、発音と止音だけ特別に半分のウェイト、といったキーワードで考えると処理が複雑そうですが、 なんのことはない、階段全体を半ステップだけ曲頭側にずらせば良いのです! 単に開始時刻を半ステップ減算するだけ。後に続く連続した発行処理は影響無しです。 つまり初期値を変えるだけなので、プログラムは一行も増えません。 これならば実装は驚異的に容易です。多分、実行時のコストもほとんど皆無に等しいと思います。
発音側で遅延効果の出だしの反応が良くなるし、止音時点でちゃんと最後の値が反映する。 しかも、全体としてきちんと線形で推移する。良いこと尽くめの気がします。
Elekenさんご提案の四捨五入方式とは止音部分の出力が微妙に異なるのですが、 でも以下の要請、 > 1) V10V20:4d4 &V30:4d4 > 2) V10V30:2d4 &d4 > 私の感覚では、これらは同じ演奏となるべきであると感じます。 は、しっかり満たしてますよ!
本改修によって、実は理想的直線から外れてしまうことも判明しましたが、 しかしそれでも尚、私はこの半ステップ曲頭ずらしの仕様の方が実用性は高いのではないかと感じ始めています。
|