在电脑中播放声音的方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值