7/13日記 ===== プログラム ===== * 進捗 - ファイル読み込み(最初は同期、可能なら非同期読み込み)\\ ファイルのセーブ状況検知実装予定、MIDI設定を改造予定 - 組込み関数の追加\\ オーディオ・MIDI・スピード変更は実装完了。今後拡張予定。 - コンパイルしたデータとサウンドの譜面を紐づける実装\\ 本日、MIDI機能の作り直しを実施。 - ADSR、フィルタの実装、加えてエフェクトの実装\\ まだ ---- * 朝起きたときに思いついたアイデアをすぐ実装してみた。 * コア部分ではあるけど1時間程度で実装からテストまで終わるのは楽ではある。 * 結果としては問題なく動いてる。 * 内容としては、「オーディオのコールバック処理にMIDIの出力をスケジュール入りで加える」というもの。 * ネックなのは以下の部分。 - MIDIデバイスとの連携において、デバイスをフックするときにオーディオのコールバックを邪魔しないか(実際Prinfを仕込むと落ちる) - miniaudioのIF内にオーディオ以外に要素を追加する必要があるため協調が上手くいくか - そもそもMIDI出力をコールバック上の遅延を指定することができるのか * 今のところ協調動作も問題なく動いているのでよかった。(少しレイテンシーはある) * もちろん1フレーム単位で命令送る場合動作に影響がある旨は確認したけど、それは仕様上仕方ない(プログラムで追加できてしまう)ので、まずは命令を想定どおりに送れることを確認したかった。 * 3.についても、PortMidiで遅延時間を考慮した指定ができるため、これを利用することにした。 * スレッド上の命令として時間管理しなくてもよくなったので、管理項目が減った。助かる。 ---- * MIDIのレイテンシーについて * レイテンシーは0より下はできないからどうやっても基準値より早く発音はできない(当然ながら) * なので他の選択肢としては「オーディオのレイテンシーを変更すればいいのでは」という。 * もちろん計算は狂うから即時に対応できるとも言い難いが、元々ライブコーディングの制約の関係上すぐに発音はできないので、それを利用して待ち時間に組み込む作戦。 ---- * PortMidiの仕様上16進数でメッセージを整形してもいいんだけど、引数としてはint型なので、トラックごとに加工が必要な場合は、一度int型で準備して、それをそのまま読み込ませる方が正常にメッセージを処理できるっぽい。 * 具体的には各トラックでフレーズを分ける場合。\\ 16進数で計算しようとしても難しいし、そもそもトラック番号をどうやって16進数に変換するんだって話なので、まず全部10進数で計算することにした。 * で、Pm_message関数はintで受け付けるので変換の必要なくそのまま読み込ませる形で対応できる。 * これで問題なく複数パートの演奏ができた。前述のオーディオコールバックに組み込んだ状態でも遅延やノイズは認められず。 ---- * サンプリングについても導入を検討 * https://wiki.laptop.org/go/Free_sound_samples * これを利用予定 * https://github.com/mhroth/tinywav * 正直自分でもWAV読み込み書き込みはできるんだけど、せっかくあるので使わせてもらおう的な考え。 *