sound_engine_defs.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #define NUM_CHANNELS 4
  6. #define RANDOM_SEED 0xf31782ce
  7. #define ACC_BITS 23
  8. #define ACC_LENGTH (1 << (ACC_BITS - 1))
  9. #define OUTPUT_BITS 16
  10. #define WAVE_AMP (1 << OUTPUT_BITS)
  11. #define SINE_LUT_SIZE 256
  12. #define SINE_LUT_BITDEPTH 8
  13. #define MAX_ADSR (0xff << 17)
  14. #define MAX_ADSR_VOLUME 0x80
  15. #define BASE_FREQ 22050
  16. #define envspd(eng, slope) \
  17. ((slope) != 0 ? \
  18. (((uint64_t)MAX_ADSR / ((slope) * (slope)*256 / 8)) * BASE_FREQ / eng->sample_rate) : \
  19. ((uint64_t)MAX_ADSR * BASE_FREQ / eng->sample_rate))
  20. typedef enum {
  21. SE_WAVEFORM_NONE = 0,
  22. SE_WAVEFORM_NOISE = 1,
  23. SE_WAVEFORM_PULSE = 2,
  24. SE_WAVEFORM_TRIANGLE = 4,
  25. SE_WAVEFORM_SAW = 8,
  26. SE_WAVEFORM_NOISE_METAL = 16,
  27. SE_WAVEFORM_SINE = 32,
  28. } SoundEngineWaveformType;
  29. typedef enum {
  30. SE_ENABLE_FILTER = 1,
  31. SE_ENABLE_GATE = 2,
  32. SE_ENABLE_RING_MOD = 4,
  33. SE_ENABLE_HARD_SYNC = 8,
  34. SE_ENABLE_KEYDOWN_SYNC = 16, // sync oscillators on keydown
  35. } SoundEngineFlags;
  36. typedef enum {
  37. FIL_OUTPUT_LOWPASS = 1,
  38. FIL_OUTPUT_HIGHPASS = 2,
  39. FIL_OUTPUT_BANDPASS = 3,
  40. FIL_OUTPUT_LOW_HIGH = 4,
  41. FIL_OUTPUT_HIGH_BAND = 5,
  42. FIL_OUTPUT_LOW_BAND = 6,
  43. FIL_OUTPUT_LOW_HIGH_BAND = 7,
  44. /* ============ */
  45. FIL_MODES = 8,
  46. } SoundEngineFilterModes;
  47. typedef enum {
  48. ATTACK = 1,
  49. DECAY = 2,
  50. SUSTAIN = 3,
  51. RELEASE = 4,
  52. DONE = 5,
  53. } SoundEngineEnvelopeStates;
  54. typedef struct {
  55. uint8_t a, d, s, r, volume, envelope_state;
  56. uint32_t envelope, envelope_speed;
  57. } SoundEngineADSR;
  58. typedef struct {
  59. int32_t cutoff, resonance, low, high, band;
  60. } SoundEngineFilter;
  61. typedef struct {
  62. uint32_t accumulator;
  63. uint32_t frequency;
  64. uint8_t waveform;
  65. uint16_t pw;
  66. uint32_t lfsr;
  67. SoundEngineADSR adsr;
  68. uint16_t flags;
  69. uint8_t ring_mod, hard_sync; // 0xff = self
  70. uint8_t sync_bit;
  71. uint8_t filter_mode;
  72. SoundEngineFilter filter;
  73. } SoundEngineChannel;
  74. typedef struct {
  75. SoundEngineChannel channel[NUM_CHANNELS];
  76. uint32_t sample_rate;
  77. uint16_t* audio_buffer;
  78. uint32_t audio_buffer_size;
  79. bool external_audio_output;
  80. uint8_t sine_lut[SINE_LUT_SIZE];
  81. // uint32_t counter; //for debug
  82. } SoundEngine;