#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 6 //秒数 #define GN_OVER_CYCLE 4 //オーバーサンプリング数 #define GN_INIT_PITCH 0.01 //初期ピッチ #define GN_OCTAVE 1.2 //音域(オクターブ) #define GN_INIT_NOISE 100.0 //初期ノイズっぽさ量(小さいほどノイズっぽい) #define GN_NOISE_RANGE -200.0 //ノイズっぽさの変化量 #define NOISE_ENV 0 //1..対数ベンド その他..直線ベンド #define GN_LIMIT (3.1415926535898 * 2) #define GN_TOTAL_SAMPLE (GN_LENGTH * SAMPLE_RATE) #define GN_FILTER_RATE (SAMPLE_RATE * GN_OVER_CYCLE) #define GN_TOTAL_SAMPLE2 (GN_TOTAL_SAMPLE * GN_OVER_CYCLE) double Noise(); //ノイズ生成関数 int main(int argc, char* argv[]) { FILE *fp; float data; //実際にファイルに書き込まれる値 double noise; //ノイズ成分(0.0〜1.0) double pitch; //角速度(noiseに掛けれらる値) double n; //ノイズっぽさ量 double integ; //位相(pitch * noiseの積分値) double bend_pitch;//pitchの変化率 double bend_noise;//nの変化率 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 = GN_INIT_PITCH / GN_OVER_CYCLE; //初期のピッチ bend_pitch = pow(2, -GN_OCTAVE / GN_TOTAL_SAMPLE2) ; if (NOISE_ENV == 1) { //対数ベンド bend_noise = pow( (GN_INIT_NOISE + GN_NOISE_RANGE) / GN_INIT_NOISE , 1.0 / GN_TOTAL_SAMPLE2 ); } else { //リニアベンド bend_noise = GN_NOISE_RANGE / GN_TOTAL_SAMPLE2; } n = GN_INIT_NOISE ; noise = 0; integ = 0; data = 0; fp = fopen(GN_OUTPUT_FILENAME,"wb"); for (i =0 ; i < GN_TOTAL_SAMPLE ; i++) { for (j = 0; j < GN_OVER_CYCLE; j++) { noise = (Noise() + (n*pitch) -0.5) / (n*pitch) * pitch ; integ += noise; if (NOISE_ENV == 1) { //対数ベンド n *= bend_noise; } else { //リニアベンド n += bend_noise; } //ピッチは対数BEND pitch *= bend_pitch; while (integ > GN_LIMIT) { integ -= GN_LIMIT; } 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 / DIV_D_32); }