Mercurial > audlegacy-plugins
view src/console/Hes_Apu.h @ 2216:3673c7ec4ea2
Sync with schism's modplug engine. Suggested by G¸«ärkan Seng¸«än.
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Fri, 07 Dec 2007 12:08:47 -0600 |
parents | fb513e10174e |
children |
line wrap: on
line source
// Turbo Grafx 16 (PC Engine) PSG sound chip emulator #ifndef HES_APU_H #define HES_APU_H #include "blargg_common.h" #include "Blip_Buffer.h" struct Hes_Osc { unsigned char wave [32]; short volume [2]; int last_amp [2]; int delay; int period; unsigned char noise; unsigned char phase; unsigned char balance; unsigned char dac; blip_time_t last_time; Blip_Buffer* outputs [2]; Blip_Buffer* chans [3]; unsigned noise_lfsr; unsigned char control; enum { amp_range = 0x8000 }; typedef Blip_Synth<blip_med_quality,1> synth_t; void run_until( synth_t& synth, blip_time_t ); }; class Hes_Apu { public: void treble_eq( blip_eq_t const& ); void volume( double ); enum { osc_count = 6 }; void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ); void reset(); enum { start_addr = 0x0800 }; enum { end_addr = 0x0809 }; void write_data( blip_time_t, int addr, int data ); void end_frame( blip_time_t ); public: Hes_Apu(); private: Hes_Osc oscs [osc_count]; int latch; int balance; Hes_Osc::synth_t synth; void balance_changed( Hes_Osc& ); void recalc_chans(); }; inline void Hes_Apu::volume( double v ) { synth.volume( 1.8 / osc_count / Hes_Osc::amp_range * v ); } inline void Hes_Apu::treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); } #endif