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空挺団の「シンセサイザー」カテゴリーを参照してください。初回は「ドッグフードを食べる」です。

Committer:
shorie
Date:
Sat Feb 18 04:37:19 2017 +0000
Revision:
29:8ee84bda128c
Parent:
28:547f19ed6f67
Limiter function is confirmed. SV filter ignored bug was fixed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shorie 26:e99f71165e19 1 #include "signal_processing.h"
shorie 26:e99f71165e19 2
shorie 27:fcb1f1da2ad7 3 EG::EG ( int32_t a_block_size )
shorie 26:e99f71165e19 4 {
shorie 27:fcb1f1da2ad7 5 this->block_size = a_block_size;
shorie 26:e99f71165e19 6
shorie 26:e99f71165e19 7 this->state = release;
shorie 26:e99f71165e19 8 this->set_sustain( 0.0f );
shorie 26:e99f71165e19 9 this->current_level = 0.0f;
shorie 26:e99f71165e19 10 this->set_attack( 0.999 );
shorie 26:e99f71165e19 11 this->set_decay( 0.999 );
shorie 26:e99f71165e19 12 this->set_release( 0.999 );
shorie 26:e99f71165e19 13
shorie 26:e99f71165e19 14 }
shorie 26:e99f71165e19 15
shorie 26:e99f71165e19 16 void EG::run( float32_t *pEnvelope )
shorie 26:e99f71165e19 17 {
shorie 26:e99f71165e19 18 if ( this->state == release )
shorie 26:e99f71165e19 19 for ( int i= 0; i< this->block_size; i++ )
shorie 26:e99f71165e19 20 pEnvelope[i] = this->current_level =
shorie 26:e99f71165e19 21 this->current_level * this->release_time_constant;
shorie 26:e99f71165e19 22 else if ( this->state == decay )
shorie 26:e99f71165e19 23 for ( int i= 0; i< this->block_size; i++ )
shorie 26:e99f71165e19 24 pEnvelope[i] = this->current_level =
shorie 26:e99f71165e19 25 ( this->current_level - this->sustain_level ) * this->decay_time_constant
shorie 26:e99f71165e19 26 + this->sustain_level;
shorie 26:e99f71165e19 27 else // attack
shorie 26:e99f71165e19 28 {
shorie 26:e99f71165e19 29 for ( int i= 0; i< this->block_size; i++ )
shorie 26:e99f71165e19 30 pEnvelope[i] = this->current_level =
shorie 26:e99f71165e19 31 1.5f -
shorie 26:e99f71165e19 32 ( 1.5f - this->current_level ) * this->attack_time_constant;
shorie 26:e99f71165e19 33 if ( this->current_level >= 1.0f )
shorie 26:e99f71165e19 34 this->state = decay;
shorie 26:e99f71165e19 35 }
shorie 26:e99f71165e19 36
shorie 26:e99f71165e19 37 }
shorie 26:e99f71165e19 38
shorie 26:e99f71165e19 39 void EG::on(void)
shorie 26:e99f71165e19 40 {
shorie 26:e99f71165e19 41 this->state = attack;
shorie 26:e99f71165e19 42 }
shorie 26:e99f71165e19 43
shorie 26:e99f71165e19 44 void EG::off(void)
shorie 26:e99f71165e19 45 {
shorie 26:e99f71165e19 46 this->state = release;
shorie 26:e99f71165e19 47 }
shorie 26:e99f71165e19 48
shorie 26:e99f71165e19 49 void EG::set_sustain( float32_t sustain )
shorie 26:e99f71165e19 50 {
shorie 26:e99f71165e19 51 this->sustain_level = sustain;
shorie 26:e99f71165e19 52 }
shorie 26:e99f71165e19 53
shorie 26:e99f71165e19 54 void EG::set_attack( float32_t attack )
shorie 26:e99f71165e19 55 {
shorie 28:547f19ed6f67 56 this->attack_time_constant = 1.0f - (1.0f-attack) * 0.001f;
shorie 26:e99f71165e19 57 }
shorie 26:e99f71165e19 58
shorie 26:e99f71165e19 59 void EG::set_decay( float32_t decay )
shorie 26:e99f71165e19 60 {
shorie 28:547f19ed6f67 61 this->decay_time_constant = 1.0f - (1.0f-decay) * 0.001f;
shorie 26:e99f71165e19 62 }
shorie 26:e99f71165e19 63
shorie 26:e99f71165e19 64 void EG::set_release( float32_t release )
shorie 26:e99f71165e19 65 {
shorie 28:547f19ed6f67 66 this->release_time_constant = 1.0f - (1.0f-release) * 0.001f;
shorie 26:e99f71165e19 67 }
shorie 26:e99f71165e19 68
shorie 26:e99f71165e19 69