| @@ -0,0 +1,49 @@ | |||
| // demonstrate pulse with slow changes in width | |||
| #include <Audio.h> | |||
| #include <Wire.h> | |||
| #include <SPI.h> | |||
| #include <SD.h> | |||
| // GUItool: begin automatically generated code | |||
| AudioSynthWaveform waveform1; //xy=188,240 | |||
| AudioEffectEnvelope envelope1; //xy=371,237 | |||
| AudioOutputI2S i2s1; //xy=565,241 | |||
| AudioConnection patchCord1(waveform1, envelope1); | |||
| AudioConnection patchCord2(envelope1, 0, i2s1, 0); | |||
| AudioConnection patchCord3(envelope1, 0, i2s1, 1); | |||
| AudioControlSGTL5000 audioShield; //xy=586,175 | |||
| // GUItool: end automatically generated code | |||
| void setup(void) | |||
| { | |||
| // Set up | |||
| AudioMemory(8); | |||
| audioShield.enable(); | |||
| audioShield.volume(0.45); | |||
| waveform1.width(0.5); | |||
| waveform1.begin(0.4, 220, WAVEFORM_PULSE); | |||
| envelope1.attack(50); | |||
| envelope1.decay(50); | |||
| envelope1.release(250); | |||
| } | |||
| void loop() { | |||
| float w; | |||
| for (uint32_t i =1; i<20; i++) { | |||
| w = i / 20.0; | |||
| waveform1.width(w); | |||
| envelope1.noteOn(); | |||
| delay(800); | |||
| envelope1.noteOff(); | |||
| delay(600); | |||
| } | |||
| } | |||
| @@ -128,6 +128,15 @@ void AudioSynthWaveform::update(void) | |||
| tone_phase += 2*tone_incr; | |||
| } | |||
| break; | |||
| case WAVEFORM_PULSE: | |||
| for(int i = 0;i < AUDIO_BLOCK_SAMPLES;i++) { | |||
| if(tone_phase < tone_width)*bp++ = -tone_amp; | |||
| else *bp++ = tone_amp; | |||
| tone_phase += tone_incr; | |||
| } | |||
| break; | |||
| } | |||
| if (tone_offset) { | |||
| bp = block->data; | |||
| @@ -44,6 +44,7 @@ extern const int16_t AudioWaveformSine[257]; | |||
| #define WAVEFORM_SQUARE 2 | |||
| #define WAVEFORM_TRIANGLE 3 | |||
| #define WAVEFORM_ARBITRARY 4 | |||
| #define WAVEFORM_PULSE 5 | |||
| // todo: remove these... | |||
| #define TONE_TYPE_SINE 0 | |||
| @@ -58,7 +59,7 @@ public: | |||
| AudioSynthWaveform(void) : | |||
| AudioStream(0,NULL), | |||
| tone_phase(0), tone_incr(0), tone_type(0), | |||
| tone_offset(0), arbdata(NULL) | |||
| tone_offset(0), tone_width(0.25), arbdata(NULL) | |||
| { | |||
| } | |||
| @@ -91,6 +92,12 @@ public: | |||
| else if (n > 1.0) n = 1.0; | |||
| tone_offset = n * 32767.0; | |||
| } | |||
| void width(float n) { // 0.0 to 1.0 | |||
| if (n < 0) n = 0; | |||
| else if (n > 1.0) n = 1.0; | |||
| tone_width = n * 0x7fffffffLL; | |||
| // width is stored as the equivalent phase | |||
| } | |||
| void begin(short t_type) { | |||
| tone_phase = 0; | |||
| tone_type = t_type; | |||
| @@ -109,6 +116,7 @@ private: | |||
| short tone_amp; | |||
| short tone_freq; | |||
| uint32_t tone_phase; | |||
| uint32_t tone_width; | |||
| // volatile prevents the compiler optimizing out the frequency function | |||
| volatile uint32_t tone_incr; | |||
| short tone_type; | |||