LMMS
Loading...
Searching...
No Matches
Nes_Fme7_Apu.h
Go to the documentation of this file.
1// Sunsoft FME-7 sound emulator
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef NES_FME7_APU_H
5#define NES_FME7_APU_H
6
7#include "blargg_common.h"
8#include "Blip_Buffer.h"
9
11{
12 enum { reg_count = 14 };
14 uint8_t phases [3]; // 0 or 1
16 uint16_t delays [3]; // a, b, c
17};
18
20public:
21 // See Nes_Apu.h for reference
22 void reset();
23 void volume( double );
24 void treble_eq( blip_eq_t const& );
26 enum { osc_count = 3 };
27 void osc_output( int index, Blip_Buffer* );
28 void end_frame( blip_time_t );
29 void save_state( fme7_apu_state_t* ) const;
30 void load_state( fme7_apu_state_t const& );
32 // Mask and addresses of registers
33 enum { addr_mask = 0xE000 };
34 enum { data_addr = 0xE000 };
35 enum { latch_addr = 0xC000 };
36
37 // (addr & addr_mask) == latch_addr
38 void write_latch( int );
39
40 // (addr & addr_mask) == data_addr
41 void write_data( blip_time_t, int data );
42
43public:
45 BLARGG_DISABLE_NOTHROW
46private:
47 // noncopyable
50
51 static unsigned char const amp_table [16];
52
53 struct {
58
59 enum { amp_range = 192 }; // can be any value; this gives best error/quality tradeoff
61
62 void run_until( blip_time_t );
63};
64
65inline void Nes_Fme7_Apu::volume( double v )
66{
67 synth.volume( 0.38 / amp_range * v ); // to do: fine-tune
68}
69
71{
72 synth.treble_eq( eq );
73}
74
75inline void Nes_Fme7_Apu::osc_output( int i, Blip_Buffer* buf )
76{
77 assert( (unsigned) i < osc_count );
78 oscs [i].output = buf;
79}
80
81inline void Nes_Fme7_Apu::output( Blip_Buffer* buf )
82{
83 for ( int i = 0; i < osc_count; i++ )
84 osc_output( i, buf );
85}
86
88{
89 output( NULL );
90 volume( 1.0 );
91 reset();
92}
93
94inline void Nes_Fme7_Apu::write_latch( int data ) { latch = data; }
95
97{
98 if ( (unsigned) latch >= reg_count )
99 {
100 #ifdef debug_printf
101 debug_printf( "FME7 write to %02X (past end of sound registers)\n", (int) latch );
102 #endif
103 return;
104 }
105
106 run_until( time );
107 regs [latch] = data;
108}
109
111{
112 if ( time > last_time )
113 run_until( time );
114
115 assert( last_time >= time );
116 last_time -= time;
117}
118
120{
121 *out = *this;
122}
123
125{
126 reset();
127 fme7_apu_state_t* state = this;
128 *state = in;
129}
130
131#endif
int const osc_count
Definition Ay_Emu.cpp:25
blip_long blip_time_t
Definition Blip_Buffer.h:17
#define NULL
Definition CarlaBridgeFormat.cpp:30
assert(0)
#define debug_printf
Definition blargg_source.h:26
Definition Blip_Buffer.h:23
Definition Blip_Buffer.h:191
@ latch_addr
Definition Nes_Fme7_Apu.h:35
void save_state(fme7_apu_state_t *) const
Definition Nes_Fme7_Apu.h:119
Blip_Buffer * output
Definition Nes_Fme7_Apu.h:54
void volume(double)
Definition Nes_Fme7_Apu.h:65
@ amp_range
Definition Nes_Fme7_Apu.h:59
void treble_eq(blip_eq_t const &)
Definition Nes_Fme7_Apu.h:70
blip_time_t last_time
Definition Nes_Fme7_Apu.h:57
int last_amp
Definition Nes_Fme7_Apu.h:55
void write_latch(int)
Definition Nes_Fme7_Apu.h:94
@ osc_count
Definition Nes_Fme7_Apu.h:26
Nes_Fme7_Apu(const Nes_Fme7_Apu &)
Blip_Synth< blip_good_quality, 1 > synth
Definition Nes_Fme7_Apu.h:60
void osc_output(int index, Blip_Buffer *)
Definition Nes_Fme7_Apu.h:75
@ addr_mask
Definition Nes_Fme7_Apu.h:33
void run_until(blip_time_t)
Definition Nes_Fme7_Apu.cpp:41
void end_frame(blip_time_t)
Definition Nes_Fme7_Apu.h:110
Nes_Fme7_Apu & operator=(const Nes_Fme7_Apu &)
void reset()
Definition Nes_Fme7_Apu.cpp:20
@ data_addr
Definition Nes_Fme7_Apu.h:34
void load_state(fme7_apu_state_t const &)
Definition Nes_Fme7_Apu.h:124
void output(Blip_Buffer *)
static unsigned char const amp_table[16]
Definition Nes_Fme7_Apu.h:31
Nes_Fme7_Apu()
Definition Nes_Fme7_Apu.h:87
void write_data(blip_time_t, int data)
Definition Nes_Fme7_Apu.h:96
struct Nes_Fme7_Apu::@330214061233141365343216362223363006051000133006 oscs[osc_count]
Definition Blip_Buffer.h:239
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
unsigned short uint16_t
Definition mid.cpp:99
unsigned char uint8_t
Definition mid.cpp:98
Definition tap_eq.c:71
Definition Nes_Fme7_Apu.h:11
uint16_t delays[3]
Definition Nes_Fme7_Apu.h:16
uint8_t phases[3]
Definition Nes_Fme7_Apu.h:14
uint8_t regs[reg_count]
Definition Nes_Fme7_Apu.h:13
uint8_t latch
Definition Nes_Fme7_Apu.h:15
@ reg_count
Definition Nes_Fme7_Apu.h:12