我的目的就是在电脑上模拟各种乐器,利用音箱逼真的播放出乐器的声音。万事开头难,第一步首先让电脑播放出一个简单的音节来,这就跟初学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原创。