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
Diff: main.cpp
- Revision:
- 0:f064b50f238e
- Child:
- 1:319b7346f8ef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Apr 14 08:37:11 2016 +0000 @@ -0,0 +1,114 @@ +//-------------------------------------------------------------- +// MEMS マイクの入力に対して音響効果を与える +// 音響効果:エコー生成,周波数シフト +// +// 2016/04/14, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------------- + +#include "InitializeGUI.hpp" +#include "SAI_InputOutput.hpp" +#include "Echo.hpp" +#include "WeaverModulator.hpp" + +using namespace Mikami; + +int main() +{ + const int FS = I2S_AUDIOFREQ_16K; // 標本化周波数: 16 kHz + SaiIO mySai(INPUT_DEVICE_DIGITAL_MICROPHONE_2, 256, FS); + mySai.Pause(); + + 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()]; + + while (true) + { + // On/OFF の設定 + int num; + if (onOff->GetTouchedNumber(num)) + if (runStop != num) + { + if (num == 0) mySai.Resume(); + else mySai.Pause(); + 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フレーム分の信号処理はここまで + //--------------------------------------------- + } +}