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@7:a392487bcf7d, 2016-11-06 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Nov 06 13:36:22 2016 +0000
- Revision:
- 7:a392487bcf7d
- Parent:
- 6:38f7dce055d0
- Child:
- 8:9378fea59845
8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:f064b50f238e | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 2 | // MEMS マイクの入力に対して音響効果を与える |
MikamiUitOpen | 0:f064b50f238e | 3 | // 音響効果:エコー生成,周波数シフト |
MikamiUitOpen | 0:f064b50f238e | 4 | // |
MikamiUitOpen | 7:a392487bcf7d | 5 | // 2016/11/06, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:f064b50f238e | 6 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 7 | |
MikamiUitOpen | 5:7de034938856 | 8 | #include "EffectorInitializeGUI.hpp" |
MikamiUitOpen | 2:a02507a43694 | 9 | #include "SAI_InOut.hpp" |
MikamiUitOpen | 0:f064b50f238e | 10 | #include "Echo.hpp" |
MikamiUitOpen | 0:f064b50f238e | 11 | #include "WeaverModulator.hpp" |
MikamiUitOpen | 0:f064b50f238e | 12 | |
MikamiUitOpen | 0:f064b50f238e | 13 | using namespace Mikami; |
MikamiUitOpen | 0:f064b50f238e | 14 | |
MikamiUitOpen | 0:f064b50f238e | 15 | int main() |
MikamiUitOpen | 0:f064b50f238e | 16 | { |
MikamiUitOpen | 0:f064b50f238e | 17 | const int FS = I2S_AUDIOFREQ_16K; // 標本化周波数: 16 kHz |
MikamiUitOpen | 2:a02507a43694 | 18 | SaiIO mySai(SaiIO::BOTH, 256, FS, INPUT_DEVICE_DIGITAL_MICROPHONE_2); |
MikamiUitOpen | 0:f064b50f238e | 19 | |
MikamiUitOpen | 0:f064b50f238e | 20 | ButtonGroup *onOff; // "ON", "OFF" |
MikamiUitOpen | 0:f064b50f238e | 21 | ButtonGroup *menu; // "THROUGH", "ECHO", "F_SHIFTER" |
MikamiUitOpen | 0:f064b50f238e | 22 | SeekBar *barEcho, *barFqCh; |
MikamiUitOpen | 0:f064b50f238e | 23 | NumericLabel<int> *frqLabel; |
MikamiUitOpen | 0:f064b50f238e | 24 | WaveformDisplay *displayIn, *displayOut; |
MikamiUitOpen | 0:f064b50f238e | 25 | |
MikamiUitOpen | 5:7de034938856 | 26 | EffectorInitializeGUI(onOff, menu, barEcho, barFqCh, |
MikamiUitOpen | 5:7de034938856 | 27 | frqLabel, displayIn, displayOut); |
MikamiUitOpen | 0:f064b50f238e | 28 | |
MikamiUitOpen | 0:f064b50f238e | 29 | ProcessingBase through; // 0: 信号処理なしで出力 |
MikamiUitOpen | 0:f064b50f238e | 30 | EchoSystem echo; // 1: エコー生成 |
MikamiUitOpen | 0:f064b50f238e | 31 | FrqShifter shifter(FS); // 2: 周波数シフト |
MikamiUitOpen | 0:f064b50f238e | 32 | ProcessingBase *func[3] = { &through, &echo, &shifter }; |
MikamiUitOpen | 0:f064b50f238e | 33 | shifter.SetFrequensy(100); // 周波数シフタの初期値:100 Hz |
MikamiUitOpen | 0:f064b50f238e | 34 | |
MikamiUitOpen | 0:f064b50f238e | 35 | int runStop = 1; |
MikamiUitOpen | 0:f064b50f238e | 36 | int menuNum = 0; |
MikamiUitOpen | 0:f064b50f238e | 37 | |
MikamiUitOpen | 0:f064b50f238e | 38 | // 入出力の波形表示で使用 |
MikamiUitOpen | 0:f064b50f238e | 39 | int16_t *snIn, *snOut; |
MikamiUitOpen | 0:f064b50f238e | 40 | snIn = new int16_t[mySai.GetLength()]; |
MikamiUitOpen | 0:f064b50f238e | 41 | snOut = new int16_t[mySai.GetLength()]; |
MikamiUitOpen | 3:dc890c293f3f | 42 | |
MikamiUitOpen | 3:dc890c293f3f | 43 | mySai.RecordIn(); |
MikamiUitOpen | 3:dc890c293f3f | 44 | mySai.PlayOut(); |
MikamiUitOpen | 3:dc890c293f3f | 45 | mySai.PauseOut(); |
MikamiUitOpen | 0:f064b50f238e | 46 | |
MikamiUitOpen | 0:f064b50f238e | 47 | while (true) |
MikamiUitOpen | 0:f064b50f238e | 48 | { |
MikamiUitOpen | 0:f064b50f238e | 49 | // On/OFF の設定 |
MikamiUitOpen | 0:f064b50f238e | 50 | int num; |
MikamiUitOpen | 0:f064b50f238e | 51 | if (onOff->GetTouchedNumber(num)) |
MikamiUitOpen | 0:f064b50f238e | 52 | if (runStop != num) |
MikamiUitOpen | 0:f064b50f238e | 53 | { |
MikamiUitOpen | 3:dc890c293f3f | 54 | if (num == 0) mySai.ResumeOut(); |
MikamiUitOpen | 3:dc890c293f3f | 55 | else mySai.PauseOut(); |
MikamiUitOpen | 0:f064b50f238e | 56 | runStop = num; |
MikamiUitOpen | 0:f064b50f238e | 57 | } |
MikamiUitOpen | 0:f064b50f238e | 58 | |
MikamiUitOpen | 0:f064b50f238e | 59 | // エコーの長さを設定 |
MikamiUitOpen | 0:f064b50f238e | 60 | if (menuNum == 1) |
MikamiUitOpen | 0:f064b50f238e | 61 | if (barEcho->Slide()) |
MikamiUitOpen | 0:f064b50f238e | 62 | echo.SetDelay(6000 - barEcho->GetIntValue()); |
MikamiUitOpen | 0:f064b50f238e | 63 | |
MikamiUitOpen | 0:f064b50f238e | 64 | // 周波数シフトの値の設定 |
MikamiUitOpen | 0:f064b50f238e | 65 | if (menuNum == 2) |
MikamiUitOpen | 0:f064b50f238e | 66 | if (barFqCh->Slide()) |
MikamiUitOpen | 0:f064b50f238e | 67 | { |
MikamiUitOpen | 7:a392487bcf7d | 68 | frqLabel->Draw(barFqCh->GetIntValue()); |
MikamiUitOpen | 0:f064b50f238e | 69 | shifter.SetFrequensy(barFqCh->GetIntValue()); |
MikamiUitOpen | 0:f064b50f238e | 70 | } |
MikamiUitOpen | 0:f064b50f238e | 71 | |
MikamiUitOpen | 0:f064b50f238e | 72 | // 信号処理の種類の切り替え |
MikamiUitOpen | 0:f064b50f238e | 73 | if (menu->GetTouchedNumber(menuNum)) |
MikamiUitOpen | 0:f064b50f238e | 74 | switch (menuNum) |
MikamiUitOpen | 0:f064b50f238e | 75 | { |
MikamiUitOpen | 0:f064b50f238e | 76 | case 0: barEcho->Inactivate(); // Through |
MikamiUitOpen | 0:f064b50f238e | 77 | barFqCh->Inactivate(); |
MikamiUitOpen | 0:f064b50f238e | 78 | frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT); |
MikamiUitOpen | 0:f064b50f238e | 79 | break; |
MikamiUitOpen | 0:f064b50f238e | 80 | case 1: barEcho->Activate(); // Echo |
MikamiUitOpen | 0:f064b50f238e | 81 | barFqCh->Inactivate(); |
MikamiUitOpen | 0:f064b50f238e | 82 | frqLabel->Draw(GuiBase::ENUM_INACTIVE_TEXT); |
MikamiUitOpen | 0:f064b50f238e | 83 | break; |
MikamiUitOpen | 0:f064b50f238e | 84 | case 2: barEcho->Inactivate(); // Frequency shifter |
MikamiUitOpen | 0:f064b50f238e | 85 | barFqCh->Activate(); |
MikamiUitOpen | 0:f064b50f238e | 86 | frqLabel->Draw(GuiBase::ENUM_TEXT); |
MikamiUitOpen | 0:f064b50f238e | 87 | break; |
MikamiUitOpen | 0:f064b50f238e | 88 | } |
MikamiUitOpen | 0:f064b50f238e | 89 | |
MikamiUitOpen | 0:f064b50f238e | 90 | //--------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 91 | // 1フレーム分の信号処理を行い,その結果を出力する |
MikamiUitOpen | 4:450b3cf1e164 | 92 | if ( mySai.IsCompleted()) |
MikamiUitOpen | 0:f064b50f238e | 93 | { |
MikamiUitOpen | 0:f064b50f238e | 94 | for (int n=0; n<mySai.GetLength(); n++) |
MikamiUitOpen | 0:f064b50f238e | 95 | { |
MikamiUitOpen | 0:f064b50f238e | 96 | int16_t xL, xR; |
MikamiUitOpen | 0:f064b50f238e | 97 | mySai.Input(xL, xR); |
MikamiUitOpen | 0:f064b50f238e | 98 | int16_t xn = xL + xR; |
MikamiUitOpen | 4:450b3cf1e164 | 99 | snIn[n] = xn; // 表示用 |
MikamiUitOpen | 0:f064b50f238e | 100 | |
MikamiUitOpen | 0:f064b50f238e | 101 | //------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 102 | // 信号処理実行 |
MikamiUitOpen | 0:f064b50f238e | 103 | int16_t yn = (int16_t)func[menuNum]->Execute((float)xn); |
MikamiUitOpen | 0:f064b50f238e | 104 | //------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 105 | |
MikamiUitOpen | 0:f064b50f238e | 106 | mySai.Output(yn, yn); // 左右チャンネルに同じ信号を出力 |
MikamiUitOpen | 4:450b3cf1e164 | 107 | snOut[n] = yn; // 表示用 |
MikamiUitOpen | 0:f064b50f238e | 108 | } |
MikamiUitOpen | 4:450b3cf1e164 | 109 | mySai.Reset(); |
MikamiUitOpen | 0:f064b50f238e | 110 | |
MikamiUitOpen | 0:f064b50f238e | 111 | displayIn->Execute(snIn); // 入力波形の表示 |
MikamiUitOpen | 0:f064b50f238e | 112 | displayOut->Execute(snOut); // 出力波形の表示 |
MikamiUitOpen | 0:f064b50f238e | 113 | } |
MikamiUitOpen | 0:f064b50f238e | 114 | // 1フレーム分の信号処理はここまで |
MikamiUitOpen | 0:f064b50f238e | 115 | //--------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 116 | } |
MikamiUitOpen | 0:f064b50f238e | 117 | } |