268 lines
8.1 KiB
C++
268 lines
8.1 KiB
C++
#ifndef SCOPE
|
|
#define SCOPE
|
|
#include <pulse/simple.h>
|
|
#include <pulse/error.h>
|
|
#include <fftw3.h>
|
|
|
|
|
|
#define SAMPLE_RATE 44100
|
|
#define FRAME_TIME 17
|
|
// this must be in power of 2 for fourier transform
|
|
#define READ_BUFFER_SIZE 2048
|
|
#define FFT_NUMBER_READ_BUFFERS 4
|
|
#define FFT_BUFFER_SIZE (READ_BUFFER_SIZE * FFT_NUMBER_READ_BUFFERS)
|
|
#define MAIN_BUFFER_SIZE 8192
|
|
#define AUDIO_BUFFER_SIZE 6000
|
|
#define FFT_START_BUCKET 0
|
|
#define MAIN_VOLUME .1
|
|
#define SPECTRUM_VOLUME .1
|
|
#define PIANO_SIZE_MULTIPLY .65
|
|
#define KEYBOARD_POSITION_X 50
|
|
#define KEYBOARD_POSITION_Y 10
|
|
#define OCTIVE_POSITION_X 800
|
|
#define OCTIVE_POSITION_Y 10
|
|
#define NUMBER_KEY_LIGHTS 12
|
|
#define NUMBER_OCTIVE_LIGHTS 8
|
|
#define RADIANS_PER_SAMPLE_AT_1_HZ (double)6.28319/(double)SAMPLE_RATE
|
|
#define NUMBER_OCTIVES 6
|
|
#define BUCKETS_PER_NOTE 2
|
|
#define NOTES_PER_OCTIVE 12
|
|
#define BUCKETS_PER_OCTIVE BUCKETS_PER_NOTE*NOTES_PER_OCTIVE
|
|
#define TOTAL_BUCKETS BUCKETS_PER_OCTIVE*NUMBER_OCTIVES
|
|
#define TOTAL_NOTES NOTES_PER_OCTIVE*NUMBER_OCTIVES
|
|
#define Q_QUALITY 6
|
|
#define FIRST_FREQUENCY 32
|
|
#define PIANO_FULL_ARRAY_SIZE 10000
|
|
|
|
//Structure for piano notes
|
|
struct piano_note_struct {
|
|
double note_strength;
|
|
int keyboard_key;
|
|
int octive;;
|
|
};
|
|
|
|
//Structure for processing buckets
|
|
struct bucket_data_struct {
|
|
double bucket_frequency;
|
|
double bucket_strength;
|
|
int buffer_size;
|
|
double radians_per_sample;
|
|
struct piano_note_struct *this_piano_note;
|
|
};
|
|
|
|
// Structure used by both piano and main classes
|
|
struct piano_data_struct {
|
|
int keyboard_key;
|
|
int octive;
|
|
int done;
|
|
};
|
|
|
|
class main_window_class {
|
|
public:
|
|
main_window_class (int x_main_window_size, int y_main_window_size);
|
|
|
|
private:
|
|
SDL_Window *window_for_main;
|
|
SDL_Renderer *renderer_for_main;
|
|
int call_result;
|
|
|
|
};
|
|
|
|
class audio_window_class {
|
|
|
|
public:
|
|
audio_window_class (int x_main_window_size, int y_main_window_size);
|
|
int draw_trace(int *audio_data, int audio_data_size);
|
|
int get_max_audio_trace_width();
|
|
int get_max_audio_trace_height();
|
|
|
|
private:
|
|
int x_audio_window_position;
|
|
int y_audio_window_position;
|
|
int x_audio_window_size;
|
|
int y_audio_window_size;
|
|
int x_audio_window_trace_base;
|
|
int y_audio_window_trace_base;
|
|
int max_audio_trace_width;
|
|
int max_audio_trace_height;
|
|
SDL_Window *window_for_audio;
|
|
SDL_Renderer *renderer_for_audio;
|
|
SDL_Rect rect_for_audio;
|
|
SDL_Texture *texture_for_audio;
|
|
SDL_Surface *surface_for_audio;
|
|
TTF_Font *font_for_audio;
|
|
SDL_Color color_for_audio;
|
|
};
|
|
|
|
class spectrum_window_class {
|
|
|
|
public:
|
|
spectrum_window_class (int x_main_window_size, int y_main_window_size);
|
|
int draw_trace(int *spectrum_data, int spectrum_data_size);
|
|
int get_max_spectrum_trace_width();
|
|
int get_max_spectrum_trace_height();
|
|
|
|
private:
|
|
int x_spectrum_window_position;
|
|
int y_spectrum_window_position;
|
|
int x_spectrum_window_size;
|
|
int y_spectrum_window_size;
|
|
int x_spectrum_window_trace_base;
|
|
int y_spectrum_window_trace_base;
|
|
int max_spectrum_trace_width;
|
|
int max_spectrum_trace_height;
|
|
SDL_Window *window_for_spectrum;
|
|
SDL_Renderer *renderer_for_spectrum;
|
|
SDL_Rect rect_for_spectrum;
|
|
SDL_Texture *texture_for_spectrum;
|
|
SDL_Surface *surface_for_spectrum;
|
|
TTF_Font *font_for_spectrum;
|
|
SDL_Color color_for_spectrum;
|
|
};
|
|
|
|
class piano_window_class {
|
|
|
|
public:
|
|
piano_window_class (int x_main_window_size, int y_main_window_size);
|
|
int draw_trace(piano_data_struct *input_piano_data);
|
|
int get_max_piano_trace_width();
|
|
int get_max_piano_trace_height();
|
|
|
|
private:
|
|
const char* keyboard_lights[12] = {
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key1.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key2.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key3.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key4.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key5.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key6.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key7.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key8.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key9.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key10.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key11.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/keyboard-key12.bmp"};
|
|
|
|
const char* octive_lights[8] = {
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-1.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-2.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-3.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-4.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-5.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-6.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-7.bmp",
|
|
"/home/maallyn/sound-scope/sdl2/fft/octive-8.bmp"};
|
|
|
|
struct piano_data_struct *my_piano_data;
|
|
int x_piano_window_position;
|
|
int y_piano_window_position;
|
|
int x_piano_window_size;
|
|
int y_piano_window_size;
|
|
int x_piano_window_trace_base;
|
|
int y_piano_window_trace_base;
|
|
int max_piano_trace_width;
|
|
int max_piano_trace_height;
|
|
int function_result;
|
|
int loop_counter;
|
|
SDL_Window *window_for_piano;
|
|
SDL_Renderer *renderer_for_piano;
|
|
SDL_Rect rect_for_piano_text;
|
|
SDL_Texture *texture_for_piano;
|
|
SDL_Surface *surface_for_piano_text;
|
|
SDL_Surface *surface_key_blank;
|
|
SDL_Surface *surface_keys[12];
|
|
SDL_Surface *surface_octive_blank;
|
|
SDL_Surface *surface_octives[8];
|
|
SDL_Texture *texture_key_blank;
|
|
SDL_Texture *texture_keys[12];
|
|
SDL_Texture *texture_octive_blank;
|
|
SDL_Texture *texture_octives[8];
|
|
SDL_Texture *texture_current_piano_light;
|
|
SDL_Texture *texture_current_octive_light;
|
|
SDL_Rect rect_for_keys;
|
|
SDL_Rect rect_for_octives;
|
|
|
|
TTF_Font *font_for_piano;
|
|
SDL_Color color_for_piano;
|
|
SDL_Rect rect_for_piano_image;
|
|
SDL_Surface *piano_image_surface;
|
|
SDL_Texture *texture_of_piano_image;
|
|
};
|
|
|
|
class main_buffer_manager_class {
|
|
public:
|
|
main_buffer_manager_class();
|
|
~main_buffer_manager_class();
|
|
Sint16 *initial_preparation();
|
|
Sint16 *read_main_buffer();
|
|
|
|
private:
|
|
Sint16 *my_read_main_buffer;
|
|
int pulse_error;
|
|
int function_return;
|
|
pa_simple *pulse_s = NULL;
|
|
int main_buffer_index;
|
|
Sint16 main_buffer_hold;
|
|
};
|
|
|
|
class audio_buffer_manager_class {
|
|
public:
|
|
audio_buffer_manager_class();
|
|
~audio_buffer_manager_class();
|
|
int initialize_audio(int horizontal_size,int vertical_size, Sint16 *main_buffer);
|
|
int *process_audio();
|
|
|
|
private:
|
|
Sint16 *my_main_buffer;
|
|
int *my_formatted_audio_buffer;
|
|
int my_audio_horizontal_size;
|
|
int my_audio_vertical_size;
|
|
int my_read_audio_index;
|
|
int function_return;
|
|
Sint16 audio_holding;
|
|
};
|
|
|
|
class spectrum_buffer_manager_class {
|
|
public:
|
|
spectrum_buffer_manager_class();
|
|
~spectrum_buffer_manager_class();
|
|
int initialize_spectrum(int horizontal_size,int vertical_size, Sint16 *main_buffer);
|
|
int *process_spectrum();
|
|
|
|
private:
|
|
Sint16 *my_main_buffer;
|
|
int *my_formatted_spectrum_buffer;
|
|
int my_spectrum_horizontal_size;
|
|
int my_spectrum_vertical_size;
|
|
int my_read_spectrum_index;
|
|
int my_output_fft_buffer_index;
|
|
int function_return;
|
|
int read_buffer_counter;
|
|
Sint16 spectrum_holding;
|
|
fftw_plan my_fftw_plan;
|
|
double *input_fftw;
|
|
double *input_fftw_write_position;
|
|
Sint16 main_buffer_hold;
|
|
fftw_complex *output_fftw;
|
|
};
|
|
|
|
class piano_process_class {
|
|
public:
|
|
piano_process_class();
|
|
~piano_process_class();
|
|
int initialize_piano_data();
|
|
struct piano_data_struct *process_piano_data(Sint16 *input_buffer);
|
|
double goertzel(int num_samples, int target_frequency, int sample_rate, Sint16 *input_buffer);
|
|
|
|
private:
|
|
struct piano_data_struct my_piano_data_struct;
|
|
Sint16 *local_main_buffer;
|
|
int ctr1;
|
|
struct piano_note_struct my_piano_notes[TOTAL_NOTES];
|
|
struct bucket_data_struct my_bucket_data[TOTAL_BUCKETS];
|
|
Sint16 full_size_buffer[PIANO_FULL_ARRAY_SIZE];
|
|
int main_buffer_read_count;
|
|
|
|
};
|
|
#endif
|