75 void reset()
override;
76 void writePort(
bool port, uint8_t value,
int cycle_offset)
override;
77 void pokeReg(uint8_t reg, uint8_t value)
override;
78 [[nodiscard]] uint8_t
peekReg(uint8_t reg)
const override;
81 void setSpeed(
double speed)
override;
83 template<
typename Archive>
84 void serialize(Archive& ar,
unsigned version);
103 using bool_2 = std::array<bool, 2>;
104 using int8_t_2 = std::array<int8_t, 2>;
105 using uint8_t_2 = std::array<uint8_t, 2>;
107 constexpr Patch() =
default;
108 constexpr Patch(uint8_t tl_, uint8_t dcm_, uint8_t fb_,
109 bool_2 am_, bool_2 vib_, bool_2 et_, bool_2 ksr_, uint8_t_2 multi_,
110 uint8_t_2 ksl_, uint8_t_2 ar_, uint8_t_2 dr_, uint8_t_2 sl_, uint8_t_2 rr_)
111 : dcm(dcm_), vib(vib_), et(et_), sl(sl_) {
118 setMulti(0, multi_[0]);
119 setMulti(1, multi_[1]);
130 constexpr void setTL(uint8_t tl) { tl2 = 2 * tl; }
131 constexpr void setFB(uint8_t fb) { fb_t = fb ? (8 - fb) : 31; }
132 constexpr void setAM(
int i,
bool am) { am_t[i] = am ? -1 : 0; }
133 constexpr void setKSR(
int i,
bool ksr) { ksr_t[i] = ksr ? 0 : 2; }
134 constexpr void setMulti(
int i, uint8_t multi) {
135 constexpr std::array<uint8_t, 16> PG_MULTI = {
136 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 20, 24, 24, 30, 30
138 multi_t[i] = PG_MULTI[multi];
140 constexpr void setKSL(
int i, uint8_t ksl) { ksl_t[i] = ksl ? (3 - ksl) : 31; }
141 constexpr void setAR (
int i, uint8_t ar) { ar4[i] = 4 * ar; }
142 constexpr void setDR (
int i, uint8_t dr) { dr4[i] = 4 * dr; }
143 constexpr void setRR (
int i, uint8_t rr) { rr4[i] = 4 * rr; }
148 int8_t_2 am_t = {0, 0};
149 bool_2 vib = {
false,
false};
150 bool_2 et = {
false,
false};
151 uint8_t_2 ksr_t = {2, 2};
152 uint8_t_2 multi_t = {1, 1};
153 uint8_t_2 ksl_t = {31, 31};
154 uint8_t_2 ar4 = {0, 0};
155 uint8_t_2 dr4 = {0, 0};
156 uint8_t_2 sl = {0, 0};
157 uint8_t_2 rr4 = {0, 0};
160 explicit Locals(std::span<float*, 9 + 5> out_) : out(out_) {}
162 std::span<float*, 9 + 5> out;
163 uint8_t rm_hh_bits = 0;
164 bool use_rm_patches =
false;
165 bool lfo_am_car =
false;
166 bool eg_timer_carry =
false;
172 template<
typename Archive>
173 void serialize(Archive& ar,
unsigned version);
177 template<
bool TEST_MODE>
NEVER_INLINE void step18(std::span<float*, 9 + 5> out);
178 template<u
int32_t CYCLES,
bool TEST_MODE>
ALWAYS_INLINE void step(Locals& l);
180 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE uint32_t phaseCalcIncrement(
const Patch& patch1)
const;
181 template<u
int32_t CYCLES>
ALWAYS_INLINE void channelOutput(std::span<float*, 9 + 5> out, int32_t ch_out);
182 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE const Patch& preparePatch1(
bool use_rm_patches)
const;
183 template<u
int32_t CYCLES,
bool TEST_MODE> [[nodiscard]]
ALWAYS_INLINE uint32_t getPhase(uint8_t& rm_hh_bits);
184 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE bool keyOnEvent()
const;
185 template<u
int32_t CYCLES,
bool TEST_MODE>
ALWAYS_INLINE void incrementPhase(uint32_t phase_incr,
bool prev_rhythm);
186 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE uint32_t getPhaseMod(uint8_t fb_t);
187 template<u
int32_t CYCLES>
ALWAYS_INLINE void doOperator(std::span<float*, 9 + 5> out,
bool eg_silent);
188 template<u
int32_t CYCLES,
bool TEST_MODE> [[nodiscard]]
ALWAYS_INLINE uint8_t envelopeOutput(uint32_t ksltl, int8_t am_t)
const;
189 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE uint32_t envelopeKSLTL(
const Patch& patch1,
bool use_rm_patches)
const;
190 template<u
int32_t CYCLES>
ALWAYS_INLINE void envelopeTimer1();
191 template<u
int32_t CYCLES,
bool TEST_MODE>
ALWAYS_INLINE void envelopeTimer2(
bool& eg_timer_carry);
192 template<u
int32_t CYCLES> [[nodiscard]]
ALWAYS_INLINE bool envelopeGenerate1();
193 template<u
int32_t CYCLES>
ALWAYS_INLINE void envelopeGenerate2(
const Patch& patch1,
bool use_rm_patches);
194 template<u
int32_t CYCLES,
bool TEST_MODE>
ALWAYS_INLINE void doLFO(
bool& lfo_am_car);
195 template<u
int32_t CYCLES,
bool TEST_MODE>
ALWAYS_INLINE void doRhythm();
200 void doRegWrite(uint8_t block, uint8_t channel, uint8_t data);
201 NEVER_INLINE void doIO(uint32_t cycles_plus_1, Write& write);
203 void doModeWrite(uint8_t address, uint8_t value);
204 void changeFnumBlock(uint32_t ch);
207 static const std::array<Patch, 15> m_patches;
211 std::array<Write, 18> writes;
214 uint8_t write_address;
215 uint8_t write_fm_cycle;
216 bool fast_fm_rewrite;
217 bool test_mode_active;
220 std::span<const uint8_t, 64> attackPtr;
221 std::span<const uint8_t, 64> releasePtr;
223 std::array<uint8_t, 2> eg_sl;
224 std::array<uint8_t, 2> eg_out;
225 uint8_t eg_counter_state;
226 uint8_t eg_timer_shift;
227 uint8_t eg_timer_shift_lock;
228 uint8_t eg_timer_lock;
229 std::array<EgState, 18> eg_state;
230 std::array<uint8_t, 18> eg_level;
231 std::array<uint8_t, 2> eg_rate;
232 std::array<bool, 18> eg_dokon;
233 std::array<bool, 2> eg_kon;
234 std::array<bool, 2> eg_off;
235 bool eg_timer_shift_stop;
238 std::array<uint32_t, 18> pg_phase;
241 std::array<int16_t, 9> op_fb1;
242 std::array<int16_t, 9> op_fb2;
244 std::array<uint16_t, 2> op_phase;
247 uint16_t lfo_counter;
248 uint16_t lfo_am_counter;
249 uint8_t lfo_vib_counter;
256 std::array<uint16_t, 9> fnum;
257 std::array<uint8_t, 9> block;
258 std::array<uint8_t, 9> p_ksl;
259 std::array<uint16_t, 9> p_incr;
260 std::array<uint8_t, 9> p_ksr_freq;
261 std::array<uint8_t, 9> sk_on;
262 std::array<uint8_t, 9> vol8;
263 std::array<uint8_t, 9> inst;
264 std::array<const Patch*, 9> p_inst;
267 std::array<Patch, 1 + 15> patches;
268 std::array<uint8_t, 3> c_dcm;
281 std::array<uint8_t, 64> regs;
284 int allowed_offset = 0;
285 bool speedUpHack =
false;