LMMS
Loading...
Searching...
No Matches
Music_Emu.h
Go to the documentation of this file.
1// Common interface to game music file emulators
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef MUSIC_EMU_H
5#define MUSIC_EMU_H
6
7#include "Gme_File.h"
8class Multi_Buffer;
9
10struct Music_Emu : public Gme_File {
11public:
12// Basic functionality (see Gme_File.h for file loading/track info functions)
13
14 // Set output sample rate. Must be called only once before loading file.
15 blargg_err_t set_sample_rate( long sample_rate );
16
17 // specifies if all 8 voices get rendered to their own stereo channel
18 // default implementation of Music_Emu always returns not supported error (i.e. no multichannel support by default)
19 // derived emus must override this if they support multichannel rendering
20 virtual blargg_err_t set_multi_channel( bool is_enabled );
21
22 // Start a track, where 0 is the first track. Also clears warning string.
23 blargg_err_t start_track( int );
24
25 // Generate 'count' samples info 'buf'. Output is in stereo. Any emulation
26 // errors set warning string, and major errors also end track.
27 typedef short sample_t;
28 blargg_err_t play( long count, sample_t* buf );
29
30// Informational
31
32 // Sample rate sound is generated at
33 long sample_rate() const;
34
35 // Index of current track or -1 if one hasn't been started
36 int current_track() const;
37
38 // Number of voices used by currently loaded file
39 int voice_count() const;
40
41 // Names of voices
42 const char** voice_names() const;
43
44 bool multi_channel() const;
45
46// Track status/control
47
48 // Number of milliseconds (1000 msec = 1 second) played since beginning of track
49 long tell() const;
50
51 // Number of samples generated since beginning of track
52 long tell_samples() const;
53
54 // Seek to new time in track. Seeking backwards or far forward can take a while.
55 blargg_err_t seek( long msec );
56
57 // Equivalent to restarting track then skipping n samples
58 blargg_err_t seek_samples( long n );
59
60 // Skip n samples
61 blargg_err_t skip( long n );
62
63 // True if a track has reached its end
64 bool track_ended() const;
65
66 // Set start time and length of track fade out. Once fade ends track_ended() returns
67 // true. Fade time can be changed while track is playing.
68 void set_fade( long start_msec, long length_msec = 8000 );
69
70 // Disable automatic end-of-track detection and skipping of silence at beginning
71 void ignore_silence( bool disable = true );
72
73 // Info for current track
75 blargg_err_t track_info( track_info_t* out ) const;
76
77// Sound customization
78
79 // Adjust song tempo, where 1.0 = normal, 0.5 = half speed, 2.0 = double speed.
80 // Track length as returned by track_info() assumes a tempo of 1.0.
81 void set_tempo( double );
82
83 // Mute/unmute voice i, where voice 0 is first voice
84 void mute_voice( int index, bool mute = true );
85
86 // Set muting state of all voices at once using a bit mask, where -1 mutes them all,
87 // 0 unmutes them all, 0x01 mutes just the first voice, etc.
88 void mute_voices( int mask );
89
90 // Change overall output amplitude, where 1.0 results in minimal clamping.
91 // Must be called before set_sample_rate().
92 void set_gain( double );
93
94 // Request use of custom multichannel buffer. Only supported by "classic" emulators;
95 // on others this has no effect. Should be called only once *before* set_sample_rate().
96 virtual void set_buffer( Multi_Buffer* ) { }
97
98 // Enables/disables accurate emulation options, if any are supported. Might change
99 // equalizer settings.
100 void enable_accuracy( bool enable = true );
101
102// Sound equalization (treble/bass)
103
104 // Frequency equalizer parameters (see gme.txt)
105 // See gme.h for definition of struct gme_equalizer_t.
107
108 // Current frequency equalizater parameters
109 equalizer_t const& equalizer() const;
110
111 // Set frequency equalizer parameters
112 void set_equalizer( equalizer_t const& );
113
114 // Construct equalizer of given treble/bass settings
115 static const equalizer_t make_equalizer( double treble, double bass )
116 {
117 const Music_Emu::equalizer_t e = { treble, bass,
118 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
119 return e;
120 }
121
122 // Equalizer settings for TV speaker
123 static equalizer_t const tv_eq;
124
125public:
126 Music_Emu();
127 ~Music_Emu();
128protected:
131 void set_voice_count( int n ) { voice_count_ = n; }
132 void set_voice_names( const char* const* names );
134 double gain() const { return gain_; }
135 double tempo() const { return tempo_; }
136 void remute_voices();
137 blargg_err_t set_multi_channel_( bool is_enabled );
138
139 virtual blargg_err_t set_sample_rate_( long sample_rate ) = 0;
140 virtual void set_equalizer_( equalizer_t const& ) { }
141 virtual void enable_accuracy_( bool /* enable */ ) { }
142 virtual void mute_voices_( int mask ) = 0;
143 virtual void set_tempo_( double ) = 0;
144 virtual blargg_err_t start_track_( int ) = 0; // tempo is set before this
145 virtual blargg_err_t play_( long count, sample_t* out ) = 0;
146 virtual blargg_err_t skip_( long count );
147protected:
148 virtual void unload();
149 virtual void pre_load();
150 virtual void post_load_();
151private:
152 // general
155 const char** voice_names_;
158 double tempo_;
159 double gain_;
161
162 // returns the number of output channels, i.e. usually 2 for stereo, unlesss multi_channel_ == true
163 int out_channels() const { return this->multi_channel() ? 2*8 : 2; }
164
166 blargg_long msec_to_samples( blargg_long msec ) const;
167
168 // track-specific
170 blargg_long out_time; // number of samples played since start of track
171 blargg_long emu_time; // number of samples emulator has generated since start of track
172 bool emu_track_ended_; // emulator has reached end of track
173 volatile bool track_ended_;
174 void clear_track_vars();
175 void end_track_if_error( blargg_err_t );
176
177 // fading
178 blargg_long fade_start;
180 void handle_fade( long count, sample_t* out );
181
182 // silence detection
183 int silence_lookahead; // speed to run emulator when looking ahead for silence
185 long silence_time; // number of samples where most recent silence began
186 long silence_count; // number of samples of silence to play before using buf
187 long buf_remain; // number of samples left in silence buffer
188 enum { buf_size = 2048 };
189 blargg_vector<sample_t> buf;
190 void fill_buf();
191 void emu_play( long count, sample_t* out );
192
194 friend Music_Emu* gme_internal_new_emu_( gme_type_t, int, bool );
195 friend void gme_set_stereo_depth( Music_Emu*, double );
196};
197
198// base class for info-only derivations
200{
201 virtual blargg_err_t set_sample_rate_( long sample_rate );
202 virtual void set_equalizer_( equalizer_t const& );
203 virtual void enable_accuracy_( bool );
204 virtual void mute_voices_( int mask );
205 virtual void set_tempo_( double );
206 virtual blargg_err_t start_track_( int );
207 virtual blargg_err_t play_( long count, sample_t* out );
208 virtual void pre_load();
209 virtual void post_load_();
210};
211
212inline blargg_err_t Music_Emu::track_info( track_info_t* out ) const
213{
214 return track_info( out, current_track_ );
215}
216
217inline long Music_Emu::sample_rate() const { return sample_rate_; }
218inline const char** Music_Emu::voice_names() const { return voice_names_; }
219inline int Music_Emu::voice_count() const { return voice_count_; }
220inline int Music_Emu::current_track() const { return current_track_; }
221inline bool Music_Emu::track_ended() const { return track_ended_; }
223
225inline void Music_Emu::set_tempo_( double t ) { tempo_ = t; }
228inline blargg_err_t Music_Emu::start_track_( int ) { return 0; }
229
230inline void Music_Emu::set_voice_names( const char* const* names )
231{
232 // Intentional removal of const, so users don't have to remember obscure const in middle
233 voice_names_ = const_cast<const char**> (names);
234}
235
236inline void Music_Emu::mute_voices_( int ) { }
237
238inline void Music_Emu::set_gain( double g )
239{
240 assert( !sample_rate() ); // you must set gain before setting sample rate
241 gain_ = g;
242}
243
244#endif
assert(0)
static const unsigned long mask[]
Definition bitwise.c:31
Definition Multi_Buffer.h:12
* e
Definition inflate.c:1404
struct huft * t
Definition inflate.c:943
int g
Definition inflate.c:1573
const struct gme_type_t_ * gme_type_t
Definition gme.h:161
float out
Definition lilv_test.c:1461
Gme_File()
Definition Gme_File.cpp:38
blargg_err_t track_info(track_info_t *out, int track) const
Definition Gme_File.cpp:179
Definition Music_Emu.h:200
virtual void set_equalizer_(equalizer_t const &)
Definition Music_Emu.cpp:434
virtual void set_tempo_(double)
Definition Music_Emu.cpp:437
virtual void post_load_()
Definition Music_Emu.cpp:433
virtual void pre_load()
Definition Music_Emu.cpp:432
virtual blargg_err_t set_sample_rate_(long sample_rate)
Definition Music_Emu.cpp:431
virtual blargg_err_t start_track_(int)
Definition Music_Emu.cpp:438
virtual void mute_voices_(int mask)
Definition Music_Emu.cpp:436
virtual void enable_accuracy_(bool)
Definition Music_Emu.cpp:435
virtual blargg_err_t play_(long count, sample_t *out)
Definition Music_Emu.cpp:439
long tell() const
Definition Music_Emu.cpp:204
virtual void post_load_()
Definition Music_Emu.cpp:145
@ buf_size
Definition Music_Emu.h:188
blargg_long out_time
Definition Music_Emu.h:170
long buf_remain
Definition Music_Emu.h:187
void set_voice_count(int n)
Definition Music_Emu.h:131
long silence_time
Definition Music_Emu.h:185
virtual blargg_err_t set_sample_rate_(long sample_rate)=0
void ignore_silence(bool disable=true)
Definition Music_Emu.h:227
blargg_long fade_start
Definition Music_Emu.h:178
void remute_voices()
Definition Music_Emu.h:226
virtual blargg_err_t skip_(long count)
Definition Music_Emu.cpp:251
int mute_mask_
Definition Music_Emu.h:157
int silence_lookahead
Definition Music_Emu.h:183
bool emu_track_ended_
Definition Music_Emu.h:172
double tempo() const
Definition Music_Emu.h:135
blargg_err_t set_sample_rate(long sample_rate)
Definition Music_Emu.cpp:77
int current_track() const
Definition Music_Emu.h:220
blargg_long msec_to_samples(blargg_long msec) const
Definition Music_Emu.cpp:192
virtual void mute_voices_(int mask)=0
Definition Music_Emu.h:236
int max_initial_silence
Definition Music_Emu.h:154
void enable_accuracy(bool enable=true)
Definition Music_Emu.h:224
gme_equalizer_t equalizer_t
Definition Music_Emu.h:106
const char ** voice_names() const
Definition Music_Emu.h:218
equalizer_t equalizer_
Definition Music_Emu.h:153
virtual void enable_accuracy_(bool)
Definition Music_Emu.h:141
virtual void pre_load()
Definition Music_Emu.cpp:86
void end_track_if_error(blargg_err_t)
Definition Music_Emu.cpp:181
virtual void set_equalizer_(equalizer_t const &)
Definition Music_Emu.h:140
Music_Emu()
Definition Music_Emu.cpp:51
void fill_buf()
Definition Music_Emu.cpp:340
double gain() const
Definition Music_Emu.h:134
void set_max_initial_silence(int n)
Definition Music_Emu.h:129
void emu_play(long count, sample_t *out)
Definition Music_Emu.cpp:318
void set_tempo(double)
Definition Music_Emu.cpp:134
int out_channels() const
Definition Music_Emu.h:163
void mute_voices(int mask)
Definition Music_Emu.cpp:127
friend Music_Emu * gme_internal_new_emu_(gme_type_t, int, bool)
Definition gme.cpp:199
Multi_Buffer * effects_buffer
Definition Music_Emu.h:193
friend void gme_set_stereo_depth(Music_Emu *, double)
Definition gme.cpp:352
static const equalizer_t make_equalizer(double treble, double bass)
Definition Music_Emu.h:115
static equalizer_t const tv_eq
Definition Music_Emu.h:123
long sample_rate() const
Definition Music_Emu.h:217
long sample_rate_
Definition Music_Emu.h:165
virtual void set_tempo_(double)=0
Definition Music_Emu.h:225
int voice_count_
Definition Music_Emu.h:156
bool ignore_silence_
Definition Music_Emu.h:184
void set_silence_lookahead(int n)
Definition Music_Emu.h:130
virtual blargg_err_t set_multi_channel(bool is_enabled)
Definition Music_Emu.cpp:103
blargg_err_t skip(long n)
Definition Music_Emu.cpp:223
long tell_samples() const
Definition Music_Emu.cpp:199
blargg_vector< sample_t > buf
Definition Music_Emu.h:189
blargg_err_t track_info(track_info_t *out) const
Definition Music_Emu.h:212
void set_track_ended()
Definition Music_Emu.h:133
void handle_fade(long count, sample_t *out)
Definition Music_Emu.cpp:296
equalizer_t const & equalizer() const
Definition Music_Emu.h:222
blargg_err_t set_multi_channel_(bool is_enabled)
Definition Music_Emu.cpp:109
int current_track_
Definition Music_Emu.h:169
bool track_ended() const
Definition Music_Emu.h:221
virtual void unload()
Definition Music_Emu.cpp:44
int voice_count() const
Definition Music_Emu.h:219
blargg_err_t seek_samples(long n)
Definition Music_Emu.cpp:211
double gain_
Definition Music_Emu.h:159
void mute_voice(int index, bool mute=true)
Definition Music_Emu.cpp:117
void set_gain(double)
Definition Music_Emu.h:238
blargg_err_t play(long count, sample_t *buf)
Definition Music_Emu.cpp:357
int fade_step
Definition Music_Emu.h:179
blargg_long emu_time
Definition Music_Emu.h:171
bool multi_channel_
Definition Music_Emu.h:160
void clear_track_vars()
Definition Music_Emu.cpp:29
const char ** voice_names_
Definition Music_Emu.h:155
volatile bool track_ended_
Definition Music_Emu.h:173
void set_fade(long start_msec, long length_msec=8000)
Definition Music_Emu.cpp:282
short sample_t
Definition Music_Emu.h:27
~Music_Emu()
Definition Music_Emu.cpp:75
long silence_count
Definition Music_Emu.h:186
void set_equalizer(equalizer_t const &)
Definition Music_Emu.cpp:92
virtual blargg_err_t play_(long count, sample_t *out)=0
virtual blargg_err_t start_track_(int)=0
Definition Music_Emu.h:228
blargg_err_t seek(long msec)
Definition Music_Emu.cpp:218
blargg_err_t start_track(int)
Definition Music_Emu.cpp:151
double tempo_
Definition Music_Emu.h:158
bool multi_channel() const
Definition Music_Emu.cpp:98
void set_voice_names(const char *const *names)
Definition Music_Emu.h:230
virtual void set_buffer(Multi_Buffer *)
Definition Music_Emu.h:96
Definition gme.h:141
Definition Gme_File.h:28
int n
Definition crypt.c:458
b
Definition crypt.c:628
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263