Mercurial > hg > Game > Cerium
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; }