Integrated program of 4 different kinds of application programs for processing sound signal. 4種類のサウンド信号処理を統合したプログラム.

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Revision:
0:224dccbc4edd
Child:
2:fcba17e3d573
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MyGraphicEqualizer/GraphicEqualizer.cpp	Mon Aug 15 07:18:07 2016 +0000
@@ -0,0 +1,89 @@
+//--------------------------------------------------------------
+//  グラフィックイコライザ用のクラス
+//  (SD_PlayerSkeleton の派生クラス)
+//
+//  2016/08/15, Copyright (c) 2016 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#include "GraphicEqualizer.hpp"
+
+namespace Mikami
+{
+    GraphicEqualizer::GraphicEqualizer(string str, int fs,
+                                       GrEqDesignerDrawer &obj)
+        : SD_PlayerSkeleton(str, fs, true),
+          flat_(BG_LEFT_, 197, BG_WIDTH_, BG_HEIGHT_, "FLAT"),
+          onOff_(BG_LEFT_, 235, BG_WIDTH_/2, BG_HEIGHT_,
+                 2, (string[]){"ON", "OFF"}, 0, 0, 2, 0),
+          myBars_(obj.GetX0(), 178, 82,
+                  obj.GetBands(), obj.GetSpaceX(),
+                  -8.0f, 8.0f, 0, SeekBar::Vertical),
+          drawerObj_(obj),
+          BANDS_(drawerObj_.GetBands()), hn_(BANDS_)
+    {
+        // 周波数特性の描画
+        drawerObj_.DrawResponse();
+
+        // フィルタの準備
+        for (int k=0; k<BANDS_; k++)
+            hn_[k] = BiquadGrEq(drawerObj_.GetCoefficient(k));
+
+        on_ = true;
+    }
+
+    // 1フレーム分の信号処理の実行
+    void GraphicEqualizer::SignalProcessing()
+    {
+        // 1フレーム分のステレオデータを SD から読み込みモノラルにする
+        sdReader_.ReadAndToMono(sn_);
+
+        while (!mySai_.IsXferred()) {}  // データの転送が終わるまで待つ
+        //------------------------------------------------------------
+        // 1フレーム分のイコライザ処理を行い,その結果を出力する
+        for (int n=0; n<FRAME_SIZE_; n++)
+        {
+            // 縦続形の IIR フィルタ実行
+            float xn = 0.125f*sn_[n];   // 0.125 の乗算はブーストしても
+                                        // クリップされないようにするため
+            float yn = xn;
+            for (int k=0; k<BANDS_; k++) yn = hn_[k].Execute(yn);
+
+            float value = on_ ? yn : xn;
+            // 音響信号の出力,左右チャンネルに同じものを出力
+            mySai_.Output((int16_t)value, (int16_t)value);
+        }
+        //------------------------------------------------------------
+        mySai_.ResetXferred();   // 次のデータ転送に備える
+    }
+
+    // サウンドエフェクタのパラメータ変更
+    void GraphicEqualizer::Modefy()
+    {
+        // 周波数特性を平坦化
+        if (flat_.Touched())
+        {
+            drawerObj_.DrawFlat();
+            for (int n=0; n<BANDS_; n++)
+                hn_[n] = BiquadGrEq(drawerObj_.GetCoefficient(n));
+            myBars_.DrawAll(0);     // ツマミの位置を 0 dB に設定する
+            flat_.Draw();
+            return;
+        }
+
+        int sw = 0;
+        if (onOff_.GetTouchedNumber(sw))
+            on_ = (sw == 0) ? true : false;
+
+        static int num = 0;
+        if (!myBars_.GetSlidedNumber(num)) return;
+        drawerObj_.DesignAndRedraw(myBars_.GetValue(num), num);
+        hn_[num] = BiquadGrEq(drawerObj_.GetCoefficient(num));
+    }
+
+    // 曲の再生中に表示する
+    void GraphicEqualizer::Display()
+    {
+        myBars_.RedrawAll();
+        drawerObj_.DrawResponse();
+    }
+}