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 Apr 10 04:07:35 2017 +0000
Revision:
24:f78f9d0ac262
Parent:
23:878419f8638b
25

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 24:f78f9d0ac262 5 // 2017/04/10, Copyright (c) 2017 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 22:8397a04baa2d 12 GraphicEqualizer::GraphicEqualizer(string str,
MikamiUitOpen 15:ef0acc9fe111 13 GrEqDesignerDrawer &obj)
MikamiUitOpen 22:8397a04baa2d 14 : SD_PlayerSkeleton(str),
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 16:cbb726ac20d8 18 // 利得の範囲:-8 dB ~ +8 dB
MikamiUitOpen 15:ef0acc9fe111 19 myBars_(obj.GetX0(), 178, 82,
MikamiUitOpen 15:ef0acc9fe111 20 obj.GetBands(), obj.GetSpaceX(),
MikamiUitOpen 15:ef0acc9fe111 21 -8.0f, 8.0f, 0, SeekBar::Vertical),
MikamiUitOpen 15:ef0acc9fe111 22 drawerObj_(obj),
MikamiUitOpen 15:ef0acc9fe111 23 BANDS_(drawerObj_.GetBands()), hn_(BANDS_)
MikamiUitOpen 15:ef0acc9fe111 24 {
MikamiUitOpen 15:ef0acc9fe111 25 // 周波数特性の描画
MikamiUitOpen 15:ef0acc9fe111 26 drawerObj_.DrawResponse();
MikamiUitOpen 15:ef0acc9fe111 27
MikamiUitOpen 15:ef0acc9fe111 28 // フィルタの準備
MikamiUitOpen 15:ef0acc9fe111 29 for (int k=0; k<BANDS_; k++)
MikamiUitOpen 15:ef0acc9fe111 30 hn_[k] = BiquadGrEq(drawerObj_.GetCoefficient(k));
MikamiUitOpen 15:ef0acc9fe111 31
MikamiUitOpen 15:ef0acc9fe111 32 on_ = true;
MikamiUitOpen 15:ef0acc9fe111 33 }
MikamiUitOpen 15:ef0acc9fe111 34
MikamiUitOpen 22:8397a04baa2d 35 // 1ブロック分の信号処理の実行
MikamiUitOpen 15:ef0acc9fe111 36 void GraphicEqualizer::SignalProcessing()
MikamiUitOpen 15:ef0acc9fe111 37 {
MikamiUitOpen 22:8397a04baa2d 38 // 1ブロック分のステレオデータを SD から読み込みモノラルにする
MikamiUitOpen 15:ef0acc9fe111 39 sdReader_.ReadAndToMono(sn_);
MikamiUitOpen 15:ef0acc9fe111 40
MikamiUitOpen 15:ef0acc9fe111 41 while (!mySai_.IsXferred()) {} // データの転送が終わるまで待つ
MikamiUitOpen 15:ef0acc9fe111 42 //------------------------------------------------------------
MikamiUitOpen 22:8397a04baa2d 43 // 1ブロック分のイコライザ処理を行い,その結果を出力する
MikamiUitOpen 22:8397a04baa2d 44 for (int n=0; n<BUFF_SIZE_; n++)
MikamiUitOpen 15:ef0acc9fe111 45 {
MikamiUitOpen 15:ef0acc9fe111 46 // 縦続形の IIR フィルタ実行
MikamiUitOpen 15:ef0acc9fe111 47 float xn = 0.125f*sn_[n]; // 0.125 の乗算はブーストしても
MikamiUitOpen 15:ef0acc9fe111 48 // クリップされないようにするため
MikamiUitOpen 15:ef0acc9fe111 49 float yn = xn;
MikamiUitOpen 15:ef0acc9fe111 50 for (int k=0; k<BANDS_; k++) yn = hn_[k].Execute(yn);
MikamiUitOpen 15:ef0acc9fe111 51
MikamiUitOpen 23:878419f8638b 52 int16_t value = on_ ? (int16_t)yn : xn;
MikamiUitOpen 15:ef0acc9fe111 53 // 音響信号の出力,左右チャンネルに同じものを出力
MikamiUitOpen 23:878419f8638b 54 mySai_.Output(value, value);
MikamiUitOpen 15:ef0acc9fe111 55 }
MikamiUitOpen 15:ef0acc9fe111 56 //------------------------------------------------------------
MikamiUitOpen 15:ef0acc9fe111 57 }
MikamiUitOpen 15:ef0acc9fe111 58
MikamiUitOpen 22:8397a04baa2d 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 23:878419f8638b 73 // グラフィックイコライザの有効/無効切り替え
MikamiUitOpen 23:878419f8638b 74 if (onOff_.Touched(0)) on_ = true;
MikamiUitOpen 23:878419f8638b 75 if (onOff_.Touched(1)) on_ = 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 }