#include #include #include "rbj.h" //このインクルードファイルは以下のWebサイトからお借りしました //(http://www.musicdsp.org/files/CFxRbjFilter.h) #define GN_OUTPUT_FILENAME "GATEDNOISE10.pcm" #define SAMPLE_RATE 44100 #define GN_LENGTH (10 * SAMPLE_RATE) #define GN_OVER_CYCLE 100 #define GN_FILTER_RATE (SAMPLE_RATE * GN_OVER_CYCLE) #define GN_LIMIT (3.1415926535898 * 2) #define GN_OCTAVE 9.0 double Noise(); //ノイズ生成関数 int main(int argc, char* argv[]) { FILE *fp; float data; //実際にファイルに書き込まれる値 double noise; //ノイズ成分(0.0〜1.0) double pitch; //角速度(noiseに掛けれらる値) double integ; //位相(pitch * noiseの積分値) double bend; //pitchの変化率 int i,j; //帯域制限用ローパスフィルタ CFxRbjFilter lopass, lopass2; lopass.calc_filter_coeffs( 0, 9000, GN_FILTER_RATE,1,-40,false); lopass2.calc_filter_coeffs( 0, 10000, GN_FILTER_RATE,1,-40,false); pitch = 0.01 / GN_OVER_CYCLE; //初期のピッチ bend = pow( pow(2, GN_OCTAVE / GN_LENGTH) , 1.0 / GN_OVER_CYCLE ); noise = 0; integ = 0; data = 0; fp = fopen(GN_OUTPUT_FILENAME,"wb"); for (i =0 ; i < GN_LENGTH ; i++) { for (j = 0; j < GN_OVER_CYCLE; j++) { noise = Noise() * pitch ; integ += noise; pitch *= bend; while (integ > GN_LIMIT) { integ -= GN_LIMIT; } data = lopass2.filter(lopass.filter(cos(integ)*0.2)); //data = cos(integ); } fwrite(&data, sizeof(float), 1, fp); } fclose(fp); return 0; } unsigned int seed = 928529388; double Noise() { #define DIV_D_32 (256.0 * 256.0 * 256.0 * 256.0) int i,lc; //変なループにしてみる lc = seed & 3; for (i=0;i <= lc ; i++) { //普通の乱数生成方法 seed = seed * 65529 - 116813153; } return ((seed & ((1 << 32) - 1)) / DIV_D_32); }