2012-06-01 10 views
5

私はCで数学的な波動関数を使って音を作りました。プロジェクトの次のステップは、MIDIキーボードコントローラからのユーザ入力を受けて、ピッチ。C Linuxデバイスプログラミング - ストレートfrom/Devを読む

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

しかし、研究では、MIDIコントローラのデバイスドライバを作成することを圧倒してお勧めします。一般的な考え方は、デバイスファイルが存在していても、アプリケーションがread()やwrite()のような関数を呼び出すときにカーネルが実行するシステムコールを知りません。

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

だから私の質問は以下のとおりです。

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

これは、システムにプラグアンドプレイデバイスドライバがインストールされていることを意味しますか?

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

これらの分野であなたの知恵を共有していただき、ありがとうございます。

+0

これをcat'tingするのではなく、 'C'プログラムからデバイスを読み込むことをお勧めします。 「有効な」データが表示されているとしたら、確かにわからないのですか? btwには既にそこにデバイスドライバが存在していなければなりません。さもなければ、デバイスファイルを持っていなくても、それにアクセスする方法もありません。 – KevinDTimm

答えて

5

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

これはおそらくコントローラーが受信している生のMIDIデータです。 nullバイトはおそらく何らかの種類のシンクティックです。

これは、システムにプラグアンドプレイデバイスドライバがインストールされていることを意味しますか?

はい。

しかし、私の研究では、MIDIコントローラのデバイスドライバを作成することを圧倒してお勧めします。一般的な考え方は、デバイスファイルが存在していても、アプリケーションがread()やwrite()のような関数を呼び出すときにカーネルが実行するシステムコールを知りません。

< ...>

は、私はまだ先に行くと、デバイスドライバを書くか、私は、ファイルのようにそれを読んで逃げることができますでしょうか?

あなたが読んでいることや、この結論にどのようになっているかはわかりませんが、間違っています。 :)あなたは既にあなたのMIDIコントローラのためにインストールされた完全に良いドライバを手に入れました。

2

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

od -vtx1 /dev/midi1 

あなたは0xf8の束を見ている場合、それは大丈夫です。 MIDIコントローラーから送信されたテンポ情報が不要な場合は、コントローラーで無効にするか、それらの0xf8ステータスバイトを無視してください。

また、MIDIの場合、現在のMIDIステータスは通常(バイト単位で保存する)に送信され、その後はペイロードバイトが必要なだけ長く続くことに注意してください。例えば、ピッチベンド状態はバイト0xeK(Kはチャネル番号、すなわち0~15)であり、そのペイロードは最下位バイトの7ビットとそれに続く最上位バイトの7ビットである。したがって、奇妙なコントローラがあり、ステータスの繰り返しペイロードしか見ていないかもしれませんが、愚かではないコントローラは、必要のないものを繰り返さないでしょう。

ドライバの場合:MIDIコントローラを接続するとdmesgを見てください。あなたのOSS /dev/midi1と表示されたら、デバイスを接続すると(udevはこの仕事をしています)、dmesgはエラーを起こさないので、他に何も必要ありません。 MIDIプロトコルは、もう1つのシリアルプロトコルであり、固定のボーレートを持ち、バイトを送受信します。それについては何も複雑なことはありません。ただデバイスから読み書きするだけで、あなたは完了です。

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

また、LinuxでMIDIで遊んでいるALSA wayを見てください。

1

新しいMIDIコントローラハードウェアを開発していない場合は、ドライバを作成する心配はありません。ユーザーのハードウェアのインストールや、ドライバの供給義務があります。

Linuxでは、ファイルを読み込んだだけです。今すぐデータを解釈して有用なものを作る。