C++生成简单WAV文件(三)——根据简谱生成菊花台

上一次已经可以生成随机的音乐,要从单调的声音变成音乐,最简单的是模仿,那么先根据菊花台的简谱整一个吧。简谱是网上找的。为了简单,乐曲只生成中间一段。

写头文件没变,依然是:Head.h,Head.cpp,因为不需要随机产生音符,那么随机数那个就不用了。

Head.h:

#ifndef HEAD_H_
#define HEAD_H_

class Head{
public:
    Head();
    void setsize(int);
    long int getsa();
    long int getsize();
    ~Head();

private:
     char RIFF[4];
     long int size0;
     char WAVE[4];
     char FMT[4];
     long int size1;
     short int fmttag;
     short int channel;
     long int samplespersec;
     long int bytepersec;
     short int blockalign;
     short int bitpersamples;
     char DATA[4];
     long int size2;

};

#endif /* HEAD_H_ */

Head.cpp:

#include "Head.h"
#include<iostream>
using namespace std;

Head::Head(){
    strcpy(RIFF,"RIFF");
    size0=0;
    strcpy(WAVE,"WAVE");
    strcpy(FMT,"fmt ");
    size1=16;
    fmttag=1;
    channel=1;
    samplespersec=11025;
    bytepersec=11025;
    blockalign=1;
    bitpersamples=8;
    strcpy(DATA,"data");
    size2=0;
    cout<<RIFF<<size0<<WAVE<<endl;
}
Head::~Head(){

    cout<<123<<endl;
}
void Head::setsize(int size){
    Head::size0=size+24;
    Head::size2=size;

}
long int Head::getsa(){

    return Head::samplespersec;
}
long int Head::getsize(){

    return Head::size2;
}

最后是MAIN:其中L[8],N[8],H[8],I[8]存的是不同音的频率。jiepai存的就是数据了。声音波形还是用的正弦波,其中每个节拍里声音轻重也是整了个正弦函数,这个比较简单,实际上不同乐器的差别在每个节拍里的函数肯定是差别很大的。还没细想过。

#include <iostream>
#include<fstream>
#include"Head.h"
#include<math.h>
#include"R.h"
using namespace std;
//L1   131     L2   147     L3   165     L4   175     L5   196     L6   220     L7   247
//N1   262     N2   296     N3   330     N4   349     N5   392     N6   440     N7   494
//H1   523     H2   587     H3   659     H4   698     H5   784     H6   880     H7   988
//I1   1047     I2   1175     I3   1319     I4   1397     I5   1568     I6   1760     I7   1976
int L[8]={0,131,147,165,175,196,220,247};
int N[8]={0,262,296,330,349,392,440,494};
int H[8]={0,523,587,659,698,784,880,988};
int I[8]={0,1047,1175,1319,1397,1568,1760,1979};
int pai=11025/4;
int jiepai[80][2]={{N[3],4},{N[3],2},{N[2],2},{N[3],4},{N[0],4},{N[3],2},{N[5],2},
                   {N[3],2},{N[2],2},{N[3],8},{N[1],4},{N[1],2},{N[2],2},{N[3],2},
                   {N[5],2},{N[3],4},{N[2],4},{N[2],2},{N[1],2},{N[2],8},{N[3],6},
                   {N[5],1},{N[3],1},{N[6],2},{N[5],6},{N[6],2},{N[5],2},{N[5],2},
                   {N[3],2},{N[5],6},{L[5],5},{N[3],4},{N[2],2},{N[2],2},{N[5],4},
                   {N[3],2},{N[2],2},{N[2],4},{N[1],4},{N[2],8},{N[3],4},{N[3],2},
                   {N[2],2},{N[3],8},{N[3],2},{N[5],2},{N[3],2},{N[3],2},{N[3],8},
                   {N[1],4},{N[1],2},{N[2],2},{N[3],2},{N[5],2},{N[3],4},{N[2],4},
                   {N[2],2},{N[2],1},{N[2],8},{N[3],6},{N[5],1},{N[3],1},{N[6],1},
                   {N[5],6},{N[6],2},{N[5],2},{N[5],2},{N[3],2},{N[5],8},{N[0],2},
                   {N[3],2},{N[2],2},{N[3],2},{N[3],4},{N[5],4},{N[3],2},{N[2],2},
                   {N[2],2},{N[1],7},{N[0],8}};

void runrun(){
        cout<<jiepai[3][1]<<endl;
        Head head;
        int i,i2,i3;
         float a=0;
        i3=0;
        int size=0;
        for(i=0;i<80;i++){
            size+=jiepai[i][1];
        }
        head.setsize(size*pai);//将数据文件大小放进WAV头里面
        cout<<head.getsize()<<endl;
        char body[head.getsize()];//同时将WAV的数据大小确认

        for(i2=0;i2<80;i2++)

        {

            if(jiepai[i2][0]!=0){
            a=(11025/(jiepai[i2][0]));};

            for(i=0;i<jiepai[i2][1]*pai;i++){

                    if(jiepai[i2][0]!=0){
                    body[i+i3]=(int)(64*sin(6.28/a*i)*(sin(3.14*i/pai/jiepai[i2][1]))+128);}
                    else{
                        body[i+i3]=128;
                    };

            }

            i3+=jiepai[i2][1]*pai;
            cout<<a<<" "<<i3<<endl;
        }

        ofstream ocout;
        ocout.open("1213.wav",ios::out|ios::binary);

        ocout.write((char*)&head,sizeof head);
        ocout.write((char*)&body,sizeof body);

        ocout.close();
//        cout <<head.getsize() <<" "<<dou[0]<<endl;

}
int main() {

    runrun();

    return 0;
}

