在電腦中播放聲音的方法

來源:互聯網
上載者:User

我的目的就是在電腦上類比各種樂器,利用音箱逼真的播放出樂器的聲音。萬事開頭難,第一步首先讓電腦播放出一個簡單的音節來,這就跟初學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原創。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.