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