7/8日記 ===== プログラム ===== * 進捗 - ファイル読み込み(最初は同期、可能なら非同期読み込み)\\ 完了。ファイルのセーブ状況検知・UI改善予定 - Miniscriptプログラムのコンパイル\\ 完了、ツール上も動作を確認 - 組込み関数の追加\\ 未済、機能検証中 - コンパイルしたデータとサウンドの譜面を紐づける実装\\ 未済 - ADSR、フィルタの実装、加えてエフェクトの実装\\ 未済 * ライブコーディングツール、まずはテスト的にシーケンス切り出し処理を実装してみる。 * 現在作成中のツールで実装するのでもいいけど複合要因で「どこが間違っているのか分からない」ケースが発生しうるので、できる限り最初から切り分けて考えられるようにした。 * Valueクラスを基準にして再帰関数を作って調べられるようにした。 ---- * せっかくC#での実装を以前に作っているので、同じことするのであればC++上で再現してみることにした。 * まずnote_info構造体を作り、複数の情報を保存できるようにしておく。 * 理由は「音程」「譜面の長さ」「譜面単位の現在の再生位置」「ネスト構造が作られているかどうか」等、意外と判断する情報が多いから。 * 移植は終わって、まともに動いてるよう。 * 後述の問題があって、確認するのは後になりそうだが。 ===== プログラム2 ===== * 午後に問題勃発。 * 仕組み上、MiniScriptから変数を別途保存領域に確保することが困難で、これをどうやって保存したらいいのか、という問題が発生した。 * なお、これはC++版でのみ発生で、C#版については簡単に保存可能なことを特記しておく。(だからこそ最初C#版で作れたわけでな) ---- * MiniscriptはVMを確保して動かしており、変数はそのVMに紐づく形で保存領域を確保している。 * VMの他に別途staticなメモリ領域を確保しても、Miniscriptで利用する型を定義する場合基本的にはアドレスしか保存されておらず、実体の保存および参照が正常に行えないことになる。 * つまり、VMで得た値を簡単な方法でVM外に保存するのが困難ということ。 * 勿論オブジェクトとの連携は元々可能だが、これは「Miniscriptの実行中に参照する」だったり、Context(実行処理)内に同じクラスへアクセスすることが前提になる。今回のケースではスクリプト実行処理の外でのアクセスが必要になるため、この連携が面倒になっている。 ---- * 解決法 * VMの機能上グローバル変数用のマップ(文字列と値のペア)を持っているため、この領域に保存と参照が可能になっている。 * 今回作成中のアプリの形式ではコンパイルと実行を一個の処理で行う事から、再コンパイル時にグローバル変数を再度登録するので、アクセスできる状態は継続できそう(初期化してないはずなので) * よって変数には別途確保せずVM上のグローバル変数のマップから参照する方法が一番確実。 * この調査のためにDiscordを延々調べてようやくたどり着いたという。すげえ時間かかったわ。 * あとでMiniscriptのWikiに情報アップしておく予定。組み込みする人だと必要になると思うし。 ---- * 16時頃に問題に遭遇、途中で寝てたけどそこから解決まで色々調べていた。 * こういうのがあると情報がない分面倒だなと思う。