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
Revision 7:be29ba9c83b2, committed 2016-05-09
- Comitter:
- MikamiUitOpen
- Date:
- Mon May 09 08:53:23 2016 +0000
- Parent:
- 6:599229a1b06a
- Child:
- 8:12aa05f3cc24
- Commit message:
- 8
Changed in this revision
--- a/F746_SAI_IO.lib Sat May 07 08:15:00 2016 +0000 +++ b/F746_SAI_IO.lib Mon May 09 08:53:23 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/MikamiUitOpen/code/F746_SAI_IO/#eade5d3ae0eb +http://mbed.org/users/MikamiUitOpen/code/F746_SAI_IO/#48ed86c8430a
--- a/MyClasses_Functions/BiquadGrEq.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-//--------------------------------------------------------------
-// グラフィックイコライザで使う 1D タイプの 2 次のフィルタ
-// Biquad filter of 1D type for graphic equalizer
-// このクラスでは,係数は実行中に書き換えられることを想定している
-//
-// u[n] = x[n] + a1*u[n-1] + a2*u[n-2]
-// y[n] = b0*u[n] + b1*u[n-1] + b2*u[n-2]
-// x[n] : input signal
-// y[n] : output signal
-//
-// 2016/03/25, Copyright (c) 2016 MIKAMI, Naoki
-//--------------------------------------------------------------
-
-#ifndef IIR_BIQUAD_HPP
-#define IIR_BIQUAD_HPP
-
-#include "mbed.h"
-
-// 2nd order IIR filter
-namespace Mikami
-{
- class BiquadGrEq
- {
- public:
- struct Coefs { float a1, a2, b0, b1, b2; };
-
- BiquadGrEq() {} // Default constructore
-
- BiquadGrEq(const Coefs ck)
- {
- SetCoefficients(ck);
- Clear();
- }
-
- void SetCoefficients(const Coefs ck)
- {
- a1_ = ck.a1;
- a2_ = ck.a2;
- b0_ = ck.b0;
- b1_ = ck.b1;
- b2_ = ck.b2;
- }
-
- float Execute(float xn)
- {
- float un = xn + a1_*un1_ + a2_*un2_;
- float yn = b0_*un + b1_*un1_ + b2_*un2_;
-
- un2_ = un1_;
- un1_ = un;
-
- return yn;
- }
-
- void Clear() { un1_ = un2_ = 0; }
-
- private:
- float a1_, a2_, b0_, b1_, b2_;
- float un1_, un2_;
-
- // disallow copy constructor
- BiquadGrEq(const BiquadGrEq&);
- };
-}
-#endif // IIR_BIQUAD_HPP
-
--- a/MyClasses_Functions/DesignerDrawer.cpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// イコライザ用フィルタのパラメータを設定し,その周波数特性を描画するためのクラス
-//
-// 2016/05/07, Copyright (c) 2016 MIKAMI, Naoki
-//------------------------------------------------------------------------------
-
-#include "DesignerDrawer.hpp"
-
-namespace Mikami
-{
- // Constructor
- DesignerDrawer::DesignerDrawer(uint16_t x0, uint16_t y0,
- int stages, float f0, int fs, float db1)
- : lcd_(GuiBase::GetLcdPtr()), ts_(GuiBase::GetTsPtr()),
- X0_(x0), Y0_(y0), STAGES_(stages), Q_VAL_(1.0f)
- {
- drawerObj_ = new FrqRespDrawer(x0, 50.0f, 20000.0f, 142,
- y0, -18, 18, db1, 6, fs);
-
- calculator_ = new GrEqParamsCalculator(fs);
- f0_ = new float[STAGES_];
- for (int n=0; n<STAGES_; n++)
- f0_[n] = f0*powf(2, n);
-
- ck_ = new BiquadGrEq::Coefs[STAGES_];
- for (int n=0; n<STAGES_; n++)
- ck_[n] = calculator_->Execute(f0_[n], 0, Q_VAL_);
- frqResp_ = new GrEqualizerFrqResp(STAGES_);
- frqResp_->SetParams(ck_);
-
- // 周波数特性の描画
- DrawResponse();
- }
-
- DesignerDrawer::~DesignerDrawer()
- {
- delete[] frqResp_;
- delete[] ck_;
- delete[] f0_;
- delete calculator_;
- delete drawerObj_;
- }
-
- // 周波数特性の描画
- void DesignerDrawer::DrawResponse()
- {
- drawerObj_->DrawAxis(); // 目盛線の描画
- FrqRespDrawer::AxisX_Char numX[] = // 横軸の目盛値を描画する際に使う構造体の配列
- {{ 50, "50"}, { 100, "100"}, { 200, "200"}, { 500, "500"}, { 1000, "1k"},
- { 2000, "2k"}, { 5000, "5k"}, {10000, "10k"}, {20000, "20k"}};
- drawerObj_->DrawNumericX(numX, 9, 6, "Frequency [Hz]"); // 横軸の目盛
- drawerObj_->DrawNumericY(-24, -6, 6, "%3d"); // 縦軸の目盛値は 6 dB 間隔
- drawerObj_->DrawGraph(frqResp_); // 周波数特性のカーブの描画
- }
-
- // 特定のバンドのイコライザ用フィルタのパラメータの設定と周波数特性の再描画
- void DesignerDrawer::DesignAndRedraw(float gainDb, int n)
- {
- ck_[n] = calculator_->Execute(f0_[n], gainDb, Q_VAL_);
- frqResp_->SetParam(ck_[n], n);
- drawerObj_->Erase();
- drawerObj_->DrawAxis(); // 目盛線の描画
- drawerObj_->DrawGraph(frqResp_); // 周波数特性のグラフのカーブを描画する
- }
-}
--- a/MyClasses_Functions/DesignerDrawer.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// イコライザ用フィルタのパラメータを設定し,その周波数特性を描画するためのクラス -- Header
-//
-// 2016/05/01, Copyright (c) 2016 MIKAMI, Naoki
-//------------------------------------------------------------------------------
-
-#ifndef F746_DISIGNER_AND_DRAWER_HPP
-#define F746_DISIGNER_AND_DRAWER_HPP
-
-#include "NumericLabel.hpp"
-#include "FrquencyResponseDrawer.hpp"
-#include "GrEqParamsCalculator.hpp"
-#include "GrEqualizerFrqResp.hpp"
-
-namespace Mikami
-{
- class DesignerDrawer
- {
- public:
- // Constructor
- DesignerDrawer(uint16_t x0, uint16_t y0,
- int stages, float f0, int fs, float db1);
-
- ~DesignerDrawer();
-
- // 周波数特性の描画
- void DrawResponse();
-
- // 特定のバンドのイコライザ用フィルタのパラメータの設定と周波数特性の再描画
- void DesignAndRedraw(float gainDb, int n);
-
- void GetCoefficients(BiquadGrEq::Coefs ck[])
- { for (int n=0; n<STAGES_; n++) ck[n] = ck_[n]; }
-
- BiquadGrEq::Coefs GetCoefficient(int n) { return ck_[n]; }
-
- uint16_t GetX0()
- { return drawerObj_->X(f0_[0]); }
-
- uint16_t GetSpaceX()
- { return (uint16_t)(drawerObj_->X(f0_[1])
- - drawerObj_->X(f0_[0])); }
-
- int GetStages() { return STAGES_; }
-
- private:
- LCD_DISCO_F746NG *lcd_;
- TS_DISCO_F746NG *ts_;
-
- const uint16_t X0_, Y0_;
- const int STAGES_;
- const float Q_VAL_;
-
- float *f0_; // 中心周波数を格納する配列のポインタ
- GrEqParamsCalculator *calculator_;
- GrEqualizerFrqResp *frqResp_; // フィルタの周波数応答に対応するオブジェクト
- BiquadGrEq::Coefs *ck_; // フィルタの係数
- FrqRespDrawer *drawerObj_;
- };
-}
-#endif // F746_DISIGNER_AND_DRAWER_HPP
--- a/MyClasses_Functions/FileSelectorWav.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-//--------------------------------------------------------------
-// FileSelector class
-// SD カード内のファイル名の一覧を表示し,ファイルを選択する
-//
-// 2016/04/18, Copyright (c) 2016 MIKAMI, Naoki
-//--------------------------------------------------------------
-
-#ifndef FILE_SELECTOR_HPP
-#define FILE_SELECTOR_HPP
-
-#include "mbed.h"
-#include "Label.hpp"
-#include "ButtonGroup.hpp"
-#include "SD_WavReader.hpp"
-#include "SDFileSystem.h"
-#include <algorithm> // sort() で使用
-#include <string>
-
-namespace Mikami
-{
- class FileSelector
- {
- public:
- FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
- 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),
- fileNames_(new string[maxFiles]),
- sortedFileNames_(new string[maxFiles]),
- nonString_(NULL), rect_(NULL), fileNameLabels_(NULL),
- lcd_(GuiBase::GetLcdPtr()),
- sdReader_(reader), prevFileCount_(0), prev_(-1) {}
-
- ~FileSelector()
- {
- for (int n=0; n<fileCount_; n++)
- delete fileNameLabels_[n];
- delete[] fileNameLabels_;
- delete rect_;
- delete[] nonString_;
- delete[] sortedFileNames_;
- delete[] fileNames_;
- }
-
- bool CreateTable()
- {
- DIR* dp = opendir("/sd");
- fileCount_ = 0;
- if (dp != NULL)
- {
- dirent* entry;
- for (int n=0; n<256; n++)
- {
- entry = readdir(dp);
- if (entry == NULL) break;
-
- string strName = entry->d_name;
- if ( (strName.find(".wav") != string::npos) ||
- (strName.find(".WAV") != string::npos) )
- {
- sdReader_.Open(strName); // ファイルオープン
-
- // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
- if (sdReader_.IsWavFile())
- {
- fileNames_[fileCount_] = strName;
- fileCount_++;
- }
- sdReader_.Close();
- }
-
-
- if (fileCount_ >= MAX_FILES_) break;
- }
- closedir(dp);
- }
- else
- return false;
-
- if (fileCount_ == 0) return false;
-
- if (nonString_ == NULL) delete[] nonString_;
- nonString_ = new string[fileCount_];
- for (int n=0; n<fileCount_; n++) nonString_[n] = "";
-
- 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,
- BASE_COLOR_, TOUCHED_COLOR_);
- for (int n=0; n<fileCount_; n++) rect_->Erase(n);
- CreateLabels();
- prevFileCount_ = fileCount_;
- return true;
- }
-
- // ファイルを選択する
- bool Select(string &fileName)
- {
- int n;
- if (rect_->GetTouchedNumber(n))
- {
- fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_);
- if ((prev_ >= 0) && (prev_ != n))
- fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_));
- prev_ = n;
- fileName = sortedFileNames_[n];
- return true;
- }
- else
- return false;
- }
-
- // ファイルの一覧の表示
- void DisplayFileList(bool sort = true)
- {
- for (int n=0; n<fileCount_; n++)
- sortedFileNames_[n] = fileNames_[n];
- if (sort)
- std::sort(sortedFileNames_, sortedFileNames_+fileCount_);
-
- Erase(X_, 0, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 288);
- rect_->DrawAll();
- for (int n=0; n<fileCount_; n++)
- fileNameLabels_[n]->Draw(GetFileNameNoExt(n));
- }
-
- void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
- uint32_t color = GuiBase::ENUM_BACK)
- {
- lcd_->SetTextColor(color);
- lcd_->FillRect(x, y, width, height);
- }
-
- private:
- const uint8_t X_, Y_, W_H_, V_L_;
- const int MAX_FILES_;
- const int MAX_NAME_LENGTH_;
- const uint32_t BASE_COLOR_;
- const uint32_t TOUCHED_COLOR_;
-
- string *fileNames_;
- string *sortedFileNames_;
- string *nonString_;
- ButtonGroup *rect_;
- Label **fileNameLabels_;
- LCD_DISCO_F746NG *lcd_;
- SD_WavReader &sdReader_;
- int fileCount_, prevFileCount_;
- int prev_;
-
- // Label を生成
- void CreateLabels()
- {
- if (fileNameLabels_ != NULL)
- {
- for (int n=0; n<prevFileCount_; n++)
- delete fileNameLabels_[n];
- delete[] fileNameLabels_;
- }
- fileNameLabels_ = new Label *[fileCount_+1];
- for (int n=0; n<fileCount_; n++)
- fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
- Label::LEFT, Font16,
- BASE_COLOR_);
- }
-
- // 拡張子を削除した文字列を取得
- string GetFileNameNoExt(int n)
- {
- string name = sortedFileNames_[n];
- name.erase(name.find("."));
- return name.substr(0, MAX_NAME_LENGTH_);
- }
-
- // disallow copy constructor and assignment operator
- FileSelector(const FileSelector&);
- FileSelector& operator=(const FileSelector&);
- };
-}
-#endif // FILE_SELECTOR_HPP
--- a/MyClasses_Functions/GrEqParamsCalculator.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Parameters calculator class of buquad unit for graphic equalizer
-// グラフィックイコライザで使う biquad フィルタの係数を計算するクラス
-//
-// 2016/04/27, Copyright (c) 2016 MIKAMI, Naoki
-//------------------------------------------------------------------------------
-
-#ifndef GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP
-#define GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP
-
-#include "mbed.h"
-#include "BiquadGrEq.hpp"
-
-namespace Mikami
-{
- class GrEqParamsCalculator
- {
- public:
- // Constructor
- GrEqParamsCalculator(float fs) : FS_(fs) {}
-
- // 係数を計算する
- BiquadGrEq::Coefs Execute(float f0, float gDb, float qVal)
- {
- const float PI = 3.1415926536f;
- BiquadGrEq::Coefs coefs;
-
- float g_sqrt = sqrtf(powf(10, gDb/20.0f));
- float w0 = 2.0f*PI*f0/FS_;
- float alpha = sinf(w0)/(2.0f*qVal);
- float a0 = 1.0f + alpha/g_sqrt;
- coefs.a1 = 2.0f*cosf(w0)/a0;
- coefs.a2 = -(1.0f - alpha/g_sqrt)/a0;
- coefs.b0 = (1.0f + alpha*g_sqrt)/a0;
- coefs.b1 = -coefs.a1;
- coefs.b2 = (1.0f - alpha*g_sqrt)/a0;
- return coefs;
- }
-
- private:
- const float FS_;
- };
-}
-#endif // GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP
--- a/MyClasses_Functions/GrEqualizerFrqResp.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-//-----------------------------------------------------------
-// グラフィックイコライザで使う IIR フィルタの周波数応答
-// Frequency response for graphic equalizer
-//
-// 2016/04/27, Copyright (c) 2016 MIKAMI, Naoki
-//-----------------------------------------------------------
-
-#ifndef GRAPHIC_EQUALIZER_FREQUENCY_RESPONSE_HPP
-#define GRAPHIC_EQUALIZER_FREQUENCY_RESPONSE_HPP
-
-#include "FrequancyResponseBase.hpp"
-#include "BiquadGrEq.hpp"
-
-namespace Mikami
-{
- class GrEqualizerFrqResp : public FrequencyResponse
- {
- public:
- GrEqualizerFrqResp(int stages) : STAGES_(stages)
- { ck_ = new BiquadGrEq::Coefs[stages]; }
-
- ~GrEqualizerFrqResp()
- { delete[] ck_; }
-
- // フィルタの係数設定
- void SetParams(BiquadGrEq::Coefs ck[])
- { for (int n=0; n<STAGES_; n++) ck_[n] = ck[n]; }
-
- void SetParam(BiquadGrEq::Coefs ck, int n)
- { ck_[n] = ck; }
-
- // 周波数応答の絶対値を返す関数, 引数: z^(-1)
- virtual float AbsH_z(Complex u)
- {
- Complex h = 1;
- for (int k=0; k<STAGES_; k++)
- h = h*(ck_[k].b0 + (ck_[k].b1 + ck_[k].b2*u)*u)
- /((1.0f - (ck_[k].a1 + ck_[k].a2*u)*u));
- return abs(h);
- }
-
- private:
- const int STAGES_;
- float g0_;
- BiquadGrEq::Coefs *ck_;
-
- // disallow copy constructor and assignment operator
- GrEqualizerFrqResp(const GrEqualizerFrqResp&);
- GrEqualizerFrqResp& operator=(const GrEqualizerFrqResp&);
- };
-}
-#endif // GRAPHIC_EQUALIZER_FREQUENCY_RESPONSE_HPP
--- a/MyClasses_Functions/MyFunctions.cpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-//--------------------------------------------------------------
-// グラフィックイコライザ付き SD オーディオプレーヤーで使う大域関数
-//
-// 2016/05/07, Copyright (c) 2016 MIKAMI, Naoki
-//--------------------------------------------------------------
-
-#include "MyFunctions.hpp"
-
-// 1フレーム分の信号処理 (イコライザ) の実行
-void ProcessSignal(SD_WavReader &sdReader, SaiIO &mySai,
- int16_t sn[], BiquadGrEq hn[],
- int stages, bool on)
-{
- // 1フレーム分のデータを SD から読み込む
- sdReader.ReadAndToMono(sn, mySai.GetLength());
-
- while (!mySai.IsXferred()) {} // データの転送が終わるまで待つ
- //--------------------------------------------------------------
- // 1フレーム分のイコライザ処理を行い,その結果を出力する
- for (int n=0; n<mySai.GetLength(); n++)
- {
- // 縦続形の IIR フィルタ実行
- float xn = 0.125f*sn[n]; // 0.125 の乗算はブースとしてもクリップ
- // されないようにするため
- float yn = xn;
- for (int k=0; k<stages; k++) yn = hn[k].Execute(yn);
- int16_t value = on ? (int16_t)yn : xn;
- mySai.Output(value, value); // 音響信号の出力
- }
- //--------------------------------------------------------------
- mySai.ResetXferred(); // 次のデータ転送に備える
-}
-
-// SD カードのファイルのオープン
-int32_t SD_Open(SD_WavReader &sdReader,
- string fileName, int32_t frameSize)
-{
- sdReader.Open(fileName);
- sdReader.IsWavFile();
- return sdReader.GetSize()/frameSize;
-}
-
-// ファイルの選択
-// selectedName: 選択されたファイル名
-void SelectFile(ButtonGroup &menu, FileSelector &selector,
- Label &msg, string &selectedName)
-{
- selector.DisplayFileList();
- msg.Draw("Select file");
- do
- {
- if (selector.Select(selectedName))
- menu.Activate(1); // PLAY 有効
- wait_ms(200);
- } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す
-}
-
-// フィルタの周波数特性の変更
-void ModifyFilter(DesignerDrawer &drawerObj,
- SeekbarGroup &myBars, BiquadGrEq hn[],
- ButtonGroup &onOff, bool &on)
-{
- int sw = 0;
- if (onOff.GetTouchedNumber(sw))
- on = (sw == 0) ? true : false;
-
- static int num = 0;
- if (!myBars.GetSlidedNumber(num)) return;
- drawerObj.DesignAndRedraw(myBars.GetValue(num), num);
- hn[num] = BiquadGrEq(drawerObj.GetCoefficient(num));
-}
--- a/MyClasses_Functions/MyFunctions.hpp Sat May 07 08:15:00 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -//-------------------------------------------------------------- -// グラフィックイコライザ付き SD オーディオプレーヤーで使う大域関数(ヘッダ) -// -// 2016/05/07, Copyright (c) 2016 MIKAMI, Naoki -//-------------------------------------------------------------- - -#ifndef F746_MY_FUNCTIONS_HPP -#define F746_MY_FUNCTIONS_HPP - -#include "SAI_InOut.hpp" -#include "ButtonGroup.hpp" -#include "FileSelectorWav.hpp" -#include "DesignerDrawer.hpp" -#include "SD_WavReader.hpp" -#include "SeekbarGroup.hpp" -#include "BiquadGrEq.hpp" - -using namespace Mikami; - -// 1フレーム分の信号処理 (イコライザ) の実行 -void ProcessSignal(SD_WavReader &sdReader, SaiIO &mySai, - int16_t sn[], BiquadGrEq hn[], - int stages, bool on); - -// SD カードのファイルのオープン -int32_t SD_Open(SD_WavReader &sdReader, - string fileName, int32_t frameSize); - -// ファイルの選択 -void SelectFile(ButtonGroup &menu, FileSelector &selector, - Label &msg, string &selectedName); - -// フィルタの変更 -void ModifyFilter(DesignerDrawer &drawerObj, - SeekbarGroup &myBars, BiquadGrEq hn[], - ButtonGroup &onOff, bool &on); - -#endif // F746_MY_FUNCTIONS_HPP
--- a/MyClasses_Functions/SD_WavReader.cpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-//--------------------------------------------------------------
-// SD_WavReader class
-// SD カードの *.wav ファイルの内容を読み出す
-// 以下のフォーマット以外は扱わない
-// PCM,16 ビットステレオ,標本化周波数 44.1 kHz
-//
-// 2016/04/19, Copyright (c) 2016 MIKAMI, Naoki
-//--------------------------------------------------------------
-
-#include "SD_WavReader.hpp"
-
-namespace Mikami
-{
- SD_WavReader::SD_WavReader(int32_t bufferSize)
- : STR_("sd"), ok_(false)
- {
- sd_ = new SDFileSystem(STR_.c_str());
- sd_->mount();
-
- buffer = new int16_t[bufferSize*2];
- }
-
- SD_WavReader::~SD_WavReader()
- {
- delete[] buffer;
- sd_->unmount();
- delete sd_;
- }
-
- void SD_WavReader::Open(const string fileName)
- {
- string name = (string)"/" + STR_ + "/" + fileName;
- fp_ = fopen(name.c_str(), "rb");
- if (fp_ == NULL) ErrorMsg("open error!!");
- }
-
-
- // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み
- // 戻り値: *.wav で,16 ビットステレオ,
- // 標本化周波数:44.1 kHz の場合 true
- bool SD_WavReader::IsWavFile()
- {
- char data[17];
- fread(data, 1, 16, fp_);
- string strRead = "";
- for (int n=0; n<4; n++) strRead += data[n];
- for (int n=8; n<16; n++) strRead += data[n];
-
- // "RIFF", "WAVE", "fmt " が存在することを確認
- if (strRead != "RIFFWAVEfmt ") return false;
-
- // fmt chunck のサイズを取得
- uint32_t fmtChunkSize;
- fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_);
-
- // 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;
-
- // data chunk を探す
- char dataId[5];
- dataId[4] = 0;
- fread(dataId, 1, 4, fp_);
- if ("data" != (string)dataId)
- for (int n=0; n<100; n++)
- {
- char oneByte;
- fread(&oneByte, 1, 1, fp_);
- for (int k=0; k<3; k++)
- dataId[k] = dataId[k+1];
- dataId[3] = oneByte;
- if ("data" == (string)dataId) break;
-
- if (n == 99) return false;
- }
-
- // データサイズ (byte) を取得
- int32_t sizeByte;
- fread(&sizeByte, sizeof(int32_t), 1, fp_);
- size_ = sizeByte/4;
-
- ok_ = true;
- return true;
- }
-
- // ファイルからデータの取得
- void SD_WavReader::Read(int16_t data[], uint32_t size)
- {
- if (!ok_) ErrorMsg("Get data FAILED");
- fread(data, sizeof(int16_t), size, fp_);
- }
-
- // ファイルからデータをモノラルに変換しての取得
- void SD_WavReader::ReadAndToMono(int16_t data[], uint32_t size)
- {
- if (!ok_) ErrorMsg("Get data FAILED");
- fread(buffer, sizeof(int16_t), size*2, fp_);
- for (int n=0; n<size; n++)
- data[n] = (buffer[2*n] + buffer[2*n+1])/2;
- }
-
- // データサイズ(標本化点の数)の取得
- int32_t SD_WavReader::GetSize()
- {
- if (!ok_) ErrorMsg("Get data size FAILED");
- return size_;
- }
-}
--- a/MyClasses_Functions/SD_WavReader.hpp Sat May 07 08:15:00 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-//--------------------------------------------------------------
-// SD_WavReader class ---- Header
-// SD カードの *.wav ファイルの内容を読み出す
-// 以下のフォーマット以外は扱わない
-// PCM,16 ビットステレオ,標本化周波数 44.1 kHz
-//
-// 2016/04/19, Copyright (c) 2016 MIKAMI, Naoki
-//--------------------------------------------------------------
-
-#ifndef SD_WAV_READER_HPP
-#define SD_WAV_READER_HPP
-
-#include "SDFileSystem.h"
-#include "BlinkLabel.hpp"
-#include <string>
-
-namespace Mikami
-{
- class SD_WavReader
- {
- public:
- SD_WavReader(int32_t bufferSize);
- ~SD_WavReader();
-
- void Open(const string fileName);
-
- void Close() { fclose(fp_); }
-
- // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み
- // 戻り値: *.wav で,16 ビットステレオ,
- // 標本化周波数:44.1 kHz の場合 true
- bool IsWavFile();
-
- // ファイルからデータの取得
- void Read(int16_t data[], uint32_t size);
-
- // ファイルからデータをモノラルに変換しての取得
- void ReadAndToMono(int16_t data[], uint32_t size);
-
- // データサイズ(標本化点の数)の取得
- int32_t GetSize();
-
- private:
- const string STR_;
-
- struct WaveFormatEx
- {
- uint16_t wFormatTag; // 1: PCM
- uint16_t nChannels; // 1:モノラル,2: ステレオ
- uint32_t nSamplesPerSec; // 標本化周波数 (Hz)
- uint32_t nAvgBytesPerSec; // 転送速度 (bytes/s)
- uint16_t nBlockAlign; // 4: 16ビットステレオの場合
- uint16_t wBitsPerSample; // データのビット数,8 または 16
- uint16_t cbSize;
- };
-
- SDFileSystem *sd_;
- FILE *fp_;
-
- bool ok_;
- int32_t size_; // モノラルデータのサイズ
- int16_t *buffer; // ステレオをモノラルに変換する際の作業領域
-
- void ErrorMsg(char msg[])
- { BlinkLabel errLabel(240, 100, msg, Label::CENTER); }
-
- // disallow copy constructor and assignment operator
- SD_WavReader(const SD_WavReader&);
- SD_WavReader& operator=(const SD_WavReader&);
- };
-}
-#endif // SD_BINARY_READER_HPP
--- a/main.cpp Sat May 07 08:15:00 2016 +0000
+++ b/main.cpp Mon May 09 08:53:23 2016 +0000
@@ -5,7 +5,7 @@
// 上記以外の形式は扱わない
// 出力:モノラル
//
-// 2016/05/07, Copyright (c) 2016 MIKAMI, Naoki
+// 2016/05/09, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------------
#include "MyFunctions.hpp"
@@ -30,7 +30,7 @@
// ボタン用の定数
const uint16_t BG_LEFT = 414;
const uint16_t BG_WIDTH = 66;
- const uint16_t BG_HEIGHT = 40;
+ const uint16_t BG_HEIGHT = 36;
// ButtonGroup: "OPEN", "PLAY", "PAUSE", "RESUME", "STOP"
const string MENU[5] = {"OPEN", "PLAY", "PAUSE", "RESUME", "STOP"};
@@ -40,8 +40,10 @@
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"};
- ButtonGroup onOff(BG_LEFT, 230, BG_WIDTH/2, BG_HEIGHT,
+ ButtonGroup onOff(BG_LEFT, 235, BG_WIDTH/2, BG_HEIGHT,
2, ON_OFF, 0, 0, 2, 0);
// フィルタの設計と周波数特性描画用
@@ -56,7 +58,7 @@
// 周波数特性変更用スライダ
SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, STAGES,
- drawerObj.GetSpaceX(), -9.6f, 9.6f, 0,
+ drawerObj.GetSpaceX(), -8.0f, 8.0f, 0,
SeekBar::Vertical);
// フィルタの準備
@@ -81,7 +83,7 @@
{
whileFirst = false;
while (!menu.Touched(0)) // OPEN がタッチされるまで待つ
- ModifyFilter(drawerObj, myBars, hn, onOff, on);
+ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on);
SelectFile(menu, selector, myLabel1, fileName);
}
else
@@ -89,14 +91,14 @@
menu.Activate(1); // PLAY 有効
int touch10;
while (!menu.GetTouchedNumber(touch10))
- ModifyFilter(drawerObj, myBars, hn, onOff, on);
+ 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, onOff, on);
+ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on);
}
else
loopCount = SD_Open(sdReader, fileName, frameSize);
@@ -114,6 +116,7 @@
// IIR フィルタの内部の遅延器のクリア
for (int k=0; k<STAGES; k++) hn[k].Clear();
+ mySai.PlayOut(); // Play 開始
for (int k=0; k<loopCount; k++)
{
@@ -129,7 +132,7 @@
// PLAY か RESUME か STOP がタッチされるまで待つ
int touch134 = -1;
while (!menu.GetTouchedNumber(touch134))
- ModifyFilter(drawerObj, myBars, hn, onOff, on);
+ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on);
switch (touch134)
{
case 1: playOk = true; // 最初から PLAY
@@ -145,9 +148,9 @@
}
if (playOk || stopOk) break;
- ModifyFilter(drawerObj, myBars, hn, onOff, on);
+ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on);
// 1フレーム分の信号処理 (イコライザ) の実行
- ProcessSignal(sdReader, mySai, sn, hn, STAGES, on);
+ SignalProcessing(sdReader, mySai, sn, hn, STAGES, on);
}
mySai.Stop();
menu.Activate(0); // OPEN 有効
