我的目的就是在電腦上類比各種樂器,利用音箱逼真的播放出樂器的聲音。萬事開頭難,第一步首先讓電腦播放出一個簡單的音節來,這就跟初學c語言時的helloworld一樣。
(1) 首先下載RtMidi庫,這是一個開源的聲音庫。RtMidi is
a set of C++ classes (RtMidiIn, RtMidiOut and
API-specific classes) that provides a common API (Application Programming Interface) for realtime MIDI input/output across Linux (ALSA & Jack), Macintosh OS X (CoreMidi & Jack), and Windows (Multimedia Library & Kernel Streaming) operating systems. RtMidi significantly
simplifies the process of interacting with computer MIDI hardware and software. It was designed with the following goals:Rtmidi是一個c++語言編寫的開源的即時的MIDi播放庫,可以在macosx,Linux,windows上運行。
:http://www.music.mcgill.ca/~gary/rtmidi/release/rtmidi-2.0.1.tar.gz ;最新的版本是2.0.1的。
(2) 開啟下載完的檔案,解壓到一個檔案夾中,開啟test檔案夾,使用vs開啟裡面的*.sln檔案。然後點擊運行,一個聲音就在音響裡面播放出來了。
(3)然而這個庫自己帶的例子太複雜了,不太適合初學這個庫的人做。於是我自己重新寫了一個helloworld(當然也可以直接在官網上找到以下的原始碼),程式如下:
(4)如果對術語不太懂的話,看其他幾篇博文。尤其是:http://blog.csdn.net/jia_zhengshen/article/details/8777071
#include <iostream>#include <cstdlib>#include "RtMidi.h"int main(){ RtMidiOut *midiout = new RtMidiOut(); std::vector<unsigned char> message; // Check available ports. unsigned int nPorts = midiout->getPortCount(); if ( nPorts == 0 ) {//看看有多少個可以使用的midi介面。為0是什麼意思?不解釋。 std::cout << "No ports available!\n"; goto cleanup;//雖然goto語句少用,但是這裡就這麼少的代碼,2,3根爛麵條你總能分的青吧 } // Open first available port. midiout->openPort( 0 );//開啟第一個midi口。 // Send out a series of MIDI messages. // Program change: 192, 5 message.push_back( 192 );//192==0xc0,這是什麼意思?看http://blog.csdn.net/jia_zhengshen/article/details/8777071 這裡用一篇文章來解釋 message.push_back( 5 ); midiout->sendMessage( &message ); // Control Change: 176, 7, 100 (volume) message[0] = 176;//調節音量。//176==b0;看上面的網址的解釋。太複雜了,雖然代碼很簡單,但是解釋清楚很不容易。 message[1] = 7; message.push_back( 100 );//這裡是push_back,如果是message【2】會導致出記憶體溢出問題。 midiout->sendMessage( &message ); // Note On: 144, 64, 90 message[0] = 144;//開始演奏 message[1] = 64;//演奏代碼為64的音符 message[2] = 90;//速度為90,最高位7fh midiout->sendMessage( &message ); SLEEP( 500 ); // Platform-dependent ... see example in tests directory. // Note Off: 128, 64, 40 message[0] = 128;//終止演奏 message[1] = 64;//停止64的音符 message[2] = 40;//速度為40 midiout->sendMessage( &message ); // Clean up cleanup: delete midiout; getchar(); return 0;}
這些代碼比較簡單。比較適合初學者。把test工程裡的sysextest.cpp檔案下的代碼全部注釋掉,複製進這些代碼,一個音符近會通過音響輸出出來。
講解完畢。本文http://my.csdn.net/jia_zhengshen原創。