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
Diff: main.cpp
- Revision:
- 13:728576fffe65
- Parent:
- 11:f4929315bc9f
- Child:
- 14:ed252615db80
--- a/main.cpp Sun Jul 03 05:30:26 2016 +0000 +++ b/main.cpp Sat Jul 23 09:32:33 2016 +0000 @@ -1,161 +1,31 @@ -//-------------------------------------------------------------- +//---------------------------------------------------------------- // グラフィックイコライザ付き SD オーディオプレーヤー // SD のファイル: *.wav // PCM,16 ビットステレオ,標本化周波数 44.1 kHz // 上記以外の形式は扱わない // 出力:モノラル(L+R,左チャンネルのみ,右チャンネルには出力しない) // -// 2016/07/03, Copyright (c) 2016 MIKAMI, Naoki -//-------------------------------------------------------------- +// 2016/07/23, Copyright (c) 2016 MIKAMI, Naoki +//---------------------------------------------------------------- -#include "MyFunctions.hpp" -#include "BlinkLabel.hpp" +#include "GraphicEqualizer.hpp" using namespace Mikami; int main() { - 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, 22, MAX_FILES, 37, sdReader); - if (!selector.CreateTable()) - BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER); - - // ボタン用の定数 - 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); - menu.InactivateAll(); - - menu.Activate(0); - Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, "FLAT"); - - const string ON_OFF[2] = {"ON", "OFF"}; - ButtonGroup onOff(BG_LEFT, 235, BG_WIDTH/2, BG_HEIGHT, - 2, ON_OFF, 0, 0, 2, 0); + const int FS = AUDIO_FREQUENCY_44K; // 標本化周波数 // フィルタの設計と周波数特性描画用 - const int BANDS = 9; // バンド数 DesignerDrawer drawerObj( - 28, // グラフの左端の位置 - 130, // グラフの下端の位置 - BANDS, // バンド数 - 62.5f, // 最低域バンドの中心周波数 - FS, // 標本化周波数 - 2.5f); // 1 dB 当たりのピクセル数 - - // 周波数特性変更用スライダ - SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, BANDS, - drawerObj.GetSpaceX(), -8.0f, 8.0f, 0, - SeekBar::Vertical); - - // フィルタの準備 - BiquadGrEq::Coefs ck[BANDS]; - drawerObj.GetCoefficients(ck); - BiquadGrEq hn[BANDS]; - for (int k=0; k<BANDS; k++) hn[k] = BiquadGrEq(ck[k]); - - int32_t frameSize = mySai.GetLength(); - bool playOk = false; - bool on = true; - 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, flat, onOff, on); - SelectFile(menu, selector, myLabel1, fileName); - } - else - { - menu.Activate(1); // PLAY 有効 - int touch10; - while (!menu.GetTouchedNumber(touch10)) - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - if (touch10 == 0) - SelectFile(menu, selector, myLabel1, fileName); - } - - loopCount = SD_Open(sdReader, fileName, frameSize); - while (!menu.Touched(1)) // PLAY がタッチされるまで待つ - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - } - else - loopCount = SD_Open(sdReader, fileName, frameSize); + 28, // グラフの左端の位置 + 130, // グラフの下端の位置 + 9, // バンド数 + 62.5f, // 最低域バンドの中心周波数 + FS, // 標本化周波数 + 2.5f); // 1 dB 当たりのピクセル数 - selector.Erase(0, 0, BG_LEFT-4, 288); - myLabel1.Draw(); - myBars.RedrawAll(); - drawerObj.DrawResponse(); - menu.Inactivate(0); // OPEN 無効 - menu.Activate(2); // PAUSE 有効 - menu.Activate(4); // STOP 有効 - - playOk = false; - bool stopOk = false; - - // IIR フィルタの内部の遅延器のクリア - for (int k=0; k<BANDS; k++) hn[k].Clear(); - mySai.PlayOut(); // Play 開始 - - 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.PauseOut(); - - // PLAY か RESUME か STOP がタッチされるまで待つ - int touch134 = -1; - while (!menu.GetTouchedNumber(touch134)) - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - switch (touch134) - { - case 1: playOk = true; // 最初から PLAY - break; - case 3: mySai.ResumeOut(); // 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, flat, onOff, on); - // 1フレーム分の信号処理 (イコライザ) の実行 - SignalProcessing(sdReader, mySai, hn, BANDS, on); - } - mySai.StopOut(); - menu.Activate(0); // OPEN 有効 - if (!playOk) menu.Activate(1); // PLAY 有効 - for (int n=2; n<5; n++) // その他は無効 - menu.Inactivate(n); - sdReader.Close(); // SD のファイルのクローズ - } + GraphicEqualizer myPlayer("9-band Graphic Equalizer", + FS, drawerObj); + myPlayer.Execute(); }