Переглянути джерело

remove ramp from waveform object (replaced by envelope object)

dds
PaulStoffregen 10 роки тому
джерело
коміт
22fe5c9ea8
4 змінених файлів з 5 додано та 86 видалено
  1. +2
    -10
      examples/Synthesis/PlayMidiTones/PlayMidiTones.ino
  2. +0
    -5
      examples/Synthesis/PlaySynthMusic/PlaySynthMusic.ino
  3. +1
    -51
      synth_waveform.cpp
  4. +2
    -20
      synth_waveform.h

+ 2
- 10
examples/Synthesis/PlayMidiTones/PlayMidiTones.ino Переглянути файл

@@ -65,20 +65,12 @@ void setup()
// I want output on the line out too
codec.unmuteLineout();

// Comment out this code to hear what it sounds like
// when the tones aren't ramped. (or change 88 to 0)
// Set the ramp time for each wave
for(int i = 0; i < 8;i++) {
waves[i]->set_ramp_length(88);
}

delay(200);
Serial.println("Begin PlayMidiTones");
delay(50);
Serial.println("setup done");
AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset();
AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset();
}

unsigned long last_time = millis();

+ 0
- 5
examples/Synthesis/PlaySynthMusic/PlaySynthMusic.ino Переглянути файл

@@ -99,11 +99,6 @@ void setup()
// Comment this if you don't it
codec.unmuteLineout();

// Set the ramp time for each wave object
for(int i = 0; i < 8;i++) {
waves[i]->set_ramp_length(88);
}

Serial.println("setup done");
// Initialize processor and memory measurements

+ 1
- 51
synth_waveform.cpp Переглянути файл

@@ -34,22 +34,6 @@
// faster than arm's sin function
// PAH 140316 - fix calculation of sample (amplitude error)
// PAH 140314 - change t_hi from int to float
// PAH - add ramp-up and ramp-down to the onset of the wave
// the length is specified in samples

void AudioSynthWaveform::set_ramp_length(int16_t r_length)
{
if(r_length < 0) {
ramp_length = 0;
return;
}
// Don't set the ramp length longer than about 4 milliseconds
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)
@@ -75,13 +59,10 @@ boolean AudioSynthWaveform::begin(float t_amp,float t_hi,short type)
return(true);
}

// PAH - 140313 fixed a problem with ramping
void AudioSynthWaveform::update(void)
{
audio_block_t *block;
short *bp;
// temporary for ramp in sine
uint32_t ramp_mag;
int32_t val1, val2, val3;
uint32_t index, scale;
@@ -90,7 +71,6 @@ void AudioSynthWaveform::update(void)
short tmp_amp;
if(tone_freq == 0)return;
// L E F T C H A N N E L O N L Y
block = allocate();
if(block) {
bp = block->data;
@@ -105,37 +85,7 @@ void AudioSynthWaveform::update(void)
val2 *= scale;
val1 *= 0xFFFF - scale;
val3 = (val1 + val2) >> 16;
// The value of ramp_up is always initialized to RAMP_LENGTH and then is
// decremented each time through here until it reaches zero.
// The value of ramp_up is used to generate a Q15 fraction which varies
// from [0 - 1), and multiplies this by the current sample
if(ramp_up) {
// ramp up to the new magnitude
// ramp_mag is the Q15 representation of the fraction
// Since ramp_up can't be zero, this cannot generate +1
ramp_mag = ((ramp_length-ramp_up)<<15)/ramp_length;
ramp_up--;
// adjust tone_phase to Q15 format and then adjust the result
// of the multiplication
// calculate the sample
tmp_amp = (short)((val3 * tone_amp) >> 15);
*bp++ = (tmp_amp * ramp_mag)>>15;
}
else if(ramp_down) {
// ramp down to zero from the last magnitude
// The value of ramp_down is always initialized to RAMP_LENGTH and then is
// decremented each time through here until it reaches zero.
// The value of ramp_down is used to generate a Q15 fraction which varies
// from [0 - 1), and multiplies this by the current sample
// avoid RAMP_LENGTH/RAMP_LENGTH because Q15 format
// cannot represent +1
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);
}
*bp++ = (short)((val3 * tone_amp) >> 15);
// phase and incr are both unsigned 32-bit fractions
tone_phase += tone_incr;

+ 2
- 20
synth_waveform.h Переглянути файл

@@ -50,8 +50,7 @@ public AudioStream
public:
AudioSynthWaveform(void) :
AudioStream(0,NULL),
tone_freq(0), tone_phase(0), tone_incr(0), tone_type(0),
ramp_down(0), ramp_up(0), ramp_length(0)
tone_freq(0), tone_phase(0), tone_incr(0), tone_type(0)
{
}
@@ -61,29 +60,16 @@ public:
tone_incr = ((0x80000000LL*t_hi)/AUDIO_SAMPLE_RATE_EXACT) + 0.5;
}
// If ramp_length is non-zero this will set up
// either a rmap up or a ramp down when a wave
// first starts or when the amplitude is set
// back to zero.
// Note that if the ramp_length is N, the generated
// wave will be N samples longer than when it is not
// ramp
void amplitude(float n) { // 0 to 1.0
if (n < 0) n = 0;
else if (n > 1.0) n = 1.0;
// Ramp code
if(tone_amp && (n == 0)) {
ramp_down = ramp_length;
ramp_up = 0;
last_tone_amp = tone_amp;
}
else if((tone_amp == 0) && n) {
ramp_up = ramp_length;
ramp_down = 0;
// reset the phase when the amplitude was zero
// and has now been increased. Note that this
// happens even if the wave is not ramped
// so that the signal starts at zero
// and has now been increased.
tone_phase = 0;
}
// set new magnitude
@@ -92,7 +78,6 @@ public:
boolean begin(float t_amp,float t_hi,short t_type);
virtual void update(void);
void set_ramp_length(int16_t r_length);
private:
short tone_amp;
@@ -103,9 +88,6 @@ private:
volatile uint32_t tone_incr;
short tone_type;

uint32_t ramp_down;
uint32_t ramp_up;
uint16_t ramp_length;
};



Завантаження…
Відмінити
Зберегти