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: main.cpp
- Revision:
- 0:e953eb392151
- Child:
- 1:a5837720e14a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Apr 27 13:56:39 2016 +0000
@@ -0,0 +1,156 @@
+//--------------------------------------------------------------
+// グラフィックイコライザ付き SD オーディオプレーヤー
+// SD のファイル: *.wav
+// PCM,16 ビットステレオ,標本化周波数 44.1 kHz
+// 上記以外の形式は扱わない
+// 出力:モノラル
+//
+// 2016/04/27, Copyright (c) 2016 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#include "MyFunctions.hpp"
+#include "BlinkLabel.hpp"
+
+using namespace Mikami;
+
+int main()
+{
+ Label myLabel(80, 4, "SD Card Audio Player 16:36", Label::LEFT, Font16);
+
+ const int FS = AUDIO_FREQUENCY_44K; // 標本化周波数: 44.1 kHz
+ SaiIO_O mySai(2048, FS);
+
+ SD_WavReader sdReader(mySai.GetLength()); // SD カード読み込み用オブジェクト
+ const int MAX_FILES = 7;
+ FileSelector selector(4, 28, MAX_FILES, 38, sdReader);
+ if (!selector.CreateTable())
+ BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);
+
+ // ボタン用の定数
+ const uint16_t BG_LEFT = 420;
+ const uint16_t BG_WIDTH = 60;
+ const uint16_t BG_HEIGHT = 40;
+
+ // ButtonGroup: "OPEN", "PLAY", "PAUSE", "RESUME", "STOP"
+ const string MENU[5] = {"OPEN", "PLAY", "PAUSE", "RESUME", "STOP"};
+ ButtonGroup menu(BG_LEFT, 2, BG_WIDTH, BG_HEIGHT,
+ 5, MENU, 0, 2, 1);
+ // OPEN のみアクティブ
+ menu.Activate(0);
+ for (int n=1; n<5; n++) menu.Inactivate(n);
+
+ Button flatButton(BG_LEFT, 230, BG_WIDTH, BG_HEIGHT, "FLAT");
+
+ // フィルタの設計と周波数特性描画用
+ const int STAGES = 9; // バンド数
+ DesignerDrawer drawerObj(
+ 30, // グラフの左端の位置
+ 130, // グラフの下端の位置
+ STAGES, // バンド数
+ 62.5f, // 最低域バンドの中心周波数
+ FS, // 標本化周波数
+ 4); // 1 dB 当たりのピクセル数
+
+ // 周波数特性変更用スライダ
+ SeekbarGroup myBars(drawerObj.GetX0(), 186, 66, STAGES,
+ drawerObj.GetSpaceX(), -8, 8, 0,
+ SeekBar::Vertical);
+
+ // フィルタの準備
+ BiquadGrEq::Coefs ck[STAGES];
+ drawerObj.GetCoefficients(ck);
+ BiquadGrEq hn[STAGES];
+ for (int k=0; k<STAGES; k++) hn[k] = BiquadGrEq(ck[k]);
+
+ int32_t frameSize = mySai.GetLength();
+ int16_t *sn = new int16_t[frameSize+1]; // フレームバッファ
+ bool playOk = false;
+ bool whileFirst = true;
+ string fileName;
+ int32_t loopCount;
+
+ while (true)
+ {
+ if (!playOk)
+ {
+ if (whileFirst)
+ {
+ whileFirst = false;
+ while (!menu.Touched(0)) // OPEN がタッチされるまで待つ
+ ModifyFilter(drawerObj, myBars, hn, flatButton);
+ SelectFile(menu, selector, myLabel, fileName);
+ }
+ else
+ {
+ menu.Activate(1); // PLAY 有効
+ int touch10;
+ while (!menu.GetTouchedNumber(touch10))
+ ModifyFilter(drawerObj, myBars, hn, flatButton);
+ if (touch10 == 0)
+ SelectFile(menu, selector, myLabel, fileName);
+ }
+
+ loopCount = SD_Open(sdReader, fileName, frameSize);
+ while (!menu.Touched(1)) // PLAY がタッチされるまで待つ
+ ModifyFilter(drawerObj, myBars, hn, flatButton);
+ }
+ else
+ loopCount = SD_Open(sdReader, fileName, frameSize);
+
+ selector.Erase(BG_LEFT-4, 288);
+ myLabel.Draw("9-band Graphic Equalizer");
+ myBars.RedrawAll();
+ drawerObj.DrawResponse();
+ menu.Inactivate(0); // OPEN 無効
+ menu.Activate(2); // PAUSE 有効
+ menu.Activate(4); // STOP 有効
+
+ playOk = false;
+ bool stopOk = false;
+ mySai.InitCodecOut(); // SAI の初期化
+
+ // IIR フィルタの内部の遅延器のクリア
+ for (int k=0; k<STAGES; k++) hn[k].Clear();
+
+ for (int k=0; k<loopCount; k++)
+ {
+ int touch42 = -1;
+ menu.GetTouchedNumber(touch42);
+ if (touch42 == 4) break; // STOP
+ if (touch42 == 2) // PAUSE
+ {
+ menu.Inactivate(2); // PAUSE 無効
+ menu.Activate(3); // RESUME 有効
+ mySai.Pause();
+
+ // PLAY か RESUME か STOP がタッチされるまで待つ
+ int touch134 = -1;
+ while (!menu.GetTouchedNumber(touch134))
+ ModifyFilter(drawerObj, myBars, hn, flatButton);
+ switch (touch134)
+ {
+ case 1: playOk = true; // 最初から PLAY
+ break;
+ case 3: mySai.Resume(); // PAUSE したところから PLAY 再開
+ menu.Activate(2);
+ menu.Inactivate(3);
+ menu.TouchedColor(1);
+ break;
+ case 4: stopOk = true; // STOP
+ break;
+ }
+ }
+ if (playOk || stopOk) break;
+
+ ModifyFilter(drawerObj, myBars, hn, flatButton);
+ // 1フレーム分の信号処理 (イコライザ) の実行
+ ProcessSignal(sdReader, mySai, sn, hn, STAGES);
+ }
+ mySai.Stop();
+ menu.Activate(0); // OPEN 有効
+ if (!playOk) menu.Activate(1); // PLAY 有効
+ for (int n=2; n<5; n++) // その他は無効
+ menu.Inactivate(n);
+ sdReader.Close(); // SD のファイルのクローズ
+ }
+}
