2010-02-19 76 views
1

如何從C++程序發送MIDI信息並讓它們從通用MIDI庫中播放聲音?在OS X,C++中播放MIDI輸出

我環顧四周,似乎沒有一個簡單的答案,我的大腦在閱讀了關於CoreMIDI以及類似內容的長篇手冊後開始融化。

我有一個簡單的C++遊戲/合成器項目,我想要做的就是,例如,當這個球碰到地板時,觸發Grand Piano銀行的C4。我對大部分節目都很滿意,但是對於我來說,完整的MIDI部分迄今爲止完全不透明。

我想使用CoreMIDI,因爲它似乎可能是最簡單的,但多平臺的東西將是一個獎金。

非常感謝您的幫助!

回答

2

另一種選擇是rtmidi

它的目的是簡單和跨平臺

我已經用於實時音頻類似rtaudio I/O,這是比較容易使用。

您應該能夠使用示例代碼列出所有MIDI設備,然後選擇GM銀行,並在選擇帶有程序更改消息的鋼琴後發送相應的MIDI消息(音符開/關消息)。維基百科有helpful page開始

+0

rtmidi看起來很完美,但它不會編譯。我得到關於vtables的一個錯誤。我還沒挖得很深,但它似乎是關於編譯器標誌的東西,所以非常感謝。 – BonzaiRob 2010-02-22 18:01:45

+0

http://www.music.mcgill.ca/~gary/rtmidi/index.html#compiling應該解釋你需要的一切,我嘗試了win32上的midiprobe示例代碼,並且沒有麻煩地編譯。 如果您需要開發人員的幫助,可以嘗試綜合工具套件的郵件列表(https://ccrma.stanford.edu/software/stk/),它包含此rtmidi類以及許多其他功能。它也由同一個開發人員構建。 – 2010-02-22 19:44:20

+0

我使用的標誌,它編譯得很好,但後來不會鏈接。如果我在主文件中包含rtmidi.h,則返回到vtables錯誤。 因此,我最終編制了大量的兩個文件。我確信有很多原因,這是一個壞主意。 – BonzaiRob 2010-02-26 20:29:13

0

我寫了一個教程,可以幫助使用CoreMIDI遇到同樣​​問題的人。它解釋瞭如何讀取MIDI文件並使用聲音字體文件中的聲音效果輸出AUGraph。它還解釋瞭如何使用虛擬終端實時訪問midi消息。 Here

做你希望做的,你可以修改樣本項目中,我有以下提供什麼樣的:

result = MusicDeviceMIDIEvent ([AUSampler], midiStatus, note, velocity, 0); 

凡AUSampler是一個指向AUSampler即在AUGraph起點。您可以使用以下命令發送一個MIDI音符來播放,而不是從文件中讀取。