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-06-16
Revision:
4:450b3cf1e164
Parent:
3:dc890c293f3f
Child:
5:7de034938856

File content as of revision 4:450b3cf1e164:

//--------------------------------------------------------------
//  MEMS マイクの入力に対して音響効果を与える
//      音響効果:エコー生成,周波数シフト
//
//  2016/05/16, 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.IsCompleted())
        {
            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.Reset(); 
            
            displayIn->Execute(snIn);   // 入力波形の表示
            displayOut->Execute(snOut); // 出力波形の表示
        }        
        // 1フレーム分の信号処理はここまで
        //---------------------------------------------
    }
}