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

Committer:
MikamiUitOpen
Date:
Mon Aug 15 07:18:07 2016 +0000
Revision:
0:224dccbc4edd
Child:
2:fcba17e3d573
1

Who changed what in which revision?

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