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

Committer:
MikamiUitOpen
Date:
Mon Apr 10 13:44:13 2017 +0000
Revision:
10:56f2f01df983
Parent:
9:1221ba81a1bb
11

Who changed what in which revision?

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