Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
*.wav
main.exe
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@ wav file generating
1. Run main.exe, the wave file `sine.wav` will be generated.

##Score structure:
1. Two integers at the beginning, for wave duration and the number of scores;
1. Two integers for each score, for pitch and duration respectively.
Two integers each line for each score; one for pitch and the other one for duration.

##Example:
```
16 14
1 1
1 1
8 1
Expand Down
35 changes: 20 additions & 15 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include <math.h>
#include <fstream>
#include <vector>
#include "wav.h"

using namespace std;
Expand All @@ -31,27 +32,31 @@ int main(int argc, char * argv[])

char in1addr[]="sine.wav";//输出
char in2addr[]="sine.txt";//输入文件

short snum;
short tlen;


fstream wavin2;
wavin2.open(in2addr,ios::in);
wavin2>>tlen>>snum;
cout<<"time:"<<tlen*bttfrac<<"s; "<<snum;
short *frnum = new short[snum];
short *tnum = new short[snum];
double *freq=new double[snum];
for(int i=0;i<snum;++i)
{
wavin2>>frnum[i]>>tnum[i];
freq[i]=fr(frnum[i]);
}
vector<short> v_tnum;
vector<double> v_freq;
short f_i,t_i;
while(!wavin2.eof())
{
wavin2>>f_i>>t_i;
v_freq.push_back(fr(f_i));
v_tnum.push_back(t_i);
}
wavin2.close();

short snum=v_tnum.size();// number of scores
short tlen=0;// total duration of scores
for(vector<short>::iterator j=v_tnum.begin();j!=v_tnum.end();++j)
tlen += *j;

cout<<"time:"<<tlen*bttfrac<<"s; "<<snum;

wavfile wavin1(in1addr,tlen*btt);
wavin1.print_info();
wavin1.put_data(btt,snum,freq,tnum);
wavin1.put_data(btt,snum,v_freq,v_tnum);

return 0;
}
Expand Down
Binary file added main.exe
Binary file not shown.
1 change: 0 additions & 1 deletion sine.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
16 14
1 1
1 1
8 1
Expand Down
13 changes: 7 additions & 6 deletions wav.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "types.h"
#include <fstream>
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
const char df_riffId[4]={'R','I','F','F'};
Expand Down Expand Up @@ -85,7 +86,7 @@ class wavfile
void chgaddr(char addr[]);

void put_data(short *ldata,short *rdata,int bufsize,int);//
void put_data(int btt,int snum,double *freq,short tnum[],int);
void put_data(int btt,int snum,vector<double> &v_freq,vector<short> &v_tnum,int);
void get_data(short *ldata,short *rdata,int bufsize,int offs)
{
if(st==1)
Expand Down Expand Up @@ -187,19 +188,19 @@ void wavfile::put_data(short *ldata,short *rdata,int bufsize,int offs=44)
}
}
}
void wavfile::put_data(int btt,int snum,double *freq,short tnum[],int offs=44)
{
void wavfile::put_data(int btt,int snum,vector<double> &v_freq,vector<short> &v_tnum,int offs=44)
{
wavin.seekp(offs,ios::beg);
for(int i=0;i<snum;++i)
{
double freq0=*(freq+i);
double freq0=v_freq[i];
double freq1=2*freq0;
double freq2=3*freq0;
double freq3=4*freq0;
double freq4=5*freq0;
for(int j=0;j<btt*tnum[i];++j)
for(int j=0;j<btt*v_tnum[i];++j)
{
short lrdata=am(j)*am(btt*tnum[i]-j)*8000*(0.8*sin(freq0*j)+0.5*sin(freq1*j)+0.4*sin(freq2*j)+0.1*sin(freq3*j+0.1*sin(freq4*j)));
short lrdata=am(j)*am(btt*v_tnum[i]-j)*8000*(0.8*sin(freq0*j)+0.5*sin(freq1*j)+0.4*sin(freq2*j)+0.1*sin(freq3*j+0.1*sin(freq4*j)));
wavin.write((char*)&lrdata,2);
wavin.write((char*)&lrdata,2);
}
Expand Down