6/28 ===== プログラム ===== * シーケンサの時間管理は実装済み。 * エンベロープも単純な形で実装済み。 * あとオシレータをプログラム側で追加、強引にポリフォニック的に和音を演奏してみた。 * 割とシンセとして使うには早いとこ実装出来るかも。 ---- * で、現在鳴ってる波形を確認してみたところ、波形が補間されてる気がしてる。 * むしろ結構きれいにくっついてるというか。 * これどうやってんだろう?と思ってソースコード眺めてた。 * どうも、1周期がdoubleの1.00という基準で加算する時間を変更して周期を決めてるみたい。 * サンプルレート単位の周波数から、1byteあたり何秒経過するかを求めて、それを管理してるみたい。なので周期あたりに求める波形の位置にズレがない、という感じ。勉強になる実装だ。 * 自作のシンセだと波形の位相を計算して求めていた記憶があるけど、こちらの実装の方が小数点計算だけど処理に手間がかからないので便利かも。 * メガデモも「実行ファイルが縮めばいい」ので、実装の選択肢に入る。どうしても小数点計算は必要なので。 ---- * ただ現在の実装で問題なのが「1個しかオシレータ使うこと想定してない」こと。 * 元々1個の音声再生を想定して作られてるのを改造したから当然だけど、シンセとして使うにはちょっと不足がある。 * ということで、完全にライブラリ側の定義に依存しないように利用関数ごとすべて別に定義しなおした。 * これで独自実装してもライブラリ側への影響はほぼない形にできる。 * トラックごとのデータ形式を別途持たせておけばとりあえず大丈夫そう。 * トラック数は制約をかける。本来制限はないからインスタンス追加という形式にすれば問題ないはずではあるけど、今回は安定動作も役割として必要かと思うし、限定的にしておく。 * あと再生のシステムにとっては途中のメモリ確保は動作に影響及ぼすのもあり、そういうのを回避する考えもある。 * 更に言うと利用者がそこまでガバガバトラックを作りまくるプログラムを書くかという話もある。(自分はあっても32とかじゃね?って思ってる) ---- * https://miniaud.io/docs/manual/index.html * ドキュメント見ながら実装してる。 * 複数のサウンドを乗せて実装するのは「エンジン」というシステム経由で可能。 * ただこれもまた考えが難しいし、ずっとストリーム流す形になるのでそれ大丈夫なの?という問題もある。(だからリングバッファがあるのかもしれないけど) * あとメンテするのに構成を単純にしておきたいのもあり、シンプルな作りにしておく。 * なので音声再生は「1in・1out」として入出力のクラスを作成した。将来的に単体で録音ができるようにするかもしれない。 * 構造のメンテナンスもそれほど難しくないと分かったので、作ってやり直すのもそれほど時間かからなさそう。