Output the audio signal with filtering by graphic equalizer in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号をグラフィック・イコライザを通して,ボードに搭載されているCODEC で出力する.
Dependencies: F746_GUI F746_SAI_IO SD_PlayerSkeleton FrequencyResponseDrawer
MyGraphicEqualizer/GraphicEqualizer.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2017-03-22
- Revision:
- 22:8397a04baa2d
- Parent:
- 20:5c69e664e17c
- Child:
- 23:878419f8638b
File content as of revision 22:8397a04baa2d:
//-------------------------------------------------------------- // グラフィックイコライザ用のクラス // (SD_PlayerSkeleton の派生クラス) // // 2017/03/22, Copyright (c) 2017 MIKAMI, Naoki //-------------------------------------------------------------- #include "GraphicEqualizer.hpp" namespace Mikami { GraphicEqualizer::GraphicEqualizer(string str, GrEqDesignerDrawer &obj) : SD_PlayerSkeleton(str), 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), // 利得の範囲:-8 dB ~ +8 dB 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<BUFF_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); } //------------------------------------------------------------ } // グラフィックイコライザのパラメータ変更 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(); } }