revised version of F746_SD_GraphicEqualizer

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO FrequencyResponseDrawer LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed

Fork of F746_SD_GraphicEqualizer by 不韋 呂

MyClasses_Functions/MyFunctions.cpp

Committer:
MikamiUitOpen
Date:
2016-05-01
Revision:
2:2a5c93bf729a
Parent:
1:a5837720e14a
Child:
5:a5a4f9d7b26c

File content as of revision 2:2a5c93bf729a:

//--------------------------------------------------------------
//  グラフィックイコライザ付き SD オーディオプレーヤーで使う大域関数
//
//  2016/05/01, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------------

#include "MyFunctions.hpp"

// 1フレーム分の信号処理 (イコライザ) の実行
void ProcessSignal(SD_WavReader &sdReader, SaiIO_O &mySai,
                   int16_t sn[], BiquadGrEq hn[],
                   int stages, bool on)
{
    // 1フレーム分のデータを SD から読み込む
    sdReader.ReadAndToMono(sn, mySai.GetLength());

    while (!mySai.IsXferred()) {}   // データの転送が終わるまで待つ
    //--------------------------------------------------------------
    // 1フレーム分のイコライザ処理を行い,その結果を出力する
    for (int n=0; n<mySai.GetLength(); n++)
    {
        // 縦続形の IIR フィルタ実行
        float xn = 0.125f*sn[n];    // 0.125 の乗算はブースとしてもクリップされないようにするため
        float yn = xn;
        for (int k=0; k<stages; k++) yn = hn[k].Execute(yn);
        int16_t value = on ? (int16_t)yn : xn;
        mySai.Output(value, value); // 音響信号の出力
    }
    //--------------------------------------------------------------
    mySai.ResetXferred();   // 次のデータ転送に備える
}

// SD カードのファイルのオープン
int32_t SD_Open(SD_WavReader &sdReader,
                string fileName, int32_t frameSize)
{
    sdReader.Open(fileName);
    sdReader.IsWavFile();
    return sdReader.GetSize()/frameSize;
}

// ファイルの選択
//      selectedName:   選択されたファイル名
void SelectFile(ButtonGroup &menu, FileSelector &selector,
                Label &msg, string &selectedName)
{
    selector.DisplayFileList();   
    msg.Draw("Select file");
    do
    {
        if (selector.Select(selectedName))
            menu.Activate(1);   // PLAY 有効
        wait_ms(200);
    } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す
}

// フィルタの周波数特性の変更
void ModifyFilter(DesignerDrawer &drawerObj,
                  SeekbarGroup &myBars, BiquadGrEq hn[],
                  ButtonGroup &onOff, bool &on)
{
    int sw = 0;
    if (onOff.GetTouchedNumber(sw))
        on = (sw == 0) ? true : false;
/*
    {
        drawerObj.DesignAndRedraw();
        for (int n=0; n<drawerObj.GetStages(); n++)
            hn[n] = BiquadGrEq(drawerObj.GetCoefficient(n));
        myBars.DrawAll(0);  // ツマミの位置を 0 dB に設定する
        reset.Draw();
        return;
    }
*/
    static int num = 0;
    if (!myBars.GetSlidedNumber(num)) return;
    drawerObj.DesignAndRedraw(myBars.GetValue(num), num);
    hn[num] = BiquadGrEq(drawerObj.GetCoefficient(num));
}