#pragma once #include typedef struct { bool audio_enabled; bool ch1_left; bool ch1_right; bool ch2_left; bool ch2_right; bool ch3_left; bool ch3_right; bool ch4_left; bool ch4_right; u8 volume_left; u8 volume_right; float sq1_freq; u8 sq1_duty; u8 sq1_volume; float sq2_freq; u8 sq2_duty; u8 sq2_volume; bool ready; u8 sq1_sample; float sq1_value; u16 sq1_period_reset; u16 sq1_period_timer; bool sq1_enable; bool sq1_len_enable; u8 sq1_sweep_pace; bool sq1_sweep_direction; u8 sq1_initial_len; u8 sq1_len; u8 sq1_initial_volume; bool sq1_env_direction; u8 sq1_env_pace; u8 sq1_env_timer; u8 sq1_sweep_step; u8 sq1_audio_buffer[4096]; u32 sq1_write_head; u32 sq1_read_head; u8 sq2_sample; float sq2_value; u16 sq2_period_reset; u16 sq2_period_timer; bool sq2_enable; bool sq2_len_enable; u8 sq2_sweep_pace; bool sq2_sweep_direction; u8 sq2_initial_len; u8 sq2_len; u8 sq2_initial_volume; bool sq2_env_direction; u8 sq2_env_pace; u8 sq2_env_timer; u8 sq2_sweep_step; u8 sq2_audio_buffer[4096]; u32 sq2_write_head; u32 sq2_read_head; } audio_context; void audio_init(); void audio_tick(); void audio_period_tick(); u8 audio_read(u16 address); void audio_write(u16 address, u8 value);