Code:
// Steven's Room Analyzer and Room Correction Filter Generation
//
//
// A special thank you to Paul Stoffregen and his team for
// developing such a great open source device that supports audio
// DSP. This project was developed on Teensy 3.2 with and audio
// shield
#include <LiquidCrystal.h>
#include <Bounce.h>
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Time.h>
#include <TimeAlarms.h>
// GUItool: begin automatically generated code
AudioInputAnalog adc1; //xy=81,20
AudioInputI2S i2s1; //xy=80.88336181640625,296.8833312988281
AudioSynthNoisePink pink1; //xy=84.00003051757812,160
AudioSynthNoisePink pink3; //xy=83.88333129882812,232.88333129882812
AudioSynthNoisePink pink2; //xy=84.88333129882812,196.88333129882812
AudioSynthToneSweep tonesweep1; //xy=87.00003051757812,52
AudioSynthToneSweep tonesweep2; //xy=88.88333129882812,85.88333129882812
AudioSynthToneSweep tonesweep3; //xy=93.88333129882812,120.88333129882812
AudioMixer4 mixer1; //xy=111.00003051757812,408
AudioFilterBiquad biquad79; //xy=267.8833770751953,1577.883316040039
AudioFilterBiquad biquad77; //xy=269.8833770751953,1544.883316040039
AudioFilterBiquad biquad75; //xy=272.8833770751953,1511.883316040039
AudioFilterBiquad biquad73; //xy=273.8833770751953,1475.883316040039
AudioFilterBiquad biquad69; //xy=274.8833770751953,1403.883316040039
AudioFilterBiquad biquad71; //xy=274.8833770751953,1440.883316040039
AudioFilterBiquad biquad67; //xy=276.8833770751953,1366.883316040039
AudioFilterBiquad biquad63; //xy=279.8833770751953,1299.883316040039
AudioFilterBiquad biquad1; //xy=286.0000762939453,209.99998474121094
AudioFilterBiquad biquad15; //xy=285.8833770751953,452.8833465576172
AudioFilterBiquad biquad17; //xy=285.8833923339844,488.88331604003906
AudioFilterBiquad biquad3; //xy=286.8833770751953,245.88328552246094
AudioFilterBiquad biquad61; //xy=282.8833770751953,1266.883316040039
AudioFilterBiquad biquad11; //xy=286.8833770751953,381.8833465576172
AudioFilterBiquad biquad59; //xy=283.8833770751953,1229.883316040039
AudioFilterBiquad biquad5; //xy=287.8833770751953,277.8833465576172
AudioFilterBiquad biquad13; //xy=287.8833770751953,417.8833465576172
AudioFilterBiquad biquad57; //xy=284.8833770751953,1196.883316040039
AudioFilterBiquad biquad19; //xy=287.8833923339844,521.8833160400391
AudioFilterBiquad biquad7; //xy=288.8833770751953,312.8833465576172
AudioFilterBiquad biquad9; //xy=288.8833770751953,345.8833465576172
AudioFilterBiquad biquad21; //xy=288.8833923339844,556.8833160400391
AudioFilterBiquad biquad23; //xy=288.8833770751953,590.8833160400391
AudioFilterBiquad biquad25; //xy=288.8833770751953,625.8832550048828
AudioFilterBiquad biquad27; //xy=288.8833770751953,661.8832550048828
AudioFilterBiquad biquad65; //xy=286.8833770751953,1330.883316040039
AudioFilterBiquad biquad39; //xy=288.8833770751953,871.8833160400391
AudioFilterBiquad biquad55; //xy=287.8833770751953,1161.883316040039
AudioFilterBiquad biquad37; //xy=289.8833770751953,836.8833160400391
AudioFilterBiquad biquad51; //xy=288.8833770751953,1089.883316040039
AudioFilterBiquad biquad53; //xy=288.8833770751953,1124.883316040039
AudioFilterBiquad biquad41; //xy=289.8833770751953,909.8833160400391
AudioFilterBiquad biquad29; //xy=290.8833770751953,694.8832550048828
AudioFilterBiquad biquad33; //xy=290.8833770751953,766.8832550048828
AudioFilterBiquad biquad35; //xy=290.8833770751953,802.8832550048828
AudioFilterBiquad biquad49; //xy=290.8833770751953,1053.883316040039
AudioFilterBiquad biquad47; //xy=291.8833770751953,1016.8832550048828
AudioFilterBiquad biquad43; //xy=292.8833770751953,943.8833160400391
AudioFilterBiquad biquad31; //xy=293.8833770751953,731.8832550048828
AudioFilterBiquad biquad45; //xy=294.8833770751953,980.8833160400391
AudioMixer4 mixer5; //xy=407.88336181640625,262.8833770751953
AudioMixer4 mixer23; //xy=405.88336181640625,1532.883316040039
AudioMixer4 mixer33; //xy=412.8833312988281,34.883331298828125
AudioMixer4 mixer21; //xy=410.88336181640625,1384.883316040039
AudioMixer4 mixer7; //xy=414.88336181640625,402.8833465576172
AudioMixer4 mixer19; //xy=414.88336181640625,1252.2833404541016
AudioMixer4 mixer34; //xy=420.8833312988281,173.88333129882812
AudioMixer4 mixer9; //xy=419.88336181640625,538.8833160400391
AudioMixer4 mixer13; //xy=418.88336181640625,816.8832550048828
AudioMixer4 mixer11; //xy=420.88336181640625,676.8833160400391
AudioMixer4 mixer17; //xy=421.88336181640625,1108.683364868164
AudioMixer4 mixer15; //xy=427.88336181640625,966.6833038330078
AudioMixer4 mixer2; //xy=587,464
AudioAnalyzeFFT1024 fft1024_2; //xy=737.8833312988281,86.88333129882812
AudioAnalyzeFFT1024 fft1024_1; //xy=739,27
AudioFilterBiquad biquad6; //xy=755.88330078125,287.88330078125
AudioFilterBiquad biquad36; //xy=753.88330078125,840.8833312988281
AudioFilterBiquad biquad32; //xy=754.88330078125,765.8832702636719
AudioFilterBiquad biquad34; //xy=754.88330078125,800.8833312988281
AudioFilterBiquad biquad8; //xy=756.88330078125,326.88330078125
AudioFilterBiquad biquad10; //xy=756.8833312988281,362.8833312988281
AudioFilterBiquad biquad14; //xy=757.88330078125,431.8832702636719
AudioFilterBiquad biquad2; //xy=759,214.00003051757812
AudioFilterBiquad biquad24; //xy=757.88330078125,618.8833618164062
AudioFilterBiquad biquad12; //xy=758.88330078125,396.8832702636719
AudioFilterBiquad biquad28; //xy=757.88330078125,694.8833312988281
AudioFilterBiquad biquad30; //xy=757.88330078125,730.8832702636719
AudioFilterBiquad biquad4; //xy=759.88330078125,250.88330078125
AudioFilterBiquad biquad22; //xy=758.88330078125,578.8833618164062
AudioFilterBiquad biquad26; //xy=758.88330078125,655.8833312988281
AudioFilterBiquad biquad16; //xy=759.88330078125,468.88336181640625
AudioFilterBiquad biquad18; //xy=759.88330078125,504.8833312988281
AudioFilterBiquad biquad20; //xy=759.88330078125,544.8833312988281
AudioFilterBiquad biquad44; //xy=762.88330078125,997.8832702636719
AudioFilterBiquad biquad38; //xy=763.88330078125,880.8832702636719
AudioFilterBiquad biquad42; //xy=763.88330078125,959.8832702636719
AudioFilterBiquad biquad40; //xy=764.88330078125,918.8833312988281
AudioFilterBiquad biquad46; //xy=764.88330078125,1034.8833312988281
AudioFilterBiquad biquad48; //xy=764.88330078125,1071.8833312988281
AudioFilterBiquad biquad50; //xy=768.88330078125,1110.8833312988281
AudioFilterBiquad biquad52; //xy=769.88330078125,1154.8833312988281
AudioFilterBiquad biquad64; //xy=769.88330078125,1382.8833312988281
AudioFilterBiquad biquad66; //xy=770.88330078125,1418.8833312988281
AudioFilterBiquad biquad60; //xy=771.88330078125,1311.8833312988281
AudioFilterBiquad biquad78; //xy=770.88330078125,1635.8833312988281
AudioFilterBiquad biquad68; //xy=771.88330078125,1456.8833312988281
AudioFilterBiquad biquad58; //xy=772.88330078125,1272.8833312988281
AudioFilterBiquad biquad72; //xy=771.88330078125,1527.8833312988281
AudioFilterBiquad biquad62; //xy=772.88330078125,1348.8833312988281
AudioFilterBiquad biquad80; //xy=771.88330078125,1673.8833312988281
AudioFilterBiquad biquad70; //xy=772.88330078125,1492.8833312988281
AudioFilterBiquad biquad74; //xy=772.88330078125,1560.8833312988281
AudioFilterBiquad biquad54; //xy=775.88330078125,1192.8833923339844
AudioFilterBiquad biquad56; //xy=775.88330078125,1232.8833312988281
AudioFilterBiquad biquad76; //xy=774.88330078125,1598.8833312988281
AudioMixer4 mixer8; //xy=903.88330078125,423.88330078125
AudioMixer4 mixer22; //xy=902.88330078125,1474.8832397460938
AudioMixer4 mixer20; //xy=903.88330078125,1332.8832397460938
AudioMixer4 mixer24; //xy=902.88330078125,1614.8832397460938
AudioMixer4 mixer14; //xy=906.88330078125,864.88330078125
AudioMixer4 mixer12; //xy=907.88330078125,724.88330078125
AudioMixer4 mixer6; //xy=909.88330078125,248.88333129882812
AudioMixer4 mixer18; //xy=907.88330078125,1169.8832397460938
AudioMixer4 mixer16; //xy=910.88330078125,1016.88330078125
AudioMixer4 mixer10; //xy=919.88330078125,557.88330078125
AudioMixer4 mixer29; //xy=1217.7167053222656,281.0834655761719
AudioMixer4 mixer27; //xy=1221.7167053222656,209.48336791992188
AudioMixer4 mixer25; //xy=1222.7167053222656,125.48333740234375
AudioMixer4 mixer26; //xy=1227.7166748046875,429.88323974609375
AudioMixer4 mixer30; //xy=1227.7166748046875,581.0833129882812
AudioMixer4 mixer28; //xy=1228.7166748046875,506.2833251953125
AudioMixer4 mixer31; //xy=1538.88330078125,203.28326416015625
AudioMixer4 mixer32; //xy=1551.88330078125,414.28326416015625
AudioMixer4 mixer3; //xy=1848.88330078125,292.08331298828125
AudioMixer4 mixer4; //xy=1850.8832702636719,364.08331298828125
AudioAnalyzeRMS rms_L; //xy=1977.9999694824219,270.1999816894531
AudioAnalyzeRMS rms_R; //xy=1980.9999694824219,391.1999816894531
AudioAnalyzePeak peak_L;
AudioAnalyzePeak peak_R;
AudioAnalyzeRMS rms_L1; //xy=1977.9999694824219,270.1999816894531
AudioAnalyzeRMS rms_R1; //xy=1980.9999694824219,391.1999816894531
AudioAnalyzePeak peak_L1;
AudioAnalyzePeak peak_R1;
AudioOutputI2S i2s2; //xy=1981.8832702636719,334.08331298828125
AudioConnection c1(i2s1, 0, peak_L, 0);
AudioConnection c2(i2s1, 1, peak_R, 0);
AudioConnection c3(i2s1,0,rms_L,0);
AudioConnection c4(i2s1,1,rms_R,0);
AudioConnection c5(tonesweep1, 0, peak_L1, 0);
AudioConnection c6(tonesweep1, 1, peak_R1, 0);
AudioConnection c7(tonesweep1,0,rms_L1,0);
AudioConnection c8(tonesweep1,1,rms_R1,0);
AudioConnection patchCord1(adc1, 0, mixer33, 3);
AudioConnection patchCord2(i2s1, 0, mixer33, 0);
AudioConnection patchCord3(i2s1, 1, mixer33, 1);
AudioConnection patchCord4(pink1, 0, mixer34, 1);
AudioConnection patchCord5(pink3, 0, mixer1, 1);
AudioConnection patchCord6(pink3, 0, mixer2, 1);
AudioConnection patchCord7(pink2, 0, mixer29, 3);
AudioConnection patchCord8(pink2, 0, mixer30, 3);
AudioConnection patchCord9(tonesweep1, 0, mixer34, 0);
AudioConnection patchCord10(tonesweep2, 0, mixer31, 3);
AudioConnection patchCord11(tonesweep2, 0, mixer32, 3);
AudioConnection patchCord12(tonesweep3, 0, mixer1, 0);
AudioConnection patchCord13(tonesweep3, 0, mixer2, 0);
AudioConnection patchCord14(mixer1, biquad1);
AudioConnection patchCord15(mixer1, biquad3);
AudioConnection patchCord16(mixer1, biquad5);
AudioConnection patchCord17(mixer1, biquad7);
AudioConnection patchCord18(mixer1, biquad9);
AudioConnection patchCord19(mixer1, biquad11);
AudioConnection patchCord20(mixer1, biquad13);
AudioConnection patchCord21(mixer1, biquad15);
AudioConnection patchCord22(mixer1, biquad79);
AudioConnection patchCord23(mixer1, biquad77);
AudioConnection patchCord24(mixer1, biquad75);
AudioConnection patchCord25(mixer1, biquad73);
AudioConnection patchCord26(mixer1, biquad71);
AudioConnection patchCord27(mixer1, biquad69);
AudioConnection patchCord28(mixer1, biquad67);
AudioConnection patchCord29(mixer1, biquad65);
AudioConnection patchCord30(mixer1, biquad63);
AudioConnection patchCord31(mixer1, biquad61);
AudioConnection patchCord32(mixer1, biquad59);
AudioConnection patchCord33(mixer1, biquad57);
AudioConnection patchCord34(mixer1, biquad55);
AudioConnection patchCord35(mixer1, biquad53);
AudioConnection patchCord36(mixer1, biquad51);
AudioConnection patchCord37(mixer1, biquad49);
AudioConnection patchCord38(mixer1, biquad47);
AudioConnection patchCord39(mixer1, biquad45);
AudioConnection patchCord40(mixer1, biquad43);
AudioConnection patchCord41(mixer1, biquad41);
AudioConnection patchCord42(mixer1, biquad39);
AudioConnection patchCord43(mixer1, biquad37);
AudioConnection patchCord44(mixer1, biquad35);
AudioConnection patchCord45(mixer1, biquad33);
AudioConnection patchCord46(mixer1, biquad31);
AudioConnection patchCord47(mixer1, biquad29);
AudioConnection patchCord48(mixer1, biquad27);
AudioConnection patchCord49(mixer1, biquad25);
AudioConnection patchCord50(mixer1, biquad23);
AudioConnection patchCord51(mixer1, biquad21);
AudioConnection patchCord52(mixer1, biquad19);
AudioConnection patchCord53(mixer1, biquad17);
AudioConnection patchCord54(biquad79, 0, mixer23, 3);
AudioConnection patchCord55(biquad77, 0, mixer23, 2);
AudioConnection patchCord56(biquad75, 0, mixer23, 1);
AudioConnection patchCord57(biquad73, 0, mixer23, 0);
AudioConnection patchCord58(biquad69, 0, mixer21, 2);
AudioConnection patchCord59(biquad71, 0, mixer21, 3);
AudioConnection patchCord60(biquad67, 0, mixer21, 1);
AudioConnection patchCord61(biquad63, 0, mixer19, 3);
AudioConnection patchCord62(biquad1, 0, mixer5, 0);
AudioConnection patchCord63(biquad15, 0, mixer7, 3);
AudioConnection patchCord64(biquad17, 0, mixer9, 0);
AudioConnection patchCord65(biquad3, 0, mixer5, 1);
AudioConnection patchCord66(biquad61, 0, mixer19, 2);
AudioConnection patchCord67(biquad11, 0, mixer7, 1);
AudioConnection patchCord68(biquad59, 0, mixer19, 1);
AudioConnection patchCord69(biquad5, 0, mixer5, 2);
AudioConnection patchCord70(biquad13, 0, mixer7, 2);
AudioConnection patchCord71(biquad57, 0, mixer19, 0);
AudioConnection patchCord72(biquad19, 0, mixer9, 1);
AudioConnection patchCord73(biquad7, 0, mixer5, 3);
AudioConnection patchCord74(biquad9, 0, mixer7, 0);
AudioConnection patchCord75(biquad21, 0, mixer9, 2);
AudioConnection patchCord76(biquad23, 0, mixer9, 3);
AudioConnection patchCord77(biquad25, 0, mixer11, 0);
AudioConnection patchCord78(biquad27, 0, mixer11, 1);
AudioConnection patchCord79(biquad65, 0, mixer21, 0);
AudioConnection patchCord80(biquad39, 0, mixer13, 3);
AudioConnection patchCord81(biquad55, 0, mixer17, 3);
AudioConnection patchCord82(biquad37, 0, mixer13, 2);
AudioConnection patchCord83(biquad51, 0, mixer17, 1);
AudioConnection patchCord84(biquad53, 0, mixer17, 2);
AudioConnection patchCord85(biquad41, 0, mixer15, 0);
AudioConnection patchCord86(biquad29, 0, mixer11, 2);
AudioConnection patchCord87(biquad33, 0, mixer13, 0);
AudioConnection patchCord88(biquad35, 0, mixer13, 1);
AudioConnection patchCord89(biquad49, 0, mixer17, 0);
AudioConnection patchCord90(biquad47, 0, mixer15, 3);
AudioConnection patchCord91(biquad43, 0, mixer15, 1);
AudioConnection patchCord92(biquad31, 0, mixer11, 3);
AudioConnection patchCord93(biquad45, 0, mixer15, 2);
AudioConnection patchCord94(mixer5, 0, mixer25, 0);
AudioConnection patchCord95(mixer23, 0, mixer29, 1);
AudioConnection patchCord96(mixer33, fft1024_2);
AudioConnection patchCord97(mixer21, 0, mixer29, 0);
AudioConnection patchCord98(mixer7, 0, mixer25, 1);
AudioConnection patchCord99(mixer19, 0, mixer27, 3);
AudioConnection patchCord100(mixer34, fft1024_1);
AudioConnection patchCord101(mixer9, 0, mixer25, 2);
AudioConnection patchCord102(mixer13, 0, mixer27, 0);
AudioConnection patchCord103(mixer11, 0, mixer25, 3);
AudioConnection patchCord104(mixer17, 0, mixer27, 2);
AudioConnection patchCord105(mixer15, 0, mixer27, 1);
AudioConnection patchCord106(mixer2, biquad2);
AudioConnection patchCord107(mixer2, biquad80);
AudioConnection patchCord108(mixer2, biquad78);
AudioConnection patchCord109(mixer2, biquad76);
AudioConnection patchCord110(mixer2, biquad74);
AudioConnection patchCord111(mixer2, biquad72);
AudioConnection patchCord112(mixer2, biquad70);
AudioConnection patchCord113(mixer2, biquad68);
AudioConnection patchCord114(mixer2, biquad66);
AudioConnection patchCord115(mixer2, biquad64);
AudioConnection patchCord116(mixer2, biquad62);
AudioConnection patchCord117(mixer2, biquad60);
AudioConnection patchCord118(mixer2, biquad58);
AudioConnection patchCord119(mixer2, biquad56);
AudioConnection patchCord120(mixer2, biquad54);
AudioConnection patchCord121(mixer2, biquad52);
AudioConnection patchCord122(mixer2, biquad50);
AudioConnection patchCord123(mixer2, biquad48);
AudioConnection patchCord124(mixer2, biquad46);
AudioConnection patchCord125(mixer2, biquad44);
AudioConnection patchCord126(mixer2, biquad42);
AudioConnection patchCord127(mixer2, biquad40);
AudioConnection patchCord128(mixer2, biquad38);
AudioConnection patchCord129(mixer2, biquad36);
AudioConnection patchCord130(mixer2, biquad34);
AudioConnection patchCord131(mixer2, biquad32);
AudioConnection patchCord132(mixer2, biquad30);
AudioConnection patchCord133(mixer2, biquad28);
AudioConnection patchCord134(mixer2, biquad26);
AudioConnection patchCord135(mixer2, biquad24);
AudioConnection patchCord136(mixer2, biquad22);
AudioConnection patchCord137(mixer2, biquad20);
AudioConnection patchCord138(mixer2, biquad18);
AudioConnection patchCord139(mixer2, biquad16);
AudioConnection patchCord140(mixer2, biquad14);
AudioConnection patchCord141(mixer2, biquad12);
AudioConnection patchCord142(mixer2, biquad10);
AudioConnection patchCord143(mixer2, biquad8);
AudioConnection patchCord144(mixer2, biquad6);
AudioConnection patchCord145(mixer2, biquad4);
AudioConnection patchCord146(biquad6, 0, mixer6, 2);
AudioConnection patchCord147(biquad36, 0, mixer14, 1);
AudioConnection patchCord148(biquad32, 0, mixer12, 3);
AudioConnection patchCord149(biquad34, 0, mixer14, 0);
AudioConnection patchCord150(biquad8, 0, mixer6, 3);
AudioConnection patchCord151(biquad10, 0, mixer8, 0);
AudioConnection patchCord152(biquad14, 0, mixer8, 2);
AudioConnection patchCord153(biquad2, 0, mixer6, 0);
AudioConnection patchCord154(biquad24, 0, mixer10, 3);
AudioConnection patchCord155(biquad12, 0, mixer8, 1);
AudioConnection patchCord156(biquad28, 0, mixer12, 1);
AudioConnection patchCord157(biquad30, 0, mixer12, 2);
AudioConnection patchCord158(biquad4, 0, mixer6, 1);
AudioConnection patchCord159(biquad22, 0, mixer10, 2);
AudioConnection patchCord160(biquad26, 0, mixer12, 0);
AudioConnection patchCord161(biquad16, 0, mixer8, 3);
AudioConnection patchCord162(biquad18, 0, mixer10, 0);
AudioConnection patchCord163(biquad20, 0, mixer10, 1);
AudioConnection patchCord164(biquad44, 0, mixer16, 1);
AudioConnection patchCord165(biquad38, 0, mixer14, 2);
AudioConnection patchCord166(biquad42, 0, mixer16, 0);
AudioConnection patchCord167(biquad40, 0, mixer14, 3);
AudioConnection patchCord168(biquad46, 0, mixer16, 2);
AudioConnection patchCord169(biquad48, 0, mixer16, 3);
AudioConnection patchCord170(biquad50, 0, mixer18, 0);
AudioConnection patchCord171(biquad52, 0, mixer18, 1);
AudioConnection patchCord172(biquad64, 0, mixer20, 3);
AudioConnection patchCord173(biquad66, 0, mixer22, 0);
AudioConnection patchCord174(biquad60, 0, mixer20, 1);
AudioConnection patchCord175(biquad78, 0, mixer24, 2);
AudioConnection patchCord176(biquad68, 0, mixer22, 1);
AudioConnection patchCord177(biquad58, 0, mixer20, 0);
AudioConnection patchCord178(biquad72, 0, mixer22, 3);
AudioConnection patchCord179(biquad62, 0, mixer20, 2);
AudioConnection patchCord180(biquad80, 0, mixer24, 3);
AudioConnection patchCord181(biquad70, 0, mixer22, 2);
AudioConnection patchCord182(biquad74, 0, mixer24, 0);
AudioConnection patchCord183(biquad54, 0, mixer18, 2);
AudioConnection patchCord184(biquad56, 0, mixer18, 3);
AudioConnection patchCord185(biquad76, 0, mixer24, 1);
AudioConnection patchCord186(mixer8, 0, mixer26, 1);
AudioConnection patchCord187(mixer22, 0, mixer30, 0);
AudioConnection patchCord188(mixer20, 0, mixer28, 3);
AudioConnection patchCord189(mixer24, 0, mixer30, 1);
AudioConnection patchCord190(mixer14, 0, mixer28, 0);
AudioConnection patchCord191(mixer12, 0, mixer26, 3);
AudioConnection patchCord192(mixer6, 0, mixer26, 0);
AudioConnection patchCord193(mixer18, 0, mixer28, 2);
AudioConnection patchCord194(mixer16, 0, mixer28, 1);
AudioConnection patchCord195(mixer10, 0, mixer26, 2);
AudioConnection patchCord196(mixer29, 0, mixer31, 2);
AudioConnection patchCord197(mixer27, 0, mixer31, 1);
AudioConnection patchCord198(mixer25, 0, mixer31, 0);
AudioConnection patchCord199(mixer26, 0, mixer32, 0);
AudioConnection patchCord200(mixer30, 0, mixer32, 2);
AudioConnection patchCord201(mixer28, 0, mixer32, 1);
AudioConnection patchCord202(mixer31, 0, mixer3, 0);
AudioConnection patchCord203(mixer32, 0, mixer4, 0);
AudioConnection patchCord204(mixer3, 0, i2s2, 0);
AudioConnection patchCord205(mixer3, rms_L);
AudioConnection patchCord206(mixer4, 0, i2s2, 1);
AudioConnection patchCord207(mixer4, rms_R);
AudioControlSGTL5000 sgtl5000_1; //xy=1903.8832397460938,49.88328552246094
// GUItool: end automatically generated code
/*
*
* Pete’s Tonesweep starts here
*
// GUItool: begin automatically generated code
AudioSynthToneSweep tonesweep1; //xy=255,382
//AudioOutputI2S i2s3; //xy=763,360
AudioConnection patchCord6(tonesweep1, 0, i2s2, 0);
AudioConnection patchCord7(tonesweep1, 0, i2s2, 1);
//AudioControlSGTL5000 sgtl5000_1; //xy=242,174
// GUItool: end automatically generated code
*
* Pete’s Tonesweep ends here
*
*/
//const int myInput = AUDIO_INPUT_LINEIN;
const int myInput = AUDIO_INPUT_MIC;
// The scale sets how much sound is needed in each frequency range to
// show all 8 bars. Higher numbers are more sensitive.
float scale = 60.0;
// An array to hold the 16 frequency bands
float level[16];
// This array holds the on-screen levels. When the signal drops quickly,
// these are used to lower the on-screen level 1 bar per update, which
// looks more pleasing to corresponds to human sound perception.
int shown[16];
// Use the LiquidCrystal library to display the spectrum
//
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);
byte bar1[8] = {0,0,0,0,0,0,0,255};
byte bar2[8] = {0,0,0,0,0,0,255,255}; // 8 bar graph
byte bar3[8] = {0,0,0,0,0,255,255,255}; // custom
byte bar4[8] = {0,0,0,0,255,255,255,255}; // characters
byte bar5[8] = {0,0,0,255,255,255,255,255};
byte bar6[8] = {0,0,255,255,255,255,255,255};
byte bar7[8] = {0,255,255,255,255,255,255,255};
byte bar8[8] = {255,255,255,255,255,255,255,255};
/*
void pinkOFF(){
pink2.amplitude(0.00);
Serial.println("Pink off initialized");
}
*/
void setup() {
Serial.begin(115200);
while(!Serial);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);
//AudioMemory(4);
AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset();
// Audio memory allocation
AudioMemory(95);
// Enable the audio shield and set the output volume.
sgtl5000_1.enable();
sgtl5000_1.inputSelect(myInput);
sgtl5000_1.volume(0.5);
// turn on the LCD and define the custom characters
lcd.begin(16, 2);
lcd.print("Audio Spectrum");
lcd.createChar(0, bar1);
lcd.createChar(1, bar2);
lcd.createChar(2, bar3);
lcd.createChar(3, bar4);
lcd.createChar(4, bar5);
lcd.createChar(5, bar6);
lcd.createChar(6, bar7);
lcd.createChar(7, bar8);
/*
// configure the mixer to equally add left & right
mixer1.gain(0, 0.5);
mixer1.gain(1, 0.5);
*/
// Compensation gain for additive gain from filters
// Reduce signal on Left and right channels by -9dB
mixer1.gain(0, powf(10.0f, -9 / 20.0f)); // any # between 0 and 1 instead of powf(10.0f, -9 / 20.0f)
mixer1.gain(1, powf(10.0f, -9 / 20.0f));
mixer2.gain(0, powf(10.0f, -9 / 20.0f) );
mixer2.gain(1, powf(10.0f, -9 / 20.0f));
// pin 21 will select rapid vs animated display
pinMode(21, INPUT_PULLUP);
// Butterworth filter, 12 db/octave
biquad1.setBandpass(0, 43, 0.716667);
biquad2.setBandpass(0, 43, 0.716667);
biquad3.setBandpass(0, 108, 2.5116);
biquad4.setBandpass(0, 108, 2.5116);
biquad5.setBandpass(0, 215, 2.5);
biquad6.setBandpass(0, 215, 2.5);
biquad7.setBandpass(0, 365, 2.829);
biquad8.setBandpass(0, 365, 2.829);
biquad9.setBandpass(0, 559, 3.25);
biquad10.setBandpass(0, 559, 3.25);
biquad11.setBandpass(0, 817, 3.16667);
biquad12.setBandpass(0, 817, 3.16667);
biquad13.setBandpass(0, 1182, 3.05);
biquad14.setBandpass(0, 1182, 3.05);
biquad15.setBandpass(0, 1699, 3);
biquad16.setBandpass(0, 1699, 3);
biquad17.setBandpass(0, 2430, 2.974);
biquad18.setBandpass(0, 2430, 2.974);
biquad19.setBandpass(0, 3440, 3.08);
biquad20.setBandpass(0, 3440, 3.08);
biquad21.setBandpass(0, 4838, 3);
biquad22.setBandpass(0, 4838, 3);
biquad23.setBandpass(0, 6816, 3);
biquad24.setBandpass(0, 6816, 3);
biquad25.setBandpass(0, 9546, 3.08);
biquad26.setBandpass(0, 9546, 3.08);
biquad27.setBandpass(0, 13309, 3.06);
biquad28.setBandpass(0, 13309, 3.06);
biquad29.setBandpass(0, 18770, 2.89);
biquad30.setBandpass(0, 18770, 2.89);
}
elapsedMillis fps;
uint8_t cnt=0;
void loop() {
float max1[20] = {0};
float max2[20] = {0};
delay[2500];
elapsedMillis pinkOFF;
while (pinkOFF < 15000){
pink2.amplitude(0.25);
if(fps > 24) {
if (peak_L.available() && peak_R.available() && rms_L.available() && rms_R.available()) {
fps=0;
uint8_t leftPeak = peak_L.read() * 30.0;
uint8_t rightPeak = peak_R.read() * 30.0;
float leftRMS = rms_L.read() * 30.0;
float rightRMS = rms_R.read() * 30.0;
for (cnt=0; cnt < 30-leftPeak; cnt++) {
Serial.print(" ");
}
while (cnt++ < 29 && cnt < 30-leftRMS) {
Serial.print("<");
}
while (cnt++ < 30) {
Serial.print("=");
}
Serial.print("||");
for(cnt=0; cnt < rightRMS; cnt++) {
Serial.print("=");
}
for(; cnt < rightPeak; cnt++) {
Serial.print(">");
}
while(cnt++ < 30) {
Serial.print(" ");
}
Serial.print(" ");
Serial.print(leftRMS / 30);
Serial.print("||");
Serial.print(rightRMS / 30);
Serial.print(" ");
Serial.print(AudioProcessorUsage());
Serial.print("/");
Serial.print(AudioProcessorUsageMax());
Serial.println();
}
}
}
// Stop the Pink noise
pink2.amplitude(0.00);
delay(5000);
// First Analysis
delay[2500];
tonesweep1.play(1.0, 10, 22050, 30);
while(tonesweep1.isPlaying()){
//pink2.amplitude(0.5);
//while(pink2.amplitude(0.5)){
if (fps >24){
if (fft1024_1.available()) {
// read the 512 FFT frequencies into 16 levels
// music is heard in octaves, but the FFT data
// is linear, so for the higher octaves, read
// many FFT bins together.
level[0] = fft1024_1.read(0);
level[1] = fft1024_1.read(1);
level[2] = fft1024_1.read(2, 3);
level[3] = fft1024_1.read(4, 6);
level[4] = fft1024_1.read(7, 10);
level[5] = fft1024_1.read(11, 15);
level[6] = fft1024_1.read(16, 22);
level[7] = fft1024_1.read(23, 32);
level[8] = fft1024_1.read(33, 46);
level[9] = fft1024_1.read(47, 66);
level[10] = fft1024_1.read(67, 93);
level[11] = fft1024_1.read(94, 131);
level[12] = fft1024_1.read(132, 184);
level[13] = fft1024_1.read(185, 257);
level[14] = fft1024_1.read(258, 359);
level[15] = fft1024_1.read(360, 511);
// See this conversation to change this to more or less than 16 log-scaled bands?
// https://forum.pjrc.com/threads/32677-Is-there-a-logarithmic-function-for-FFT-bin-selection-for-any-given-of-bands
// if you have the volume pot soldered to your audio shield
// uncomment this line to make it adjust the full scale signal
//scale = 8.0 + analogRead(A1) / 5.0;
// begin drawing at the first character on the 2nd row
lcd.setCursor(0, 1);
for (int i=0; i<16; i++) {
Serial.print(level[i]);
if ( max1[i] < level[i])
{
max1[i] = level[i];
}
// TODO: conversion from FFT data to display bars should be
// exponentially scaled. But how keep it a simple example?
int val = level[i] * scale;
if (val > 8) val = 8;
if (val >= shown[i]) {
shown[i] = val;
} else {
if (shown[i] > 0) shown[i] = shown[i] - 1;
val = shown[i];
}
//Serial.print(shown[i]);
Serial.print(" ");
// print each custom digit
if (shown[i] == 0) {
lcd.write(' ');
} else {
lcd.write(shown[i] - 1);
}
}
if (peak_L.available() && peak_R.available() && rms_L.available() && rms_R.available()) {
fps=0;
uint8_t leftPeak = peak_L1.read() * 30.0;
uint8_t rightPeak = peak_R1.read() * 30.0;
float leftRMS = rms_L1.read() * 30.0;
float rightRMS = rms_R1.read() * 30.0;
for (cnt=0; cnt < 30-leftPeak; cnt++) {
Serial.print(" ");
}
while (cnt++ < 29 && cnt < 30-leftRMS) {
Serial.print("<");
}
while (cnt++ < 30) {
Serial.print("=");
}
Serial.print("||");
for(cnt=0; cnt < rightRMS; cnt++) {
Serial.print("=");
}
for(; cnt < rightPeak; cnt++) {
Serial.print(">");
}
while(cnt++ < 30) {
Serial.print(" ");
}
Serial.print(" ");
Serial.print(leftRMS / 30);
Serial.print("||");
Serial.print(leftRMS / 30);
Serial.print(" ");
Serial.print(AudioProcessorUsage());
Serial.print("/");
Serial.print(AudioProcessorUsageMax());
Serial.println();
}
Serial.print(" cpu:");
Serial.println(AudioProcessorUsageMax());
// This is the end of the max audio
}}
}
Serial.println("Your Maximum Value:");
for (int j=0;j<16;j++)
{
Serial.print(max1[j]);
Serial.print(" ");
}
delay(5000);
Serial.println("");
// Second Part starts Here
delay[2500];
////////////////////////// Sweep 2 ////////////////////////////////
////////////////////////////////////////////////////////////////////
tonesweep2.play(0.25, 10, 22050, 30);
while(tonesweep2.isPlaying()){
if (fps >24){
if (fft1024_2.available()) {
// read the 512 FFT frequencies into 16 levels
// music is heard in octaves, but the FFT data
// is linear, so for the higher octaves, read
// many FFT bins together.
level[0] = fft1024_2.read(0);
level[1] = fft1024_2.read(1);
level[2] = fft1024_2.read(2, 3);
level[3] = fft1024_2.read(4, 6);
level[4] = fft1024_2.read(7, 10);
level[5] = fft1024_2.read(11, 15);
level[6] = fft1024_2.read(16, 22);
level[7] = fft1024_2.read(23, 32);
level[8] = fft1024_2.read(33, 46);
level[9] = fft1024_2.read(47, 66);
level[10] = fft1024_2.read(67, 93);
level[11] = fft1024_2.read(94, 131);
level[12] = fft1024_2.read(132, 184);
level[13] = fft1024_2.read(185, 257);
level[14] = fft1024_2.read(258, 359);
level[15] = fft1024_2.read(360, 511);
// See this conversation to change this to more or less than 16 log-scaled bands?
// https://forum.pjrc.com/threads/32677-Is-there-a-logarithmic-function-for-FFT-bin-selection-for-any-given-of-bands
// if you have the volume pot soldered to your audio shield
// uncomment this line to make it adjust the full scale signal
//scale = 8.0 + analogRead(A1) / 5.0;
// begin drawing at the first character on the 2nd row
lcd.setCursor(0, 1);
for (int i=0; i<16; i++) {
Serial.print(level[i]);
if ( max2[i] < level[i])
{
max2[i] = level[i];
}
// TODO: conversion from FFT data to display bars should be
// exponentially scaled. But how keep it a simple example?
int val = level[i] * scale;
if (val > 8) val = 8;
if (val >= shown[i]) {
shown[i] = val;
} else {
if (shown[i] > 0) shown[i] = shown[i] - 1;
val = shown[i];
}
//Serial.print(shown[i]);
Serial.print(" ");
// print each custom digit
if (shown[i] == 0) {
lcd.write(' ');
} else {
lcd.write(shown[i] - 1);
}
}
if (peak_L.available() && peak_R.available() && rms_L.available() && rms_R.available()) {
fps=0;
uint8_t leftPeak = peak_L.read() * 30.0;
uint8_t rightPeak = peak_R.read() * 30.0;
float leftRMS = rms_L.read() * 30.0;
float rightRMS = rms_R.read() * 30.0;
for (cnt=0; cnt < 30-leftPeak; cnt++) {
Serial.print(" ");
}
while (cnt++ < 29 && cnt < 30-leftRMS) {
Serial.print("<");
}
while (cnt++ < 30) {
Serial.print("=");
}
Serial.print("||");
for(cnt=0; cnt < rightRMS; cnt++) {
Serial.print("=");
}
for(; cnt < rightPeak; cnt++) {
Serial.print(">");
}
while(cnt++ < 30) {
Serial.print(" ");
}
Serial.print(" ");
Serial.print(leftRMS / 30);
Serial.print("||");
Serial.print(rightRMS / 30);
Serial.print(" ");
Serial.print(AudioProcessorUsage());
Serial.print("/");
Serial.print(AudioProcessorUsageMax());
Serial.println();
}
Serial.print(" cpu:");
Serial.println(AudioProcessorUsageMax());
// This is the end of the max audio
}}
}
Serial.println("Your Maximum Value:");
for (int j=0;j<16;j++)
{
Serial.print(max2[j]);
Serial.print(" ");
}
delay(5000);
Serial.println("");
/*
// Filter 1 Gain
mixer5.gain(0, filter1gain_L );
mixer6.gain(0, filter1gain_R );
// Filter 2 Gain
mixer5.gain(1, filter2gain_L );
mixer6.gain(1, filter2gain_R );
// Filter 3 Gain
mixer5.gain(2, filter3gain_L );
mixer6.gain(2, filter3gain_R );
// Filter 4 Gain
mixer5.gain(3, filter4gain_L );
mixer6.gain(3, filter4gain_R );
// Filter 5 Gain
mixer7.gain(0, filter5gain_L );
mixer8.gain(0, filter5gain_R );
// Filter 6 Gain
mixer7.gain(1, filter6gain_L );
mixer8.gain(1, filter6gain_R );
// Filter 7 Gain
mixer7.gain(2, filter7gain_L );
mixer8.gain(2, filter7gain_R );
// Filter 8 Gain
mixer7.gain(3, filter8gain_L );
mixer8.gain(3, filter8gain_R );
// Filter 9 Gain
mixer9.gain(0, filter9gain_L );
mixer10.gain(0, filter9gain_R );
// Filter 10 Gain
mixer9.gain(1, filter10gain_L );
mixer10.gain(1, filter10gain_R );
// Filter 11 Gain
mixer9.gain(2, filter11gain_L );
mixer10.gain(2, filter11gain_R );
// Filter 12 Gain
mixer9.gain(3, filter12gain_L );
mixer10.gain(3, filter12gain_R );
// Filter 13 Gain
mixer11.gain(0, filter13gain_L );
mixer12.gain(0, filter13gain_R );
// Filter 14 Gain
mixer11.gain(1, filter14gain_L );
mixer12.gain(1, filter14gain_R );
// Filter 15 Gain
mixer11.gain(2, filter15gain_L );
mixer12.gain(2, filter15gain_R );
*/
/////////////////////////////// Sweep 3 /////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
tonesweep3.play(0.25, 10, 22050, 30);
while(tonesweep3.isPlaying()){
if (fft1024_2.available()) {
// read the 512 FFT frequencies into 16 levels
// music is heard in octaves, but the FFT data
// is linear, so for the higher octaves, read
// many FFT bins together.
level[0] = fft1024_2.read(0);
level[1] = fft1024_2.read(1);
level[2] = fft1024_2.read(2, 3);
level[3] = fft1024_2.read(4, 6);
level[4] = fft1024_2.read(7, 10);
level[5] = fft1024_2.read(11, 15);
level[6] = fft1024_2.read(16, 22);
level[7] = fft1024_2.read(23, 32);
level[8] = fft1024_2.read(33, 46);
level[9] = fft1024_2.read(47, 66);
level[10] = fft1024_2.read(67, 93);
level[11] = fft1024_2.read(94, 131);
level[12] = fft1024_2.read(132, 184);
level[13] = fft1024_2.read(185, 257);
level[14] = fft1024_2.read(258, 359);
level[15] = fft1024_2.read(360, 511);
// See this conversation to change this to more or less than 16 log-scaled bands?
// https://forum.pjrc.com/threads/32677-Is-there-a-logarithmic-function-for-FFT-bin-selection-for-any-given-of-bands
// if you have the volume pot soldered to your audio shield
// uncomment this line to make it adjust the full scale signal
//scale = 8.0 + analogRead(A1) / 5.0;
// begin drawing at the first character on the 2nd row
lcd.setCursor(0, 1);
for (int i=0; i<16; i++) {
Serial.print(level[i]);
if ( max2[i] < level[i])
{
max2[i] = level[i];
}
// TODO: conversion from FFT data to display bars should be
// exponentially scaled. But how keep it a simple example?
int val = level[i] * scale;
if (val > 8) val = 8;
if (val >= shown[i]) {
shown[i] = val;
} else {
if (shown[i] > 0) shown[i] = shown[i] - 1;
val = shown[i];
}
//Serial.print(shown[i]);
Serial.print(" ");
// print each custom digit
if (shown[i] == 0) {
lcd.write(' ');
} else {
lcd.write(shown[i] - 1);
}
}
if (peak_L.available() && peak_R.available() && rms_L.available() && rms_R.available()) {
fps=0;
uint8_t leftPeak = peak_L.read() * 30.0;
uint8_t rightPeak = peak_R.read() * 30.0;
float leftRMS = rms_L.read() * 30.0;
float rightRMS = rms_R.read() * 30.0;
for (cnt=0; cnt < 30-leftPeak; cnt++) {
Serial.print(" ");
}
while (cnt++ < 29 && cnt < 30-leftRMS) {
Serial.print("<");
}
while (cnt++ < 30) {
Serial.print("=");
}
Serial.print("||");
for(cnt=0; cnt < rightRMS; cnt++) {
Serial.print("=");
}
for(; cnt < rightPeak; cnt++) {
Serial.print(">");
}
while(cnt++ < 30) {
Serial.print(" ");
}
Serial.print(" ");
Serial.print(leftRMS / 30);
Serial.print("||");
Serial.print(rightRMS / 30);
Serial.print(" ");
Serial.print(AudioProcessorUsage());
Serial.print("/");
Serial.print(AudioProcessorUsageMax());
Serial.println();
}
Serial.print(" cpu:");
Serial.println(AudioProcessorUsageMax());
// This is the end of the max audio
}}
//}
Serial.println("Your Maximum Value:");
for (int j=0;j<16;j++)
{
Serial.print(max2[j]);
Serial.print(" ");
}
delay(5000);
Serial.println("");
}