sound_engine_adsr.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "sound_engine_adsr.h"
  2. int32_t sound_engine_cycle_and_output_adsr(int32_t input, SoundEngine *eng, SoundEngineADSR *adsr, uint16_t *flags)
  3. {
  4. switch (adsr->envelope_state)
  5. {
  6. case ATTACK:
  7. {
  8. adsr->envelope += adsr->envelope_speed;
  9. if (adsr->envelope >= MAX_ADSR)
  10. {
  11. adsr->envelope_state = DECAY;
  12. adsr->envelope = MAX_ADSR;
  13. adsr->envelope_speed = envspd(eng, adsr->d);
  14. }
  15. break;
  16. }
  17. case DECAY:
  18. {
  19. if (adsr->envelope > ((uint32_t)adsr->s << 17) + adsr->envelope_speed)
  20. {
  21. adsr->envelope -= adsr->envelope_speed;
  22. }
  23. else
  24. {
  25. adsr->envelope = (uint32_t)adsr->s << 17;
  26. adsr->envelope_state = (adsr->s == 0) ? RELEASE : SUSTAIN;
  27. adsr->envelope_speed = envspd(eng, adsr->r);
  28. }
  29. break;
  30. }
  31. case SUSTAIN:
  32. case DONE:
  33. {
  34. break;
  35. }
  36. case RELEASE:
  37. {
  38. if (adsr->envelope > adsr->envelope_speed)
  39. {
  40. adsr->envelope -= adsr->envelope_speed;
  41. }
  42. else
  43. {
  44. adsr->envelope_state = DONE;
  45. *flags &= ~SE_ENABLE_GATE;
  46. adsr->envelope = 0;
  47. }
  48. break;
  49. }
  50. }
  51. return (int32_t)((int32_t)input * (int32_t)(adsr->envelope >> 10) / (int32_t)(MAX_ADSR >> 10) * (int32_t)adsr->volume / (int32_t)MAX_ADSR_VOLUME);
  52. }