errormsg synth_electricorgan(CAudioData**out,double basefreq, double lengthSeconds, double amp)
{
    CAudioData* audio;
    audio = *out = caudiodata_new(); //use audio as an alias for the output, *out.
    if (lengthSeconds<0) return "Invalid length";
    if (basefreq<=0) return "Invalid frequency";
    int length = (int)(lengthSeconds * SampleRate);
    errormsg msg = caudiodata_allocate(audio, length, 1, SampleRate);
    if (msg!=OK) return msg;

    //OscillatorFn fn = (OscillatorFn) sin;

    //make sure all set to 0
    int i;
    for (i=0; i<audio->length; i++) audio->data[i] = 0;

    int n;
    for(n=0; n<8; n++)
    {
        double freq1 = basefreq*(n+1);
        double freq2 = (basefreq*1.00606)*(n+1);
        double weight = (n==0) ? pow(0.9, 8 - 1) : 0.1 * pow(0.9, 8 - n); //or 8-1 ?

        double timescale1 = freq1 * 2.0 * PI / (double) SampleRate;
        double timescale2 = freq2 * 2.0 * PI / (double) SampleRate;
        for (i=0; i<audio->length; i++)
            audio->data[i] += amp*0.5*weight*(sin(i*timescale1)+sin(i*timescale2));
    }
    return OK;
}
예제 #2
0
파일: examples.c 프로젝트: Alexrerx/yaalp
caudiodata_void example1()
{
	//create a sample sine wave.
	CAudioData* audio =  caudiodata_new();
	errormsg msg = caudiodata_allocate(audio, 44100*4, 1, 44100); // 4 seconds of audio, mono.
	if (msg!=OK) puts(msg);
	
	double freq = 300;
	int i;
	for (i = 0; i < audio->length; i++)
	{
		audio->data[i] = 0.9 * sin(i * freq * 2.0 * PI / (double)audio->sampleRate);
	}
	
	FILE * f = fopen("out.wav", "wb");
	msg = caudiodata_savewave(audio, f, 16);
	if (msg != OK) puts(msg);
	fclose(f);
	caudiodata_dispose( audio);
}
// Intentional beat frequencies "smoothen" the sound and make it more musical.
errormsg synth_sineorgan(CAudioData**out,double freq, double lengthSeconds, double amp)
{
    CAudioData* audio;
    audio = *out = caudiodata_new(); //use audio as an alias for the output, *out.
    if (lengthSeconds<0) return "Invalid length";
    if (freq<=0) return "Invalid frequency";
    int length = (int)(lengthSeconds * SampleRate);
    errormsg msg = caudiodata_allocate(audio, length, 1, SampleRate);
    if (msg!=OK) return msg;

    CAudioData* w1;
    CAudioData* w2;
    synth_sin(&w1, freq, lengthSeconds, amp);
    synth_sin(&w2, freq* 1.0006079, lengthSeconds, amp);
    int i;
    for(i=0; i<audio->length; i++)
        audio->data[i] = 0.6*w1->data[i] + 0.4*w2->data[i];

    caudiodata_dispose(w1);
    caudiodata_dispose(w2);
    return OK;
}