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
Diff: MyGraphicEqualizer/GraphicEqualizer.cpp
- Revision:
- 0:224dccbc4edd
- Child:
- 2:fcba17e3d573
diff -r 000000000000 -r 224dccbc4edd MyGraphicEqualizer/GraphicEqualizer.cpp --- /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(); + } +}