ユーザー モードとカーネル モードの比較
カスタムシンセは、ユーザーモードまたはカーネルモードのいずれかで動作するように記述できます。 一般に、ソフトウェア シンセはユーザー モードでの実装が簡単ですが、多くの場合、カーネル モードでは待機時間を短くすることができます。 ハードウェア コンポーネントは、カーネル モードでのみサポートできます。 ただし、最終的な実装がカーネル モードで実行される場合でも、ユーザー モードで開発を開始する正当な理由があります。
ソフトウェア シンセサイザー (およびウェーブ シンク) の構築は、ユーザー モードでははるかに簡単です。 ユーザー モード インターフェイスは使いやすく、デバッグが簡略化されています。 もう 一つの利点は、結果のコンポーネントが Microsoft Windows 実行可能ファイルであることです。 この実行可能ファイルは COM オブジェクトであるため、インストールはコマンド ラインから regsvr32.exe で自己登録するだけで済みます。 (RegSvr32 システム アプリケーションは、DLL の DllRegisterServer関数を呼び出します。詳細については、Microsoft Windows SDK のドキュメントを参照してください。
ユーザー モードの実装だけで十分な場合は、ドライバーの代わりにアプリケーション プログラムを使用して製品を配布できます。 ユーザーは複雑なドライバーのインストールプロセスを回避し、インストール後に再起動する必要はありません。 その後、ユーザー モード コンポーネントは、他のアプリケーションで使用できるようにするかどうかに応じて、使用可能なポートの 1 つとして列挙できます。 詳細については、シンセサイザーの登録を参照してください。
カーネル モード ソフトウェア実装の利点は、待機時間が短いことです。 しかし、タイムスタンプ付きメッセージの出現により、この利点は以前ほど大きくありません。 従来の MIDI API にはタイムスタンプがなかったため、ノートを演奏すると、そのときだけ再生キューに入れられました。 タイムスタンプを使用すると、将来の指定した時間に再生するノートをキューに入れることができます。 タイムスタンプを使用すると、事前の警告がシステムに固有のレイテンシーよりも小さくない限り、ノートは正しい時間に再生されます。
レイテンシーが問題になるのは、事前の警告がほとんどまたはまったくない状態でサウンドが再生されるキューに入れられている場合のみです。 したがって、カーネル モードの実装は、ユーザー モード ソフトウェアの実装に望ましくない制限がある場合、またはハードウェア アクセラレーションをサポートする場合にのみ推奨されます。
カーネル モードの実装を行う場合でも、ユーザー モードで開発を開始するのが最善の方法です。 Microsoftのユーザーモードシンセサイザーのソースコードは、Microsoft Windows Driver Kit(WDK)で提供されているため、新しいシンセサイザーをゼロから作成する必要はありません。 既存のコードを使用して、ダウンロード可能なサウンド (DLS) のダウンロードがどのように解析されるかを理解できます。 次に、新しい機能 (追加のチャンクの解析など) を追加し、最初にユーザー モードでこのロジックをデバッグして、ハードウェアにアクセスするルーチンをスタブ化できます。 (スタブアウトルーチンは、何もしないか、ソフトウェアでハードウェア機能をエミュレートすることができます。DLS の詳細については、Windows SDK のドキュメントを参照してください。
実装をユーザー モードで動作させる場合は、カーネル モードに移動して、そこで動作させることができます。 ソフトウェア バージョンをカーネル モードで動作させたら、次の手順は、ハードウェアへの機能の移動を開始することです。 ユーザー モードとカーネル モードのソフトウェア シンセは、ハードウェア シンセサイザーを起動して実行するプロセスの便利な中間ステップとして機能します。
上記の推奨事項を要約すると、次のようになります:
ソフトウェアのみのコンポーネントの場合は、最初にコンポーネントをユーザー モードで実装し (簡単なインターフェイス、デバッグ、インストール、削除で設計上の問題を解決するため)、待機時間やその他の考慮事項のために必要に応じてカーネル モードに変換します。
ハードウェア コンポーネントの場合は、最初にユーザー モードでソフトウェア バージョンを実装し (簡単なインターフェイス、デバッグ、インストール、削除で設計上の問題を解決するため)、次にカーネル モードのソフトウェア バージョンに変換します。 最後に、すべてが希望どおりに動作するまで、カーネル モード コンポーネントを一度に 1 つの機能でハードウェアに接続します。