Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: F746_GUI F746_SAI_IO
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 }
Generated on Tue Jul 12 2022 19:08:57 by
1.7.2