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

Committer:
MikamiUitOpen
Date:
Thu Apr 27 23:55:53 2017 +0000
Revision:
16:d60e5187fd31
Parent:
14:34c356ceb8e7
17

Who changed what in which revision?

UserRevisionLine numberNew 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