Synthesizer based on the Unzen / Nucleo F746ZG

Dependencies:   amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746

Fork of skeleton_unzen_nucleo_f746 by seiichi horie

雲仙フレームワークのテストとして作っているプロジェクトです。中身はどんどん変っていきます。 説明はDSP空挺団の「シンセサイザー」カテゴリーを参照してください。初回は「ドッグフードを食べる」です。

signal_processing.h

Committer:
shorie
Date:
2017-02-03
Revision:
19:f5e785fe50b1
Parent:
18:b9b1116f8768
Child:
20:53021b2c424d

File content as of revision 19:f5e785fe50b1:

#ifndef _SIGNAL_PROCESSING_H_
#define _SIGNAL_PROCESSING_H_

#include "amakusa.h"

#define SAMPLING_FREQUENCY 48000

enum wave_form { triangle, square };

    // 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     // 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;
};

    // 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     // 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;
};


    // 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