===== プログラム ===== * ライブコーディングツールの進捗 - サンプリング再生機能\\ 再生バッファに枠を確保ずみ、サンプリングデータを引っ張ってくる処理はまだ。 * 二次機能 - 任意のファイル読み込み - MIDIとオーディオの同期精度向上(パラメータ変更)\\ 対応済み。 - 利用MIDIデバイス選択\\ 実装済み。 - サイクルの時間表示 - MML機能拡張 * 優先度若干下げ - ADSR、フィルタの実装、加えてエフェクトの実装\\ 未済、MIDIデータ出力で最低限の作曲は可能、サンプリングで補填等も検討 ---- * MIDIデバイスの選択については、ラジオボタン機能で作ることで問題なく実装できた。 * ListBoxの場合開閉でエラーが出ていたけど、それもなさそうなので安心。 * ラジオボタンを選択したら接続を行うという形にしている。 * これでエラーが出るなら未接続を項目として追加するのがいいかなと思った。 ---- * オーディオとのMIDIの再生遅延による演奏乱れについては軽減することができた。 * Play状態の間にバッファを噛ませることにして、一定秒数以上経過したら改めてバッファを進めるようにした。 * これだと発音自体は行っているけどシーケンス自体が進まない状態になってしまうので、ちょっと遅延やノイズが出るようになってしまった。これも対応済み。 * 細かく指定を入れていくことでどうにかなってきた。 * ただ、管理を別にしてしまった弊害として、MIDIとオーディオで同期が取れなくなってきてしまった。\\ 流石に、オーディオとMIDIでサイクルの半分フレーズがズレてきたのには笑ってしまった。 * ということであまり意味がないのかもしれないけど、バッファ更新タイミングでオーディオとMIDIのシーケンス位置について同期を取ることにした。これで再生が大きくおかしくなるのは避けられる。 ---- * また、MIDIの1個目の譜面が再生されないバグがあった。\\ 最初はデータが間に合ってないとかかと思ったけど、タイミングの調整を導入したら明らかに間に合っている状態で再生されないため、これはおかしいと調査を開始。 * 原因はなんてことはない、「再生可否を確認することなくデータを再生する一択」の処理になっていたことが原因だった。\\ このため、停止を行っても少しバッファが進んでいる状態でしかも1個目のデータが停止するのに鳴っている状態だった。 * 再生フラグをしっかり確認して鳴らすようにしたら回避可能になった。 * かなり完成度が上がってきてる。なかなか楽しい。 ---- * 追加 * 上記の多重化のおかげで、別のタイミングで再生情報が初期化されるバグがあったので除去してた。多分1時間くらいかかった。 * デバッグは、通常の処理に加えコールバック処理の最初・最後にブレークポイントやprintfを引っ掛けて、タイミングを確認する状態になった。 * 今までで一番厄介なバグだった・・・そこまでの蓄積がなければ泥沼にはまってたはず。 ---- * ノイズを低減させるために以下の資料を読み込んでみよう * https://postd.cc/four-common-mistakes-in-audio-development/ * メインスレッドで言語のコンパイル処理が挟まっているので、これはやべえなと思って、マルチスレッド構造にしてコンパイル処理を別スレッドに流すようにした。 * メインスレッドはGUIでファイル参照の心配はほぼないんだけど、コンパイルするときにファイル読んでから行うようにしているので、GUI側でメモリ確保が挟まってしまうこと考えると、マルチスレッドにしておいたほうが安全かなと思い始めた。 * デバッグが大変かもしれないけど、基本的にはデータサーバ処理は別物にしているので、どうにかなると思いたい。 * で、Releaseでデバッグしてみたところ、うまくスレッド周りが終了しないことが発覚。何かと思ったら最適化によって正常に動かなくなっていたという。 * https://ameblo.jp/super-hk/entry-12678708771.html * 危なかった・・・(汗