zoukankan      html  css  js  c++  java
  • 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()里 的种子是固定的,所以要是觉得好听可以再听一遍的哈。换一首改个种子就可以了。先玩到这吧。回头再说。

  • 相关阅读:
    Oracle查询语句中指定索引时优化器及指定索引不好使的处理方法
    oracle 死锁处理
    ORACLE里锁的几种模式
    oracle rpad()函数
    Oracle JOB
    Oracle 函数取汉字的拼音首字母
    COM 组件注册方法
    oracle 创建一个用户,只能访问指定的对象
    SOAP和WSDL的一些必要知识
    【转】net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
  • 原文地址:https://www.cnblogs.com/shibuliao/p/3807898.html
Copyright © 2011-2022 走看看