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

Committer:
MikamiUitOpen
Date:
Mon Aug 15 06:37:47 2016 +0000
Revision:
15:ef0acc9fe111
Child:
16:cbb726ac20d8
16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 15:ef0acc9fe111 1 //--------------------------------------------------------------
MikamiUitOpen 15:ef0acc9fe111 2 // グラフィックイコライザ用のクラス
MikamiUitOpen 15:ef0acc9fe111 3 // (SD_PlayerSkeleton の派生クラス)
MikamiUitOpen 15:ef0acc9fe111 4 //
MikamiUitOpen 15:ef0acc9fe111 5 // 2016/08/11, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 15:ef0acc9fe111 6 //--------------------------------------------------------------
MikamiUitOpen 15:ef0acc9fe111 7
MikamiUitOpen 15:ef0acc9fe111 8 #include "GraphicEqualizer.hpp"
MikamiUitOpen 15:ef0acc9fe111 9
MikamiUitOpen 15:ef0acc9fe111 10 namespace Mikami
MikamiUitOpen 15:ef0acc9fe111 11 {
MikamiUitOpen 15:ef0acc9fe111 12 GraphicEqualizer::GraphicEqualizer(string str, int fs,
MikamiUitOpen 15:ef0acc9fe111 13 GrEqDesignerDrawer &obj)
MikamiUitOpen 15:ef0acc9fe111 14 : SD_PlayerSkeleton(str, fs),
MikamiUitOpen 15:ef0acc9fe111 15 flat_(BG_LEFT_, 197, BG_WIDTH_, BG_HEIGHT_, "FLAT"),
MikamiUitOpen 15:ef0acc9fe111 16 onOff_(BG_LEFT_, 235, BG_WIDTH_/2, BG_HEIGHT_,
MikamiUitOpen 15:ef0acc9fe111 17 2, (string[]){"ON", "OFF"}, 0, 0, 2, 0),
MikamiUitOpen 15:ef0acc9fe111 18 myBars_(obj.GetX0(), 178, 82,
MikamiUitOpen 15:ef0acc9fe111 19 obj.GetBands(), obj.GetSpaceX(),
MikamiUitOpen 15:ef0acc9fe111 20 -8.0f, 8.0f, 0, SeekBar::Vertical),
MikamiUitOpen 15:ef0acc9fe111 21 drawerObj_(obj),
MikamiUitOpen 15:ef0acc9fe111 22 BANDS_(drawerObj_.GetBands()), hn_(BANDS_)
MikamiUitOpen 15:ef0acc9fe111 23 {
MikamiUitOpen 15:ef0acc9fe111 24 // 周波数特性の描画
MikamiUitOpen 15:ef0acc9fe111 25 drawerObj_.DrawResponse();
MikamiUitOpen 15:ef0acc9fe111 26
MikamiUitOpen 15:ef0acc9fe111 27 // フィルタの準備
MikamiUitOpen 15:ef0acc9fe111 28 for (int k=0; k<BANDS_; k++)
MikamiUitOpen 15:ef0acc9fe111 29 hn_[k] = BiquadGrEq(drawerObj_.GetCoefficient(k));
MikamiUitOpen 15:ef0acc9fe111 30
MikamiUitOpen 15:ef0acc9fe111 31 on_ = true;
MikamiUitOpen 15:ef0acc9fe111 32 }
MikamiUitOpen 15:ef0acc9fe111 33
MikamiUitOpen 15:ef0acc9fe111 34 // 1フレーム分の信号処理の実行
MikamiUitOpen 15:ef0acc9fe111 35 void GraphicEqualizer::SignalProcessing()
MikamiUitOpen 15:ef0acc9fe111 36 {
MikamiUitOpen 15:ef0acc9fe111 37 // 1フレーム分のステレオデータを SD から読み込みモノラルにする
MikamiUitOpen 15:ef0acc9fe111 38 sdReader_.ReadAndToMono(sn_);
MikamiUitOpen 15:ef0acc9fe111 39
MikamiUitOpen 15:ef0acc9fe111 40 while (!mySai_.IsXferred()) {} // データの転送が終わるまで待つ
MikamiUitOpen 15:ef0acc9fe111 41 //------------------------------------------------------------
MikamiUitOpen 15:ef0acc9fe111 42 // 1フレーム分のイコライザ処理を行い,その結果を出力する
MikamiUitOpen 15:ef0acc9fe111 43 for (int n=0; n<FRAME_SIZE_; n++)
MikamiUitOpen 15:ef0acc9fe111 44 {
MikamiUitOpen 15:ef0acc9fe111 45 // 縦続形の IIR フィルタ実行
MikamiUitOpen 15:ef0acc9fe111 46 float xn = 0.125f*sn_[n]; // 0.125 の乗算はブーストしても
MikamiUitOpen 15:ef0acc9fe111 47 // クリップされないようにするため
MikamiUitOpen 15:ef0acc9fe111 48 float yn = xn;
MikamiUitOpen 15:ef0acc9fe111 49 for (int k=0; k<BANDS_; k++) yn = hn_[k].Execute(yn);
MikamiUitOpen 15:ef0acc9fe111 50
MikamiUitOpen 15:ef0acc9fe111 51 float value = on_ ? yn : xn;
MikamiUitOpen 15:ef0acc9fe111 52 // 音響信号の出力,左右チャンネルに同じものを出力
MikamiUitOpen 15:ef0acc9fe111 53 mySai_.Output((int16_t)value, (int16_t)value);
MikamiUitOpen 15:ef0acc9fe111 54 }
MikamiUitOpen 15:ef0acc9fe111 55 //------------------------------------------------------------
MikamiUitOpen 15:ef0acc9fe111 56 mySai_.ResetXferred(); // 次のデータ転送に備える
MikamiUitOpen 15:ef0acc9fe111 57 }
MikamiUitOpen 15:ef0acc9fe111 58
MikamiUitOpen 15:ef0acc9fe111 59 // サウンドエフェクタのパラメータ変更
MikamiUitOpen 15:ef0acc9fe111 60 void GraphicEqualizer::Modefy()
MikamiUitOpen 15:ef0acc9fe111 61 {
MikamiUitOpen 15:ef0acc9fe111 62 // 周波数特性を平坦化
MikamiUitOpen 15:ef0acc9fe111 63 if (flat_.Touched())
MikamiUitOpen 15:ef0acc9fe111 64 {
MikamiUitOpen 15:ef0acc9fe111 65 drawerObj_.DrawFlat();
MikamiUitOpen 15:ef0acc9fe111 66 for (int n=0; n<BANDS_; n++)
MikamiUitOpen 15:ef0acc9fe111 67 hn_[n] = BiquadGrEq(drawerObj_.GetCoefficient(n));
MikamiUitOpen 15:ef0acc9fe111 68 myBars_.DrawAll(0); // ツマミの位置を 0 dB に設定する
MikamiUitOpen 15:ef0acc9fe111 69 flat_.Draw();
MikamiUitOpen 15:ef0acc9fe111 70 return;
MikamiUitOpen 15:ef0acc9fe111 71 }
MikamiUitOpen 15:ef0acc9fe111 72
MikamiUitOpen 15:ef0acc9fe111 73 int sw = 0;
MikamiUitOpen 15:ef0acc9fe111 74 if (onOff_.GetTouchedNumber(sw))
MikamiUitOpen 15:ef0acc9fe111 75 on_ = (sw == 0) ? true : false;
MikamiUitOpen 15:ef0acc9fe111 76
MikamiUitOpen 15:ef0acc9fe111 77 static int num = 0;
MikamiUitOpen 15:ef0acc9fe111 78 if (!myBars_.GetSlidedNumber(num)) return;
MikamiUitOpen 15:ef0acc9fe111 79 drawerObj_.DesignAndRedraw(myBars_.GetValue(num), num);
MikamiUitOpen 15:ef0acc9fe111 80 hn_[num] = BiquadGrEq(drawerObj_.GetCoefficient(num));
MikamiUitOpen 15:ef0acc9fe111 81 }
MikamiUitOpen 15:ef0acc9fe111 82
MikamiUitOpen 15:ef0acc9fe111 83 // 曲の再生中に表示する
MikamiUitOpen 15:ef0acc9fe111 84 void GraphicEqualizer::Display()
MikamiUitOpen 15:ef0acc9fe111 85 {
MikamiUitOpen 15:ef0acc9fe111 86 myBars_.RedrawAll();
MikamiUitOpen 15:ef0acc9fe111 87 drawerObj_.DrawResponse();
MikamiUitOpen 15:ef0acc9fe111 88 }
MikamiUitOpen 15:ef0acc9fe111 89 }