2012-06-01 48 views
5
直讀

我一直在玩,以調製波的不同創造C.在我的項目的下一步是從一個MIDI鍵盤控制器讓用戶輸入使用數學波函數的聲音音高。çLinux設備編程 - 從/ dev

我的第一個觀點是,這將是相對簡單和Linux上,Linux的存在,可以讓我從我的設備就像我對任何其他文件中讀取原始數據流。

然而,絕大多數的研究建議,我寫的MIDI控制器的設備驅動程序。一般的想法是即使設備文件可能存在,當我的應用程序調用像read()和write()這樣的函數時,內核也不會知道要執行什麼系統調用。

儘管有這些警告,我做了一個實驗。我插入MIDI控制器並捕捉「/ dev/midi1」設備文件。出現了穩定的空字符流,當我在MIDI控制器上按下一個鍵時,幾個字節出現對應於MIDI設備應該輸出的預期消息塊。 MIDI Protocol Info

所以我的問題是:

爲什麼cat'ed流這樣的行爲?

這是否意味着我的系統中已經安裝了即插即用設備驅動程序?

如果我還是繼續寫一個設備驅動程序,或者我可以讀取它像一個文件脫身?

非常感謝您在這些領域分享您的智慧。

+0

而不是cat'ting它,我會建議你從'C'程序讀取()設備。你說你看到'有效'的數據,爲什麼不能確定?順便說一句,那裏必須有一個設備驅動程序,否則你不會有設備文件,也不會有方法訪問它。 – KevinDTimm

回答

5

爲什麼cat'ed流這樣的行爲?

因爲這可能是控制器正在接收的原始MIDI數據。空字節可能是某種同步時鐘。

這是否意味着我的系統中已經安裝了即插即用設備驅動程序?

是的。

但是,研究壓倒性地建議我爲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。現在,如果插入設備(udev正在執行此項工作)時您的OSS /dev/midi1出現,並且dmesg不會發出任何錯誤,則不需要其他任何操作。 MIDI協議是另一種串行協議,具有固定的波特率和發送/接收字節。沒有什麼複雜的...只需讀取或寫入設備,你就完成了。

唯一的問題是,在某些地方排隊可能會導致音頻延遲不佳(如果您使用MIDI命令來控制實時音頻,我相信您就是這麼做的)。看起來這些設備主要是針對系統專有的消息製作的,也就是說,例如,在線下載合成器的一些音色/預設並使用MIDI將其上傳到設備。在這種情況下,延遲並不重要。

也看看在Linux上使用MIDI播放的ALSA way

1

如果您沒有開發新的MIDI控制器硬件,則不必擔心爲其編寫驅動程序。用戶需要安裝他們的硬件,供應商有義務提供驅動程序。

在Linux下,您只需閱讀該文件。現在用數據解釋並做出有用的事情。