ref: a38a0a08f095edb0c24824f679ef7a6cb8b3961e
dir: /spc_player.h/
#include <stddef.h>
#include "snes/dsp.h"
typedef struct Channel {
uint16 pattern_order_ptr_for_chan;
uint8 note_ticks_left;
uint8 note_keyoff_ticks_left;
uint8 subroutine_num_loops;
uint8 volume_fade_ticks;
uint8 pan_num_ticks;
uint8 pitch_slide_length;
uint8 pitch_slide_delay_left;
uint8 vibrato_hold_count;
uint8 vib_depth;
uint8 tremolo_hold_count;
uint8 tremolo_depth;
uint8 vibrato_change_count;
uint8 note_length;
uint8 note_gate_off_fixedpt;
uint8 channel_volume_master;
uint8 instrument_id;
uint16 instrument_pitch_base;
uint16 saved_pattern_ptr;
uint16 pattern_start_ptr;
uint8 pitch_envelope_num_ticks;
uint8 pitch_envelope_delay;
uint8 pitch_envelope_direction;
uint8 pitch_envelope_slide_value;
uint8 vibrato_count;
uint8 vibrato_rate;
uint8 vibrato_delay_ticks;
uint8 vibrato_fade_num_ticks;
uint8 vibrato_fade_add_per_tick;
uint8 vibrato_depth_target;
uint8 tremolo_count;
uint8 tremolo_rate;
uint8 tremolo_delay_ticks;
uint8 channel_transposition;
uint16 channel_volume;
uint16 volume_fade_addpertick;
uint8 volume_fade_target;
uint8 final_volume;
uint16 pan_value;
uint16 pan_add_per_tick;
uint8 pan_target_value;
uint8 pan_flag_with_phase_invert;
uint16 pitch;
uint16 pitch_add_per_tick;
uint8 pitch_target;
uint8 fine_tune;
uint16 sfx_sound_ptr;
uint8 sfx_which_sound;
uint8 sfx_arr_countdown;
uint8 sfx_note_length_left;
uint8 sfx_note_length;
uint8 sfx_pan;
uint8 index;
} Channel;
typedef struct SpcPlayer {
DspRegWriteHistory *reg_write_history;
uint8 timer_cycles;
Dsp *dsp;
uint8 new_value_from_snes[4];
uint8 port_to_snes[4];
uint8 last_value_from_snes[4];
uint8 counter_sf0c;
uint16 _always_zero;
uint16 temp_accum;
uint8 ttt;
uint8 did_affect_volumepitch_flag;
uint16 addr0;
uint16 addr1;
uint16 lfsr_value;
uint8 is_chan_on;
uint8 fast_forward;
uint8 sfx_start_arg_pan;
uint16 sfx_sound_ptr_cur;
uint16 music_ptr_toplevel;
uint8 block_count;
uint8 sfx_timer_accum;
uint8 chn;
uint8 key_ON;
uint8 key_OFF;
uint8 cur_chan_bit;
uint8 reg_FLG;
uint8 reg_NON;
uint8 reg_EON;
uint8 reg_PMON;
uint8 echo_stored_time;
uint8 echo_parameter_EDL;
uint8 reg_EFB;
uint8 global_transposition;
uint8 main_tempo_accum;
uint16 tempo;
uint8 tempo_fade_num_ticks;
uint8 tempo_fade_final;
uint16 tempo_fade_add;
uint16 master_volume;
uint8 master_volume_fade_ticks;
uint8 master_volume_fade_target;
uint16 master_volume_fade_add_per_tick;
uint8 vol_dirty;
uint8 percussion_base_id;
uint16 echo_volume_left;
uint16 echo_volume_right;
uint16 echo_volume_fade_add_left;
uint16 echo_volume_fade_add_right;
uint8 echo_volume_fade_ticks;
uint8 echo_volume_fade_target_left;
uint8 echo_volume_fade_target_right;
uint8 sfx_channel_index;
uint8 current_bit;
uint8 dsp_register_index;
uint8 echo_channels;
uint8 byte_3C4;
uint8 byte_3C5;
uint8 echo_fract_incr;
uint8 sfx_channel_index2;
uint8 sfx_channel_bit;
uint8 pause_music_ctr;
uint8 port2_active;
uint8 port2_current_bit;
uint8 port3_active;
uint8 port3_current_bit;
uint8 port1_active;
uint8 port1_current_bit;
uint8 byte_3E1;
uint8 sfx_play_echo_flag;
uint8 sfx_channels_echo_mask2;
uint8 port1_counter;
uint8 channel_67_volume;
uint8 cutk_always_zero;
uint8 last_written_edl;
uint8 input_ports[4];
Channel channel[8];
uint8 ram[65536]; // rest of ram
} SpcPlayer;
SpcPlayer *SpcPlayer_Create();
void SpcPlayer_GenerateSamples(SpcPlayer *p);
void SpcPlayer_Initialize(SpcPlayer *p);
void SpcPlayer_Upload(SpcPlayer *p, const uint8_t *data);
void SpcPlayer_CopyVariablesFromRam(SpcPlayer *p);
void SpcPlayer_CopyVariablesToRam(SpcPlayer *p);