sound_engine.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. #define NUM_CHANNELS 4
  5. #define RANDOM_SEED 0xf31782ce
  6. #define ACC_BITS 23
  7. #define ACC_LENGTH (1 << (ACC_BITS - 1))
  8. #define OUTPUT_BITS 16
  9. #define WAVE_AMP (1 << OUTPUT_BITS)
  10. #define SINE_LUT_SIZE 256
  11. #define SINE_LUT_BITDEPTH 8
  12. typedef enum
  13. {
  14. SE_WAVEFORM_NONE = 0,
  15. SE_WAVEFORM_NOISE = 1,
  16. SE_WAVEFORM_PULSE = 2,
  17. SE_WAVEFORM_TRIANGLE = 4,
  18. SE_WAVEFORM_SAW = 8,
  19. SE_WAVEFORM_NOISE_METAL = 16,
  20. SE_WAVEFORM_SINE = 32,
  21. } SoudEngineWaveformType;
  22. typedef enum
  23. {
  24. SE_ENABLE_FILTER = 1,
  25. SE_ENABLE_GATE = 2,
  26. SE_ENABLE_RING_MOD = 4,
  27. SE_ENABLE_HARD_SYNC = 8,
  28. SE_ENABLE_KEYDOWN_SYNC = 16, //sync oscillators on keydown
  29. } SoundEngineFlags;
  30. typedef enum
  31. {
  32. FIL_OUTPUT_LOWPASS = 1,
  33. FIL_OUTPUT_HIGHPASS = 2,
  34. FIL_OUTPUT_BANDPASS = 3,
  35. } SoundEngineFilterModes;
  36. typedef struct
  37. {
  38. uint8_t a, d, s, r, volume;
  39. uint32_t envelope, envelope_speed;
  40. } SoundEngineADSR;
  41. typedef struct
  42. {
  43. int32_t f, q, p;
  44. int32_t b0, b1, b2, b3, b4; //filter coefficients
  45. } SoundEngineFilter;
  46. typedef struct
  47. {
  48. uint32_t accumulator;
  49. uint32_t frequency;
  50. uint8_t waveform;
  51. uint16_t pw;
  52. uint32_t lfsr;
  53. SoundEngineADSR adsr;
  54. uint16_t flags;
  55. uint8_t filter_mode;
  56. uint16_t filter_cutoff;
  57. uint16_t filter_resonace;
  58. SoundEngineFilter filter;
  59. } SoundEngineChannel;
  60. typedef struct
  61. {
  62. SoundEngineChannel channel[NUM_CHANNELS];
  63. uint32_t sample_rate;
  64. uint16_t* audio_buffer;
  65. uint32_t audio_buffer_size;
  66. bool external_audio_output;
  67. uint8_t sine_lut[SINE_LUT_SIZE];
  68. } SoundEngine;
  69. void sound_engine_init(SoundEngine* sound_engine, uint32_t sample_rate, bool external_audio_output, uint32_t audio_buffer_size);
  70. void sound_engine_deinit(SoundEngine* sound_engine);
  71. void sound_engine_set_channel_frequency(SoundEngine* sound_engine, SoundEngineChannel* channel, uint32_t frequency);
  72. void sound_engine_fill_buffer(SoundEngine* sound_engine, uint16_t* audio_buffer, uint32_t audio_buffer_size);
  73. void sound_engine_filter_set_coeff(SoundEngineFilter *flt, uint32_t frequency, uint16_t resonance);