最近聽了場音樂會,為啥音樂會那么吸引人呢?
自己完全是五音不全,用電腦自動生成人類欣賞音樂肯定是可行的,但是如何去做呢。
可惜本人完全是編程盲,只能從最基礎開始,希望隨着自己深入學習,慢慢掌握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()里 的種子是固定的,所以要是覺得好聽可以再聽一遍的哈。換一首改個種子就可以了。先玩到這吧。回頭再說。