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:
Sat May 07 07:33:52 2016 +0000
Revision:
5:a5a4f9d7b26c
Parent:
4:14f401cb069a
Child:
7:be29ba9c83b2
6. From this revision, using class library "F746_SAI_IO".

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