Integrated program of 4 different kinds of application programs for processing sound signal. 4種類のサウンド信号処理を統合したプログラム.
Dependencies: F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real
MyAcousticEffector_MIC/ReverbFrShifterMain.hpp@16:d60e5187fd31, 2017-04-27 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 27 23:55:53 2017 +0000
- Revision:
- 16:d60e5187fd31
- Parent:
- 14:34c356ceb8e7
17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 14:34c356ceb8e7 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 2 | // MEMS マイクの入力に対して音響効果を与える |
MikamiUitOpen | 14:34c356ceb8e7 | 3 | // 音響効果:残響生成,周波数シフト |
MikamiUitOpen | 14:34c356ceb8e7 | 4 | // |
MikamiUitOpen | 14:34c356ceb8e7 | 5 | // 2017/04/13, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 14:34c356ceb8e7 | 6 | //-------------------------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 7 | |
MikamiUitOpen | 14:34c356ceb8e7 | 8 | #ifndef REVERB_FRSHIFTER_HPP |
MikamiUitOpen | 14:34c356ceb8e7 | 9 | #define REVERB_FRSHIFTER_HPP |
MikamiUitOpen | 14:34c356ceb8e7 | 10 | |
MikamiUitOpen | 14:34c356ceb8e7 | 11 | #include "InitializeGUI.hpp" |
MikamiUitOpen | 14:34c356ceb8e7 | 12 | #include "SAI_InOut.hpp" |
MikamiUitOpen | 14:34c356ceb8e7 | 13 | #include "Reverberator.hpp" |
MikamiUitOpen | 14:34c356ceb8e7 | 14 | #include "WeaverModulator.hpp" |
MikamiUitOpen | 14:34c356ceb8e7 | 15 | #include "GuiChanger.hpp" |
MikamiUitOpen | 14:34c356ceb8e7 | 16 | using namespace Mikami; |
MikamiUitOpen | 14:34c356ceb8e7 | 17 | |
MikamiUitOpen | 14:34c356ceb8e7 | 18 | void ReverbFrShifter() |
MikamiUitOpen | 14:34c356ceb8e7 | 19 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 20 | const int FS = AUDIO_FREQUENCY_16K; // 標本化周波数: 16 kHz |
MikamiUitOpen | 14:34c356ceb8e7 | 21 | SaiIO mySai(SaiIO::BOTH, 256, FS, INPUT_DEVICE_DIGITAL_MICROPHONE_2); |
MikamiUitOpen | 14:34c356ceb8e7 | 22 | |
MikamiUitOpen | 14:34c356ceb8e7 | 23 | ButtonGroup *onOff; // "ON", "OFF" |
MikamiUitOpen | 14:34c356ceb8e7 | 24 | ButtonGroup *menu; // "THROUGH", "REVERB", "F_SHIFTER" |
MikamiUitOpen | 14:34c356ceb8e7 | 25 | SeekBar *barReverb, *barFqCh; |
MikamiUitOpen | 14:34c356ceb8e7 | 26 | NumericLabel<int> *frqLabel; |
MikamiUitOpen | 14:34c356ceb8e7 | 27 | WaveformDisplay *displayIn, *displayOut; |
MikamiUitOpen | 14:34c356ceb8e7 | 28 | |
MikamiUitOpen | 14:34c356ceb8e7 | 29 | // GUI 部品の初期化 |
MikamiUitOpen | 14:34c356ceb8e7 | 30 | InitializeGUI(onOff, menu, barReverb, barFqCh, |
MikamiUitOpen | 14:34c356ceb8e7 | 31 | frqLabel, displayIn, displayOut); |
MikamiUitOpen | 14:34c356ceb8e7 | 32 | // 処理に応じて GUI 部品の状態を変更する関数の割り当て |
MikamiUitOpen | 14:34c356ceb8e7 | 33 | void (*fPtr[])(SeekBar*, SeekBar*, NumericLabel<int>*) |
MikamiUitOpen | 14:34c356ceb8e7 | 34 | = { SetThrough, SetReverb, SetFrqShifter }; |
MikamiUitOpen | 14:34c356ceb8e7 | 35 | |
MikamiUitOpen | 14:34c356ceb8e7 | 36 | ProcessingBase through; // 0: 信号処理なしで出力 |
MikamiUitOpen | 14:34c356ceb8e7 | 37 | Reverberator reverb; // 1: 残響生成 |
MikamiUitOpen | 14:34c356ceb8e7 | 38 | WeaverMod shifter(FS, 100); // 2: 周波数シフト(シフトの初期値:100 Hz) |
MikamiUitOpen | 14:34c356ceb8e7 | 39 | ProcessingBase *func[3] = { &through, &reverb, &shifter }; |
MikamiUitOpen | 14:34c356ceb8e7 | 40 | ResetButton reset; |
MikamiUitOpen | 14:34c356ceb8e7 | 41 | |
MikamiUitOpen | 14:34c356ceb8e7 | 42 | int runStop = 1; |
MikamiUitOpen | 14:34c356ceb8e7 | 43 | int menuNum = 0; |
MikamiUitOpen | 14:34c356ceb8e7 | 44 | |
MikamiUitOpen | 14:34c356ceb8e7 | 45 | // 入出力の波形表示で使用 |
MikamiUitOpen | 14:34c356ceb8e7 | 46 | Array<int16_t> snIn(mySai.GetLength()); |
MikamiUitOpen | 14:34c356ceb8e7 | 47 | Array<int16_t> snOut(mySai.GetLength()); |
MikamiUitOpen | 14:34c356ceb8e7 | 48 | |
MikamiUitOpen | 14:34c356ceb8e7 | 49 | mySai.RecordIn(); |
MikamiUitOpen | 14:34c356ceb8e7 | 50 | mySai.PlayOut(); |
MikamiUitOpen | 14:34c356ceb8e7 | 51 | mySai.PauseOut(); |
MikamiUitOpen | 14:34c356ceb8e7 | 52 | |
MikamiUitOpen | 14:34c356ceb8e7 | 53 | while (true) |
MikamiUitOpen | 14:34c356ceb8e7 | 54 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 55 | // On/OFF の設定 |
MikamiUitOpen | 14:34c356ceb8e7 | 56 | int num; |
MikamiUitOpen | 14:34c356ceb8e7 | 57 | if (onOff->GetTouchedNumber(num)) |
MikamiUitOpen | 14:34c356ceb8e7 | 58 | if (runStop != num) |
MikamiUitOpen | 14:34c356ceb8e7 | 59 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 60 | if (num == 0) mySai.ResumeOut(); |
MikamiUitOpen | 14:34c356ceb8e7 | 61 | else mySai.PauseOut(); |
MikamiUitOpen | 14:34c356ceb8e7 | 62 | runStop = num; |
MikamiUitOpen | 14:34c356ceb8e7 | 63 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 64 | |
MikamiUitOpen | 14:34c356ceb8e7 | 65 | // 信号処理の種類の切り替えに対応する GUI 部品の状態の設定 |
MikamiUitOpen | 14:34c356ceb8e7 | 66 | if (menu->GetTouchedNumber(menuNum)) |
MikamiUitOpen | 14:34c356ceb8e7 | 67 | fPtr[menuNum](barReverb, barFqCh, frqLabel); |
MikamiUitOpen | 14:34c356ceb8e7 | 68 | |
MikamiUitOpen | 14:34c356ceb8e7 | 69 | // 残響の長さを設定 |
MikamiUitOpen | 14:34c356ceb8e7 | 70 | if ( (menuNum == 1) && (barReverb->Slide()) ) |
MikamiUitOpen | 14:34c356ceb8e7 | 71 | reverb.SetDelay(6000 - barReverb->GetIntValue()); |
MikamiUitOpen | 14:34c356ceb8e7 | 72 | |
MikamiUitOpen | 14:34c356ceb8e7 | 73 | // 周波数シフトの値の設定 |
MikamiUitOpen | 14:34c356ceb8e7 | 74 | if ( (menuNum == 2) && (barFqCh->Slide()) ) |
MikamiUitOpen | 14:34c356ceb8e7 | 75 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 76 | frqLabel->Draw("+%d Hz", barFqCh->GetIntValue()); |
MikamiUitOpen | 14:34c356ceb8e7 | 77 | shifter.SetFrequency(barFqCh->GetIntValue()); |
MikamiUitOpen | 14:34c356ceb8e7 | 78 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 79 | |
MikamiUitOpen | 14:34c356ceb8e7 | 80 | //--------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 81 | // 1ブロック分の信号処理を行い,その結果を出力する |
MikamiUitOpen | 14:34c356ceb8e7 | 82 | if ( mySai.IsCompleted()) |
MikamiUitOpen | 14:34c356ceb8e7 | 83 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 84 | for (int n=0; n<mySai.GetLength(); n++) |
MikamiUitOpen | 14:34c356ceb8e7 | 85 | { |
MikamiUitOpen | 14:34c356ceb8e7 | 86 | int16_t xL, xR; |
MikamiUitOpen | 14:34c356ceb8e7 | 87 | mySai.Input(xL, xR); |
MikamiUitOpen | 14:34c356ceb8e7 | 88 | int16_t xn = xL + xR; |
MikamiUitOpen | 14:34c356ceb8e7 | 89 | snIn[n] = xn; // 表示用 |
MikamiUitOpen | 14:34c356ceb8e7 | 90 | |
MikamiUitOpen | 14:34c356ceb8e7 | 91 | //------------------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 92 | // 信号処理実行 |
MikamiUitOpen | 14:34c356ceb8e7 | 93 | int16_t yn = (int16_t)func[menuNum]->Execute((float)xn); |
MikamiUitOpen | 14:34c356ceb8e7 | 94 | //------------------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 95 | |
MikamiUitOpen | 14:34c356ceb8e7 | 96 | mySai.Output(yn, yn); // 左右チャンネルに同じ信号を出力 |
MikamiUitOpen | 14:34c356ceb8e7 | 97 | snOut[n] = yn; // 表示用 |
MikamiUitOpen | 14:34c356ceb8e7 | 98 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 99 | |
MikamiUitOpen | 14:34c356ceb8e7 | 100 | displayIn->Execute(snIn); // 入力波形の表示 |
MikamiUitOpen | 14:34c356ceb8e7 | 101 | displayOut->Execute(snOut); // 出力波形の表示 |
MikamiUitOpen | 14:34c356ceb8e7 | 102 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 103 | // 1ブロック分の信号処理はここまで |
MikamiUitOpen | 14:34c356ceb8e7 | 104 | //--------------------------------------------- |
MikamiUitOpen | 14:34c356ceb8e7 | 105 | |
MikamiUitOpen | 14:34c356ceb8e7 | 106 | reset.DoIfTouched(); // リセットボタンがタッチされればメニューに戻る |
MikamiUitOpen | 14:34c356ceb8e7 | 107 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 108 | } |
MikamiUitOpen | 14:34c356ceb8e7 | 109 | #endif // REVERB_FRSHIFTER_HPP |