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

有了WAV头文件的格式,要生成一个WAV格式的声音文件就比较简单了,只要将头文件输出,在简单生成一点内容就可以了。为了简单,就生成一个单声道,11025HZ的,长度一秒的声音文件。

那么开做,要生成一个文件,那么文件的输出流<fstream>肯定要用到,参考了一下资料,简单整了如下的一个程序:

#include <iostream>
#include<fstream> //文件输出
#include<math.h> //主要生产波形使用SIN函数,所以弄了这个头

using namespace std;
float dou=256; //声音dou的频率264,这里为了凑整数用的256 HZ  

struct WavHead{
 char RIFF[4];    //头部分那个RIFF
 long int size0;//存的是后面所有文件大小
 char WAVE[4];
 char FMT[4];
 long int size1;//存的是fmt保存的大小,包含这之后,data前面几个,共16个
 short int fmttag;
 short int channel;
 long int samplespersec;//每秒采样数,用的是11025
 long int bytepersec;
 short int blockalign;
 short int bitpersamples;
 char DATA[4];
 long int size2;//剩下文件大小,也就是声音采样是大小,因为是一秒钟的内容,那么就是11025了。

};

int main() {

    WavHead head={{‘R‘,‘I‘,‘F‘,‘F‘},0,{‘W‘,‘A‘,‘V‘,‘E‘},{‘f‘,‘m‘,‘t‘,‘ ‘},16,
            1,1,11025,11025,1,8,{‘d‘,‘a‘,‘t‘,‘a‘},
            0};//初始化,没将声音采样文件大小赋值,后面修改
    head.size0=11025+16+8;
    head.size2=11025;
    char body[head.size2];//打算将采样数据放在这个里面
    int i,i2;//为了声音不是很单调,用了两个循环,里面一层i是生成声音函数,外面那层i2,是生成不同频率的。
    float a=(head.samplespersec/dou);//是dou持续时间(1/dou)除以采样数(1/head.samplespersec),也就是一个dou的波形里有a个采样点,这里是43。
    for (i2=1;i2<=2;i2++){//这里弄了两个声音,一个是256HZ,一个是512HZ

        for(i=0+head.size2/2*(i2-1);i<head.size2/2*i2;i++){

                body[i]=(int)(64*sin(6.28/a*i*i2)+128);//这个波用的是sina函数,以128(ox80)为中心的正弦波,实际上当采样点是0x80的时候是静音,大于则是正的,小于0X80则是负的,前面64则是声音大小,等于128的时候,生成的声音最大

        }

    }
    ofstream ocout;
    ocout.open("123.wav",ios::out|ios::binary);//打开(不存在时生成)123.wav

    ocout.write((char*)&head,sizeof head);//将文件头部分写进文件
    ocout.write((char*)&body,sizeof body);//将数据文件写入程序

    ocout.close();//关闭文件
    cout <<head.samplespersec <<" "<<dou<< endl; // 调试的时候查看一下文件大小是否出错
    return 0;
}
 

调试运行成功

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

时间: 2024-10-13 18:05:42

C++生成简单WAV文件(一)的相关文章

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()

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

解码aac,并生成wav文件

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

XStream生成简单的XMl文件

一.生成简单的XML文件: 1.新建ResumeToXml.java文件 package com.saicfc.pmpf.resume.bocom.utils.resume; /** * 把Java对象转化成xml * @author lizhiyong * @version $Id: RefundToXml.java, v 0.1 2014年6月5日 下午3:44:54 Exp $ */ @SuppressWarnings("unused") public class ResumeT

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"

VHDL生成的ngc文件被verilog的工程调用的问题

1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into IOBs)置为否.综合最后生成了a.ngc文件供其他工程使用.在生成完ngc后,还可以在 "Design Utilities" -> "View HDL Instantiation Template" 中生成相应的调用文件. 工程b调用的a.ngc,但是工程b使

【转】Android NDK学习(3)使用Javah命令生成JNI头文件 .

第一步: 在Eclipse中创建android项目,并声明Native接口: public native int add (int a, int b);public native int sub (int a, int b); 编译.运行: 这样在bin目录下就会生成类文件: 第二步: 打开命令行cmd,到达bin目录: F:\fww\workspace\TestJNI\bin> 输入如下命令: F:\fww\workspace\TestJNI\bin>javah -d header -cla

基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界面看起来更加美观和协调.但是在系统中一般内置的图标样式相对比较有限,而且硬编码写到样式表里面,这样给我们扩展使用有很多的不方便.基于这个原因,我想如果能够独立一个模块,自动根据图标生成图标CSS样式文件,并存储相应的记录到数据库里面,方便我们查询显示,那样我们使用起来就很方便了,最后有了这些数据,只需要做一个通用的图标选择界面,并可以在很多地方重用了.本文正是基于这个思路,开发了一个图标管理模

nodejs 实现简单的文件上传功能

首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传功能,优点:浏览器兼容好. 3.通过xhr level2的异步请求,可以百度formData对象. 这里使用2做个练习. node插件请看下package.json文件 { "name": "upload", "version": "0.1