1 // Private oscillators used by Gb_Apu
2
3 // Gb_Snd_Emu 0.1.5
4 #ifndef GB_OSCS_H
5 #define GB_OSCS_H
6
7 #include "blargg_common.h"
8 #include "Blip_Buffer.h"
9
10 struct Gb_Osc
11 {
12 enum { trigger = 0x80 };
13 enum { len_enabled_mask = 0x40 };
14
15 Blip_Buffer* outputs [4]; // NULL, right, left, center
16 Blip_Buffer* output;
17 int output_select;
18 BOOST::uint8_t* regs; // osc's 5 registers
19
20 int delay;
21 int last_amp;
22 int volume;
23 int length;
24 int enabled;
25
26 void reset();
27 void clock_length();
frequencyGb_Osc28 int frequency() const { return (regs [4] & 7) * 0x100 + regs [3]; }
29 };
30
31 struct Gb_Env : Gb_Osc
32 {
33 int env_delay;
34
35 void reset();
36 void clock_envelope();
37 bool write_register( int, int );
38 };
39
40 struct Gb_Square : Gb_Env
41 {
42 enum { period_mask = 0x70 };
43 enum { shift_mask = 0x07 };
44
45 typedef Blip_Synth<blip_good_quality,1> Synth;
46 Synth const* synth;
47 int sweep_delay;
48 int sweep_freq;
49 int phase;
50
51 void reset();
52 void clock_sweep();
53 void run( blip_time_t, blip_time_t, int playing );
54 };
55
56 struct Gb_Noise : Gb_Env
57 {
58 typedef Blip_Synth<blip_med_quality,1> Synth;
59 Synth const* synth;
60 unsigned bits;
61
62 void run( blip_time_t, blip_time_t, int playing );
63 };
64
65 struct Gb_Wave : Gb_Osc
66 {
67 typedef Blip_Synth<blip_med_quality,1> Synth;
68 Synth const* synth;
69 int wave_pos;
70 enum { wave_size = 32 };
71 BOOST::uint8_t wave [wave_size];
72
73 void write_register( int, int );
74 void run( blip_time_t, blip_time_t, int playing );
75 };
76
reset()77 inline void Gb_Env::reset()
78 {
79 env_delay = 0;
80 Gb_Osc::reset();
81 }
82
83 #endif
84