PWMDAC_Synth更新(ピッチベンド関連のバグ修正)

連休前のこのときにCAmiDionでプログラムチェンジの受信をサポートして以来、自分のHDDに眠っているさまざまなMIDIファイルを再生し、テストを兼ねてBGMとして楽しんでいたわけですが、一つだけ、どうしても気になっていたことがありました。

それは、ニコニ・コモンズに上がっているButter-Fly(デジモンアドベンチャーOP曲)のMIDIデータを再生したときの、あのかっこいいイントロのところ。ピッチベンドで音程が一瞬上がるところで、本来なら半音しか上がらないのに、3全音近くまで上がって聞こえるのです(あぁっ、せっかくのかっこいいイントロが…どうしてこうなった)。

Windows内蔵のMIDI音源で再生するとこの現象は出ませんでした(CAmiDionに再生させたときにだけ発生する現象)。

そこで、6月の初めくらいから本格的に調査。
PWMDAC_Synthのピッチベンド周りの処理が怪しいと思い、桁あふれや桁落ちか?と思って型キャストの方法を見直してみたり、計算順を見直してみたり、いろいろやってみたのですが、改善せず。

じゃあ、処理が重いせい?
と思って問題のパートだけをソロ演奏してみたものの、現象は変わらず。

で、たまたま休みだった6月10日(金)に、問題の切り分けをしているうちに気づいたこと。

それは、ベンド幅(Pitch Bend Sensitivity)を変数から持ってくると上記の現象が再現し、12で固定すると再現しないことです。

もしかして、ベンド幅が間違って代入されてしまっている…!?

さらに調べていると…
あっ!これかもしかして!?

気づいたところでさっそくツイート:

ベンド幅が、最大12半音(= 1オクターブ)と指定されていたわけですが、そのあとにも Data Entry の項目で64と指定されているのを、MIDIエディタソフトDominoで見ていて発見。

RPN MSB=0 LSB=0 と来て、Pitch Bend Sensitivity だと判断して Data Entry 12 だからベンド幅12と解釈されたはいいが、その後にNRPNの Data Entry もやってきて、こっちは64だけど、ベンド幅を後から上書きしたものとプログラムが誤認し、結果としてベンド幅が64/12=5.3倍に。

うん、たしかに5.3半音ぐらいに聞こえた気が。
本来半音になるはずのところが、ドを基準にしてファのちょっと高めぐらいになるくらいの音程。どうりで音程が大きく外れた状態になるわけです。

ベンド幅に対応したのは2015年9月頃ですが、NRPNが来た場合を想定せずに実装して9か月近くそのままになっていたようです。

さっそくバグフィックスしました。

その後、動画もniconicoに上げました