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

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フレーム分の信号処理はここまで
+        //---------------------------------------------
+    }
+}