소스 검색

Fix dc offset for pulse waveform to match the duty cycle, to stop pumping on note attack/release

dds
user 4 년 전
부모
커밋
5457aedfab
1개의 변경된 파일5개의 추가작업 그리고 3개의 파일을 삭제
  1. +5
    -3
      synth_waveform.cpp

+ 5
- 3
synth_waveform.cpp 파일 보기

@@ -32,6 +32,8 @@

// uncomment for more accurate but more computationally expensive frequency modulation
//#define IMPROVE_EXPONENTIAL_ACCURACY
#define BASE_AMPLITUDE 0x6000 // 0x7fff won't work due to Gibb's phenomenon, so use 3/4 of full range.



void AudioSynthWaveform::update(void)
@@ -189,6 +191,7 @@ void AudioSynthWaveform::update(void)
{
int32_t new_ph = ph + inc ;
int32_t val = band_limit_waveform.generate_pulse (new_ph, pulse_width, i) ;
val += BASE_AMPLITUDE/2 - pulse_width / (0x100000000L / BASE_AMPLITUDE) ; // correct DC offset for duty cycle
*bp++ = (int16_t) ((val * magnitude) >> 16) ;
ph = new_ph ;
}
@@ -372,6 +375,7 @@ void AudioSynthWaveformModulated::update(void)
{
uint32_t width = ((shapedata->data[i] + 0x8000) & 0xFFFF) << 16;
int32_t val = band_limit_waveform.generate_pulse (phasedata[i], width, i) ;
val += BASE_AMPLITUDE/2 - width / (0x100000000L / BASE_AMPLITUDE) ; // correct DC offset for duty cycle
*bp++ = (int16_t) ((val * magnitude) >> 16) ;
}
break;
@@ -484,8 +488,6 @@ void AudioSynthWaveformModulated::update(void)
#define HALF_GUARD (1 << (GUARD_BITS-1))


#define BASE_AMPLITUDE 0x6000 // 0x7fff won't work due to Gibb's phenomenon, so use 3/4 of full range.

#define DEG90 0x40000000u
#define DEG180 0x80000000u

@@ -643,7 +645,7 @@ int16_t BandLimitedWaveform::generate_pulse (uint32_t new_phase, uint32_t pulse_
int32_t sample = cyclic [i&15] ;
cyclic [i&15] = val ;
phase_word = new_phase ;
return (int16_t) (sample - (sample >> 2)) ; // scale down a bit to avoid overflow on narrow pulses
return (int16_t) (sample >> 1) ; // scale down to avoid overflow on narrow pulses, where the DC shift is big
}

void BandLimitedWaveform::init_sawtooth (uint32_t freq_word)

Loading…
취소
저장