|
|
|
|
|
|
|
|
|
|
|
// MemoryAndCpuUsage |
|
|
|
|
|
// |
|
|
|
|
|
// This example demonstrates how to monitor CPU and memory |
|
|
|
|
|
// usage by the audio library. You can see the total memory |
|
|
|
|
|
// used at any moment, and the maximum (worst case) used. |
|
|
|
|
|
// |
|
|
|
|
|
// The total CPU usage, and CPU usage for each object can |
|
|
|
|
|
// be monitored. Reset functions clear the maximums. |
|
|
|
|
|
// |
|
|
|
|
|
// Use the Arduino Serial Monitor to view the usage info |
|
|
|
|
|
// and control ('F', 'S', and 'R' keys) this program. |
|
|
|
|
|
// |
|
|
|
|
|
// This example code is in the public domain. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <Audio.h> |
|
|
|
|
|
#include <Wire.h> |
|
|
|
|
|
#include <SPI.h> |
|
|
|
|
|
#include <SD.h> |
|
|
|
|
|
|
|
|
|
|
|
// GUItool: begin automatically generated code |
|
|
|
|
|
AudioSynthWaveformSine sine1; //xy=125,221 |
|
|
|
|
|
AudioSynthNoisePink pink1; //xy=133,121 |
|
|
|
|
|
AudioEffectEnvelope envelope1; //xy=298,133 |
|
|
|
|
|
AudioEffectEnvelope envelope2; //xy=302,197 |
|
|
|
|
|
AudioAnalyzeFFT256 fft256_1; //xy=304,272 |
|
|
|
|
|
AudioMixer4 mixer1; //xy=486,163 |
|
|
|
|
|
AudioOutputI2S i2s1; //xy=640,161 |
|
|
|
|
|
AudioConnection patchCord1(sine1, envelope2); |
|
|
|
|
|
AudioConnection patchCord2(sine1, fft256_1); |
|
|
|
|
|
AudioConnection patchCord3(pink1, envelope1); |
|
|
|
|
|
AudioConnection patchCord4(envelope1, 0, mixer1, 0); |
|
|
|
|
|
AudioConnection patchCord5(envelope2, 0, mixer1, 1); |
|
|
|
|
|
AudioConnection patchCord6(mixer1, 0, i2s1, 0); |
|
|
|
|
|
AudioConnection patchCord7(mixer1, 0, i2s1, 1); |
|
|
|
|
|
AudioControlSGTL5000 sgtl5000_1; //xy=517,297 |
|
|
|
|
|
// GUItool: end automatically generated code |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
|
|
// give the audio library some memory. We'll be able |
|
|
|
|
|
// to see how much it actually uses, which can be used |
|
|
|
|
|
// to reduce this to the minimum necessary. |
|
|
|
|
|
AudioMemory(20); |
|
|
|
|
|
|
|
|
|
|
|
// enable the audio shield |
|
|
|
|
|
sgtl5000_1.enable(); |
|
|
|
|
|
sgtl5000_1.volume(0.6); |
|
|
|
|
|
|
|
|
|
|
|
// create a simple percussive sound using pink noise |
|
|
|
|
|
// and an envelope to shape it. |
|
|
|
|
|
pink1.amplitude(0.5); |
|
|
|
|
|
envelope1.attack(1.5); |
|
|
|
|
|
envelope1.hold(5); |
|
|
|
|
|
envelope1.decay(20); |
|
|
|
|
|
envelope1.sustain(0); |
|
|
|
|
|
|
|
|
|
|
|
// create a simple bass note using a sine wave |
|
|
|
|
|
sine1.frequency(120); |
|
|
|
|
|
sine1.amplitude(0.6); |
|
|
|
|
|
envelope2.attack(6.5); |
|
|
|
|
|
envelope2.hold(25); |
|
|
|
|
|
envelope2.decay(70); |
|
|
|
|
|
envelope2.sustain(0); |
|
|
|
|
|
|
|
|
|
|
|
// add both the note together, so we can hear them |
|
|
|
|
|
mixer1.gain(0, 0.5); |
|
|
|
|
|
mixer1.gain(1, 0.5); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int count = 0; |
|
|
|
|
|
int speed = 60; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void loop() { |
|
|
|
|
|
// a simple sequencer, count goes from 0 to 15 |
|
|
|
|
|
count = count + 1; |
|
|
|
|
|
if (count >= 16) count = 0; |
|
|
|
|
|
|
|
|
|
|
|
// play percussive sounds every 4th time |
|
|
|
|
|
if (count == 0) envelope1.noteOn(); |
|
|
|
|
|
if (count == 4) envelope1.noteOn(); |
|
|
|
|
|
if (count == 8) envelope1.noteOn(); |
|
|
|
|
|
if (count == 12) envelope1.noteOn(); |
|
|
|
|
|
|
|
|
|
|
|
// play the bass tone every 8th time |
|
|
|
|
|
if (count == 4) { |
|
|
|
|
|
sine1.amplitude(0.6); |
|
|
|
|
|
sine1.frequency(100); |
|
|
|
|
|
envelope2.noteOn(); |
|
|
|
|
|
} |
|
|
|
|
|
if (count == 12) { |
|
|
|
|
|
sine1.amplitude(0.3); |
|
|
|
|
|
sine1.frequency(120); |
|
|
|
|
|
envelope2.noteOn(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// turn off the sine wave, which saves |
|
|
|
|
|
// CPU power (especially since the sine goes |
|
|
|
|
|
// to a CPU-hungry FFT analysis) |
|
|
|
|
|
if (count == 6) { |
|
|
|
|
|
sine1.amplitude(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// check for incoming characters from the serial monitor |
|
|
|
|
|
if (Serial.available()) { |
|
|
|
|
|
char c = Serial.read(); |
|
|
|
|
|
if ((c == 'r' || c == 'R')) { |
|
|
|
|
|
pink1.processorUsageMaxReset(); |
|
|
|
|
|
fft256_1.processorUsageMaxReset(); |
|
|
|
|
|
AudioProcessorUsageMaxReset(); |
|
|
|
|
|
AudioMemoryUsageMaxReset(); |
|
|
|
|
|
Serial.println("Reset all max numbers"); |
|
|
|
|
|
} |
|
|
|
|
|
if ((c == 'f' || c == 'F') && speed > 16) { |
|
|
|
|
|
speed = speed - 2; |
|
|
|
|
|
} |
|
|
|
|
|
if ((c == 's' || c == 'S') && speed < 250) { |
|
|
|
|
|
speed = speed + 2; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// print a summary of the current & maximum usage |
|
|
|
|
|
Serial.print("CPU: "); |
|
|
|
|
|
Serial.print("pink="); |
|
|
|
|
|
Serial.print(pink1.processorUsage()); |
|
|
|
|
|
Serial.print(","); |
|
|
|
|
|
Serial.print(pink1.processorUsageMax()); |
|
|
|
|
|
Serial.print(" "); |
|
|
|
|
|
Serial.print("fft="); |
|
|
|
|
|
Serial.print(fft256_1.processorUsage()); |
|
|
|
|
|
Serial.print(","); |
|
|
|
|
|
Serial.print(fft256_1.processorUsageMax()); |
|
|
|
|
|
Serial.print(" "); |
|
|
|
|
|
Serial.print("all="); |
|
|
|
|
|
Serial.print(AudioProcessorUsage()); |
|
|
|
|
|
Serial.print(","); |
|
|
|
|
|
Serial.print(AudioProcessorUsageMax()); |
|
|
|
|
|
Serial.print(" "); |
|
|
|
|
|
Serial.print("Memory: "); |
|
|
|
|
|
Serial.print(AudioMemoryUsage()); |
|
|
|
|
|
Serial.print(","); |
|
|
|
|
|
Serial.print(AudioMemoryUsageMax()); |
|
|
|
|
|
Serial.print(" "); |
|
|
|
|
|
Serial.print("Send: (R)eset, (S)lower, (F)aster"); |
|
|
|
|
|
Serial.println(); |
|
|
|
|
|
|
|
|
|
|
|
// very simple timing :-) |
|
|
|
|
|
delay(speed); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|