yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dsp.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_AUDIO_S_DSP_H
2#define YAZE_APP_EMU_AUDIO_S_DSP_H
3
4#include <cstdint>
5#include <vector>
6
7namespace yaze {
8namespace emu {
9
11 Linear,
12 Hermite, // Used by bsnes/Snes9x - better quality than linear
13 Gaussian, // SNES hardware accurate
14 Cosine,
15 Cubic,
16};
17
18typedef struct DspChannel {
19 // pitch
20 uint16_t pitch;
21 uint16_t pitchCounter;
23 // brr decoding
24 int16_t decodeBuffer[12];
25 uint8_t bufferOffset;
26 uint8_t srcn;
27 uint16_t decodeOffset;
28 uint8_t blockOffset; // offset within brr block
29 uint8_t brrHeader;
31 uint8_t startDelay;
32 // adsr, envelope, gain
33 uint8_t adsrRates[4]; // attack, decay, sustain, gain
34 uint8_t adsrState; // 0: attack, 1: decay, 2: sustain, 3: release
35 uint8_t sustainLevel;
37 bool useGain;
38 uint8_t gainMode;
40 uint16_t gainValue; // for direct gain
41 uint16_t preclampGain; // for bent increase
42 uint16_t gain;
43 // keyon/off
44 bool keyOn;
45 bool keyOff;
46 // output
47 int16_t sampleOut; // final sample, to be multiplied by channel volume
48 int8_t volumeL;
49 int8_t volumeR;
52
88class Dsp {
89 public:
90 Dsp(std::vector<uint8_t>& aram) : aram_(aram) {}
91
92 void NewFrame();
93
94 void Reset();
95
96 void SaveState(std::ostream& stream);
97 void LoadState(std::istream& stream);
98
99 void Cycle();
100
101 void HandleEcho();
102 void CycleChannel(int ch);
103
104 void HandleNoise();
105 void HandleGain(int ch);
106
107 bool CheckCounter(int rate);
108
109 void DecodeBrr(int ch);
110
111 uint8_t Read(uint8_t adr);
112 void Write(uint8_t adr, uint8_t val);
113
114 int16_t GetSample(int ch);
115
116 void GetSamples(int16_t* sample_data, int samples_per_frame, bool pal_timing);
117 int CopyNativeFrame(int16_t* sample_data, bool pal_timing);
118
119 void SetChannelMute(int ch, bool mute) {
120 if (ch >= 0 && ch < 8) debug_mute_channels_[ch] = mute;
121 }
122 bool GetChannelMute(int ch) const {
123 if (ch >= 0 && ch < 8) return debug_mute_channels_[ch];
124 return false;
125 }
126
127 // Accessor for visualization
128 const DspChannel& GetChannel(int ch) const {
129 // Safety clamp
130 if (ch < 0) ch = 0;
131 if (ch > 7) ch = 7;
132 return channel[ch];
133 }
134
135 // Accessor for master buffer (for oscilloscope)
136 const int16_t* GetSampleBuffer() const { return sampleBuffer; }
137 uint16_t GetSampleOffset() const { return sampleOffset; }
138
139 // Reset sample buffer state for clean playback start
140 // Clears the ring buffer and resets position tracking
141 void ResetSampleBuffer();
142
143 // Debug accessors for diagnostic UI
144 uint32_t GetFrameBoundary() const { return lastFrameBoundary; }
145 int8_t GetMasterVolumeL() const { return masterVolumeL; }
146 int8_t GetMasterVolumeR() const { return masterVolumeR; }
147 bool IsMuted() const { return mute; }
148 bool IsReset() const { return reset; }
149 bool IsEchoEnabled() const { return echoWrites; }
150 uint16_t GetEchoDelay() const { return echoDelay; }
151
152 // Default to Gaussian for authentic SNES sound
154
155 private:
156 // sample ring buffer (2048 samples, *2 for stereo)
157 // Increased to 2048 to handle 2-frame updates (~1066 samples) without overflow
158 int16_t sampleBuffer[0x800 * 2];
159 uint16_t sampleOffset; // current offset in samplebuffer
160
161 bool debug_mute_channels_[8] = {false};
162
163 std::vector<uint8_t>& aram_;
164
165 // mirror ram
166 uint8_t ram[0x80];
167 // 8 channels
169 // overarching
170 uint16_t counter;
171 uint16_t dirPage;
173 bool mute;
174 bool reset;
177 // accumulation
178 int16_t sampleOutL;
179 int16_t sampleOutR;
180 int16_t echoOutL;
181 int16_t echoOutR;
182 // noise
183 int16_t noiseSample;
184 uint8_t noiseRate;
185 // echo
191 uint16_t echoDelay;
192 uint16_t echoLength;
195 int8_t firValues[8];
196 int16_t firBufferL[8];
197 int16_t firBufferR[8];
199};
200
201} // namespace emu
202} // namespace yaze
203
204#endif // YAZE_APP_EMU_AUDIO_S_DSP_H
uint16_t echoBufferIndex
Definition dsp.h:193
uint32_t lastFrameBoundary
Definition dsp.h:198
void CycleChannel(int ch)
Definition dsp.cc:252
bool IsMuted() const
Definition dsp.h:147
void HandleGain(int ch)
Definition dsp.cc:353
bool GetChannelMute(int ch) const
Definition dsp.h:122
void GetSamples(int16_t *sample_data, int samples_per_frame, bool pal_timing)
Definition dsp.cc:722
int16_t sampleOutR
Definition dsp.h:179
void DecodeBrr(int ch)
Definition dsp.cc:432
int16_t echoOutR
Definition dsp.h:181
int8_t feedbackVolume
Definition dsp.h:189
void ResetSampleBuffer()
Definition dsp.cc:134
uint8_t Read(uint8_t adr)
Definition dsp.cc:483
std::vector< uint8_t > & aram_
Definition dsp.h:163
uint8_t noiseRate
Definition dsp.h:184
bool CheckCounter(int rate)
Definition dsp.cc:192
const int16_t * GetSampleBuffer() const
Definition dsp.h:136
int16_t sampleBuffer[0x800 *2]
Definition dsp.h:158
uint16_t counter
Definition dsp.h:170
uint16_t GetEchoDelay() const
Definition dsp.h:150
uint16_t sampleOffset
Definition dsp.h:159
int CopyNativeFrame(int16_t *sample_data, bool pal_timing)
Definition dsp.cc:848
int8_t GetMasterVolumeR() const
Definition dsp.h:146
uint16_t echoBufferAdr
Definition dsp.h:190
void Cycle()
Definition dsp.cc:142
int8_t masterVolumeL
Definition dsp.h:175
uint16_t echoDelay
Definition dsp.h:191
const DspChannel & GetChannel(int ch) const
Definition dsp.h:128
void SetChannelMute(int ch, bool mute)
Definition dsp.h:119
void HandleEcho()
Definition dsp.cc:198
bool debug_mute_channels_[8]
Definition dsp.h:161
int8_t firValues[8]
Definition dsp.h:195
int16_t sampleOutL
Definition dsp.h:178
void Reset()
Definition dsp.cc:68
void Write(uint8_t adr, uint8_t val)
Definition dsp.cc:487
int8_t masterVolumeR
Definition dsp.h:176
bool evenCycle
Definition dsp.h:172
InterpolationType interpolation_type
Definition dsp.h:153
uint8_t firBufferIndex
Definition dsp.h:194
void NewFrame()
Definition dsp.cc:130
int16_t firBufferR[8]
Definition dsp.h:197
int16_t noiseSample
Definition dsp.h:183
uint16_t dirPage
Definition dsp.h:171
bool IsReset() const
Definition dsp.h:148
int16_t echoOutL
Definition dsp.h:180
int16_t firBufferL[8]
Definition dsp.h:196
uint16_t echoLength
Definition dsp.h:192
bool IsEchoEnabled() const
Definition dsp.h:149
int8_t echoVolumeR
Definition dsp.h:188
bool echoWrites
Definition dsp.h:186
uint32_t GetFrameBoundary() const
Definition dsp.h:144
void LoadState(std::istream &stream)
Definition dsp.cc:957
int8_t echoVolumeL
Definition dsp.h:187
Dsp(std::vector< uint8_t > &aram)
Definition dsp.h:90
bool mute
Definition dsp.h:173
uint8_t ram[0x80]
Definition dsp.h:166
void HandleNoise()
Definition dsp.cc:476
int16_t GetSample(int ch)
Definition dsp.cc:417
DspChannel channel[8]
Definition dsp.h:168
void SaveState(std::ostream &stream)
Definition dsp.cc:868
bool reset
Definition dsp.h:174
uint16_t GetSampleOffset() const
Definition dsp.h:137
int8_t GetMasterVolumeL() const
Definition dsp.h:145
struct yaze::emu::DspChannel DspChannel
InterpolationType
Definition dsp.h:10
uint16_t pitch
Definition dsp.h:20
uint8_t startDelay
Definition dsp.h:31
uint8_t adsrState
Definition dsp.h:34
uint16_t pitchCounter
Definition dsp.h:21
uint16_t gain
Definition dsp.h:42
int16_t sampleOut
Definition dsp.h:47
uint16_t decodeOffset
Definition dsp.h:27
uint8_t bufferOffset
Definition dsp.h:25
uint8_t sustainLevel
Definition dsp.h:35
int16_t decodeBuffer[12]
Definition dsp.h:24
uint8_t blockOffset
Definition dsp.h:28
uint8_t brrHeader
Definition dsp.h:29
bool pitchModulation
Definition dsp.h:22
uint16_t gainValue
Definition dsp.h:40
uint8_t adsrRates[4]
Definition dsp.h:33
uint8_t gainMode
Definition dsp.h:38
uint16_t preclampGain
Definition dsp.h:41
uint8_t gainSustainLevel
Definition dsp.h:36