7/9日記 ===== プログラム ===== * 進捗 - ファイル読み込み(最初は同期、可能なら非同期読み込み)\\ 完了。ファイルのセーブ状況検知・UI改善予定 - Miniscriptプログラムのコンパイル\\ 完了 - 組込み関数の追加\\ 実装中、実装時の仕様について決定 - コンパイルしたデータとサウンドの譜面を紐づける実装\\ 未済、着手中 - ADSR、フィルタの実装、加えてエフェクトの実装\\ 未済 * ライブコーディングツールの開発中。 * 譜面を読み込ませて偽のWAVデータ生成処理を動かしてみたところ、譜面を正常に出力できてる。これならば問題なさそう。\\ (Callback処理でWAVをバイト単位で生成するので、同様の処理をWhileループで作ってみたお手軽なスタブ) * あとはグローバル変数をVM上に用意する必要があるので、起動時に名前決め打ちでマップの紐付けする形が確実と思った。 * VM上に登録する関係で配列が使えないのでちょっと面倒だなあと思ったが、関数をトラック単位で分ける予定なので、分岐速度はあまり気にしなくていい見込み。 ---- * 当初のプログラムに組み込み実施。 * 変数については一度仮に値を突っ込んだが、そもそもInterpreterを一度でも起動しておかないとマップ作成ができないらしいので、一度空のソースコードを起動してInterpreterを使える状態にしてから、マップ作成を組み込んでみた。 * ただ、結論から言うとこの状態だと動かない。組み込み関数経由で情報登録して初めて動いたので、初期化周りで不足がある可能性はある。もしくはContext経由の情報登録でしかうまく更新されない可能性。 * 上記より、Context(Interpreterの実行処理)から変数登録を行うのが一番安全ということがわかった。 * このため、以下の対応を実施。 - 保存用インタプリタのインスタンスを用意 - 1.をコンパイル実行(空のソース、これにより正常に初期化が行われる) - 2.を実施したインタプリタのインスタンスにグローバル変数を登録 - 実行用のインタプリタのインスタンスを用意 - 以降の更新は4.のインスタンスを用いる - グローバル変数が必要な場合、1.のインスタンスから変数を呼びだす。 * なかなかな回り道ぽいけど、より確実な方法を採用した。 ---- * また問題発生。 * 今のところMiniscriptのVM上のグローバル変数について、変数そのものにアクセスして状態を調べることは仕様上困難。(アクセスの時点で識別子が存在しない場合エラー検知する) * VM上で発生したエラーを握りつぶすこともできるけど、影響範囲がVM全体に及んでしまうので修正を避けることにした。 * 上記より、別の変数をもってVMに変数を保存しているかを確認する必要がある。 * 今のところ所定の箇所にbool変数作って管理してみることにした。 * 使い方としては複数回のコンパイルにも対応する形で変数更新の管理を行うことで、最悪VMがクリアされてもまた全部更新しない扱いに戻す等もできるので割と取り扱いは楽かなと思った。 * なんか作りがどんどんややこしくなってきてるぞ・・・(汗 ---- * [[2024:07:04|以前書いた残り作業]]について、以下の状態。 * ここ数日は主に3.および4.について対応していた。4.がウェイト高くかつフィージビリティの確認が必要な内容だったけど、本日時点でどうにかできたのでこれでよしとする。 * とは言うものの、まだ中途半端な状態なので、再生システムと3.を紐づけて更新できれば完了というところ。 ---- * 作曲用の関数について。 * 前回は作りながら仕様を策定していたけど、今回は利用関数の仕様を先に決めてある。 * 初心者向けに使う関数と、マニアックな使い方ができる関数で分割しているので、これでよし。 * ただ1種類だけ、実装に時間がかかりそうな関数がでてきてるので、これは後回しにする。 * 作ることができれば便利なんだけど、それなりに時間がかかりそうな気がする。