diff options
Diffstat (limited to 'plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h')
-rw-r--r-- | plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h new file mode 100644 index 00000000..60ea1631 --- /dev/null +++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h @@ -0,0 +1,80 @@ +// Konami VRC7 sound chip emulator + +#ifndef NES_VRC7_APU_H +#define NES_VRC7_APU_H + +#include "blargg_common.h" +#include "Blip_Buffer.h" + +struct vrc7_snapshot_t; + +class Nes_Vrc7_Apu { +public: + blargg_err_t init(); + + // See Nes_Apu.h for reference + void reset(); + void volume( double ); + void treble_eq( blip_eq_t const& ); + void set_output( Blip_Buffer* ); + enum { osc_count = 6 }; + void set_output( int index, Blip_Buffer* ); + void end_frame( blip_time_t ); + void save_snapshot( vrc7_snapshot_t* ) const; + void load_snapshot( vrc7_snapshot_t const& ); + + void write_reg( int reg ); + void write_data( blip_time_t, int data ); + +public: + Nes_Vrc7_Apu(); + ~Nes_Vrc7_Apu(); + BLARGG_DISABLE_NOTHROW +private: + // noncopyable + Nes_Vrc7_Apu( const Nes_Vrc7_Apu& ); + Nes_Vrc7_Apu& operator = ( const Nes_Vrc7_Apu& ); + + struct Vrc7_Osc + { + BOOST::uint8_t regs [3]; + Blip_Buffer* output; + int last_amp; + }; + + Vrc7_Osc oscs [osc_count]; + void* opll; + int addr; + blip_time_t next_time; + struct { + Blip_Buffer* output; + int last_amp; + } mono; + + Blip_Synth_Fast synth; + + void run_until( blip_time_t ); + void output_changed(); +}; + +struct vrc7_snapshot_t +{ + BOOST::uint8_t latch; + BOOST::uint8_t inst [8]; + BOOST::uint8_t regs [6] [3]; + BOOST::uint8_t delay; +}; + +inline void Nes_Vrc7_Apu::set_output( int i, Blip_Buffer* buf ) +{ + assert( (unsigned) i < osc_count ); + oscs [i].output = buf; + output_changed(); +} + +// DB2LIN_AMP_BITS == 11, * 2 +inline void Nes_Vrc7_Apu::volume( double v ) { synth.volume( 1.0 / 3 / 4096 * v ); } + +inline void Nes_Vrc7_Apu::treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); } + +#endif |