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 不韋 呂

Committer:
MikamiUitOpen
Date:
Wed Apr 27 13:56:39 2016 +0000
Revision:
0:e953eb392151
Child:
1:a5837720e14a
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:e953eb392151 1 //--------------------------------------------------------------
MikamiUitOpen 0:e953eb392151 2 // グラフィックイコライザ付き SD オーディオプレーヤー
MikamiUitOpen 0:e953eb392151 3 // SD のファイル: *.wav
MikamiUitOpen 0:e953eb392151 4 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz
MikamiUitOpen 0:e953eb392151 5 // 上記以外の形式は扱わない
MikamiUitOpen 0:e953eb392151 6 // 出力:モノラル
MikamiUitOpen 0:e953eb392151 7 //
MikamiUitOpen 0:e953eb392151 8 // 2016/04/27, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:e953eb392151 9 //--------------------------------------------------------------
MikamiUitOpen 0:e953eb392151 10
MikamiUitOpen 0:e953eb392151 11 #include "MyFunctions.hpp"
MikamiUitOpen 0:e953eb392151 12 #include "BlinkLabel.hpp"
MikamiUitOpen 0:e953eb392151 13
MikamiUitOpen 0:e953eb392151 14 using namespace Mikami;
MikamiUitOpen 0:e953eb392151 15
MikamiUitOpen 0:e953eb392151 16 int main()
MikamiUitOpen 0:e953eb392151 17 {
MikamiUitOpen 0:e953eb392151 18 Label myLabel(80, 4, "SD Card Audio Player 16:36", Label::LEFT, Font16);
MikamiUitOpen 0:e953eb392151 19
MikamiUitOpen 0:e953eb392151 20 const int FS = AUDIO_FREQUENCY_44K; // 標本化周波数: 44.1 kHz
MikamiUitOpen 0:e953eb392151 21 SaiIO_O mySai(2048, FS);
MikamiUitOpen 0:e953eb392151 22
MikamiUitOpen 0:e953eb392151 23 SD_WavReader sdReader(mySai.GetLength()); // SD カード読み込み用オブジェクト
MikamiUitOpen 0:e953eb392151 24 const int MAX_FILES = 7;
MikamiUitOpen 0:e953eb392151 25 FileSelector selector(4, 28, MAX_FILES, 38, sdReader);
MikamiUitOpen 0:e953eb392151 26 if (!selector.CreateTable())
MikamiUitOpen 0:e953eb392151 27 BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);
MikamiUitOpen 0:e953eb392151 28
MikamiUitOpen 0:e953eb392151 29 // ボタン用の定数
MikamiUitOpen 0:e953eb392151 30 const uint16_t BG_LEFT = 420;
MikamiUitOpen 0:e953eb392151 31 const uint16_t BG_WIDTH = 60;
MikamiUitOpen 0:e953eb392151 32 const uint16_t BG_HEIGHT = 40;
MikamiUitOpen 0:e953eb392151 33
MikamiUitOpen 0:e953eb392151 34 // ButtonGroup: "OPEN", "PLAY", "PAUSE", "RESUME", "STOP"
MikamiUitOpen 0:e953eb392151 35 const string MENU[5] = {"OPEN", "PLAY", "PAUSE", "RESUME", "STOP"};
MikamiUitOpen 0:e953eb392151 36 ButtonGroup menu(BG_LEFT, 2, BG_WIDTH, BG_HEIGHT,
MikamiUitOpen 0:e953eb392151 37 5, MENU, 0, 2, 1);
MikamiUitOpen 0:e953eb392151 38 // OPEN のみアクティブ
MikamiUitOpen 0:e953eb392151 39 menu.Activate(0);
MikamiUitOpen 0:e953eb392151 40 for (int n=1; n<5; n++) menu.Inactivate(n);
MikamiUitOpen 0:e953eb392151 41
MikamiUitOpen 0:e953eb392151 42 Button flatButton(BG_LEFT, 230, BG_WIDTH, BG_HEIGHT, "FLAT");
MikamiUitOpen 0:e953eb392151 43
MikamiUitOpen 0:e953eb392151 44 // フィルタの設計と周波数特性描画用
MikamiUitOpen 0:e953eb392151 45 const int STAGES = 9; // バンド数
MikamiUitOpen 0:e953eb392151 46 DesignerDrawer drawerObj(
MikamiUitOpen 0:e953eb392151 47 30, // グラフの左端の位置
MikamiUitOpen 0:e953eb392151 48 130, // グラフの下端の位置
MikamiUitOpen 0:e953eb392151 49 STAGES, // バンド数
MikamiUitOpen 0:e953eb392151 50 62.5f, // 最低域バンドの中心周波数
MikamiUitOpen 0:e953eb392151 51 FS, // 標本化周波数
MikamiUitOpen 0:e953eb392151 52 4); // 1 dB 当たりのピクセル数
MikamiUitOpen 0:e953eb392151 53
MikamiUitOpen 0:e953eb392151 54 // 周波数特性変更用スライダ
MikamiUitOpen 0:e953eb392151 55 SeekbarGroup myBars(drawerObj.GetX0(), 186, 66, STAGES,
MikamiUitOpen 0:e953eb392151 56 drawerObj.GetSpaceX(), -8, 8, 0,
MikamiUitOpen 0:e953eb392151 57 SeekBar::Vertical);
MikamiUitOpen 0:e953eb392151 58
MikamiUitOpen 0:e953eb392151 59 // フィルタの準備
MikamiUitOpen 0:e953eb392151 60 BiquadGrEq::Coefs ck[STAGES];
MikamiUitOpen 0:e953eb392151 61 drawerObj.GetCoefficients(ck);
MikamiUitOpen 0:e953eb392151 62 BiquadGrEq hn[STAGES];
MikamiUitOpen 0:e953eb392151 63 for (int k=0; k<STAGES; k++) hn[k] = BiquadGrEq(ck[k]);
MikamiUitOpen 0:e953eb392151 64
MikamiUitOpen 0:e953eb392151 65 int32_t frameSize = mySai.GetLength();
MikamiUitOpen 0:e953eb392151 66 int16_t *sn = new int16_t[frameSize+1]; // フレームバッファ
MikamiUitOpen 0:e953eb392151 67 bool playOk = false;
MikamiUitOpen 0:e953eb392151 68 bool whileFirst = true;
MikamiUitOpen 0:e953eb392151 69 string fileName;
MikamiUitOpen 0:e953eb392151 70 int32_t loopCount;
MikamiUitOpen 0:e953eb392151 71
MikamiUitOpen 0:e953eb392151 72 while (true)
MikamiUitOpen 0:e953eb392151 73 {
MikamiUitOpen 0:e953eb392151 74 if (!playOk)
MikamiUitOpen 0:e953eb392151 75 {
MikamiUitOpen 0:e953eb392151 76 if (whileFirst)
MikamiUitOpen 0:e953eb392151 77 {
MikamiUitOpen 0:e953eb392151 78 whileFirst = false;
MikamiUitOpen 0:e953eb392151 79 while (!menu.Touched(0)) // OPEN がタッチされるまで待つ
MikamiUitOpen 0:e953eb392151 80 ModifyFilter(drawerObj, myBars, hn, flatButton);
MikamiUitOpen 0:e953eb392151 81 SelectFile(menu, selector, myLabel, fileName);
MikamiUitOpen 0:e953eb392151 82 }
MikamiUitOpen 0:e953eb392151 83 else
MikamiUitOpen 0:e953eb392151 84 {
MikamiUitOpen 0:e953eb392151 85 menu.Activate(1); // PLAY 有効
MikamiUitOpen 0:e953eb392151 86 int touch10;
MikamiUitOpen 0:e953eb392151 87 while (!menu.GetTouchedNumber(touch10))
MikamiUitOpen 0:e953eb392151 88 ModifyFilter(drawerObj, myBars, hn, flatButton);
MikamiUitOpen 0:e953eb392151 89 if (touch10 == 0)
MikamiUitOpen 0:e953eb392151 90 SelectFile(menu, selector, myLabel, fileName);
MikamiUitOpen 0:e953eb392151 91 }
MikamiUitOpen 0:e953eb392151 92
MikamiUitOpen 0:e953eb392151 93 loopCount = SD_Open(sdReader, fileName, frameSize);
MikamiUitOpen 0:e953eb392151 94 while (!menu.Touched(1)) // PLAY がタッチされるまで待つ
MikamiUitOpen 0:e953eb392151 95 ModifyFilter(drawerObj, myBars, hn, flatButton);
MikamiUitOpen 0:e953eb392151 96 }
MikamiUitOpen 0:e953eb392151 97 else
MikamiUitOpen 0:e953eb392151 98 loopCount = SD_Open(sdReader, fileName, frameSize);
MikamiUitOpen 0:e953eb392151 99
MikamiUitOpen 0:e953eb392151 100 selector.Erase(BG_LEFT-4, 288);
MikamiUitOpen 0:e953eb392151 101 myLabel.Draw("9-band Graphic Equalizer");
MikamiUitOpen 0:e953eb392151 102 myBars.RedrawAll();
MikamiUitOpen 0:e953eb392151 103 drawerObj.DrawResponse();
MikamiUitOpen 0:e953eb392151 104 menu.Inactivate(0); // OPEN 無効
MikamiUitOpen 0:e953eb392151 105 menu.Activate(2); // PAUSE 有効
MikamiUitOpen 0:e953eb392151 106 menu.Activate(4); // STOP 有効
MikamiUitOpen 0:e953eb392151 107
MikamiUitOpen 0:e953eb392151 108 playOk = false;
MikamiUitOpen 0:e953eb392151 109 bool stopOk = false;
MikamiUitOpen 0:e953eb392151 110 mySai.InitCodecOut(); // SAI の初期化
MikamiUitOpen 0:e953eb392151 111
MikamiUitOpen 0:e953eb392151 112 // IIR フィルタの内部の遅延器のクリア
MikamiUitOpen 0:e953eb392151 113 for (int k=0; k<STAGES; k++) hn[k].Clear();
MikamiUitOpen 0:e953eb392151 114
MikamiUitOpen 0:e953eb392151 115 for (int k=0; k<loopCount; k++)
MikamiUitOpen 0:e953eb392151 116 {
MikamiUitOpen 0:e953eb392151 117 int touch42 = -1;
MikamiUitOpen 0:e953eb392151 118 menu.GetTouchedNumber(touch42);
MikamiUitOpen 0:e953eb392151 119 if (touch42 == 4) break; // STOP
MikamiUitOpen 0:e953eb392151 120 if (touch42 == 2) // PAUSE
MikamiUitOpen 0:e953eb392151 121 {
MikamiUitOpen 0:e953eb392151 122 menu.Inactivate(2); // PAUSE 無効
MikamiUitOpen 0:e953eb392151 123 menu.Activate(3); // RESUME 有効
MikamiUitOpen 0:e953eb392151 124 mySai.Pause();
MikamiUitOpen 0:e953eb392151 125
MikamiUitOpen 0:e953eb392151 126 // PLAY か RESUME か STOP がタッチされるまで待つ
MikamiUitOpen 0:e953eb392151 127 int touch134 = -1;
MikamiUitOpen 0:e953eb392151 128 while (!menu.GetTouchedNumber(touch134))
MikamiUitOpen 0:e953eb392151 129 ModifyFilter(drawerObj, myBars, hn, flatButton);
MikamiUitOpen 0:e953eb392151 130 switch (touch134)
MikamiUitOpen 0:e953eb392151 131 {
MikamiUitOpen 0:e953eb392151 132 case 1: playOk = true; // 最初から PLAY
MikamiUitOpen 0:e953eb392151 133 break;
MikamiUitOpen 0:e953eb392151 134 case 3: mySai.Resume(); // PAUSE したところから PLAY 再開
MikamiUitOpen 0:e953eb392151 135 menu.Activate(2);
MikamiUitOpen 0:e953eb392151 136 menu.Inactivate(3);
MikamiUitOpen 0:e953eb392151 137 menu.TouchedColor(1);
MikamiUitOpen 0:e953eb392151 138 break;
MikamiUitOpen 0:e953eb392151 139 case 4: stopOk = true; // STOP
MikamiUitOpen 0:e953eb392151 140 break;
MikamiUitOpen 0:e953eb392151 141 }
MikamiUitOpen 0:e953eb392151 142 }
MikamiUitOpen 0:e953eb392151 143 if (playOk || stopOk) break;
MikamiUitOpen 0:e953eb392151 144
MikamiUitOpen 0:e953eb392151 145 ModifyFilter(drawerObj, myBars, hn, flatButton);
MikamiUitOpen 0:e953eb392151 146 // 1フレーム分の信号処理 (イコライザ) の実行
MikamiUitOpen 0:e953eb392151 147 ProcessSignal(sdReader, mySai, sn, hn, STAGES);
MikamiUitOpen 0:e953eb392151 148 }
MikamiUitOpen 0:e953eb392151 149 mySai.Stop();
MikamiUitOpen 0:e953eb392151 150 menu.Activate(0); // OPEN 有効
MikamiUitOpen 0:e953eb392151 151 if (!playOk) menu.Activate(1); // PLAY 有効
MikamiUitOpen 0:e953eb392151 152 for (int n=2; n<5; n++) // その他は無効
MikamiUitOpen 0:e953eb392151 153 menu.Inactivate(n);
MikamiUitOpen 0:e953eb392151 154 sdReader.Close(); // SD のファイルのクローズ
MikamiUitOpen 0:e953eb392151 155 }
MikamiUitOpen 0:e953eb392151 156 }