mirror of
https://github.com/snesrev/zelda3.git
synced 2025-12-25 11:12:35 -05:00
146 lines
3.8 KiB
C
146 lines
3.8 KiB
C
#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);
|