![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: MyClasses_Functions/MyFunctions.cpp
- Revision:
- 8:12aa05f3cc24
- Child:
- 10:fc6367c2ffcf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MyClasses_Functions/MyFunctions.cpp Mon May 09 08:54:09 2016 +0000 @@ -0,0 +1,83 @@ +//-------------------------------------------------------------- +// グラフィックイコライザ付き SD オーディオプレーヤーで使う大域関数 +// +// 2016/05/09, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------------- + +#include "MyFunctions.hpp" + +// 1フレーム分の信号処理 (イコライザ) の実行 +void SignalProcessing(SD_WavReader &sdReader, SaiIO &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[], + Button &flat, ButtonGroup &onOff, bool &on) +{ + + // 周波数特性を平坦化 + if (flat.Touched()) + { + drawerObj.DrawFlat(); + for (int n=0; n<drawerObj.GetStages(); 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)); +}