Synthesizer based on the Unzen / Nucleo F746ZG
Dependencies: amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746
Fork of skeleton_unzen_nucleo_f746 by
雲仙フレームワークのテストとして作っているプロジェクトです。中身はどんどん変っていきます。 説明はDSP空挺団の「シンセサイザー」カテゴリーを参照してください。初回は「ドッグフードを食べる」です。
signal_processing.h
- Committer:
- shorie
- Date:
- 2017-02-04
- Revision:
- 20:53021b2c424d
- Parent:
- 19:f5e785fe50b1
- Child:
- 22:dc2cbe8db9d9
File content as of revision 20:53021b2c424d:
#ifndef _SIGNAL_PROCESSING_H_ #define _SIGNAL_PROCESSING_H_ #include "amakusa.h" #define SAMPLING_FREQUENCY 48000 enum wave_form { triangle, square }; enum svf_mode { lpf, hpf, bpf }; // Variable Frequency Oscillator. Only square and triangle class VFO { public: VFO( void ); virtual ~VFO(void); void run( float out_buffer[], // place to write the right output samples unsigned int block_size =0 // block size [sample] ); // parameter settings void set_frequency( int freq ); // unit is Hz. void set_Fs( int Fs ); // unit is Hz. void set_duty_cycle( float duty ); // 0 ... 0.5 void set_wave_form( wave_form form ); private: // control variables. int frequency; // VFO frequency [Hz] int Fs; // sampling Frequency [Hz] float duty_cycle; // VFO duty cycle. 0 ... 0.5 wave_form form; // form of the wave form. // internal variable. int current_phase; // internal variable of VFO. int half_way; // change point by duty cycle. ( period * duty_cycle ). float rising_rate; float falling_rate; void update_parameters(void); // call one of the parameter is changed. }; // Blocking DC class DCBlocker : public amakusa::AbstractFilter { public: DCBlocker( uint32_t blockSize ); virtual void run( float32_t *pSrc, float32_t *pDst, uint32_t blockSize = 0 ); private: float x_last; float y_last; }; // State Variable Filter // The f * f_factor must be < Fs/6. class SVFilter : public amakusa::AbstractFilter { public: SVFilter( uint32_t blockSize ); virtual void run( float32_t *pSrc, float32_t *pDst, uint32_t blockSize = 0 ); void set_Q( float32_t Q ); // real Q factor [ 0.5 ... inf ] void set_Fs( int new_Fs ); // Hz void set_fc( int new_fc ); // Hz void set_f_factor( float32_t new_f_factor ); void set_mode( svf_mode new_mode ); private: // internal variable float32_t d1, d2; // delay 1, delay 2; float32_t q, f; // q = 1/Q, f = 2 * sin( fc*f_factor*pi/Fs ); // parameter set by method int Fs, fc, f_factor; // sampling frequency and control frequency svf_mode mode; // lpf, hpf, bpf void update_parameters( void ); }; // Monophonic synthsizer class class Monophonic { public: Monophonic( unsigned int block_size ); virtual ~Monophonic(void); void run( float out_buffer[], // place to write the right output samples unsigned int block_size = 0 // block size [sample] ); void set_Fs( int Fs ); // unit is Hz. void set_vfo_frequency( int freq ); // unit is Hz. void set_vfo_duty_cycle( float duty ); // 0 ... 0.5 void set_vfo_wave_form( wave_form form ); private: VFO *vfo; DCBlocker *dc_blocker; SVFilter *sv_filter; float32_t *work_buf_a, *work_buf_b; }; // User Signal processing Class class SignalProcessing { public: // essential members. Do not touch SignalProcessing( unsigned int block_size ); void run( float rx_left_buffer[], // array of the left input samples float rx_right_buffer[], // array of the right input samples float tx_left_buffer[], // place to write the left output samples float tx_right_buffer[], // place to write the right output samples unsigned int block_size // block size [sample] ); // project depenedent members. void set_volume( float vol ); void set_Fs( int Fs ); // unit is Hz. void set_vfo_frequency( int freq ); // unit is Hz. void set_vfo_duty_cycle( float duty ); // 0 ... 0.5 void set_vfo_wave_form( wave_form form ); private: // essential members. Do not touch. void enter_critical_section(void); void leave_critical_section(void); // project dependent members. float volume_level; // 0 ... 1.0 Monophonic * note; }; #endif