Audio singal input and output example for DISCO-F746. Input: MEMS mic, Output: CN10 OUT, Acoustic effect: echo and frequency shift. DISCO-F746 によるオーディオ信号入出力.入力:MEMS マイク,出力:CN10 OUT,音響効果:エコー,周波数変換.
Dependencies: F746_GUI F746_SAI_IO
main.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2016-05-09
- Revision:
- 3:dc890c293f3f
- Parent:
- 2:a02507a43694
- Child:
- 4:450b3cf1e164
File content as of revision 3:dc890c293f3f:
//-------------------------------------------------------------- // MEMS マイクの入力に対して音響効果を与える // 音響効果:エコー生成,周波数シフト // // 2016/05/09, Copyright (c) 2016 MIKAMI, Naoki //-------------------------------------------------------------- #include "InitializeGUI.hpp" #include "SAI_InOut.hpp" #include "Echo.hpp" #include "WeaverModulator.hpp" using namespace Mikami; int main() { const int FS = I2S_AUDIOFREQ_16K; // 標本化周波数: 16 kHz SaiIO mySai(SaiIO::BOTH, 256, FS, INPUT_DEVICE_DIGITAL_MICROPHONE_2); ButtonGroup *onOff; // "ON", "OFF" ButtonGroup *menu; // "THROUGH", "ECHO", "F_SHIFTER" SeekBar *barEcho, *barFqCh; NumericLabel<int> *frqLabel; WaveformDisplay *displayIn, *displayOut; InitializeGUI(onOff, menu, barEcho, barFqCh, frqLabel, displayIn, displayOut); ProcessingBase through; // 0: 信号処理なしで出力 EchoSystem echo; // 1: エコー生成 FrqShifter shifter(FS); // 2: 周波数シフト ProcessingBase *func[3] = { &through, &echo, &shifter }; shifter.SetFrequensy(100); // 周波数シフタの初期値:100 Hz int runStop = 1; int menuNum = 0; // 入出力の波形表示で使用 int16_t *snIn, *snOut; snIn = new int16_t[mySai.GetLength()]; snOut = new int16_t[mySai.GetLength()]; mySai.RecordIn(); mySai.PlayOut(); mySai.PauseOut(); while (true) { // On/OFF の設定 int num; if (onOff->GetTouchedNumber(num)) if (runStop != num) { if (num == 0) mySai.ResumeOut(); else mySai.PauseOut(); runStop = num; } // エコーの長さを設定 if (menuNum == 1) if (barEcho->Slide()) echo.SetDelay(6000 - barEcho->GetIntValue()); // 周波数シフトの値の設定 if (menuNum == 2) if (barFqCh->Slide()) { frqLabel->Draw("+%d Hz", barFqCh->GetIntValue()); shifter.SetFrequensy(barFqCh->GetIntValue()); } // 信号処理の種類の切り替え if (menu->GetTouchedNumber(menuNum)) switch (menuNum) { case 0: barEcho->Inactivate(); // Through barFqCh->Inactivate(); frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT); break; case 1: barEcho->Activate(); // Echo barFqCh->Inactivate(); frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT); break; case 2: barEcho->Inactivate(); // Frequency shifter barFqCh->Activate(); frqLabel->Draw(GuiBase::ENUM_TEXT); break; } //--------------------------------------------- // 1フレーム分の信号処理を行い,その結果を出力する if ( mySai.IsCaptured() && mySai.IsXferred() ) { for (int n=0; n<mySai.GetLength(); n++) { int16_t xL, xR; mySai.Input(xL, xR); int16_t xn = xL + xR; snIn[n] = xn; //------------------------------------------------------- // 信号処理実行 int16_t yn = (int16_t)func[menuNum]->Execute((float)xn); //------------------------------------------------------- mySai.Output(yn, yn); // 左右チャンネルに同じ信号を出力 snOut[n] = yn; } mySai.ResetCaptured(); mySai.ResetXferred(); displayIn->Execute(snIn); // 入力波形の表示 displayOut->Execute(snOut); // 出力波形の表示 } // 1フレーム分の信号処理はここまで //--------------------------------------------- } }