LMMS
Loading...
Searching...
No Matches
Vgm_Emu.h
Go to the documentation of this file.
1// Sega Master System/Mark III, Sega Genesis/Mega Drive, BBC Micro VGM music file emulator
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef VGM_EMU_H
5#define VGM_EMU_H
6
7#include "Vgm_Emu_Impl.h"
8
9// Emulates VGM music using SN76489/SN76496 PSG, YM2612, and YM2413 FM sound chips.
10// Supports custom sound buffer and frequency equalization when VGM uses just the PSG.
11// FM sound chips can be run at their proper rates, or slightly higher to reduce
12// aliasing on high notes. Currently YM2413 support requires that you supply a
13// YM2413 sound chip emulator. I can provide one I've modified to work with the library.
14class Vgm_Emu : public Vgm_Emu_Impl {
15public:
16 // True if custom buffer and custom equalization are supported
17 // TODO: move into Music_Emu and rename to something like supports_custom_buffer()
18 bool is_classic_emu() const { return !uses_fm; }
19
20 blargg_err_t set_multi_channel ( bool is_enabled ) override;
21
22 // Disable running FM chips at higher than normal rate. Will result in slightly
23 // more aliasing of high notes.
24 void disable_oversampling( bool disable = true ) { disable_oversampling_ = disable; }
25
26 // VGM header format
27 enum { header_size = 0x40 };
28 struct header_t
29 {
30 char tag [4];
31 byte data_size [4];
32 byte version [4];
33 byte psg_rate [4];
34 byte ym2413_rate [4];
35 byte gd3_offset [4];
37 byte loop_offset [4];
38 byte loop_duration [4];
39 byte frame_rate [4];
42 byte unused1;
43 byte ym2612_rate [4];
44 byte ym2151_rate [4];
45 byte data_offset [4];
46 byte unused2 [8];
47 };
48
49 // Header for currently loaded file
50 header_t const& header() const { return *(header_t const*) data; }
51
52 static gme_type_t static_type() { return gme_vgm_type; }
53
54public:
55 // deprecated
56 using Music_Emu::load;
57 blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
58 { return load_remaining_( &h, sizeof h, in ); }
59 byte const* gd3_data( int* size_out = 0 ) const; // use track_info()
60
61public:
62 Vgm_Emu();
63 ~Vgm_Emu();
64protected:
65 blargg_err_t track_info_( track_info_t*, int track ) const;
66 blargg_err_t load_mem_( byte const*, long );
67 blargg_err_t set_sample_rate_( long sample_rate );
68 blargg_err_t start_track_( int );
69 blargg_err_t play_( long count, sample_t* );
70 blargg_err_t run_clocks( blip_time_t&, int );
71 void set_tempo_( double );
72 void mute_voices_( int mask );
74 void update_eq( blip_eq_t const& );
75private:
76 // removed; use disable_oversampling() and set_tempo() instead
77 Vgm_Emu( bool oversample, double tempo = 1.0 );
78 double fm_rate;
82 bool uses_fm;
83 blargg_err_t setup_fm();
84};
85
86#endif
blip_long blip_time_t
Definition Blip_Buffer.h:17
LADSPA_Data sample_t
Definition basics.h:100
static const unsigned long mask[]
Definition bitwise.c:31
Definition Blip_Buffer.h:23
Definition Data_Reader.h:10
Definition Vgm_Emu_Impl.h:27
byte const * data
Definition Vgm_Emu_Impl.h:45
header_t const & header() const
Definition Vgm_Emu.h:50
long psg_rate
Definition Vgm_Emu.h:79
blargg_err_t track_info_(track_info_t *, int track) const
Definition Vgm_Emu.cpp:141
blargg_err_t set_sample_rate_(long sample_rate)
Definition Vgm_Emu.cpp:230
static gme_type_t static_type()
Definition Vgm_Emu.h:52
void set_tempo_(double)
Definition Vgm_Emu.cpp:214
blargg_err_t play_(long count, sample_t *)
Definition Vgm_Emu.cpp:427
@ header_size
Definition Vgm_Emu.h:27
void mute_voices_(int mask)
Definition Vgm_Emu.cpp:267
bool disable_oversampling_
Definition Vgm_Emu.h:81
Vgm_Emu()
Definition Vgm_Emu.cpp:26
bool is_classic_emu() const
Definition Vgm_Emu.h:18
Vgm_Emu(bool oversample, double tempo=1.0)
void disable_oversampling(bool disable=true)
Definition Vgm_Emu.h:24
~Vgm_Emu()
Definition Vgm_Emu.cpp:42
blargg_err_t load(header_t const &h, Data_Reader &in)
Definition Vgm_Emu.h:57
blargg_err_t start_track_(int)
Definition Vgm_Emu.cpp:386
blargg_err_t run_clocks(blip_time_t &, int)
Definition Vgm_Emu.cpp:420
blargg_err_t setup_fm()
Definition Vgm_Emu.cpp:333
void update_eq(blip_eq_t const &)
Definition Vgm_Emu.cpp:255
bool uses_fm
Definition Vgm_Emu.h:82
double fm_rate
Definition Vgm_Emu.h:78
blargg_err_t set_multi_channel(bool is_enabled) override
Definition Vgm_Emu.cpp:236
blargg_err_t load_mem_(byte const *, long)
Definition Vgm_Emu.cpp:292
long vgm_rate
Definition Vgm_Emu.h:80
byte const * gd3_data(int *size_out=0) const
Definition Vgm_Emu.cpp:101
void set_voice(int, Blip_Buffer *, Blip_Buffer *, Blip_Buffer *)
Definition Vgm_Emu.cpp:261
Definition Blip_Buffer.h:239
const struct gme_type_t_ * gme_type_t
Definition gme.h:161
const gme_type_t gme_vgm_type
Definition gme.h:174
float in
Definition lilv_test.c:1460
blargg_err_t load(Data_Reader &)
Definition Gme_File.cpp:93
blargg_err_t load_remaining_(void const *header, long header_size, Data_Reader &remaining)
Definition Gme_File.cpp:107
double tempo() const
Definition Music_Emu.h:135
long sample_rate() const
Definition Music_Emu.h:217
Definition Vgm_Emu.h:29
byte data_offset[4]
Definition Vgm_Emu.h:45
byte version[4]
Definition Vgm_Emu.h:32
char tag[4]
Definition Vgm_Emu.h:30
byte unused1
Definition Vgm_Emu.h:42
byte loop_offset[4]
Definition Vgm_Emu.h:37
byte unused2[8]
Definition Vgm_Emu.h:46
byte data_size[4]
Definition Vgm_Emu.h:31
byte ym2612_rate[4]
Definition Vgm_Emu.h:43
byte ym2413_rate[4]
Definition Vgm_Emu.h:34
byte loop_duration[4]
Definition Vgm_Emu.h:38
byte ym2151_rate[4]
Definition Vgm_Emu.h:44
byte gd3_offset[4]
Definition Vgm_Emu.h:35
byte frame_rate[4]
Definition Vgm_Emu.h:39
byte noise_width
Definition Vgm_Emu.h:41
byte noise_feedback[2]
Definition Vgm_Emu.h:40
byte track_duration[4]
Definition Vgm_Emu.h:36
byte psg_rate[4]
Definition Vgm_Emu.h:33
Definition Gme_File.h:28
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263