view example/synthesizer/ppe/OSC.cc @ 2048:6796d85f3d6b draft

remove error
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Thu, 28 Jan 2016 00:05:49 +0900
parents 652dd569acc1
children
line wrap: on
line source

#include <stdio.h>
#include <string.h>
#include "AudioData.h"
#include "Func.h"
#include "OSC.h"

#include <sdl.h>
#include <SDL_audio.h>
#include <math.h>
/* これは必須 */
SchedDefineTask1(Audioosc,osc);

SDL_AudioSpec Desired;
SDL_AudioSpec Obtained;

double
square(double t)
{
    double decimal_part = t - abs(t);
    return decimal_part < 0.5 ? 1 : -1;
}

double
tri(double t)
{
    double decimal_part = t - abs(t);
    if(abs(t) % 2 != 0){
        return decimal_part < 0.5 ? decimal_part : 1 - decimal_part;
    }else{
        return decimal_part < 0.5 ? -decimal_part : 1 - decimal_part;
    }
}

double
saw(double t)
{
    double decimal_part = t - abs(t);
    return decimal_part;
}


void callback(void *userdata,Uint8 *stream,int len){

    AudioDataPtr au = (AudioData*)userdata;

    char *waveform_name = au->waveform_name;
    double frequency = au->frequency;
    int volume = au->volume;
    static unsigned int step = 0;
    Uint16 *frames = (Uint16 *) stream;
    int framesize = len / 2;

    if(strcmp(waveform_name, "tri") == 0){
        for (int i = 0; i < framesize ; i++, step++){
            frames[i] = tri(step * frequency / Obtained.freq) * volume ;
        }

    }else if(strcmp(waveform_name, "sqr") == 0){
        for (int i = 0; i < framesize ; i++, step++){
            frames[i] = square(step * frequency / Obtained.freq) * volume ;
        }

    }else if(strcmp(waveform_name, "saw") == 0){
        for (int i = 0; i < framesize ; i++, step++){
            frames[i] = saw(step * frequency / Obtained.freq) * volume ;
        }
    }
}

static int
osc(SchedTask *s, void *rbuf, void *wbuf)
{
    AudioData *i_data = (AudioDataPtr)s->get_input(0);

    Desired.freq = i_data->sampling_rate; /* Sampling rate: 44100Hz */
    Desired.format = i_data->format; /* 16-bit signed audio */
    Desired.channels = i_data->channels; /* Mono */
    Desired.samples = i_data->samples; /* Buffer size: 8K = 0.37 sec. */
    Desired.callback = callback;
    Desired.userdata = (void*)i_data;

    SDL_OpenAudio(&Desired, &Obtained);
    SDL_PauseAudio(0);
    SDL_Delay(1000);
    SDL_Quit();

    return 0;
}