在电脑中播放声音的方法

2019-04-14 12:36发布

我的目的就是在电脑上模拟各种乐器,利用音箱逼真的播放出乐器的声音。万事开头难,第一步首先让电脑播放出一个简单的音节来,这就跟初学c语言时的helloworld一样。 (1) 首先下载RtMidi库,这是一个开源的声音库。RtMidi is a set of C++ classes (RtMidiInRtMidiOut 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 #include #include "RtMidi.h" int main() { RtMidiOut *midiout = new RtMidiOut(); std::vector message; // Check available ports. unsigned int nPorts = midiout->getPortCount(); if ( nPorts == 0 ) {//看看有多少个可以使用的midi接口。为0是什么意思?不解释。 std::cout << "No ports available! "; 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原创。