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

Committer:
MikamiUitOpen
Date:
Mon May 09 13:40:37 2016 +0000
Revision:
3:dc890c293f3f
Parent:
2:a02507a43694
Child:
4:450b3cf1e164
4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:f064b50f238e 1 //--------------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 2 // MEMS マイクの入力に対して音響効果を与える
MikamiUitOpen 0:f064b50f238e 3 // 音響効果:エコー生成,周波数シフト
MikamiUitOpen 0:f064b50f238e 4 //
MikamiUitOpen 3:dc890c293f3f 5 // 2016/05/09, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:f064b50f238e 6 //--------------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 7
MikamiUitOpen 0:f064b50f238e 8 #include "InitializeGUI.hpp"
MikamiUitOpen 2:a02507a43694 9 #include "SAI_InOut.hpp"
MikamiUitOpen 0:f064b50f238e 10 #include "Echo.hpp"
MikamiUitOpen 0:f064b50f238e 11 #include "WeaverModulator.hpp"
MikamiUitOpen 0:f064b50f238e 12
MikamiUitOpen 0:f064b50f238e 13 using namespace Mikami;
MikamiUitOpen 0:f064b50f238e 14
MikamiUitOpen 0:f064b50f238e 15 int main()
MikamiUitOpen 0:f064b50f238e 16 {
MikamiUitOpen 0:f064b50f238e 17 const int FS = I2S_AUDIOFREQ_16K; // 標本化周波数: 16 kHz
MikamiUitOpen 2:a02507a43694 18 SaiIO mySai(SaiIO::BOTH, 256, FS, INPUT_DEVICE_DIGITAL_MICROPHONE_2);
MikamiUitOpen 0:f064b50f238e 19
MikamiUitOpen 0:f064b50f238e 20 ButtonGroup *onOff; // "ON", "OFF"
MikamiUitOpen 0:f064b50f238e 21 ButtonGroup *menu; // "THROUGH", "ECHO", "F_SHIFTER"
MikamiUitOpen 0:f064b50f238e 22 SeekBar *barEcho, *barFqCh;
MikamiUitOpen 0:f064b50f238e 23 NumericLabel<int> *frqLabel;
MikamiUitOpen 0:f064b50f238e 24 WaveformDisplay *displayIn, *displayOut;
MikamiUitOpen 0:f064b50f238e 25
MikamiUitOpen 0:f064b50f238e 26 InitializeGUI(onOff, menu, barEcho, barFqCh, frqLabel, displayIn, displayOut);
MikamiUitOpen 0:f064b50f238e 27
MikamiUitOpen 0:f064b50f238e 28 ProcessingBase through; // 0: 信号処理なしで出力
MikamiUitOpen 0:f064b50f238e 29 EchoSystem echo; // 1: エコー生成
MikamiUitOpen 0:f064b50f238e 30 FrqShifter shifter(FS); // 2: 周波数シフト
MikamiUitOpen 0:f064b50f238e 31 ProcessingBase *func[3] = { &through, &echo, &shifter };
MikamiUitOpen 0:f064b50f238e 32 shifter.SetFrequensy(100); // 周波数シフタの初期値:100 Hz
MikamiUitOpen 0:f064b50f238e 33
MikamiUitOpen 0:f064b50f238e 34 int runStop = 1;
MikamiUitOpen 0:f064b50f238e 35 int menuNum = 0;
MikamiUitOpen 0:f064b50f238e 36
MikamiUitOpen 0:f064b50f238e 37 // 入出力の波形表示で使用
MikamiUitOpen 0:f064b50f238e 38 int16_t *snIn, *snOut;
MikamiUitOpen 0:f064b50f238e 39 snIn = new int16_t[mySai.GetLength()];
MikamiUitOpen 0:f064b50f238e 40 snOut = new int16_t[mySai.GetLength()];
MikamiUitOpen 3:dc890c293f3f 41
MikamiUitOpen 3:dc890c293f3f 42 mySai.RecordIn();
MikamiUitOpen 3:dc890c293f3f 43 mySai.PlayOut();
MikamiUitOpen 3:dc890c293f3f 44 mySai.PauseOut();
MikamiUitOpen 0:f064b50f238e 45
MikamiUitOpen 0:f064b50f238e 46 while (true)
MikamiUitOpen 0:f064b50f238e 47 {
MikamiUitOpen 0:f064b50f238e 48 // On/OFF の設定
MikamiUitOpen 0:f064b50f238e 49 int num;
MikamiUitOpen 0:f064b50f238e 50 if (onOff->GetTouchedNumber(num))
MikamiUitOpen 0:f064b50f238e 51 if (runStop != num)
MikamiUitOpen 0:f064b50f238e 52 {
MikamiUitOpen 3:dc890c293f3f 53 if (num == 0) mySai.ResumeOut();
MikamiUitOpen 3:dc890c293f3f 54 else mySai.PauseOut();
MikamiUitOpen 0:f064b50f238e 55 runStop = num;
MikamiUitOpen 0:f064b50f238e 56 }
MikamiUitOpen 0:f064b50f238e 57
MikamiUitOpen 0:f064b50f238e 58 // エコーの長さを設定
MikamiUitOpen 0:f064b50f238e 59 if (menuNum == 1)
MikamiUitOpen 0:f064b50f238e 60 if (barEcho->Slide())
MikamiUitOpen 0:f064b50f238e 61 echo.SetDelay(6000 - barEcho->GetIntValue());
MikamiUitOpen 0:f064b50f238e 62
MikamiUitOpen 0:f064b50f238e 63 // 周波数シフトの値の設定
MikamiUitOpen 0:f064b50f238e 64 if (menuNum == 2)
MikamiUitOpen 0:f064b50f238e 65 if (barFqCh->Slide())
MikamiUitOpen 0:f064b50f238e 66 {
MikamiUitOpen 0:f064b50f238e 67 frqLabel->Draw("+%d Hz", barFqCh->GetIntValue());
MikamiUitOpen 0:f064b50f238e 68 shifter.SetFrequensy(barFqCh->GetIntValue());
MikamiUitOpen 0:f064b50f238e 69 }
MikamiUitOpen 0:f064b50f238e 70
MikamiUitOpen 0:f064b50f238e 71 // 信号処理の種類の切り替え
MikamiUitOpen 0:f064b50f238e 72 if (menu->GetTouchedNumber(menuNum))
MikamiUitOpen 0:f064b50f238e 73 switch (menuNum)
MikamiUitOpen 0:f064b50f238e 74 {
MikamiUitOpen 0:f064b50f238e 75 case 0: barEcho->Inactivate(); // Through
MikamiUitOpen 0:f064b50f238e 76 barFqCh->Inactivate();
MikamiUitOpen 0:f064b50f238e 77 frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT);
MikamiUitOpen 0:f064b50f238e 78 break;
MikamiUitOpen 0:f064b50f238e 79 case 1: barEcho->Activate(); // Echo
MikamiUitOpen 0:f064b50f238e 80 barFqCh->Inactivate();
MikamiUitOpen 0:f064b50f238e 81 frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT);
MikamiUitOpen 0:f064b50f238e 82 break;
MikamiUitOpen 0:f064b50f238e 83 case 2: barEcho->Inactivate(); // Frequency shifter
MikamiUitOpen 0:f064b50f238e 84 barFqCh->Activate();
MikamiUitOpen 0:f064b50f238e 85 frqLabel->Draw(GuiBase::ENUM_TEXT);
MikamiUitOpen 0:f064b50f238e 86 break;
MikamiUitOpen 0:f064b50f238e 87 }
MikamiUitOpen 0:f064b50f238e 88
MikamiUitOpen 0:f064b50f238e 89 //---------------------------------------------
MikamiUitOpen 0:f064b50f238e 90 // 1フレーム分の信号処理を行い,その結果を出力する
MikamiUitOpen 0:f064b50f238e 91 if ( mySai.IsCaptured() && mySai.IsXferred() )
MikamiUitOpen 0:f064b50f238e 92 {
MikamiUitOpen 0:f064b50f238e 93 for (int n=0; n<mySai.GetLength(); n++)
MikamiUitOpen 0:f064b50f238e 94 {
MikamiUitOpen 0:f064b50f238e 95 int16_t xL, xR;
MikamiUitOpen 0:f064b50f238e 96 mySai.Input(xL, xR);
MikamiUitOpen 0:f064b50f238e 97 int16_t xn = xL + xR;
MikamiUitOpen 0:f064b50f238e 98 snIn[n] = xn;
MikamiUitOpen 0:f064b50f238e 99
MikamiUitOpen 0:f064b50f238e 100 //-------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 101 // 信号処理実行
MikamiUitOpen 0:f064b50f238e 102 int16_t yn = (int16_t)func[menuNum]->Execute((float)xn);
MikamiUitOpen 0:f064b50f238e 103 //-------------------------------------------------------
MikamiUitOpen 0:f064b50f238e 104
MikamiUitOpen 0:f064b50f238e 105 mySai.Output(yn, yn); // 左右チャンネルに同じ信号を出力
MikamiUitOpen 0:f064b50f238e 106 snOut[n] = yn;
MikamiUitOpen 0:f064b50f238e 107 }
MikamiUitOpen 0:f064b50f238e 108 mySai.ResetCaptured();
MikamiUitOpen 0:f064b50f238e 109 mySai.ResetXferred();
MikamiUitOpen 0:f064b50f238e 110
MikamiUitOpen 0:f064b50f238e 111 displayIn->Execute(snIn); // 入力波形の表示
MikamiUitOpen 0:f064b50f238e 112 displayOut->Execute(snOut); // 出力波形の表示
MikamiUitOpen 0:f064b50f238e 113 }
MikamiUitOpen 0:f064b50f238e 114 // 1フレーム分の信号処理はここまで
MikamiUitOpen 0:f064b50f238e 115 //---------------------------------------------
MikamiUitOpen 0:f064b50f238e 116 }
MikamiUitOpen 0:f064b50f238e 117 }