The experiment using this program is introduced on "Interface" No.3, CQ publishing Co.,Ltd, 2015. 本プログラムを使った実験は,CQ出版社のインターフェース 2015年3月号で紹介しています.

Dependencies:   DSProcessingIO mbed

Committer:
CQpub0Mikami
Date:
Sun Aug 24 10:19:58 2014 +0000
Revision:
3:e8fff6901dcd
Parent:
0:47656a949b95
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CQpub0Mikami 0:47656a949b95 1 //--------------------------------------------------------------
CQpub0Mikami 0:47656a949b95 2 // Reverb unit
CQpub0Mikami 0:47656a949b95 3 // Copyright (c) 2014 MIKAMI, Naoki, 2014/06/28
CQpub0Mikami 0:47656a949b95 4 //--------------------------------------------------------------
CQpub0Mikami 0:47656a949b95 5
CQpub0Mikami 0:47656a949b95 6 #ifndef REVERB_UNIT_HPP
CQpub0Mikami 0:47656a949b95 7 #define REVERB_UNIT_HPP
CQpub0Mikami 0:47656a949b95 8
CQpub0Mikami 0:47656a949b95 9 #include "mbed.h"
CQpub0Mikami 0:47656a949b95 10
CQpub0Mikami 0:47656a949b95 11 namespace Mikami
CQpub0Mikami 0:47656a949b95 12 {
CQpub0Mikami 0:47656a949b95 13 // Base class for reverb unit
CQpub0Mikami 0:47656a949b95 14 template<int delay> class Reverb
CQpub0Mikami 0:47656a949b95 15 {
CQpub0Mikami 0:47656a949b95 16 private:
CQpub0Mikami 0:47656a949b95 17 int ptr_;
CQpub0Mikami 0:47656a949b95 18 float un_[delay]; // for delay
CQpub0Mikami 0:47656a949b95 19
CQpub0Mikami 0:47656a949b95 20 Reverb(const Reverb&);
CQpub0Mikami 0:47656a949b95 21 Reverb& operator=(const Reverb&);
CQpub0Mikami 0:47656a949b95 22 protected:
CQpub0Mikami 0:47656a949b95 23 float Get() { return un_[ptr_]; }
CQpub0Mikami 0:47656a949b95 24 void Set(float x)
CQpub0Mikami 0:47656a949b95 25 {
CQpub0Mikami 0:47656a949b95 26 un_[ptr_] = x;
CQpub0Mikami 0:47656a949b95 27 if (++ptr_ >= delay) ptr_ = 0;
CQpub0Mikami 0:47656a949b95 28 }
CQpub0Mikami 0:47656a949b95 29 public:
CQpub0Mikami 0:47656a949b95 30 // Constructor
CQpub0Mikami 0:47656a949b95 31 Reverb() : ptr_(0) { Clear(); }
CQpub0Mikami 0:47656a949b95 32
CQpub0Mikami 0:47656a949b95 33 // Execute of filter (pure virtual function)
CQpub0Mikami 0:47656a949b95 34 virtual float Execute(float x) = 0;
CQpub0Mikami 0:47656a949b95 35
CQpub0Mikami 0:47656a949b95 36 // Clear internal delay elements
CQpub0Mikami 0:47656a949b95 37 void Clear()
CQpub0Mikami 0:47656a949b95 38 { for (int n=0; n<delay; n++) un_[n] = 0; }
CQpub0Mikami 0:47656a949b95 39 };
CQpub0Mikami 0:47656a949b95 40
CQpub0Mikami 0:47656a949b95 41 // Reverb unit using comb filter
CQpub0Mikami 0:47656a949b95 42 template<int delay> class CombFilter : public Reverb<delay>
CQpub0Mikami 0:47656a949b95 43 {
CQpub0Mikami 0:47656a949b95 44 private:
CQpub0Mikami 0:47656a949b95 45 const float G0_;
CQpub0Mikami 0:47656a949b95 46 public:
CQpub0Mikami 0:47656a949b95 47 // Constructor
CQpub0Mikami 0:47656a949b95 48 CombFilter(float g) : G0_(g) {}
CQpub0Mikami 0:47656a949b95 49
CQpub0Mikami 0:47656a949b95 50 // Execute comb filter
CQpub0Mikami 0:47656a949b95 51 virtual float Execute(float x)
CQpub0Mikami 0:47656a949b95 52 {
CQpub0Mikami 0:47656a949b95 53 float yn = Reverb<delay>::Get();
CQpub0Mikami 0:47656a949b95 54 Reverb<delay>::Set(x + G0_*yn);
CQpub0Mikami 0:47656a949b95 55 return yn;
CQpub0Mikami 0:47656a949b95 56 }
CQpub0Mikami 0:47656a949b95 57 };
CQpub0Mikami 0:47656a949b95 58
CQpub0Mikami 0:47656a949b95 59 // Reverb unit using allpass filter
CQpub0Mikami 0:47656a949b95 60 template<int delay> class AllPassFilter : public Reverb<delay>
CQpub0Mikami 0:47656a949b95 61 {
CQpub0Mikami 0:47656a949b95 62 private:
CQpub0Mikami 0:47656a949b95 63 const float G0_;
CQpub0Mikami 0:47656a949b95 64 public:
CQpub0Mikami 0:47656a949b95 65 // Constructor
CQpub0Mikami 0:47656a949b95 66 AllPassFilter(float g) : G0_(g) {}
CQpub0Mikami 0:47656a949b95 67
CQpub0Mikami 0:47656a949b95 68 // Execute allpass filter
CQpub0Mikami 0:47656a949b95 69 virtual float Execute(float x)
CQpub0Mikami 0:47656a949b95 70 {
CQpub0Mikami 0:47656a949b95 71 float un = x + G0_*Reverb<delay>::Get();
CQpub0Mikami 0:47656a949b95 72 float yn = -G0_*un + Reverb<delay>::Get();
CQpub0Mikami 0:47656a949b95 73 Reverb<delay>::Set(un);
CQpub0Mikami 0:47656a949b95 74 return yn;
CQpub0Mikami 0:47656a949b95 75 }
CQpub0Mikami 0:47656a949b95 76 };
CQpub0Mikami 0:47656a949b95 77 }
CQpub0Mikami 0:47656a949b95 78 #endif // REVERB_UNIT_HPP