|
-
-
- #include <Arduino.h>
- #include "synth_simple_drum.h"
-
- extern "C" {
- extern const int16_t AudioWaveformSine[257];
- }
-
- void AudioSynthSimpleDrum::noteOn(void)
- {
- __disable_irq();
-
- wav_phasor = 0;
- wav_phasor2 = 0;
-
- env_lin_current = 0x7fff0000;
-
- __enable_irq();
- }
-
- void AudioSynthSimpleDrum::secondMix(float level)
- {
-
-
-
-
- if(level < 0)
- {
- level = 0;
- }
- else if(level > 1.0)
- {
- level = 1.0;
- }
-
- __disable_irq();
- wav_amplitude2 = level * 0x3fff;
- wav_amplitude1 = 0x7fff - wav_amplitude2;
- __enable_irq();
- }
-
-
- void AudioSynthSimpleDrum::pitchMod(float depth)
- {
- int32_t intdepth, calc;
-
-
- if(depth < 0)
- {
- depth = 0;
- }
- else if(depth > 1.0)
- {
- depth = 1.0;
- }
-
-
-
-
- intdepth = depth * 0x7fff;
-
-
-
- if(intdepth < 0x4000)
- {
-
-
- calc = ((0x4000 - intdepth) * 0x3000 )>> 14;
- calc = -calc;
- }
- else
- {
-
-
- calc = ((intdepth - 0x4000) * 0xc000)>> 14;
- }
-
-
-
- wav_pitch_mod = calc;
- }
-
-
-
- void AudioSynthSimpleDrum::update(void)
- {
- audio_block_t *block_wav;
- int16_t *p_wave, *end;
- int32_t sin_l, sin_r, interp, mod, mod2, delta;
- int32_t interp2;
- int32_t index, scale;
- bool do_second;
-
- int32_t env_sqr_current;
-
- block_wav = allocate();
- if (!block_wav) return;
- p_wave = (block_wav->data);
- end = p_wave + AUDIO_BLOCK_SAMPLES;
-
-
-
-
- do_second = (wav_amplitude2 > 50);
-
- while(p_wave < end)
- {
-
- if(env_lin_current < 0x0000ffff)
- {
-
- *p_wave = 0;
- p_wave++;
- }
- else
- {
- env_lin_current -= env_decrement;
- env_sqr_current = multiply_16tx16t(env_lin_current, env_lin_current) ;
-
-
- wav_phasor += wav_increment;
-
-
-
-
-
-
-
- mod = signed_multiply_32x16b((env_sqr_current), (wav_pitch_mod>>1)) >> 13;
- mod2 = signed_multiply_32x16b(wav_increment<<3, mod>>1);
-
- wav_phasor += (mod2);
- wav_phasor &= 0x7fffffff;
-
- if(do_second)
- {
-
- wav_phasor2 += wav_increment;
- wav_phasor2 += (wav_increment >> 1);
- wav_phasor2 += mod2;
- wav_phasor2 += (mod2 >> 1);
- wav_phasor2 &= 0x7fffffff;
- }
-
-
- index = wav_phasor >> 23;
- sin_l = AudioWaveformSine[index];
- sin_r = AudioWaveformSine[index+1];
-
-
-
-
- delta = sin_r-sin_l;
- scale = (wav_phasor >> 7) & 0xfFFF;
- delta = (delta * scale)>> 16;
- interp = sin_l + delta;
-
- if(do_second)
- {
- index = wav_phasor2 >> 23;
- sin_l = AudioWaveformSine[index];
- sin_r = AudioWaveformSine[index+1];
-
- delta = sin_r-sin_l;
- scale = (wav_phasor2 >> 7) & 0xFFFF;
- delta = (delta * scale)>> 16;
- interp2 = sin_l + delta;
-
-
- interp2 = (interp2 * wav_amplitude2 ) >> 15;
- interp = (interp * wav_amplitude1) >> 15;
- interp = interp + interp2;
- }
-
- *p_wave = signed_multiply_32x16b(env_sqr_current, interp ) >> 15 ;
- p_wave++;
- }
- }
-
- transmit(block_wav, 0);
- release(block_wav);
-
- }
|