6

私は、C で数学的な波動関数を使用してサウンドを作成して遊んでいます。私のプロジェクトの次のステップは、波をさまざまなピッチに変調するために、MIDI キーボード コントローラーからユーザー入力を取得することです。

私の最初の考えは、これは比較的単純であり、Linux は Linux であるため、他のファイルと同じようにデバイスから生データ ストリームを読み取ることができるというものでした。

しかし、調査によると、MIDI コントローラー用のデバイス ドライバーを作成するように勧められています。一般的な考え方は、デバイス ファイルが存在する可能性があっても、アプリケーションが read() や write() などの関数を呼び出すときに、どのシステム コールを実行する必要があるかをカーネルが認識できないということです。

これらの警告にもかかわらず、私は実験を行いました。MIDI コントローラーを接続し、"/dev/midi1" デバイス ファイルを cat しました。null 文字の安定したストリームが表示され、MIDI コントローラーのキーを押すと、MIDI デバイスが出力する必要があると予想されるメッセージ チャンクに対応する数バイトが表示されました。MIDI プロトコル情報

だから私の質問は:

cat'ed ストリームがこのように動作するのはなぜですか?

これは、使用しているシステムにプラグ アンド プレイ デバイス ドライバーが既にインストールされているということですか?

デバイス ドライバーを作成する必要がありますか?それとも、ファイルのように読み取ることで解決できますか?

これらの分野であなたの知恵を共有してくれてありがとう。

4

3 に答える 3

5

cat'ed ストリームがこのように動作するのはなぜですか?

それはおそらく、コントローラーが受信している未加工の MIDI データだからです。null バイトは、おそらくある種の同期ティックです。

これは、使用しているシステムにプラグ アンド プレイ デバイス ドライバーが既にインストールされているということですか?

はい。

しかし、調査によると、MIDI コントローラー用のデバイス ドライバーを作成するように勧められています。一般的な考え方としては、デバイス ファイルが存在する可能性があっても、アプリケーションが read() や write() などの関数を呼び出すときに、カーネルはどのシステム コールを実行するかを認識していないということです。

<...>

デバイス ドライバーを作成する必要がありますか?それとも、ファイルのように読み取ることで解決できますか?

あなたが何を読んでいるのか、どのようにこの結論に達しているのかはわかりませんが、それは間違っています. :) あなたの MIDI コントローラー用に完全に優れたドライバーがインストールされています。どうぞ、それを使用してください!

于 2012-06-01T19:52:27.900 に答える
3

NULバイトを読んでよろしいですか?そして、0xf8バイトではありませんか?0xf8はMIDIタイムティックステータスであり、通常、楽器の同期を維持するために定期的に送信されるためです。を使用してデバイスを読んでみてくださいod

od -vtx1 /dev/midi1

0xf8がたくさん表示されている場合は、問題ありません。MIDIコントローラーから送信されるテンポ情報が必要ない場合は、コントローラーでテンポ情報を無効にするか、これらの0xf8ステータスバイトを無視してください。

また、MIDIの場合、現在のMIDIステータスは通常1回送信され(バイトを節約するため)、その後、ペイロードバイトが必要な期間続くことに注意してください。たとえば、ピッチベンドステータスはバイト0xeK(Kはチャネル番号、つまり0〜15)であり、そのペイロードは最下位バイトの7ビットとそれに続く最上位バイトの7ビットです。したがって、奇妙なコントローラーを入手し、あるステータスのペイロードが繰り返されるだけである可能性がありますが、愚かでないコントローラーは、必要のないものを繰り返すことはありません。

次に、ドライバーについてdmesg説明します。MIDIコントローラーを接続するタイミングを確認してください。これで、デバイスを接続したときにOSS/dev/midi1 が表示dmesgされ(udevがこのジョブを実行している)、エラーが発生しない場合は、他に何も必要ありません。MIDIプロトコルは、固定ボーレートを持ち、バイトを送受信する、まだ別のシリアルプロトコルです。それについて複雑なことは何もありません...デバイスからの読み取りまたはデバイスへの書き込みだけで完了です。

唯一の問題は、ある場所でキューに入れると、オーディオのレイテンシーが悪くなる可能性があることです(MIDIコマンドを使用してライブオーディオを制御している場合、これはあなたが行っていることだと思います)。これらのデバイスは、ほとんどがシステム専用メッセージ用に作成されているようです。たとえば、シンセサイザーのパッチ/プリセットをオンラインでダウンロードし、MIDIを使用してデバイスにアップロードします。この状況では、レイテンシーは実際には重要ではありません。

LinuxでMIDIを再生するALSAの方法もご覧ください。

于 2012-06-01T21:53:22.320 に答える
1

新しい MIDI コントローラー ハードウェアを開発していない場合は、そのドライバーの作成について心配する必要はありません。ハードウェアをインストールするのはユーザーの関心事であり、ドライバーを提供するのはベンダーの義務です。

Linux では、ファイルを読み取るだけです。次に、データを解釈して有用なものを作成します。

于 2012-06-01T22:02:15.620 に答える