#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioSynthNoiseWhite noise2;
AudioSynthNoiseWhite noise1;
AudioSynthSimpleDrum drum1;
AudioSynthWaveform waveform_start;
AudioSynthWaveformDc dc1;
AudioFilterBiquad biquad2;
AudioFilterBiquad biquad1;
AudioFilterBiquad biquad3;
AudioEffectEnvelope envelope1;
AudioEffectMultiply multiply2;
AudioEffectMultiply mult2;
AudioMixer4 mixer2;
AudioEffectFreeverb freeverb1;
AudioSynthWaveformSineModulated Sine1;
AudioEffectFreeverb freeverb2;
AudioEffectMultiply mult1;
AudioMixer4 mixerBang;
AudioAmplifier amp1;
AudioOutputI2S i2s1;
AudioConnection patchCord1(noise2, biquad3);
AudioConnection patchCord3(noise1, biquad1);
AudioConnection patchCord4(drum1, biquad2);
AudioConnection patchCord5(waveform_start, 0, multiply2, 0);
AudioConnection patchCord6(dc1, 0, mult2, 1);
AudioConnection patchCord7(biquad2, 0, mixer2, 1);
AudioConnection patchCord8(biquad1, envelope1);
AudioConnection patchCord9(biquad3, 0, mult2, 0);
AudioConnection patchCord10(biquad3, 0, multiply2, 1);
AudioConnection patchCord11(envelope1, 0, mixer2, 0);
AudioConnection patchCord12(multiply2, 0, mixer2, 2);
AudioConnection patchCord13(mult2, freeverb2);
AudioConnection patchCord14(mixer2, freeverb1);
AudioConnection patchCord15(freeverb1, 0, mult1, 0);
AudioConnection patchCord16(Sine1, 0, mult1, 1);
AudioConnection patchCord17(freeverb2, 0, mixerBang, 1);
AudioConnection patchCord18(mult1, 0, mixerBang, 0);
AudioConnection patchCord19(mixerBang, amp1);
AudioConnection patchCord20(amp1, 0, i2s1, 0);
AudioConnection patchCord21(amp1, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1;
//#define COMM_ROUE A0//channel 1
const int sensorPin = A2;
uint32_t cylinder=0;
uint32_t cylinderfreq[]= {60,63,58,56,59,60,60,61,62};
int F,S,BP;
float G;
static int bangPeriodMilliseconds = 100;
// Variables PID
static float P, I,D;
float oldBang=0;static float commande;int sensorValue;
//Variables temporelles
static uint32_t next;static uint32_t old;
elapsedMillis sinceBang;
int delayBang;
elapsedMillis sinceStatus;
static int bpms = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// pinMode(COMM_ROUE, INPUT);
AudioMemory(15);
sgtl5000_1.enable();
sgtl5000_1.volume(0.7);
mixer2.gain(0,0);
mixer2.gain(1,10); // gain du bruit du moteur
mixer2.gain(2,0);
mixer2.gain(3,0);
mixerBang.gain(0,1);// gain des cyilindres
mixerBang.gain(1,0);
biquad1.setLowpass(0,200,0.8);
biquad2.setLowpass(0,250,0.8);
biquad3.setBandpass(0,1000,0.8);
amp1.gain(2);
envelope1.attack(25);
envelope1.hold(20);
envelope1.decay(150);
envelope1.sustain(0.05);
envelope1.release(100);
freeverb1.roomsize(0.2);
freeverb1.damping(1);
freeverb2.roomsize(0.01);
freeverb2.damping(0.1);
Sine1.amplitude(2);
Sine1.frequency(-1);
Sine1.phase(90);
drum1.secondMix(0.5);
drum1.pitchMod(0.5);
noise2.amplitude(5);
waveform_start.frequency(8);
waveform_start.amplitude(1);
waveform_start.begin(WAVEFORM_SQUARE);
while (millis()<2000){
freeverb1.roomsize(0.4);
freeverb1.damping(1);
noise2.amplitude(1);
waveform_start.begin(WAVEFORM_PULSE);waveform_start.offset(-1); waveform_start.pulseWidth(0.90);
}
noise2.amplitude(0);
waveform_start.amplitude(0);
}
void loop() {
//long duration = pulseIn(COMM_ROUE, HIGH);
//long commande =map(duration,1438,1179,110,20);
AudioInterrupts();
next = millis();
if (next-old>100){
if ( bpms != bangPeriodMilliseconds ) {
bpms = bangPeriodMilliseconds;
Serial.println(bangPeriodMilliseconds);
}
old=millis();
sensorValue = analogRead(sensorPin);
commande =map(sensorValue,1,1024,12,100);
P=0.6;I=0.8;D=0.3;
oldBang=bangPeriodMilliseconds;
bangPeriodMilliseconds = (commande - bangPeriodMilliseconds)*(P);
bangPeriodMilliseconds = commande - D*abs(bangPeriodMilliseconds-oldBang);
bangPeriodMilliseconds = commande - I*(commande - oldBang);
}
reglages(bangPeriodMilliseconds);
if(sinceBang>bangPeriodMilliseconds)
{
int rdm_explos=random(1,35);
if(rdm_explos==5)
dc1.amplitude(2,1);
else
dc1.amplitude(0,1);
int rdm_cylinder=random(0,8);
sinceBang=0;
drums(cylinderfreq[rdm_cylinder]+F,bangPeriodMilliseconds+BP);// ou F un reglage pour augmenter la freq des cylindres,
noise(1.5); // ou P pour la prolongation du bruit
Sine1.frequency(S); // ou S pour la freq du vibrement moteur
amp1.gain(G);
}
//bangPeriodMilliseconds = map(sensorValue,1,1024,16,100);
AudioInterrupts();
noise2.amplitude(1);
// waveform.begin(WAVEFORM_PULSE);waveform.offset(-1); waveform.pulseWidth(0.95);
if (sinceStatus>500){
Serial.print(" Diagnostics: ");
Serial.print(AudioProcessorUsageMax());
Serial.print(" ");
Serial.println(AudioMemoryUsageMax());
AudioProcessorUsageMaxReset();
sinceStatus=0;
}
}
void drums(int cylinder, int length){
drum1.frequency(cylinder);
drum1.length(length);
drum1.noteOn();
}
void noise(int amplitude)
{
noise1.amplitude(amplitude);
envelope1.noteOn();
envelope1.noteOff();
}
void reglages( int bangPeriod ) {
if (bangPeriod>=90){
freeverb1.roomsize(0.7);
freeverb1.damping(1);
biquad1.setBandpass(0,250,0.8);
biquad2.setBandpass(0,600,0.8);
F=20;
BP=100;
S=11;
G=0.5;
}
if (bangPeriod>=60 && bangPeriod<90 ){
biquad1.setBandpass(0,250,0.8);
biquad2.setHighpass(0,190,1.4);
F=25;
BP=100;
S=13;
G=0.8;
}
if (bangPeriod<60 ){
// freeverb1.roomsize(0.7);
// freeverb1.damping(1);
biquad1.setBandpass(0,250,0.8);
biquad2.setBandpass(0,200,2);
F=25;
BP=3;
S=11;
G=1;
}
}