Output the audio signal with filtering by graphic equalizer in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号をグラフィック・イコライザを通して,ボードに搭載されているCODEC で出力する.

Dependencies:   F746_GUI F746_SAI_IO SD_PlayerSkeleton FrequencyResponseDrawer

Revision:
11:f4929315bc9f
Parent:
10:160fcbe4dee8
Child:
13:728576fffe65
--- a/main.cpp	Wed Jun 15 13:08:45 2016 +0000
+++ b/main.cpp	Sun Jul 03 05:29:38 2016 +0000
@@ -3,9 +3,9 @@
 //      SD のファイル: *.wav
 //                   PCM,16 ビットステレオ,標本化周波数 44.1 kHz
 //                   上記以外の形式は扱わない
-//      出力:モノラル
+//      出力:モノラル(L+R,左チャンネルのみ,右チャンネルには出力しない)
 //
-//  2016/06/15, Copyright (c) 2016 MIKAMI, Naoki
+//  2016/07/03, Copyright (c) 2016 MIKAMI, Naoki
 //--------------------------------------------------------------
 
 #include "MyFunctions.hpp"
@@ -15,15 +15,16 @@
 
 int main()
 {
-    Label myLabel1(212, 2, "SD Card Audio Player", Label::CENTER, Font16);
-    Label myLabel2(212, 16, "---- Graphic equalizer ----", Label::CENTER, Font12);
+    const uint16_t X_CENTER = 214;
+    Label myLabel1(X_CENTER,  4, "9-band Graphic Equalizer", Label::CENTER, Font16);
+    Label myLabel2(X_CENTER, 20, "---- Source: microSD card ----", Label::CENTER);
 
     const int FS = AUDIO_FREQUENCY_44K;         // 標本化周波数: 44.1 kHz
     SaiIO mySai(SaiIO::OUTPUT, 2048, FS);
 
     SD_WavReader sdReader(mySai.GetLength());   // SD カード読み込み用オブジェクト
     const int MAX_FILES = 7;
-    FileSelector selector(4, 26, MAX_FILES, 37, sdReader);
+    FileSelector selector(4, 22, MAX_FILES, 37, sdReader);
     if (!selector.CreateTable())
         BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);
 
@@ -31,15 +32,14 @@
     const uint16_t BG_LEFT = 414;
     const uint16_t BG_WIDTH = 66;
     const uint16_t BG_HEIGHT = 36;
-
+    
     // 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.InactivateAll();
+
     menu.Activate(0);
-    for (int n=1; n<5; n++) menu.Inactivate(n);
-
     Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, "FLAT");
 
     const string ON_OFF[2] = {"ON", "OFF"};
@@ -47,28 +47,27 @@
                       2, ON_OFF, 0, 0, 2, 0);
 
     // フィルタの設計と周波数特性描画用
-    const int STAGES = 9;       // バンド数
+    const int BANDS = 9;        // バンド数
     DesignerDrawer drawerObj(
                      28,        // グラフの左端の位置
                      130,       // グラフの下端の位置
-                     STAGES,    // バンド数
+                     BANDS,     // バンド数
                      62.5f,     // 最低域バンドの中心周波数
                      FS,        // 標本化周波数
                      2.5f);     // 1 dB 当たりのピクセル数
 
     // 周波数特性変更用スライダ
-    SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, STAGES,
+    SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, BANDS,
                         drawerObj.GetSpaceX(), -8.0f, 8.0f, 0,
                         SeekBar::Vertical);
 
     // フィルタの準備
-    BiquadGrEq::Coefs ck[STAGES];
+    BiquadGrEq::Coefs ck[BANDS];
     drawerObj.GetCoefficients(ck);
-    BiquadGrEq hn[STAGES];
-    for (int k=0; k<STAGES; k++) hn[k] = BiquadGrEq(ck[k]);
+    BiquadGrEq hn[BANDS];
+    for (int k=0; k<BANDS; k++) hn[k] = BiquadGrEq(ck[k]);
 
     int32_t frameSize = mySai.GetLength();
-    int16_t *sn = new int16_t[frameSize+1]; // フレームバッファ
     bool playOk = false;
     bool on = true;
     bool whileFirst = true;
@@ -104,7 +103,7 @@
             loopCount = SD_Open(sdReader, fileName, frameSize);
 
         selector.Erase(0, 0, BG_LEFT-4, 288);
-        myLabel1.Draw("9-band Graphic Equalizer");
+        myLabel1.Draw();
         myBars.RedrawAll();
         drawerObj.DrawResponse();
         menu.Inactivate(0); // OPEN 無効
@@ -115,7 +114,7 @@
         bool stopOk = false;
 
         // IIR フィルタの内部の遅延器のクリア
-        for (int k=0; k<STAGES; k++) hn[k].Clear();
+        for (int k=0; k<BANDS; k++) hn[k].Clear();
         mySai.PlayOut();    // Play 開始
 
         for (int k=0; k<loopCount; k++)
@@ -150,7 +149,7 @@
 
             ModifyFilter(drawerObj, myBars, hn, flat, onOff, on);
             // 1フレーム分の信号処理 (イコライザ) の実行
-            SignalProcessing(sdReader, mySai, sn, hn, STAGES, on);
+            SignalProcessing(sdReader, mySai, hn, BANDS, on);
         }
         mySai.StopOut();
         menu.Activate(0);               // OPEN 有効