|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
-
-
- #include "synth_waveform.h"
- #include "arm_math.h"
- #include "utility/dspinst.h"
-
-
-
-
-
-
-
-
-
-
- void AudioSynthWaveform::set_ramp_length(int16_t r_length)
- {
- if(r_length < 0) {
- ramp_length = 0;
- return;
- }
-
- if(r_length > 44*4) {
- ramp_length = 44*4;
- return;
- }
- ramp_length = r_length;
- }
-
-
- boolean AudioSynthWaveform::begin(float t_amp,float t_hi,short type)
- {
- tone_type = type;
- amplitude(t_amp);
- tone_freq = t_hi > 0.0;
- if(t_hi <= 0.0)return false;
- if(t_hi >= AUDIO_SAMPLE_RATE_EXACT/2)return false;
- tone_phase = 0;
- frequency(t_hi);
- if(0) {
- Serial.print("AudioSynthWaveform.begin(tone_amp = ");
- Serial.print(t_amp);
- Serial.print(", tone_hi = ");
- Serial.print(t_hi);
- Serial.print(", tone_incr = ");
- Serial.print(tone_incr,HEX);
-
-
- Serial.println(")");
- }
- return(true);
- }
-
-
- void AudioSynthWaveform::update(void)
- {
- audio_block_t *block;
- short *bp;
-
- uint32_t ramp_mag;
- int32_t val1, val2, val3;
- uint32_t index, scale;
-
-
- uint32_t mag;
- short tmp_amp;
-
- if(tone_freq == 0)return;
-
- block = allocate();
- if(block) {
- bp = block->data;
- switch(tone_type) {
- case TONE_TYPE_SINE:
- for(int i = 0;i < AUDIO_BLOCK_SAMPLES;i++) {
-
- index = tone_phase >> 23;
- val1 = AudioWaveformSine[index];
- val2 = AudioWaveformSine[index+1];
- scale = (tone_phase >> 7) & 0xFFFF;
- val2 *= scale;
- val1 *= 0xFFFF - scale;
- val3 = (val1 + val2) >> 16;
-
-
-
-
- if(ramp_up) {
-
-
-
- ramp_mag = ((ramp_length-ramp_up)<<15)/ramp_length;
- ramp_up--;
-
-
-
- tmp_amp = (short)((val3 * tone_amp) >> 15);
- *bp++ = (tmp_amp * ramp_mag)>>15;
- }
- else if(ramp_down) {
-
-
-
-
-
-
-
- ramp_mag = ((ramp_down - 1)<<15)/ramp_length;
- ramp_down--;
- tmp_amp = (short)((val3 * last_tone_amp) >> 15);
- *bp++ = (tmp_amp * ramp_mag)>>15;
- } else {
- *bp++ = (short)((val3 * tone_amp) >> 15);
- }
-
-
- tone_phase += tone_incr;
-
- if(tone_phase & 0x80000000)tone_phase &= 0x7fffffff;
- }
- break;
-
- case TONE_TYPE_SQUARE:
- for(int i = 0;i < AUDIO_BLOCK_SAMPLES;i++) {
- if(tone_phase & 0x40000000)*bp++ = -tone_amp;
- else *bp++ = tone_amp;
-
- tone_phase += tone_incr;
- }
- break;
-
- case TONE_TYPE_SAWTOOTH:
- for(int i = 0;i < AUDIO_BLOCK_SAMPLES;i++) {
- *bp++ = ((short)(tone_phase>>15)*tone_amp) >> 15;
-
- tone_phase += tone_incr;
- }
- break;
-
- case TONE_TYPE_TRIANGLE:
- for(int i = 0;i < AUDIO_BLOCK_SAMPLES;i++) {
- if(tone_phase & 0x80000000) {
-
- tmp_amp = -tone_amp;
- }
- else {
-
- tmp_amp = tone_amp;
- }
- mag = tone_phase << 2;
-
- if(tone_phase & 0x40000000) {
-
- mag = ~mag + 1;
- }
- *bp++ = ((short)(mag>>17)*tmp_amp) >> 15;
- tone_phase += 2*tone_incr;
- }
- break;
- }
-
- transmit(block,0);
- release(block);
- }
- }
-
-
-
-
|