Vowel synthesizer using digital resonators. This program can run without LCD display. ディジタル共振器を使った合成母音ジェネレータ.LCD表示器なしでも動く.

Dependencies:   UITDSP_ADDA UIT_ACM1602NI UIT_AQM1602 mbed

Committer:
MikamiUitOpen
Date:
Sat Jul 25 07:10:11 2015 +0000
Revision:
5:0396de26b449
Parent:
Rosenberg.hpp@0:6c67a9387981
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:6c67a9387981 1 //------------------------------------------------------------------------------
MikamiUitOpen 0:6c67a9387981 2 // 声帯波の合成 ― Rosenberg 波(ヘッダ)
MikamiUitOpen 0:6c67a9387981 3 // 作成者:三上直樹,2013/10/27 作成,(c)三上直樹 2013
MikamiUitOpen 0:6c67a9387981 4 //------------------------------------------------------------------------------
MikamiUitOpen 0:6c67a9387981 5
MikamiUitOpen 0:6c67a9387981 6 #include "mbed.h"
MikamiUitOpen 0:6c67a9387981 7
MikamiUitOpen 0:6c67a9387981 8 #ifndef ROSENBERG_HPP
MikamiUitOpen 0:6c67a9387981 9 #define ROSENBERGL_HPP
MikamiUitOpen 0:6c67a9387981 10
MikamiUitOpen 0:6c67a9387981 11 namespace Mikami
MikamiUitOpen 0:6c67a9387981 12 {
MikamiUitOpen 0:6c67a9387981 13 class Rosenberg
MikamiUitOpen 0:6c67a9387981 14 {
MikamiUitOpen 0:6c67a9387981 15 private:
MikamiUitOpen 0:6c67a9387981 16 const float DT_;
MikamiUitOpen 0:6c67a9387981 17
MikamiUitOpen 0:6c67a9387981 18 float period_, t1_, t2_, t_, amp_;
MikamiUitOpen 0:6c67a9387981 19
MikamiUitOpen 0:6c67a9387981 20 // コピー・コンストラクタの使用禁止
MikamiUitOpen 0:6c67a9387981 21 Rosenberg(const Rosenberg& g);
MikamiUitOpen 0:6c67a9387981 22 // 代入演算子の使用禁止
MikamiUitOpen 0:6c67a9387981 23 Rosenberg& operator=(const Rosenberg& g);
MikamiUitOpen 0:6c67a9387981 24
MikamiUitOpen 0:6c67a9387981 25 public:
MikamiUitOpen 0:6c67a9387981 26 // 初期化を行うコンストラクタ
MikamiUitOpen 0:6c67a9387981 27 // f0: 基本周波数
MikamiUitOpen 0:6c67a9387981 28 // fs: 標本化周波数
MikamiUitOpen 0:6c67a9387981 29 // amp: 振幅
MikamiUitOpen 0:6c67a9387981 30 Rosenberg(float f0, float fs, float amp)
MikamiUitOpen 0:6c67a9387981 31 : DT_(1.0f/fs), t_(0), amp_(amp)
MikamiUitOpen 0:6c67a9387981 32 { SetPeriod(f0); }
MikamiUitOpen 0:6c67a9387981 33
MikamiUitOpen 0:6c67a9387981 34 // 基本周期の再設定
MikamiUitOpen 0:6c67a9387981 35 void SetPeriod(float f0)
MikamiUitOpen 0:6c67a9387981 36 {
MikamiUitOpen 0:6c67a9387981 37 period_ = 1.0f/f0;
MikamiUitOpen 0:6c67a9387981 38 t1_ = 0.4f/f0;
MikamiUitOpen 0:6c67a9387981 39 t2_ = 0.16f/f0;
MikamiUitOpen 0:6c67a9387981 40 }
MikamiUitOpen 0:6c67a9387981 41
MikamiUitOpen 0:6c67a9387981 42 // 振幅の再設定
MikamiUitOpen 0:6c67a9387981 43 void SetAmplitude(float amp) { amp_ = amp; }
MikamiUitOpen 0:6c67a9387981 44
MikamiUitOpen 0:6c67a9387981 45 // t_ = 0 に設定
MikamiUitOpen 0:6c67a9387981 46 void Reset() { t_ = 0; }
MikamiUitOpen 0:6c67a9387981 47
MikamiUitOpen 0:6c67a9387981 48 // Rosengerg 波の計算
MikamiUitOpen 0:6c67a9387981 49 // amp: 振幅
MikamiUitOpen 0:6c67a9387981 50 float Execute()
MikamiUitOpen 0:6c67a9387981 51 {
MikamiUitOpen 0:6c67a9387981 52 float g = 0;
MikamiUitOpen 0:6c67a9387981 53
MikamiUitOpen 0:6c67a9387981 54 if (t_ < t1_)
MikamiUitOpen 0:6c67a9387981 55 {
MikamiUitOpen 0:6c67a9387981 56 float x = t_/t1_;
MikamiUitOpen 0:6c67a9387981 57 g = amp_*(3.0f - 2.0f*x)*x*x;
MikamiUitOpen 0:6c67a9387981 58 }
MikamiUitOpen 0:6c67a9387981 59 if ((t_ >= t1_) && (t_ < t1_+t2_))
MikamiUitOpen 0:6c67a9387981 60 {
MikamiUitOpen 0:6c67a9387981 61 float x = (t_ - t1_)/t2_;
MikamiUitOpen 0:6c67a9387981 62 g = amp_*(1.0f - x*x);
MikamiUitOpen 0:6c67a9387981 63 }
MikamiUitOpen 0:6c67a9387981 64
MikamiUitOpen 0:6c67a9387981 65 if ((t_+=DT_) > period_) t_ -= period_;
MikamiUitOpen 0:6c67a9387981 66
MikamiUitOpen 0:6c67a9387981 67 return g;
MikamiUitOpen 0:6c67a9387981 68 }
MikamiUitOpen 0:6c67a9387981 69 };
MikamiUitOpen 0:6c67a9387981 70 }
MikamiUitOpen 0:6c67a9387981 71 #endif // ROSENBERG_HPP