第39章. 完全なホスト、最初から最後まで
この章の目的
この章を読み終える頃には、完全なピアノロールホストを読んで、この部の各テクニックがその中のどこに出てくるかが分かるようになります。この章を読み終える頃には、完全なピアノロールホストを読んで、この部の各テクニックがその中のどこに出てくるかが分かるようになります。
ファイル
ピアノロールのホストはリポジトリの中の1つのファイルexamples/piano_roll.rsです。およそ1300行で、読まれることを意図して書かれています。この章はその地図です。ピアノロールのホストはリポジトリの中の1つのファイルexamples/piano_roll.rsです。およそ1300行で、読まれることを意図して書かれています。この章はその地図です。
2種類のコード
最初の通読で認識すべき最も役立つ事は、ファイルには2種類のコードが入っていて、そのうち1種類だけがKeleusmaの組み込みに関するものだ、ということです。最初の通読で認識すべき最も役立つ事は、ファイルには2種類のコードが入っていて、そのうち1種類だけがKeleusmaの組み込みに関するものだ、ということです。
組み込みコードはこの部の話題で、ファイルの一部分でしかありません。
build_moduleは第32章の段階 —tokenize、parse、compile、を実行します。build_moduleは第32章の段階 —tokenize、parse、compile、を実行します。runがArenaとVmを構築します — 第32章の残り、です。register_nativesが16個のネイティブをregister_native_closureで登録します — 第33章の取り込み状態のルート、です。register_nativesが16個のネイティブをregister_native_closureで登録します — 第33章の取り込み状態のルート、です。init_dataがset_dataでデータセグメントを初期化します。- メインのティックループが
resumeを呼び、VmStateにマッチし、Resetケースを処理します — 第34章のプロトコル、です。メインのティックループがresumeを呼び、VmStateにマッチし、Resetケースを処理します — 第34章のプロトコル、です。 Resetアームがreplace_moduleを呼んで楽曲を切り替えます — 第37章のホットスワップ、です。Resetアームがreplace_moduleを呼んで楽曲を切り替えます — 第37章のホットスワップ、です。
オーディオ合成コードはそれ以外のすべてで、Keleusmaにはまったく関係ありません。Mixer、AudioCallback実装、advance_envelope、waveform_sample、VoiceとEnvState構造体、SDL3デバイスのセットアップは普通のソフトウェアシンセサイザーです。どんなオーディオプログラムも同じようなコードが必要です。ファイルを組み込みの学習のために読むとき、このコードはざっと飛ばして構いません。オーディオ合成コードはそれ以外のすべてで、Keleusmaにはまったく関係ありません。Mixer、AudioCallback実装、advance_envelope、waveform_sample、VoiceとEnvState構造体、SDL3デバイスのセットアップは普通のソフトウェアシンセサイザーです。どんなオーディオプログラムも同じようなコードが必要です。ファイルを組み込みの学習のために読むとき、このコードはざっと飛ばして構いません。
main と run の分離
ファイルは2つの関心を分けています。関数mainはアプリケーションの装飾 — 引数処理やプロセスレベルのセットアップ — を担います。関数runは組み込み可能なホストループ — VMの構築、オーディオデバイスのオープン、ネイティブの登録、ティック・アンド・イールドサイクルのドライブ — を担います。両者の境界は、別のアプリケーションが捨てる部分とコピーする部分の境界です。ピアノロールを別のプログラムに持ち込む開発者は、runの本体をコピーします。ファイルは2つの関心を分けています。関数mainはアプリケーションの装飾 — 引数処理やプロセスレベルのセットアップ — を担います。関数runは組み込み可能なホストループ — VMの構築、オーディオデバイスのオープン、ネイティブの登録、ティック・アンド・イールドサイクルのドライブ — を担います。両者の境界は、別のアプリケーションが捨てる部分とコピーする部分の境界です。ピアノロールを別のプログラムに持ち込む開発者は、runの本体をコピーします。
クックブックのパターン
リポジトリのCOOKBOOK.mdは、アプリケーションを跨いで繰り返される、そしてピアノロールが触れているホスト側のパターンを集めています — モジュールのWCMUからアリーナをサイズする、ホスト構成のためのデータローダーパターン、サブ64ビットターゲットのための狭いランタイム型エイリアシング、署名付きバイトコードの配信、測定されたコストモデルでキャリブレートされたWCET、です。それぞれがこの部のテクニックを土台にした短いレシピです。リポジトリのCOOKBOOK.mdは、アプリケーションを跨いで繰り返される、そしてピアノロールが触れているホスト側のパターンを集めています — モジュールのWCMUからアリーナをサイズする、ホスト構成のためのデータローダーパターン、サブ64ビットターゲットのための狭いランタイム型エイリアシング、署名付きバイトコードの配信、測定されたコストモデルでキャリブレートされたWCET、です。それぞれがこの部のテクニックを土台にした短いレシピです。
この章のまとめ
- ピアノロールのホストは1つの読める形式の、およそ1300行のファイルです。
- ファイルには組み込みコードとオーディオ合成コードが入っていますが、最初の方だけがKeleusmaに関するもので、それはファイルのごく一部です。ファイルには組み込みコードとオーディオ合成コードが入っていますが、最初の方だけがKeleusmaに関するもので、それはファイルのごく一部です。
- この部のすべてのテクニックがその中に出てきます — 構築、ネイティブ登録、再開プロトコル、ホットスワップ、です。この部のすべてのテクニックがその中に出てきます — 構築、ネイティブ登録、再開プロトコル、ホットスワップ、です。
mainとrunの分離が、アプリケーションの装飾と組み込み可能なホストループを分けています。mainとrunの分離が、アプリケーションの装飾と組み込み可能なホストループを分けています。
これで第9部は完了です。ホスト側のすべての要素 — 構築、ネイティブ関数、コルーチンプロトコル、アリーナのサイズ、バイトコードの読み込み、ホットスワップ、コストモデル — を持ちました。最後の部は、ここからどこへ進めばよいかを指し示します。これで第9部は完了です。ホスト側のすべての要素 — 構築、ネイティブ関数、コルーチンプロトコル、アリーナのサイズ、バイトコードの読み込み、ホットスワップ、コストモデル — を持ちました。最後の部は、ここからどこへ進めばよいかを指し示します。