The experiment using this program is introduced on "Interface" No.3, CQ publishing Co.,Ltd, 2015. 本プログラムを使った実験は,CQ出版社のインターフェース 2015年3月号で紹介しています.
Dependencies: DSProcessingIO mbed
ReverbUnit.hpp@0:47656a949b95, 2014-07-15 (annotated)
- Committer:
- CQpub0Mikami
- Date:
- Tue Jul 15 09:26:17 2014 +0000
- Revision:
- 0:47656a949b95
1
Who changed what in which revision?
User | Revision | Line number | New 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 |