C++播放蜂鳴(一)


最近聽了場音樂會,為啥音樂會那么吸引人呢?

自己完全是五音不全,用電腦自動生成人類欣賞音樂肯定是可行的,但是如何去做呢。

可惜本人完全是編程盲,只能從最基礎開始,希望隨着自己深入學習,慢慢掌握C++的使用方法吧。這里注冊了一個博客,邊記錄邊學習吧。

要生成音樂,當然最開始的肯定是從蜂鳴器發生開始了。

百度了下BEEP 

http://msdn.microsoft.com/en-us/library/ms679277(VS.85).aspx

 MSDN中是這樣定義的

BOOL WINAPI Beep(
  _In_  DWORD dwFreq,
  _In_  DWORD dwDuration
);

前面第一個頻率,第二個是持續時間(毫秒)

同樣,里面提到一個例子

Beep( 750, 300 );

於是,打算測試一下。

#include <windows.h>

int main() {
    Beep( 750, 300 ); return 0; }

就聽到比較清脆的嘟的一聲。

百度了一下,人耳能聽到的聲音數值實在20-20000HZ之間,那么就玩玩看,將BEEP頻率隨便改改,我這邊台式只有個外放的音響,將頻率調整至30以下15000以上就基本聽不到了,而100以下,10000以上,聽起來就非常難受,哈哈,也許可以適合防盜。

在測試一下持續時間,發現最短的時間是2,小於2就沒啥反應。比如改為

#include <windows.h>

int main() {
    Beep( 1000, 2); return 0;

那么聽起來就像是敲了一下桌子。

在試一試時間間隔。發現連續兩個Beep中間是有一定 時間間隔的。不能很好的將兩個Beep連在一起,百度沒查到時間間隔,只能自己試着玩玩。

#include <windows.h>
#include<iostream>

using namespace std; int main() { double start=GetTickCount(); int i; for(i=0;i<20;i++){ Beep( 800, 1000); } double end=GetTickCount(); cout<<"時間差為"<<end-start<<endl; return 0; }

然后發現運行起來360安全衛士就開始報毒了,什么情況。關閉360,重新運行。發現結果竟然是“時間差為20000”,一毫秒都不多,那么這個時間間隔就是包含在BEEP里的1000毫秒中了,也就是響的時間肯定不到1000毫秒,其中一定的時間是被用到了時間間隔。

不管怎么說都比較小,暫時都不關心了,那么現在就可以來一首歌了,當然是自動生成,這就用到了隨機數,不然怎么算是自動生成的呢?

#include <windows.h>
#include<iostream> #include <cstdlib> using namespace std; int main() { double start=GetTickCount(); int i; srand(5); for(i=0;i<20;i++){ int a1=rand()%12+2; int a2=rand()%12+2; int a3=rand()%12+2; int b1=rand()%10+10; int b2=rand()%10+10; int a=a1*a2*a3; int b=b1*b2; Beep( a, b); cout<<a<<" "<<b<<endl; } double end=GetTickCount(); cout<<"時間差為"<<end-start<<endl; return 0; }

 

隨便弄一個,因為音樂從低到高范圍很廣,簡單就用隨機數相乘了,聽了一下挺怪異的哈。不過因為srand()里 的種子是固定的,所以要是覺得好聽可以再聽一遍的哈。換一首改個種子就可以了。先玩到這吧。回頭再說。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM