遂にオペレータが2つになりました!!
二つになったらそらもうFM変調するしかないでしょうという事で。
早速サンプルを鳴らしてみたので聞いてみてね。
MDXをそのまま鳴らす為に、今回オペレータ3と4を1と2に各パラメータを流し込んで
鳴らしてみました。よってフィードバックは無し。
ドラスピを聴いてわかると思うけど、かなりギョイ~ンといっております。
今回の一番の山場は
「テーブル化」!!
毎22マイクロセカンドで計算しないといけないので、イチイチsin()とかlog10()とかexp()
とかでやってるとまあ遅い遅い!!
v1のサイン波でそのまま作ったら、演奏がヨレヨレになるくらい遅い。
2017年になっても、プログラムの高速化は必要なのでした。
そうなると古典的な方法、テーブル化。
計算を事前にしておいて、値を参照するだけなのですな。
今回、ほとんどリアルタイム部分はテーブル化してみました。
自前で全部用意しようと思ったけど、どうしてもピッチ関連だけはx68sound.dllのやり方
を使わせて頂く事になりました・・。むっちゃ大変なのよ、ピッチ関連・・。
実際どこまで作れたかというと、サインテーブルを用意して音程を変えるという所まで
作れたのでございます。ところが、ノートオン後、ノートオフの前にピッチをビビビと
変化させるとものすごいブリブリとノイズっぽいものが乗るのね。
波形を見てびっくり!
ピッチが変わる度に、サインテーブルに送る角度がリセットされるので、波形もリセット
されてしまう感じ。サンプル聴いてみて下さい。(※音量でかいかも)
ざらざらした音を再生する
サインテーブルに送る角度を毎回ゼロから計算するのではなく、角速度というもので
順送りにしていく必要があり、そこが何度やってもうまくいかず、最終的にはギブアップ。
FM変調も結局使わせてもらう事になりました・・。
でも完全に諦めたわけでは無い!全体がまとまってきたらまたチャレンジするつもり。
そのあたりの格闘具合はソースコードを見てみて下さい。
その他、大変だったのはエンベロープのテーブル化。
YM2151の挙動をサンプリングして計算で真似てみました。
結構いい感じにまとまってきたのではないでしょうか。
全く同じではなく、似てる感じが頑張ってる感出てます。
音量をテーブル化すると、音量が変わる時にこれまたノイズが乗るので、ロマンシアは
かなりボソボソいっております。これは2点取って補完する処理を入れなければいけない
けどこれも積み残し。
次はついに4オペレータ化!オシレータの波形追加!フィードバック!あとはパッチ!!
パッチはまた地獄になりそうやな・・。