|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
-
-
- #ifndef synth_dc_h_
- #define synth_dc_h_
- #include "AudioStream.h"
- #include "utility/dspinst.h"
-
-
-
-
- #if 0
-
- static inline int32_t substract_32_then_divide(int32_t a, int32_t b, int32_t c) __attribute__((always_inline, unused));
- static inline int32_t substract_32_then_divide(int32_t a, int32_t b, int32_t c)
- {
- int32_t diff = substract_32_saturate(a, b);
-
- if (diff != 0x7FFFFFFF && diff != 0x80000000) {
- return diff / c;
- } else {
- diff = substract_32_saturate(a/2, b/2);
- if (c == 1 || c == -1) c *= 2;
- return (diff / c) * 2;
- }
- }
- #else
-
- static inline int32_t substract_int32_then_divide_int32(int32_t a, int32_t b, int32_t c) __attribute__((always_inline, unused));
- static inline int32_t substract_int32_then_divide_int32(int32_t a, int32_t b, int32_t c)
- {
- uint32_t diff;
- uint8_t negative;
-
- if (a >= 0) {
- if (b >= 0) {
- return (a - b) / c;
- } else {
- diff = a + (b * -1);
- negative = 0;
- }
- } else {
- if (b >= 0) {
- diff = (a * -1) + b;
- negative = 1;
- } else {
- return (a - b) / c;
- }
- }
- if (c >= 0) {
- diff = diff / (uint32_t)c;
- } else {
- diff = diff / (uint32_t)(c * -1);
- negative ^= 1;
- }
- if (negative) {
- if (diff > 0x7FFFFFFF) return 0x80000000;
- return (int32_t)diff * -1;
- } else {
- if (diff > 0x7FFFFFFF) return 0x7FFFFFFF;
- return (int32_t)diff;
- }
- }
-
- #endif
-
- class AudioSynthWaveformDc : public AudioStream
- {
- public:
- AudioSynthWaveformDc() : AudioStream(0, NULL), state(0), magnitude(0) {}
-
- void amplitude(float n) {
- if (n > 1.0) n = 1.0;
- else if (n < -1.0) n = -1.0;
- int32_t m = (int32_t)(n * 2147418112.0);
- __disable_irq();
- magnitude = m;
- state = 0;
- __enable_irq();
- }
-
- void amplitude(float n, float milliseconds) {
- if (milliseconds <= 0.0) {
- amplitude(n);
- return;
- }
- if (n > 1.0) n = 1.0;
- else if (n < -1.0) n = -1.0;
- int32_t c = (int32_t)(milliseconds*(AUDIO_SAMPLE_RATE_EXACT/1000.0));
- if (c == 0) {
- amplitude(n);
- return;
- }
- int32_t t = (int32_t)(n * 2147418112.0);
- __disable_irq();
- target = t;
- if (target == magnitude) {
- state = 0;
- __enable_irq();
- return;
- }
- increment = substract_int32_then_divide_int32(target, magnitude, c);
- if (increment == 0) {
- increment = (target > magnitude) ? 1 : -1;
- }
- state = 1;
- __enable_irq();
- }
- virtual void update(void);
- private:
- uint8_t state;
- int32_t magnitude;
- int32_t target;
- int32_t increment;
- };
-
- #endif
|