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();
    }
}