/* Show levels (RMS & Peak) for 8 I2S microphone inputs * * Connect 8 INMP411 I2S microphones to Teensy 4.0 * Pin 8 SD on mics #1 and #2 * Pin 6 SD on mics #3 and #4 * Pin 9 SD on mics #5 and #6 * Pin 32 SD on mics #7 and #8 * Pin 20 WS on all mics * Pin 21 SCK on all mics * * Each mic needs GND to Teensy GND, VCC to Teensy 3.3V. * Connect L/R to GND on the odd numbered mics * and L/R to 3.3V on the even numbered mics. * * Optional - connect a Teensy Audio Shield or other I2S * output device, but do not connect it to pin 8, because * the INMP411 mics #1 & #2 send their signal to pin 8. * * This example code is in the public domain */ #include #include #include #include #include // If INMP411 mics are not available, the audio shield mic can // be used, but it will send a single signal to inputs #1 & #2 // (if connected to pin 8). //const int myInput = AUDIO_INPUT_LINEIN; const int myInput = AUDIO_INPUT_MIC; AudioInputI2SOct audioInput; // audio shield: mic or line-in AudioAmplifier amp1; AudioAmplifier amp2; AudioAmplifier amp3; AudioAmplifier amp4; AudioAmplifier amp5; AudioAmplifier amp6; AudioAmplifier amp7; AudioAmplifier amp8; AudioAnalyzeRMS rms1; AudioAnalyzeRMS rms2; AudioAnalyzeRMS rms3; AudioAnalyzeRMS rms4; AudioAnalyzeRMS rms5; AudioAnalyzeRMS rms6; AudioAnalyzeRMS rms7; AudioAnalyzeRMS rms8; AudioAnalyzePeak peak1; AudioAnalyzePeak peak2; AudioAnalyzePeak peak3; AudioAnalyzePeak peak4; AudioAnalyzePeak peak5; AudioAnalyzePeak peak6; AudioAnalyzePeak peak7; AudioAnalyzePeak peak8; AudioOutputI2S audioOutput; // audio shield: headphones & line-out // Send all microphone signals to amps AudioConnection r1(audioInput, 0, amp1, 0); AudioConnection r2(audioInput, 1, amp2, 0); AudioConnection r3(audioInput, 2, amp3, 0); AudioConnection r4(audioInput, 3, amp4, 0); AudioConnection r5(audioInput, 4, amp5, 0); AudioConnection r6(audioInput, 5, amp6, 0); AudioConnection r7(audioInput, 6, amp7, 0); AudioConnection r8(audioInput, 7, amp8, 0); // Connect the amps to RMS and Peak analyzers AudioConnection a1(amp1, 0, rms1, 0); AudioConnection a2(amp2, 0, rms2, 0); AudioConnection a3(amp3, 0, rms3, 0); AudioConnection a4(amp4, 0, rms4, 0); AudioConnection a5(amp5, 0, rms5, 0); AudioConnection a6(amp6, 0, rms6, 0); AudioConnection a7(amp7, 0, rms7, 0); AudioConnection a8(amp8, 0, rms8, 0); AudioConnection p1(amp1, 0, peak1, 0); AudioConnection p2(amp2, 0, peak2, 0); AudioConnection p3(amp3, 0, peak3, 0); AudioConnection p4(amp4, 0, peak4, 0); AudioConnection p5(amp5, 0, peak5, 0); AudioConnection p6(amp6, 0, peak6, 0); AudioConnection p7(amp7, 0, peak7, 0); AudioConnection p8(amp8, 0, peak8, 0); // Also connect 2 of the amps to an I2S output (Pin 8) // to be able to listen to the sound. AudioConnection c10(amp1, 0, audioOutput, 0); AudioConnection c11(amp2, 0, audioOutput, 1); AudioControlSGTL5000 audioShield; void setup() { AudioMemory(26); audioShield.enable(); audioShield.inputSelect(myInput); audioShield.micGain(12); audioShield.volume(0.5); const float microphoneAmplification = 72.0; amp1.gain(microphoneAmplification); amp2.gain(microphoneAmplification); amp3.gain(microphoneAmplification); amp4.gain(microphoneAmplification); amp5.gain(microphoneAmplification); amp6.gain(microphoneAmplification); amp7.gain(microphoneAmplification); amp8.gain(microphoneAmplification); Serial.begin(9600); } elapsedMillis fps; void loop() { if (fps > 24) { fps = 0; const int digits = 8; print_bar(1, rms1.read(), peak1.readPeakToPeak()/2, digits); print_bar(2, rms2.read(), peak2.readPeakToPeak()/2, digits); print_bar(3, rms3.read(), peak3.readPeakToPeak()/2, digits); print_bar(4, rms4.read(), peak4.readPeakToPeak()/2, digits); print_bar(5, rms5.read(), peak5.readPeakToPeak()/2, digits); print_bar(6, rms6.read(), peak6.readPeakToPeak()/2, digits); print_bar(7, rms7.read(), peak7.readPeakToPeak()/2, digits); print_bar(8, rms8.read(), peak8.readPeakToPeak()/2, digits); Serial.println(); } } void print_bar(int in, float rms, float peak, int digits) { Serial.print(in); Serial.print(":"); int num_rms = roundf(rms * digits); int num_peak = roundf(peak * digits); for (int i=0; i < digits; i++) { if (i < num_rms) { Serial.print("*"); } else if (i < num_peak) { Serial.print(">"); } else { Serial.print(" "); } } Serial.print(" "); }