sound_engine_adsr.c 1.4 KB

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