不韋 呂 / F746_SD_GraphicEqualizer

Dependencies:   F746_GUI F746_SAI_IO SD_PlayerSkeleton FrequencyResponseDrawer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers GraphicEqualizer.cpp Source File

GraphicEqualizer.cpp

00001 //--------------------------------------------------------------
00002 //  グラフィックイコライザ用のクラス
00003 //  (SD_PlayerSkeleton の派生クラス)
00004 //
00005 //  2017/04/10, Copyright (c) 2017 MIKAMI, Naoki
00006 //--------------------------------------------------------------
00007 
00008 #include "GraphicEqualizer.hpp"
00009 
00010 namespace Mikami
00011 {
00012     GraphicEqualizer::GraphicEqualizer(string str,
00013                                        GrEqDesignerDrawer &obj)
00014         : SD_PlayerSkeleton(str),
00015           flat_(BG_LEFT_, 197, BG_WIDTH_, BG_HEIGHT_, "FLAT"),
00016           onOff_(BG_LEFT_, 235, BG_WIDTH_/2, BG_HEIGHT_,
00017                  2, (string[]){"ON", "OFF"}, 0, 0, 2, 0),
00018           // 利得の範囲:-8 dB ~ +8 dB
00019           myBars_(obj.GetX0(), 178, 82,
00020                   obj.GetBands(), obj.GetSpaceX(),
00021                   -8.0f, 8.0f, 0, SeekBar::Vertical),
00022           drawerObj_(obj),
00023           BANDS_(drawerObj_.GetBands()), hn_(BANDS_)
00024     {
00025         // 周波数特性の描画
00026         drawerObj_.DrawResponse();
00027 
00028         // フィルタの準備
00029         for (int k=0; k<BANDS_; k++)
00030             hn_[k] = BiquadGrEq(drawerObj_.GetCoefficient(k));
00031 
00032         on_ = true;
00033     }
00034 
00035     // 1ブロック分の信号処理の実行
00036     void GraphicEqualizer::SignalProcessing()
00037     {
00038         // 1ブロック分のステレオデータを SD から読み込みモノラルにする
00039         sdReader_.ReadAndToMono(sn_);
00040 
00041         while (!mySai_.IsXferred()) {}  // データの転送が終わるまで待つ
00042         //------------------------------------------------------------
00043         // 1ブロック分のイコライザ処理を行い,その結果を出力する
00044         for (int n=0; n<BUFF_SIZE_; n++)
00045         {
00046             // 縦続形の IIR フィルタ実行
00047             float xn = 0.125f*sn_[n];   // 0.125 の乗算はブーストしても
00048                                         // クリップされないようにするため
00049             float yn = xn;
00050             for (int k=0; k<BANDS_; k++) yn = hn_[k].Execute(yn);
00051 
00052             int16_t value = on_ ? (int16_t)yn : xn;
00053             // 音響信号の出力,左右チャンネルに同じものを出力
00054             mySai_.Output(value, value);
00055         }
00056         //------------------------------------------------------------
00057     }
00058 
00059     // グラフィックイコライザのパラメータ変更
00060     void GraphicEqualizer::Modefy()
00061     {
00062         // 周波数特性を平坦化
00063         if (flat_.Touched())
00064         {
00065             drawerObj_.DrawFlat();
00066             for (int n=0; n<BANDS_; n++)
00067                 hn_[n] = BiquadGrEq(drawerObj_.GetCoefficient(n));
00068             myBars_.DrawAll(0);     // ツマミの位置を 0 dB に設定する
00069             flat_.Draw();
00070             return;
00071         }
00072 
00073         // グラフィックイコライザの有効/無効切り替え
00074         if (onOff_.Touched(0)) on_ = true;
00075         if (onOff_.Touched(1)) on_ = false;
00076 
00077         static int num = 0;
00078         if (!myBars_.GetSlidedNumber(num)) return;
00079         drawerObj_.DesignAndRedraw(myBars_.GetValue(num), num);
00080         hn_[num] = BiquadGrEq(drawerObj_.GetCoefficient(num));
00081     }
00082 
00083     // 曲の再生中に表示する
00084     void GraphicEqualizer::Display()
00085     {
00086         myBars_.RedrawAll();
00087         drawerObj_.DrawResponse();
00088     }
00089 }