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@10:56f2f01df983, 2017-04-10 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Apr 10 13:44:13 2017 +0000
- Revision:
- 10:56f2f01df983
- Parent:
- 9:1221ba81a1bb
11
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:f064b50f238e | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 2 | // MEMS マイクの入力に対して音響効果を与える |
MikamiUitOpen | 10:56f2f01df983 | 3 | // 音響効果:残響生成,周波数シフト |
MikamiUitOpen | 0:f064b50f238e | 4 | // |
MikamiUitOpen | 10:56f2f01df983 | 5 | // 2017/04/10, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:f064b50f238e | 6 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 7 | |
MikamiUitOpen | 10:56f2f01df983 | 8 | #include "InitializeGUI.hpp" |
MikamiUitOpen | 2:a02507a43694 | 9 | #include "SAI_InOut.hpp" |
MikamiUitOpen | 10:56f2f01df983 | 10 | #include "Reverberator.hpp" |
MikamiUitOpen | 0:f064b50f238e | 11 | #include "WeaverModulator.hpp" |
MikamiUitOpen | 10:56f2f01df983 | 12 | #include "GuiChanger.hpp" |
MikamiUitOpen | 0:f064b50f238e | 13 | using namespace Mikami; |
MikamiUitOpen | 0:f064b50f238e | 14 | |
MikamiUitOpen | 0:f064b50f238e | 15 | int main() |
MikamiUitOpen | 0:f064b50f238e | 16 | { |
MikamiUitOpen | 10:56f2f01df983 | 17 | const int FS = AUDIO_FREQUENCY_16K; // 標本化周波数: 16 kHz |
MikamiUitOpen | 10:56f2f01df983 | 18 | // 入出力の準備 |
MikamiUitOpen | 10:56f2f01df983 | 19 | SaiIO mySai(SaiIO::BOTH, 256, FS, |
MikamiUitOpen | 10:56f2f01df983 | 20 | INPUT_DEVICE_DIGITAL_MICROPHONE_2); |
MikamiUitOpen | 0:f064b50f238e | 21 | |
MikamiUitOpen | 10:56f2f01df983 | 22 | ButtonGroup *onOff; // "ON", "OFF" |
MikamiUitOpen | 10:56f2f01df983 | 23 | ButtonGroup *menu; // "THROUGH", "REVERB", "F_SHIFTER" |
MikamiUitOpen | 10:56f2f01df983 | 24 | SeekBar *barReverb, *barFqCh; |
MikamiUitOpen | 0:f064b50f238e | 25 | NumericLabel<int> *frqLabel; |
MikamiUitOpen | 0:f064b50f238e | 26 | WaveformDisplay *displayIn, *displayOut; |
MikamiUitOpen | 10:56f2f01df983 | 27 | // GUI 部品の初期化 |
MikamiUitOpen | 10:56f2f01df983 | 28 | InitializeGUI(onOff, menu, barReverb, barFqCh, |
MikamiUitOpen | 10:56f2f01df983 | 29 | frqLabel, displayIn, displayOut); |
MikamiUitOpen | 10:56f2f01df983 | 30 | // 処理に応じて GUI 部品の状態を変更する関数の割り当て |
MikamiUitOpen | 10:56f2f01df983 | 31 | void (*fPtr[])(SeekBar*, SeekBar*, NumericLabel<int>*) |
MikamiUitOpen | 10:56f2f01df983 | 32 | = { SetThrough, SetReverb, SetFrqShifter }; |
MikamiUitOpen | 9:1221ba81a1bb | 33 | |
MikamiUitOpen | 10:56f2f01df983 | 34 | ProcessingBase through; // 0: 信号処理なしで出力 |
MikamiUitOpen | 10:56f2f01df983 | 35 | Reverberator reverb; // 1: 残響生成 |
MikamiUitOpen | 10:56f2f01df983 | 36 | WeaverMod shifter(FS, 100); // 2: 周波数シフト(シフトの初期値:100 Hz) |
MikamiUitOpen | 10:56f2f01df983 | 37 | ProcessingBase *func[3] = { &through, |
MikamiUitOpen | 10:56f2f01df983 | 38 | &reverb, |
MikamiUitOpen | 10:56f2f01df983 | 39 | &shifter }; |
MikamiUitOpen | 9:1221ba81a1bb | 40 | |
MikamiUitOpen | 10:56f2f01df983 | 41 | Array<int16_t> snIn(mySai.GetLength()); // 入力波形表示で使用 |
MikamiUitOpen | 10:56f2f01df983 | 42 | Array<int16_t> snOut(mySai.GetLength()); // 出力波形表示で使用 |
MikamiUitOpen | 8:9378fea59845 | 43 | |
MikamiUitOpen | 10:56f2f01df983 | 44 | mySai.RecordIn(); // 入力開始 |
MikamiUitOpen | 10:56f2f01df983 | 45 | mySai.PlayOut(); // 出力開始 |
MikamiUitOpen | 10:56f2f01df983 | 46 | mySai.PauseOut(); // 出力一時停止 |
MikamiUitOpen | 0:f064b50f238e | 47 | |
MikamiUitOpen | 10:56f2f01df983 | 48 | int menuNum = 0; |
MikamiUitOpen | 0:f064b50f238e | 49 | while (true) |
MikamiUitOpen | 0:f064b50f238e | 50 | { |
MikamiUitOpen | 0:f064b50f238e | 51 | // On/OFF の設定 |
MikamiUitOpen | 0:f064b50f238e | 52 | int num; |
MikamiUitOpen | 10:56f2f01df983 | 53 | if (onOff->GetTouchedNumber(num)) |
MikamiUitOpen | 9:1221ba81a1bb | 54 | { |
MikamiUitOpen | 10:56f2f01df983 | 55 | if (num == 0) mySai.ResumeOut(); // 出力再開 |
MikamiUitOpen | 9:1221ba81a1bb | 56 | else mySai.PauseOut(); |
MikamiUitOpen | 9:1221ba81a1bb | 57 | } |
MikamiUitOpen | 0:f064b50f238e | 58 | |
MikamiUitOpen | 10:56f2f01df983 | 59 | // 信号処理の種類の切り替えに対応する GUI 部品の状態の設定 |
MikamiUitOpen | 10:56f2f01df983 | 60 | if (menu->GetTouchedNumber(menuNum)) |
MikamiUitOpen | 10:56f2f01df983 | 61 | fPtr[menuNum](barReverb, barFqCh, frqLabel); |
MikamiUitOpen | 10:56f2f01df983 | 62 | |
MikamiUitOpen | 10:56f2f01df983 | 63 | // 残響の長さを設定 |
MikamiUitOpen | 10:56f2f01df983 | 64 | if ( (menuNum == 1) && (barReverb->Slide()) ) |
MikamiUitOpen | 10:56f2f01df983 | 65 | reverb.SetDelay(barReverb->GetIntValue()); |
MikamiUitOpen | 9:1221ba81a1bb | 66 | |
MikamiUitOpen | 0:f064b50f238e | 67 | // 周波数シフトの値の設定 |
MikamiUitOpen | 9:1221ba81a1bb | 68 | if ( (menuNum == 2) && (barFqCh->Slide()) ) |
MikamiUitOpen | 9:1221ba81a1bb | 69 | { |
MikamiUitOpen | 9:1221ba81a1bb | 70 | frqLabel->Draw(barFqCh->GetIntValue()); |
MikamiUitOpen | 10:56f2f01df983 | 71 | shifter.SetFrequency(barFqCh->GetIntValue()); |
MikamiUitOpen | 9:1221ba81a1bb | 72 | } |
MikamiUitOpen | 0:f064b50f238e | 73 | |
MikamiUitOpen | 0:f064b50f238e | 74 | //--------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 75 | // 1フレーム分の信号処理を行い,その結果を出力する |
MikamiUitOpen | 10:56f2f01df983 | 76 | if (mySai.IsCompleted()) |
MikamiUitOpen | 0:f064b50f238e | 77 | { |
MikamiUitOpen | 0:f064b50f238e | 78 | for (int n=0; n<mySai.GetLength(); n++) |
MikamiUitOpen | 0:f064b50f238e | 79 | { |
MikamiUitOpen | 0:f064b50f238e | 80 | int16_t xL, xR; |
MikamiUitOpen | 0:f064b50f238e | 81 | mySai.Input(xL, xR); |
MikamiUitOpen | 0:f064b50f238e | 82 | int16_t xn = xL + xR; |
MikamiUitOpen | 10:56f2f01df983 | 83 | snIn[n] = xn; // 表示用 |
MikamiUitOpen | 0:f064b50f238e | 84 | |
MikamiUitOpen | 0:f064b50f238e | 85 | //------------------------------------------------------- |
MikamiUitOpen | 10:56f2f01df983 | 86 | int16_t yn = func[menuNum]->Execute(xn); // 信号処理実行 |
MikamiUitOpen | 0:f064b50f238e | 87 | //------------------------------------------------------- |
MikamiUitOpen | 9:1221ba81a1bb | 88 | |
MikamiUitOpen | 0:f064b50f238e | 89 | mySai.Output(yn, yn); // 左右チャンネルに同じ信号を出力 |
MikamiUitOpen | 4:450b3cf1e164 | 90 | snOut[n] = yn; // 表示用 |
MikamiUitOpen | 0:f064b50f238e | 91 | } |
MikamiUitOpen | 9:1221ba81a1bb | 92 | |
MikamiUitOpen | 0:f064b50f238e | 93 | displayIn->Execute(snIn); // 入力波形の表示 |
MikamiUitOpen | 0:f064b50f238e | 94 | displayOut->Execute(snOut); // 出力波形の表示 |
MikamiUitOpen | 9:1221ba81a1bb | 95 | } |
MikamiUitOpen | 0:f064b50f238e | 96 | // 1フレーム分の信号処理はここまで |
MikamiUitOpen | 0:f064b50f238e | 97 | //--------------------------------------------- |
MikamiUitOpen | 0:f064b50f238e | 98 | } |
MikamiUitOpen | 0:f064b50f238e | 99 | } |