测试通过,貌似听起来有几个音可能手误写错了,但是总体来说还是挺好玩的。

C++生成简单WAV文件(三)——根据简谱生成菊花台

时间: 2024-08-05 11:12:37

C++生成简单WAV文件(三)——根据简谱生成菊花台的相关文章

C++生成简单WAV文件(二)

既然生成声音已经没问题了,现在简单生成一下一个类似蜂鸣器的随机音乐文件.(注:可能书写有格式不正式之类问题,反正思路应该没问题,测试可以运行) 因为是随机,那么先弄个产生随机数的类 R.H和R.CPP R.H: #ifndef R_H_ #define R_H_ class R{ public: R(); int suiji(int i); int suiji(); private: int shuchu(int number); }; #endif /* R_H_ */ R.cpp: #inc

C++生成简单WAV文件(一)

有了WAV头文件的格式,要生成一个WAV格式的声音文件就比较简单了,只要将头文件输出,在简单生成一点内容就可以了.为了简单,就生成一个单声道,11025HZ的,长度一秒的声音文件. 那么开做,要生成一个文件,那么文件的输出流<fstream>肯定要用到,参考了一下资料,简单整了如下的一个程序: #include <iostream> #include<fstream> //文件输出 #include<math.h> //主要生产波形使用SIN函数,所以弄了这

减少服务器压力php生成静态xml文件

一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权限限制等,但是,对应一些我们经常频频使用的文件,比方说,开发的新闻发布系统,我们不希望很多用户都读取数据库才显示结果,这样一方面消耗了服务器的资源,另一方面占去了浏览者大量可贵的响应时间,所有,有了"静态页面话"的做法,当前很多网站都采用这种技术,一般都是由管理后台控制,或者生成html直

Eclipse中JSP生成的class文件去了哪里?(转)

大家都知道,JSP在请求的时候,会先转化成Servlet(其实就是个java类),然后生成class文件,再提供服务. 那么生成的java.class文件在哪呢?Eclipse中根本找不到呀! 首先应该了解的是Tomcat在Eclipse的映射关系,参考前一篇博文所述:Tomcat的服务器目录配置 可以了解到,Tomcat在Eclipse中提供了三种位置配置选项: 1 Use workspace metadata 2 Use Tomcat installation 3 Use custom lo

Eclipse中JSP生成的class文件去了哪里?

转自:http://www.cnblogs.com/xing901022/p/4352999.html 首先应该了解的是Tomcat在Eclipse的映射关系,参考前一篇博文所述:Tomcat的服务器目录配置 可以了解到,Tomcat在Eclipse中提供了三种位置配置选项: 1 Use workspace metadata 2 Use Tomcat installation 3 Use custom location 分别对应三种情况说一下,注意要把Server中发布的目录全部删除,然后cle

你生成的转储文件有问题吗?

原总结debug调试dump转储文件windbgprocdump 如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 -- 转储文件知多少. 前言 细心的小伙伴可能注意到了,我在上一篇介绍抓取转储文件的工具的文章 -- 你需要知道的 N 种抓取 dump 的工具 中提到了: 如果用 64 位的 windbg 附加到 32 位目标进程后,直接执行.dump 命令生成的转储文件会 "有问题". 经常抓 dump 的小伙伴很可能遇到过这个问题.具体是什么

C# WebForm 使用NPOI 2 生成简单的word文档(.docx)

使用NPOI可以方便的实现服务端对Word.Excel的读写.要实现对Word的读写操作,需要引用NPOI.OOXML.dll,应用命名空间XWPF. 本文使用NPOI 2.0实现对Word的基本生成.下载操作. NOPI 2.0 下载地址:http://npoi.codeplex.com/downloads/get/764162 虽然现在最新版本为NPOI 2.1.1 ,但笔者使用2.1.1的NPOI.OOXML.dll时,发现无法实现段落格式化功能,故推荐使用本文版本. 需要添加的命名空间:

解码aac,并生成wav文件

小程在讲多媒体的编码格式时,详细介绍过pcm跟aac等概念.简单来说,pcm是没有压缩的数字信号,可以直接用于音频输出,而aac则是一种音频编码格式,需要解码后才能用于音频输出. aac编码格式,已经是一种很常见的音频编码格式,硬件设备(比如电脑芯片.手机.其它终端设备)都集成了aac的解码功能,而且有些系统还提供了调用硬件解码的接口,比如iOS上的AudioConverterRef接口.Android上的MediaCodec接口等. 从性能的角度,使用硬件解码是最佳选择,但如果从通用的角度,使

webpack(二) 根据模板生成简单的html文件

(一)使用webpack 根据模板生成HTML,首先需要安装插件 html-webpack-plugin. 在工程文件夹安装插件 命令如下: npm install html-webpack-plugin --save-dev (二) 新建 webpack.config.js,名称可以更改,更改后 运行时,需指定 配置文件名称. 例如,配置文件名为 my.webpack.config.js, 则需要在package.json 文件中,在scripts 处添加如下代码: "scripts"