#ifndef wavehpp
#define wavehpp
#include <stdio.h>
#include <vector>
#include <math.h>
using namespace std;
class MONO_PCM{
public :
int fs; /* 標本化周波数 */
int bits; /* 量子化精度 */
std:: vector < int > s; /* 音データ */
//初期化
MONO_PCM( int myfs= 44100 ,int mybits= 16 )
{
fs = myfs;
bits = mybits;
}
//要素追加
void add( int data)
{
s.push_back ( data) ;
}
//要素クリア
void clear( ) {
s.clear ( ) ;
}
//書き出し
int write( char * file_name)
{
FILE * fp;
char riff_chunk_ID[ 4 ] ;
long riff_chunk_size;
char riff_form_type[ 4 ] ;
char fmt_chunk_ID[ 4 ] ;
long fmt_chunk_size;
short fmt_wave_format_type;
short fmt_channel;
long fmt_samples_per_sec;
long fmt_bytes_per_sec;
short fmt_block_size;
short fmt_bits_per_sample;
char data_chunk_ID[ 4 ] ;
long data_chunk_size;
short data;
int si;
riff_chunk_ID[ 0 ] = 'R' ;
riff_chunk_ID[ 1 ] = 'I' ;
riff_chunk_ID[ 2 ] = 'F' ;
riff_chunk_ID[ 3 ] = 'F' ;
riff_chunk_size = 36 + s.size ( ) * 2 ;
riff_form_type[ 0 ] = 'W' ;
riff_form_type[ 1 ] = 'A' ;
riff_form_type[ 2 ] = 'V' ;
riff_form_type[ 3 ] = 'E' ;
fmt_chunk_ID[ 0 ] = 'f' ;
fmt_chunk_ID[ 1 ] = 'm' ;
fmt_chunk_ID[ 2 ] = 't' ;
fmt_chunk_ID[ 3 ] = ' ' ;
fmt_chunk_size = 16 ;
fmt_wave_format_type = 1 ;
fmt_channel = 1 ;
fmt_samples_per_sec = fs; /* 標本化周波数 */
fmt_bytes_per_sec = fs * bits / 8 ;
fmt_block_size = bits / 8 ;
fmt_bits_per_sample = bits; /* 量子化精度 */
data_chunk_ID[ 0 ] = 'd' ;
data_chunk_ID[ 1 ] = 'a' ;
data_chunk_ID[ 2 ] = 't' ;
data_chunk_ID[ 3 ] = 'a' ;
data_chunk_size = s.size ( ) * 2 ;
fp = fopen ( file_name, "wb" ) ;
fwrite ( riff_chunk_ID, 1 , 4 , fp) ;
fwrite ( & riff_chunk_size, 4 , 1 , fp) ;
fwrite ( riff_form_type, 1 , 4 , fp) ;
fwrite ( fmt_chunk_ID, 1 , 4 , fp) ;
fwrite ( & fmt_chunk_size, 4 , 1 , fp) ;
fwrite ( & fmt_wave_format_type, 2 , 1 , fp) ;
fwrite ( & fmt_channel, 2 , 1 , fp) ;
fwrite ( & fmt_samples_per_sec, 4 , 1 , fp) ;
fwrite ( & fmt_bytes_per_sec, 4 , 1 , fp) ;
fwrite ( & fmt_block_size, 2 , 1 , fp) ;
fwrite ( & fmt_bits_per_sample, 2 , 1 , fp) ;
fwrite ( data_chunk_ID, 1 , 4 , fp) ;
fwrite ( & data_chunk_size, 4 , 1 , fp) ;
for ( size_t n = 0 ; n < s.size ( ) ; n++ ) {
si = s[ n] ;
if ( si > 0x7fff ) {
si = 0x7fff ; /* クリッピング */
} else if ( si < - 0x7fff ) {
si = - 0x7fff ;
}
data = ( short ) si; /* 四捨五入とオフセットの調節 */
fwrite ( & data, 2 , 1 , fp) ; /* 音データの書き出し */
}
fclose ( fp) ;
return 0 ;
}
//読み込み
int read( char * file_name)
{
FILE * fp;
char riff_chunk_ID[ 4 ] ;
long riff_chunk_size;
char riff_form_type[ 4 ] ;
char fmt_chunk_ID[ 4 ] ;
long fmt_chunk_size;
short fmt_wave_format_type;
short fmt_channel;
long fmt_samples_per_sec;
long fmt_bytes_per_sec;
short fmt_block_size;
short fmt_bits_per_sample;
char data_chunk_ID[ 4 ] ;
long data_chunk_size;
short data;
fp = fopen ( file_name, "rb" ) ;
fread ( riff_chunk_ID, 1 , 4 , fp) ;
fread ( & riff_chunk_size, 4 , 1 , fp) ;
fread ( riff_form_type, 1 , 4 , fp) ;
fread ( fmt_chunk_ID, 1 , 4 , fp) ;
fread ( & fmt_chunk_size, 4 , 1 , fp) ;
fread ( & fmt_wave_format_type, 2 , 1 , fp) ;
fread ( & fmt_channel, 2 , 1 , fp) ;
fread ( & fmt_samples_per_sec, 4 , 1 , fp) ;
fread ( & fmt_bytes_per_sec, 4 , 1 , fp) ;
fread ( & fmt_block_size, 2 , 1 , fp) ;
fread ( & fmt_bits_per_sample, 2 , 1 , fp) ;
fread ( data_chunk_ID, 1 , 4 , fp) ;
fread ( & data_chunk_size, 4 , 1 , fp) ;
fs = fmt_samples_per_sec; /* 標本化周波数 */
bits = fmt_bits_per_sample; /* 量子化精度 */
s.resize ( data_chunk_size / 2 ) ; /* 音データの長さ */
for ( size_t n = 0 ; n < s.size ( ) ; n++ ) {
fread ( & data, 2 , 1 , fp) ; /* 音データの読み取り */
s[ n] = data;
}
fclose ( fp) ;
return 0 ;
}
} ;
#endif
I2lmbmRlZiB3YXZlaHBwCiNkZWZpbmUgd2F2ZWhwcAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hdGguaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgTU9OT19QQ017CnB1YmxpYzoKICAgIGludCBmczsgICAgIAkvKiDmqJnmnKzljJblkajms6LmlbAgKi8KICAgIGludCBiaXRzOwkJLyog6YeP5a2Q5YyW57K+5bqmICovCiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHM7CS8qIOmfs+ODh+ODvOOCvyAqLwogICAgLy/liJ3mnJ/ljJYKICAgIE1PTk9fUENNKGludCBteWZzPTQ0MTAwLGludCBteWJpdHM9MTYpCiAgICB7CiAgICAJZnMgICA9IG15ZnM7CiAgICAJYml0cyA9IG15Yml0czsKICAgIH0KICAgIC8v6KaB57Sg6L+95YqgCiAgICB2b2lkIGFkZChpbnQgZGF0YSkKICAgIHsKICAgIAlzLnB1c2hfYmFjayhkYXRhKTsKICAgIH0KICAgIC8v6KaB57Sg44Kv44Oq44KiCiAgICB2b2lkIGNsZWFyKCl7CiAgICAgICAgcy5jbGVhcigpOwogICAgfQogICAgLy/mm7jjgY3lh7rjgZcKICAgIGludCB3cml0ZShjaGFyKiBmaWxlX25hbWUpCiAgICB7CiAgICAJRklMRSAqZnA7CiAgICAJY2hhciAgcmlmZl9jaHVua19JRFs0XTsKICAgIAlsb25nICByaWZmX2NodW5rX3NpemU7CiAgICAJY2hhciAgcmlmZl9mb3JtX3R5cGVbNF07CiAgICAJY2hhciAgZm10X2NodW5rX0lEWzRdOwogICAgCWxvbmcgIGZtdF9jaHVua19zaXplOwogICAgCXNob3J0IGZtdF93YXZlX2Zvcm1hdF90eXBlOwogICAgCXNob3J0IGZtdF9jaGFubmVsOwogICAgCWxvbmcgIGZtdF9zYW1wbGVzX3Blcl9zZWM7CiAgICAJbG9uZyAgZm10X2J5dGVzX3Blcl9zZWM7CiAgICAJc2hvcnQgZm10X2Jsb2NrX3NpemU7CiAgICAJc2hvcnQgZm10X2JpdHNfcGVyX3NhbXBsZTsKICAgIAljaGFyICBkYXRhX2NodW5rX0lEWzRdOwogICAgCWxvbmcgIGRhdGFfY2h1bmtfc2l6ZTsKICAgIAlzaG9ydCBkYXRhOwogICAgCWludCBzaTsKICAgIAlyaWZmX2NodW5rX0lEWzBdID0gJ1InOwogICAgCXJpZmZfY2h1bmtfSURbMV0gPSAnSSc7CiAgICAJcmlmZl9jaHVua19JRFsyXSA9ICdGJzsKICAgIAlyaWZmX2NodW5rX0lEWzNdID0gJ0YnOwogICAgCXJpZmZfY2h1bmtfc2l6ZSA9IDM2ICsgcy5zaXplKCkgKiAyOwogICAgCXJpZmZfZm9ybV90eXBlWzBdID0gJ1cnOwogICAgCXJpZmZfZm9ybV90eXBlWzFdID0gJ0EnOwogICAgCXJpZmZfZm9ybV90eXBlWzJdID0gJ1YnOwogICAgCXJpZmZfZm9ybV90eXBlWzNdID0gJ0UnOwogICAgCWZtdF9jaHVua19JRFswXSA9ICdmJzsKICAgIAlmbXRfY2h1bmtfSURbMV0gPSAnbSc7CiAgICAJZm10X2NodW5rX0lEWzJdID0gJ3QnOwogICAgCWZtdF9jaHVua19JRFszXSA9ICcgJzsKICAgIAlmbXRfY2h1bmtfc2l6ZSA9IDE2OwogICAgCWZtdF93YXZlX2Zvcm1hdF90eXBlID0gMTsKICAgIAlmbXRfY2hhbm5lbCA9IDE7CiAgICAJZm10X3NhbXBsZXNfcGVyX3NlYyA9IGZzOyAvKiDmqJnmnKzljJblkajms6LmlbAgKi8KICAgIAlmbXRfYnl0ZXNfcGVyX3NlYyAgID0gZnMgKiBiaXRzIC8gODsKICAgIAlmbXRfYmxvY2tfc2l6ZSAgICAgID0gYml0cyAvIDg7CiAgICAJZm10X2JpdHNfcGVyX3NhbXBsZSA9IGJpdHM7IC8qIOmHj+WtkOWMlueyvuW6piAqLwoJICAgIGRhdGFfY2h1bmtfSURbMF0gPSAnZCc7CiAgICAJZGF0YV9jaHVua19JRFsxXSA9ICdhJzsKICAgIAlkYXRhX2NodW5rX0lEWzJdID0gJ3QnOwogICAgCWRhdGFfY2h1bmtfSURbM10gPSAnYSc7CiAgICAJZGF0YV9jaHVua19zaXplID0gcy5zaXplKCkgKiAyOwogICAgICAgIGZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKICAgICAgICBmd3JpdGUocmlmZl9jaHVua19JRCwgMSwgNCwgZnApOwogICAgCWZ3cml0ZSgmcmlmZl9jaHVua19zaXplLCA0LCAxLCBmcCk7CiAgICAJZndyaXRlKHJpZmZfZm9ybV90eXBlLCAxLCA0LCBmcCk7CiAgICAJZndyaXRlKGZtdF9jaHVua19JRCwgMSwgNCwgZnApOwogICAgCWZ3cml0ZSgmZm10X2NodW5rX3NpemUsIDQsIDEsIGZwKTsKICAgIAlmd3JpdGUoJmZtdF93YXZlX2Zvcm1hdF90eXBlLCAyLCAxLCBmcCk7CiAgICAJZndyaXRlKCZmbXRfY2hhbm5lbCwgMiwgMSwgZnApOwogICAgCWZ3cml0ZSgmZm10X3NhbXBsZXNfcGVyX3NlYywgNCwgMSwgZnApOwogICAgCWZ3cml0ZSgmZm10X2J5dGVzX3Blcl9zZWMsIDQsIDEsIGZwKTsKICAgIAlmd3JpdGUoJmZtdF9ibG9ja19zaXplLCAyLCAxLCBmcCk7CiAgICAJZndyaXRlKCZmbXRfYml0c19wZXJfc2FtcGxlLCAyLCAxLCBmcCk7CiAgICAJZndyaXRlKGRhdGFfY2h1bmtfSUQsIDEsIDQsIGZwKTsKICAgIAlmd3JpdGUoJmRhdGFfY2h1bmtfc2l6ZSwgNCwgMSwgZnApOwogICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgcy5zaXplKCk7IG4rKyl7CiAgICAJICAgIHNpID0gc1tuXTsKICAgIAkgICAgaWYgKHNpID4gMHg3ZmZmKXsKICAgIAkgICAgICAgIHNpID0gMHg3ZmZmOyAvKiDjgq/jg6rjg4Pjg5Tjg7PjgrAgKi8KICAgIAkgICAgfWVsc2UgaWYgKHNpIDwgLTB4N2ZmZil7CiAgICAJICAgICAgICBzaSA9IC0weDdmZmY7CiAgICAJICAgIH0KICAgIAkJICAgIGRhdGEgPSAoc2hvcnQpc2k7IC8qIOWbm+aNqOS6lOWFpeOBqOOCquODleOCu+ODg+ODiOOBruiqv+evgCAqLwogICAgCSAgICBmd3JpdGUoJmRhdGEsIDIsIDEsIGZwKTsgLyog6Z+z44OH44O844K/44Gu5pu444GN5Ye644GXICovCiAgICAJfQogICAgIAogICAgCWZjbG9zZShmcCk7CiAgICAJcmV0dXJuIDA7CiAgICB9CiAgICAvL+iqreOBv+i+vOOBvwogICAgaW50IHJlYWQoY2hhciogZmlsZV9uYW1lKQogICAgewogICAgCUZJTEUgKmZwOwogICAgCWNoYXIgcmlmZl9jaHVua19JRFs0XTsKICAgIAlsb25nIHJpZmZfY2h1bmtfc2l6ZTsKICAgIAljaGFyIHJpZmZfZm9ybV90eXBlWzRdOwogICAgCWNoYXIgZm10X2NodW5rX0lEWzRdOwogICAgCWxvbmcgZm10X2NodW5rX3NpemU7CiAgICAJc2hvcnQgZm10X3dhdmVfZm9ybWF0X3R5cGU7CiAgICAJc2hvcnQgZm10X2NoYW5uZWw7CiAgICAJbG9uZyBmbXRfc2FtcGxlc19wZXJfc2VjOwogICAgCWxvbmcgZm10X2J5dGVzX3Blcl9zZWM7CiAgICAJc2hvcnQgZm10X2Jsb2NrX3NpemU7CiAgICAJc2hvcnQgZm10X2JpdHNfcGVyX3NhbXBsZTsKICAgIAljaGFyIGRhdGFfY2h1bmtfSURbNF07CiAgICAJbG9uZyBkYXRhX2NodW5rX3NpemU7CiAgICAJc2hvcnQgZGF0YTsKICAgICAKICAgIAlmcCA9IGZvcGVuKGZpbGVfbmFtZSwgInJiIik7CiAgICAgCiAgICAJZnJlYWQocmlmZl9jaHVua19JRCwgMSwgNCwgZnApOwogICAgCWZyZWFkKCZyaWZmX2NodW5rX3NpemUsIDQsIDEsIGZwKTsKICAgIAlmcmVhZChyaWZmX2Zvcm1fdHlwZSwgMSwgNCwgZnApOwogICAgCWZyZWFkKGZtdF9jaHVua19JRCwgMSwgNCwgZnApOwogICAgCWZyZWFkKCZmbXRfY2h1bmtfc2l6ZSwgNCwgMSwgZnApOwogICAgCWZyZWFkKCZmbXRfd2F2ZV9mb3JtYXRfdHlwZSwgMiwgMSwgZnApOwogICAgCWZyZWFkKCZmbXRfY2hhbm5lbCwgMiwgMSwgZnApOwogICAgCWZyZWFkKCZmbXRfc2FtcGxlc19wZXJfc2VjLCA0LCAxLCBmcCk7CiAgICAJZnJlYWQoJmZtdF9ieXRlc19wZXJfc2VjLCA0LCAxLCBmcCk7CiAgICAJZnJlYWQoJmZtdF9ibG9ja19zaXplLCAyLCAxLCBmcCk7CiAgICAJZnJlYWQoJmZtdF9iaXRzX3Blcl9zYW1wbGUsIDIsIDEsIGZwKTsKICAgIAlmcmVhZChkYXRhX2NodW5rX0lELCAxLCA0LCBmcCk7CiAgICAJZnJlYWQoJmRhdGFfY2h1bmtfc2l6ZSwgNCwgMSwgZnApOwogICAgIAogICAgCWZzID0gZm10X3NhbXBsZXNfcGVyX3NlYzsgLyog5qiZ5pys5YyW5ZGo5rOi5pWwICovCiAgICAJYml0cyA9IGZtdF9iaXRzX3Blcl9zYW1wbGU7IC8qIOmHj+WtkOWMlueyvuW6piAqLwogICAgCXMucmVzaXplKGRhdGFfY2h1bmtfc2l6ZSAvIDIpOyAvKiDpn7Pjg4fjg7zjgr/jga7plbfjgZUgKi8KICAgIAlmb3IgKHNpemVfdCBuID0gMDsgbiA8IHMuc2l6ZSgpIDsgbisrKXsKICAgIAkgIGZyZWFkKCZkYXRhLCAyLCAxLCBmcCk7IC8qIOmfs+ODh+ODvOOCv+OBruiqreOBv+WPluOCiiAqLwogICAgCSAgc1tuXSA9IGRhdGE7CiAgICAJfQogICAgCQogICAgCWZjbG9zZShmcCk7CiAgICAJcmV0dXJuIDA7CiAgICB9Cn07CiNlbmRpZgo=