不韋 呂 / F746_AcousticEffector_MIC

Dependencies:   F746_GUI F746_SAI_IO

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //--------------------------------------------------------------
00002 //  MEMS マイクの入力に対して音響効果を与える
00003 //      音響効果:残響生成,周波数シフト
00004 //
00005 //  2017/04/10, Copyright (c) 2017 MIKAMI, Naoki
00006 //--------------------------------------------------------------
00007 
00008 #include "InitializeGUI.hpp"
00009 #include "SAI_InOut.hpp"
00010 #include "Reverberator.hpp"
00011 #include "WeaverModulator.hpp"
00012 #include "GuiChanger.hpp"
00013 using namespace Mikami;
00014 
00015 int main()
00016 {
00017     const int FS = AUDIO_FREQUENCY_16K;    // 標本化周波数: 16 kHz
00018     // 入出力の準備
00019     SaiIO mySai(SaiIO::BOTH, 256, FS,
00020                 INPUT_DEVICE_DIGITAL_MICROPHONE_2);
00021 
00022     ButtonGroup *onOff; // "ON", "OFF"
00023     ButtonGroup *menu;  // "THROUGH", "REVERB", "F_SHIFTER"
00024     SeekBar *barReverb, *barFqCh;
00025     NumericLabel<int> *frqLabel;
00026     WaveformDisplay *displayIn, *displayOut;
00027     // GUI 部品の初期化
00028     InitializeGUI(onOff, menu, barReverb, barFqCh,
00029                   frqLabel, displayIn, displayOut);
00030     // 処理に応じて GUI 部品の状態を変更する関数の割り当て
00031     void (*fPtr[])(SeekBar*, SeekBar*, NumericLabel<int>*)
00032         = { SetThrough, SetReverb, SetFrqShifter };
00033 
00034     ProcessingBase through;     // 0: 信号処理なしで出力
00035     Reverberator reverb;        // 1: 残響生成
00036     WeaverMod shifter(FS, 100); // 2: 周波数シフト(シフトの初期値:100 Hz)
00037     ProcessingBase *func[3] = { &through,
00038                                 &reverb,
00039                                 &shifter };
00040 
00041     Array<int16_t> snIn(mySai.GetLength());     // 入力波形表示で使用
00042     Array<int16_t> snOut(mySai.GetLength());    // 出力波形表示で使用
00043 
00044     mySai.RecordIn();   // 入力開始
00045     mySai.PlayOut();    // 出力開始
00046     mySai.PauseOut();   // 出力一時停止
00047 
00048     int menuNum = 0;
00049     while (true)
00050     {
00051         // On/OFF の設定
00052         int num;
00053         if (onOff->GetTouchedNumber(num))
00054         {
00055             if (num == 0) mySai.ResumeOut();    // 出力再開
00056             else          mySai.PauseOut();
00057         }
00058 
00059         // 信号処理の種類の切り替えに対応する GUI 部品の状態の設定
00060         if (menu->GetTouchedNumber(menuNum))
00061             fPtr[menuNum](barReverb, barFqCh, frqLabel);
00062 
00063         // 残響の長さを設定
00064         if ( (menuNum == 1) && (barReverb->Slide()) )
00065             reverb.SetDelay(barReverb->GetIntValue());
00066 
00067         // 周波数シフトの値の設定
00068         if ( (menuNum == 2) && (barFqCh->Slide()) )
00069         {
00070             frqLabel->Draw(barFqCh->GetIntValue());
00071             shifter.SetFrequency(barFqCh->GetIntValue());
00072         }
00073 
00074         //---------------------------------------------
00075         // 1フレーム分の信号処理を行い,その結果を出力する
00076         if (mySai.IsCompleted())
00077         {
00078             for (int n=0; n<mySai.GetLength(); n++)
00079             {
00080                 int16_t xL, xR;
00081                 mySai.Input(xL, xR);
00082                 int16_t xn = xL + xR;
00083                 snIn[n] = xn;   // 表示用
00084 
00085                 //-------------------------------------------------------
00086                 int16_t yn = func[menuNum]->Execute(xn);    // 信号処理実行
00087                 //-------------------------------------------------------
00088 
00089                 mySai.Output(yn, yn);   // 左右チャンネルに同じ信号を出力
00090                 snOut[n] = yn;  // 表示用
00091             }
00092 
00093             displayIn->Execute(snIn);   // 入力波形の表示
00094             displayOut->Execute(snOut); // 出力波形の表示
00095         }
00096         // 1フレーム分の信号処理はここまで
00097         //---------------------------------------------
00098     }
00099 }