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