Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Revision 10:fc6367c2ffcf, committed 2016-06-22
- Comitter:
- edamame22
- Date:
- Wed Jun 22 03:50:38 2016 +0000
- Parent:
- 9:0d5bd1539291
- Child:
- 11:2286f2668e8c
- Commit message:
- auto play is enabled
Changed in this revision
--- a/BSP_DISCO_F746NG.lib Mon May 09 13:48:33 2016 +0000 +++ b/BSP_DISCO_F746NG.lib Wed Jun 22 03:50:38 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/ST/code/BSP_DISCO_F746NG/#458ab1edf6b2 +http://mbed.org/teams/ST/code/BSP_DISCO_F746NG/#286943c42d38
--- a/F746_GUI.lib Mon May 09 13:48:33 2016 +0000 +++ b/F746_GUI.lib Wed Jun 22 03:50:38 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/MikamiUitOpen/code/F746_GUI/#687ec6183385 +http://mbed.org/users/MikamiUitOpen/code/F746_GUI/#95544440b46c
--- a/MyClasses_Functions/FileSelectorWav.hpp Mon May 09 13:48:33 2016 +0000 +++ b/MyClasses_Functions/FileSelectorWav.hpp Wed Jun 22 03:50:38 2016 +0000 @@ -16,6 +16,7 @@ #include <algorithm> // sort() で使用 #include <string> + namespace Mikami { class FileSelector @@ -25,7 +26,7 @@ int maxNameLength, SD_WavReader &reader) : X_(x0), Y_(y0), W_H_(24), V_L_(36), MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), - BASE_COLOR_(0xFF80FFA0), TOUCHED_COLOR_(0xFF80FFFF), + BASE_COLOR_(0xFFDBAD17), TOUCHED_COLOR_(0xFFF8F8FB), fileNames_(new string[maxFiles]), sortedFileNames_(new string[maxFiles]), nonString_(NULL), rect_(NULL), fileNameLabels_(NULL), @@ -42,7 +43,15 @@ delete[] sortedFileNames_; delete[] fileNames_; } - +// ren: show a string + void ren_Msg(int pos, char msg[]) + { int lin, y_pos[7]= {0,70,130,160,190,220,250}; + if(pos<0) lin=0; + else if (pos>6) lin=6; + else lin=pos; + Label renLabel(240, y_pos[lin], msg, Label::CENTER,Font20); + } + bool CreateTable() { DIR* dp = opendir("/sd"); @@ -50,7 +59,8 @@ if (dp != NULL) { dirent* entry; - for (int n=0; n<256; n++) + // ren: change n<256 to n<2560 + for (int n=0; n<2560; n++) { entry = readdir(dp); if (entry == NULL) break; @@ -60,13 +70,24 @@ (strName.find(".WAV") != string::npos) ) { sdReader_.Open(strName); // ファイルオープン - +/**{ +char tmpmsg[500]; +sprintf(tmpmsg, "1..found a file: %s", strName.c_str()); +ren_Msg(1,tmpmsg); +sprintf(tmpmsg, "2..fileCount_: %d", fileCount_); +ren_Msg(2,tmpmsg); +}**/ // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外 if (sdReader_.IsWavFile()) { fileNames_[fileCount_] = strName; fileCount_++; } +/**{ +char tmpmsg[500]; +sprintf(tmpmsg, "fileCount_: %d", fileCount_); +ren_Msg(3, tmpmsg); +}**/ sdReader_.Close(); } @@ -87,16 +108,17 @@ if (rect_ != NULL) delete rect_; rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_, nonString_, 0, V_L_-W_H_, 1, - -1, Font12, 0, GuiBase::ENUM_BACK, + -1, true,Font12, 0, GuiBase::ENUM_BACK, BASE_COLOR_, TOUCHED_COLOR_); for (int n=0; n<fileCount_; n++) rect_->Erase(n); CreateLabels(); prevFileCount_ = fileCount_; + return true; } // ファイルを選択する - bool Select(string &fileName) + bool Select(string fileList[],int *idx) { int n; if (rect_->GetTouchedNumber(n)) @@ -105,7 +127,10 @@ if ((prev_ >= 0) && (prev_ != n)) fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_)); prev_ = n; - fileName = sortedFileNames_[n]; + *idx = n; + for (int n=0; n<fileCount_; n++) fileList[n] = sortedFileNames_[n]; +// fileName = sortedFileNames_[n]; +//printf("\nSelected file : %s", fileName); return true; } else
--- a/MyClasses_Functions/MyFunctions.cpp Mon May 09 13:48:33 2016 +0000 +++ b/MyClasses_Functions/MyFunctions.cpp Wed Jun 22 03:50:38 2016 +0000 @@ -43,15 +43,16 @@ // ファイルの選択 // selectedName: 選択されたファイル名 void SelectFile(ButtonGroup &menu, FileSelector &selector, - Label &msg, string &selectedName) + Label &msg, string fileList[], int *selected) { selector.DisplayFileList(); msg.Draw("Select file"); do { - if (selector.Select(selectedName)) + if (selector.Select(fileList, selected)) menu.Activate(1); // PLAY 有効 - wait_ms(200); + // ren: change wait timer 200 to 60 + wait_ms(60); } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す }
--- a/MyClasses_Functions/MyFunctions.hpp Mon May 09 13:48:33 2016 +0000 +++ b/MyClasses_Functions/MyFunctions.hpp Wed Jun 22 03:50:38 2016 +0000 @@ -28,7 +28,7 @@ // ファイルの選択 void SelectFile(ButtonGroup &menu, FileSelector &selector, - Label &msg, string &selectedName); + Label &msg, string fileList[], int *selected); // フィルタの変更 void ModifyFilter(DesignerDrawer &drawerObj,
--- a/MyClasses_Functions/SD_WavReader.cpp Mon May 09 13:48:33 2016 +0000 +++ b/MyClasses_Functions/SD_WavReader.cpp Wed Jun 22 03:50:38 2016 +0000 @@ -48,7 +48,10 @@ // "RIFF", "WAVE", "fmt " が存在することを確認 if (strRead != "RIFFWAVEfmt ") return false; - +/**{ + char dump[500]; strcpy(dump, strRead.c_str()); +ren_Msg1(4, dump); +}**/ // fmt chunck のサイズを取得 uint32_t fmtChunkSize; fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_); @@ -56,18 +59,35 @@ // PCM, Stereo, 44.1 kHz, 16 bit であることを確認 WaveFormatEx fmtData; fread(&fmtData, fmtChunkSize, 1, fp_); + if ((fmtData.wFormatTag != 1) || (fmtData.nChannels != 2) || (fmtData.nSamplesPerSec != 44100) || (fmtData.wBitsPerSample != 16) - ) return false; - + ) + return false; +/**{ + char dump[500]; +sprintf(dump, "wFormatTag: %d", fmtData.wFormatTag); +ren_Msg1(1, dump); +sprintf(dump, "nChannels: %d", fmtData.nChannels); +ren_Msg1(2, dump); +sprintf(dump, "nSamplesPerSec: %d", fmtData.nSamplesPerSec); +ren_Msg1(3, dump); +sprintf(dump, "wBitsPerSample: %d", fmtData.wBitsPerSample); +ren_Msg1(4, dump); +}**/ // data chunk を探す char dataId[5]; dataId[4] = 0; fread(dataId, 1, 4, fp_); +/**{ + char dump[500]; +sprintf(dump, "dataId: %s", dataId); +ren_Msg1(5, dump); wait(20.0f); +}**/ if ("data" != (string)dataId) - for (int n=0; n<100; n++) + for (int n=0; n<1000; n++) { char oneByte; fread(&oneByte, 1, 1, fp_); @@ -76,7 +96,7 @@ dataId[3] = oneByte; if ("data" == (string)dataId) break; - if (n == 99) return false; + if (n == 999) return false; } // データサイズ (byte) を取得
--- a/MyClasses_Functions/SD_WavReader.hpp Mon May 09 13:48:33 2016 +0000 +++ b/MyClasses_Functions/SD_WavReader.hpp Wed Jun 22 03:50:38 2016 +0000 @@ -39,7 +39,21 @@ // データサイズ(標本化点の数)の取得 int32_t GetSize(); - + + // ren: show a string +/* void ren_Msg1(int pos, char msg[]) + { int lin, str_ln, y_pos[7]= {0,70,130,160,190,220,250}; +// char msg[501]; +// strcpy(msg, str_msg.c_str()); +// str_ln=str_msg.size(); +// if(str_ln>500) str_ln=500; +// msg[str_ln]='\0'; + if(pos<0) lin=0; + else if (pos>6) lin=6; + else lin=pos; + Label renLabel(0, y_pos[lin], msg, Label::LEFT,Font20); + } +*/ private: const string STR_;
--- a/main.cpp Mon May 09 13:48:33 2016 +0000 +++ b/main.cpp Wed Jun 22 03:50:38 2016 +0000 @@ -12,6 +12,9 @@ #include "BlinkLabel.hpp" using namespace Mikami; +enum ts_State { + IDLE_NOPALY, SELECTED_PREPARE_PALY, PALYING, PAUSED, STOPPED, RESUMED +}; int main() { @@ -23,6 +26,8 @@ SD_WavReader sdReader(mySai.GetLength()); // SD カード読み込み用オブジェクト const int MAX_FILES = 7; + string PlayList[MAX_FILES]; + int list_id = 0; FileSelector selector(4, 26, MAX_FILES, 37, sdReader); if (!selector.CreateTable()) BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER); @@ -39,8 +44,8 @@ // OPEN のみアクティブ menu.Activate(0); for (int n=1; n<5; n++) menu.Inactivate(n); - - Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, "FLAT"); +// printf("Button flat with 0 expanded detection Area\n"); + Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, 0, "FLAT"); const string ON_OFF[2] = {"ON", "OFF"}; ButtonGroup onOff(BG_LEFT, 235, BG_WIDTH/2, BG_HEIGHT, @@ -49,12 +54,12 @@ // フィルタの設計と周波数特性描画用 const int STAGES = 9; // バンド数 DesignerDrawer drawerObj( - 28, // グラフの左端の位置 - 130, // グラフの下端の位置 - STAGES, // バンド数 - 62.5f, // 最低域バンドの中心周波数 - FS, // 標本化周波数 - 2.5f); // 1 dB 当たりのピクセル数 + 28, // グラフの左端の位置 + 130, // グラフの下端の位置 + STAGES, // バンド数 + 62.5f, // 最低域バンドの中心周波数 + FS, // 標本化周波数 + 2.5f); // 1 dB 当たりのピクセル数 // 周波数特性変更用スライダ SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, STAGES, @@ -69,94 +74,103 @@ int32_t frameSize = mySai.GetLength(); int16_t *sn = new int16_t[frameSize+1]; // フレームバッファ - bool playOk = false; bool on = true; - bool whileFirst = true; string fileName; int32_t loopCount; - - while (true) - { - if (!playOk) - { - if (whileFirst) - { - whileFirst = false; + ts_State ui_mode = IDLE_NOPALY; + int k; + while (true) { + switch(ui_mode) { + case IDLE_NOPALY: while (!menu.Touched(0)) // OPEN がタッチされるまで待つ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - SelectFile(menu, selector, myLabel1, fileName); + for(int m=0; m<MAX_FILES; m++) PlayList[m]=""; // clear playlist + SelectFile(menu, selector, myLabel1, PlayList, &list_id); // returned playlist and selected ID + ui_mode = SELECTED_PREPARE_PALY ; + case SELECTED_PREPARE_PALY: + printf(" current track is %s ******\n", PlayList[list_id].c_str()); + loopCount = SD_Open(sdReader, PlayList[list_id], frameSize); + // while (!menu.Touched(1)) // PLAY がタッチされるまで待つ + // ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + selector.Erase(0, 0, BG_LEFT-4, 288); + myLabel1.Draw("9-band Graphic Equalizer"); + myBars.RedrawAll(); + drawerObj.DrawResponse(); + menu.Inactivate(0); // OPEN 無効 + menu.Activate(2); // PAUSE 有効 + menu.Activate(4); // STOP 有効 + // IIR フィルタの内部の遅延器のクリア + for (int j=0; j<STAGES; j++) hn[j].Clear(); + mySai.PlayOut(); // Play 開始 + ui_mode = PALYING ; + k=0; + case PALYING: + for (; k<loopCount && ui_mode==PALYING; k++) { + int touch42 = -1; + menu.GetTouchedNumber(touch42); + if (touch42 == 4) ui_mode = STOPPED; // STOP + else if (touch42 == 2) ui_mode = PAUSED; // PAUSE + ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + // 1フレーム分の信号処理 (イコライザ) の実行 + SignalProcessing(sdReader, mySai, sn, hn, STAGES, on); + } + if(ui_mode == PAUSED) break; // Paused + mySai.StopOut(); // current track play ended + sdReader.Close(); // SD のファイルのクローズ + if(ui_mode == STOPPED) break; // Stopped + + if (list_id < MAX_FILES-1) { // goto next track + if (PlayList[list_id+1].empty()) list_id=0; + else list_id++; + } else list_id=0; + ui_mode = SELECTED_PREPARE_PALY; + break; + case PAUSED: { + 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); + if(touch134 == 3) { + ui_mode = RESUMED; + break; // PAUSE したところから PLAY 再開 + } + mySai.ResumeOut(); // PAUSE したところから PLAY 再開 またはSTOPの後処理 + mySai.StopOut(); + sdReader.Close(); // SD のファイルのクローズ + + if(touch134 == 4) { + ui_mode = STOPPED; break; // STOP + } + if(touch134 == 1) { + ui_mode = SELECTED_PREPARE_PALY; // 最初から PLAY + menu.Inactivate(3); // RESUME disable to start play + break; + } + printf("a very bad wrong point\n"); + break; } - else - { - menu.Activate(1); // PLAY 有効 + case STOPPED: + menu.Activate(0); // OPEN 有効 + menu.Activate(1); // PLAY 有効 + for (int n=2; n<5; n++) // その他は無効 + menu.Inactivate(n); 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); + SelectFile(menu, selector, myLabel1, PlayList, &list_id); + ui_mode = SELECTED_PREPARE_PALY; + break; + case RESUMED: + mySai.ResumeOut(); // PAUSE したところから PLAY 再開 + menu.Activate(2); + menu.Inactivate(3); + menu.TouchedColor(1); + ui_mode = PALYING; + break; } - else - loopCount = SD_Open(sdReader, fileName, frameSize); - - selector.Erase(0, 0, BG_LEFT-4, 288); - myLabel1.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; - - // IIR フィルタの内部の遅延器のクリア - for (int k=0; k<STAGES; 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, sn, hn, STAGES, 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 のファイルのクローズ } }