Remove midi_timiditylike

- Did anybody actually use this? Use WildMidi instead if you want
  something that sounds more like Timidity++ without actually being
  Timidity++, since not even the old Timidity manages that.
This commit is contained in:
Randy Heit 2015-12-29 16:04:26 -06:00
parent 0cc4bd56d1
commit 14361d9313
9 changed files with 33 additions and 165 deletions

View file

@ -142,7 +142,7 @@ static void reverse_data(sample_t *sp, int ls, int le)
TODO: do reverse loops right */ TODO: do reverse loops right */
static Instrument *load_instrument(Renderer *song, const char *name, int percussion, static Instrument *load_instrument(Renderer *song, const char *name, int percussion,
int panning, int amp, int note_to_use, int panning, int note_to_use,
int strip_loop, int strip_envelope, int strip_loop, int strip_envelope,
int strip_tail) int strip_tail)
{ {
@ -372,7 +372,6 @@ fail:
{ {
sp->modes &= ~(PATCH_SUSTAIN | PATCH_LOOPEN | PATCH_BIDIR | PATCH_BACKWARD); sp->modes &= ~(PATCH_SUSTAIN | PATCH_LOOPEN | PATCH_BIDIR | PATCH_BACKWARD);
} }
sp->modes |= PATCH_T_NO_LOOP;
} }
if (strip_envelope == 1) if (strip_envelope == 1)
@ -398,37 +397,6 @@ fail:
patch_data.EnvelopeOffset[k] = patch_data.EnvelopeOffset[0]; patch_data.EnvelopeOffset[k] = patch_data.EnvelopeOffset[0];
} }
} }
sp->modes |= PATCH_T_NO_ENVELOPE;
}
else if (strip_envelope != 0)
{
/* Have to make a guess. */
if (!(sp->modes & (PATCH_LOOPEN | PATCH_BIDIR | PATCH_BACKWARD)))
{
/* No loop? Then what's there to sustain? No envelope needed either... */
sp->modes |= PATCH_T_NO_ENVELOPE;
cmsg(CMSG_INFO, VERB_DEBUG, " - No loop, removing sustain and envelope\n");
}
else if (memcmp(patch_data.EnvelopeRate, "??????", 6) == 0 || patch_data.EnvelopeOffset[GF1_RELEASEC] >= 100)
{
/* Envelope rates all maxed out? Envelope end at a high "offset"?
That's a weird envelope. Take it out. */
sp->modes |= PATCH_T_NO_ENVELOPE;
cmsg(CMSG_INFO, VERB_DEBUG, " - Weirdness, removing envelope\n");
}
else if (!(sp->modes & PATCH_SUSTAIN))
{
/* No sustain? Then no envelope. I don't know if this is
justified, but patches without sustain usually don't need the
envelope either... at least the Gravis ones. They're mostly
drums. I think. */
sp->modes |= PATCH_T_NO_ENVELOPE;
cmsg(CMSG_INFO, VERB_DEBUG, " - No sustain, removing envelope\n");
}
}
if (!(sp->modes & PATCH_NO_SRELEASE))
{ // TiMidity thinks that this is an envelope enable flag.
sp->modes |= PATCH_T_NO_ENVELOPE;
} }
for (j = 0; j < 6; j++) for (j = 0; j < 6; j++)
@ -470,29 +438,6 @@ fail:
sp->modes |= PATCH_LOOPEN; /* just in case */ sp->modes |= PATCH_LOOPEN; /* just in case */
} }
if (amp != -1)
{
sp->volume = (amp) / 100.f;
}
else
{
/* Try to determine a volume scaling factor for the sample.
This is a very crude adjustment, but things sound more
balanced with it. Still, this should be a runtime option.
(This is ignored unless midi_timiditylike is turned on.) */
int i;
sample_t maxamp = 0, a;
sample_t *tmp;
for (i = sp->data_length, tmp = sp->data; i; --i)
{
a = fabsf(*tmp++);
if (a > maxamp)
maxamp = a;
}
sp->volume = 1 / maxamp;
cmsg(CMSG_INFO, VERB_DEBUG, " * volume comp: %f\n", sp->volume);
}
/* Then fractional samples */ /* Then fractional samples */
sp->data_length <<= FRACTION_BITS; sp->data_length <<= FRACTION_BITS;
sp->loop_start <<= FRACTION_BITS; sp->loop_start <<= FRACTION_BITS;
@ -653,7 +598,6 @@ static int fill_bank(Renderer *song, int dr, int b)
ip = load_instrument(song, bank->tone[i].name, ip = load_instrument(song, bank->tone[i].name,
(dr) ? 1 : 0, (dr) ? 1 : 0,
bank->tone[i].pan, bank->tone[i].pan,
bank->tone[i].amp,
(bank->tone[i].note != -1) ? bank->tone[i].note : ((dr) ? i : -1), (bank->tone[i].note != -1) ? bank->tone[i].note : ((dr) ? i : -1),
(bank->tone[i].strip_loop != -1) ? bank->tone[i].strip_loop : ((dr) ? 1 : -1), (bank->tone[i].strip_loop != -1) ? bank->tone[i].strip_loop : ((dr) ? 1 : -1),
(bank->tone[i].strip_envelope != -1) ? bank->tone[i].strip_envelope : ((dr) ? 1 : -1), (bank->tone[i].strip_envelope != -1) ? bank->tone[i].strip_envelope : ((dr) ? 1 : -1),
@ -731,7 +675,7 @@ void free_instruments()
int Renderer::set_default_instrument(const char *name) int Renderer::set_default_instrument(const char *name)
{ {
Instrument *ip; Instrument *ip;
if ((ip = load_instrument(this, name, 0, -1, -1, -1, 0, 0, 0)) == NULL) if ((ip = load_instrument(this, name, 0, -1, -1, 0, 0, 0)) == NULL)
{ {
return -1; return -1;
} }

View file

@ -1141,7 +1141,6 @@ static void load_region_dls(Renderer *song, Sample *sample, DLS_Instrument *ins,
sample->loop_start = rgn->wsmp_loop->ulStart / 2; sample->loop_start = rgn->wsmp_loop->ulStart / 2;
sample->loop_end = sample->loop_start + (rgn->wsmp_loop->ulLength / 2); sample->loop_end = sample->loop_start + (rgn->wsmp_loop->ulLength / 2);
} }
sample->volume = 1.0f;
if (sample->modes & PATCH_SUSTAIN) if (sample->modes & PATCH_SUSTAIN)
{ {

View file

@ -1441,7 +1441,6 @@ void SFFile::ApplyGeneratorsToRegion(SFGenComposite *gen, SFSample *sfsamp, Rend
sp->root_freq = note_to_freq(sp->scale_note); sp->root_freq = note_to_freq(sp->scale_note);
sp->sample_rate = sfsamp->SampleRate; sp->sample_rate = sfsamp->SampleRate;
sp->key_group = gen->exclusiveClass; sp->key_group = gen->exclusiveClass;
sp->volume = 1;
// Set key scaling // Set key scaling
if (gen->keynum >= 0 && gen->keynum <= 127) if (gen->keynum >= 0 && gen->keynum <= 127)

View file

@ -29,8 +29,6 @@
#include "templates.h" #include "templates.h"
#include "c_cvars.h" #include "c_cvars.h"
EXTERN_CVAR(Bool, midi_timiditylike)
namespace Timidity namespace Timidity
{ {
@ -78,16 +76,7 @@ void GF1Envelope::Init(Renderer *song, Voice *v)
void GF1Envelope::Release(Voice *v) void GF1Envelope::Release(Voice *v)
{ {
if (midi_timiditylike) if (!(v->sample->modes & PATCH_NO_SRELEASE) || (v->sample->modes & PATCH_FAST_REL))
{
if (!(v->sample->modes & PATCH_T_NO_ENVELOPE))
{
stage = GF1_RELEASE;
Recompute(v);
}
// else ... loop was already turned off by the caller
}
else if (!(v->sample->modes & PATCH_NO_SRELEASE) || (v->sample->modes & PATCH_FAST_REL))
{ {
/* ramp out to minimum volume with rate from final release stage */ /* ramp out to minimum volume with rate from final release stage */
stage = GF1_RELEASEC+1; stage = GF1_RELEASEC+1;
@ -119,23 +108,11 @@ bool GF1Envelope::Recompute(Voice *v)
bUpdating = false; bUpdating = false;
v->status &= ~(VOICE_SUSTAINING | VOICE_LPE); v->status &= ~(VOICE_SUSTAINING | VOICE_LPE);
v->status |= VOICE_RELEASING; v->status |= VOICE_RELEASING;
if (midi_timiditylike) /* play sampled release */
{ /* kill the voice ... or not */
if (volume <= 0)
{
v->status |= VOICE_STOPPING;
}
return 1;
}
else
{ /* play sampled release */
}
return 0; return 0;
} }
if (newstage == GF1_RELEASE && !(v->status & VOICE_RELEASING) && if (newstage == GF1_RELEASE && !(v->status & VOICE_RELEASING) && (v->sample->modes & PATCH_SUSTAIN))
((!midi_timiditylike && (v->sample->modes & PATCH_SUSTAIN)) ||
(midi_timiditylike && !(v->sample->modes & PATCH_T_NO_ENVELOPE))))
{ {
v->status |= VOICE_SUSTAINING; v->status |= VOICE_SUSTAINING;
/* Freeze envelope until note turns off. Trumpets want this. */ /* Freeze envelope until note turns off. Trumpets want this. */
@ -161,10 +138,6 @@ bool GF1Envelope::Recompute(Voice *v)
bool GF1Envelope::Update(Voice *v) bool GF1Envelope::Update(Voice *v)
{ {
if (midi_timiditylike && (v->sample->modes & PATCH_T_NO_ENVELOPE))
{
return 0;
}
volume += increment; volume += increment;
if (((increment < 0) && (volume <= target)) || ((increment > 0) && (volume >= target))) if (((increment < 0) && (volume <= target)) || ((increment > 0) && (volume >= target)))
{ {
@ -182,36 +155,14 @@ void GF1Envelope::ApplyToAmp(Voice *v)
double env_vol = v->attenuation; double env_vol = v->attenuation;
double final_amp; double final_amp;
if (midi_timiditylike) final_amp = FINAL_MIX_SCALE;
{ if (v->tremolo_phase_increment != 0)
final_amp = v->sample->volume * FINAL_MIX_TIMIDITY_SCALE; { // [RH] FIXME: This is wrong. Tremolo should offset the
if (v->tremolo_phase_increment != 0) // envelope volume, not scale it.
{ env_vol *= v->tremolo_volume;
env_vol *= v->tremolo_volume;
}
if (!(v->sample->modes & PATCH_T_NO_ENVELOPE))
{
if (stage > GF1_ATTACK)
{
env_vol *= pow(2.0, volume * (6.0 / (1 << 30)) - 6.0);
}
else
{
env_vol *= volume / float(1 << 30);
}
}
}
else
{
final_amp = FINAL_MIX_SCALE;
if (v->tremolo_phase_increment != 0)
{ // [RH] FIXME: This is wrong. Tremolo should offset the
// envelope volume, not scale it.
env_vol *= v->tremolo_volume;
}
env_vol *= volume / float(1 << 30);
env_vol = calc_gf1_amp(env_vol);
} }
env_vol *= volume / float(1 << 30);
env_vol = calc_gf1_amp(env_vol);
env_vol *= final_amp; env_vol *= final_amp;
v->left_mix = float(env_vol * v->left_offset); v->left_mix = float(env_vol * v->left_offset);
v->right_mix = float(env_vol * v->right_offset); v->right_mix = float(env_vol * v->right_offset);

View file

@ -29,8 +29,6 @@
#include "timidity.h" #include "timidity.h"
#include "c_cvars.h" #include "c_cvars.h"
EXTERN_CVAR(Bool, midi_timiditylike)
namespace Timidity namespace Timidity
{ {
@ -118,7 +116,7 @@ void Renderer::recompute_freq(int v)
voice[v].sample_increment = (int)(a); voice[v].sample_increment = (int)(a);
} }
static BYTE vol_table[] = { static const BYTE vol_table[] = {
000 /* 000 */, 129 /* 001 */, 145 /* 002 */, 155 /* 003 */, 000 /* 000 */, 129 /* 001 */, 145 /* 002 */, 155 /* 003 */,
161 /* 004 */, 166 /* 005 */, 171 /* 006 */, 174 /* 007 */, 161 /* 004 */, 166 /* 005 */, 171 /* 006 */, 174 /* 007 */,
177 /* 008 */, 180 /* 009 */, 182 /* 010 */, 185 /* 011 */, 177 /* 008 */, 180 /* 009 */, 182 /* 010 */, 185 /* 011 */,
@ -161,16 +159,7 @@ void Renderer::recompute_amp(Voice *v)
if (v->sample->type == INST_GUS) if (v->sample->type == INST_GUS)
{ {
if (midi_timiditylike) v->attenuation = (vol_table[(chanvol * chanexpr) / 127] * vol_table[v->velocity]) * ((127 + 64) / 12419775.f);
{
v->attenuation = float(timidityxx_perceived_vol(v->velocity / 127.0) *
timidityxx_perceived_vol(chanvol / 127.0) *
timidityxx_perceived_vol(chanexpr / 127.0));
}
else
{
v->attenuation = (vol_table[(chanvol * chanexpr) / 127] * vol_table[v->velocity]) * ((127 + 64) / 12419775.f);
}
} }
else else
{ {
@ -199,7 +188,7 @@ void Renderer::compute_pan(double pan, int type, float &left_offset, float &righ
} }
else else
{ {
if (type == INST_GUS && !midi_timiditylike) if (type == INST_GUS)
{ {
/* Original amp equation looks like this: /* Original amp equation looks like this:
* calc_gf1_amp(atten + offset) * calc_gf1_amp(atten + offset)
@ -218,9 +207,7 @@ void Renderer::compute_pan(double pan, int type, float &left_offset, float &righ
} }
else else
{ {
/* I have no idea what equation, if any, will reproduce the sc_pan_table /* Equal Power Panning for SF2/DLS.
* that TiMidity++ uses, so midi_timiditylike gets the same Equal Power
* Panning as SF2/DLS.
*/ */
left_offset = (float)sqrt(1 - pan); left_offset = (float)sqrt(1 - pan);
right_offset = (float)sqrt(pan); right_offset = (float)sqrt(pan);
@ -561,7 +548,7 @@ void Renderer::finish_note(int i)
v->status &= ~VOICE_SUSTAINING; v->status &= ~VOICE_SUSTAINING;
v->status |= VOICE_RELEASING; v->status |= VOICE_RELEASING;
if (!(v->sample->modes & PATCH_NO_SRELEASE) || midi_timiditylike) if (!(v->sample->modes & PATCH_NO_SRELEASE))
{ {
v->status &= ~VOICE_LPE; /* sampled release */ v->status &= ~VOICE_LPE; /* sampled release */
} }

View file

@ -28,8 +28,6 @@
#include "timidity.h" #include "timidity.h"
#include "c_cvars.h" #include "c_cvars.h"
EXTERN_CVAR(Bool, midi_timiditylike)
namespace Timidity namespace Timidity
{ {
@ -522,7 +520,7 @@ sample_t *resample_voice(Renderer *song, Voice *vp, int *countptr)
if (vp->vibrato_control_ratio) if (vp->vibrato_control_ratio)
{ {
if (vp->status & VOICE_LPE && !(midi_timiditylike && vp->sample->modes & PATCH_T_NO_LOOP)) if (vp->status & VOICE_LPE)
{ {
if (modes & PATCH_BIDIR) if (modes & PATCH_BIDIR)
return rs_vib_bidir(song->resample_buffer, song->rate, vp, *countptr); return rs_vib_bidir(song->resample_buffer, song->rate, vp, *countptr);
@ -536,7 +534,7 @@ sample_t *resample_voice(Renderer *song, Voice *vp, int *countptr)
} }
else else
{ {
if (vp->status & VOICE_LPE && !(midi_timiditylike && vp->sample->modes & PATCH_T_NO_LOOP)) if (vp->status & VOICE_LPE)
{ {
if (modes & PATCH_BIDIR) if (modes & PATCH_BIDIR)
return rs_bidir(song->resample_buffer, vp, *countptr); return rs_bidir(song->resample_buffer, vp, *countptr);

View file

@ -34,7 +34,6 @@
CVAR(String, midi_config, CONFIG_FILE, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(String, midi_config, CONFIG_FILE, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(Int, midi_voices, 32, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Int, midi_voices, 32, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(Bool, midi_timiditylike, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(String, gus_patchdir, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(String, gus_patchdir, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(Bool, midi_dmxgus, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, midi_dmxgus, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR(Int, gus_memsize, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Int, gus_memsize, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -377,7 +376,7 @@ static int read_config_file(const char *name, bool ismain)
delete fp; delete fp;
return -2; return -2;
} }
bank->tone[i].note = bank->tone[i].amp = bank->tone[i].pan = bank->tone[i].note = bank->tone[i].pan =
bank->tone[i].fontbank = bank->tone[i].fontpreset = bank->tone[i].fontbank = bank->tone[i].fontpreset =
bank->tone[i].fontnote = bank->tone[i].strip_loop = bank->tone[i].fontnote = bank->tone[i].strip_loop =
bank->tone[i].strip_envelope = bank->tone[i].strip_tail = -1; bank->tone[i].strip_envelope = bank->tone[i].strip_tail = -1;
@ -415,14 +414,7 @@ static int read_config_file(const char *name, bool ismain)
*cp++ = 0; *cp++ = 0;
if (!strcmp(w[j], "amp")) if (!strcmp(w[j], "amp"))
{ {
k = atoi(cp); /* Ignored */
if ((k < 0 || k > MAX_AMPLIFICATION) || (*cp < '0' || *cp > '9'))
{
Printf("%s: line %d: amplification must be between 0 and %d\n", name, line, MAX_AMPLIFICATION);
delete fp;
return -2;
}
bank->tone[i].amp = k;
} }
else if (!strcmp(w[j], "note")) else if (!strcmp(w[j], "note"))
{ {
@ -676,7 +668,7 @@ int LoadDMXGUS()
continue; continue;
int val = k % 128; int val = k % 128;
bank->tone[val].note = bank->tone[val].amp = bank->tone[val].pan = bank->tone[val].note = bank->tone[val].pan =
bank->tone[val].fontbank = bank->tone[val].fontpreset = bank->tone[val].fontbank = bank->tone[val].fontpreset =
bank->tone[val].fontnote = bank->tone[val].strip_loop = bank->tone[val].fontnote = bank->tone[val].strip_loop =
bank->tone[val].strip_envelope = bank->tone[val].strip_tail = -1; bank->tone[val].strip_envelope = bank->tone[val].strip_tail = -1;

View file

@ -55,10 +55,6 @@ config.h
volume level of FMOD's built-in MIDI player. */ volume level of FMOD's built-in MIDI player. */
#define FINAL_MIX_SCALE 0.5 #define FINAL_MIX_SCALE 0.5
/* This value is used instead when midi_timiditylike is turned on,
because TiMidity++ is louder than a GUS. */
#define FINAL_MIX_TIMIDITY_SCALE 0.3
/* How many bits to use for the fractional part of sample positions. /* How many bits to use for the fractional part of sample positions.
This affects tonal accuracy. The entire position counter must fit This affects tonal accuracy. The entire position counter must fit
in 32 bits, so with FRACTION_BITS equal to 12, the maximum size of in 32 bits, so with FRACTION_BITS equal to 12, the maximum size of
@ -211,9 +207,6 @@ enum
PATCH_SUSTAIN = (1<<5), PATCH_SUSTAIN = (1<<5),
PATCH_NO_SRELEASE = (1<<6), PATCH_NO_SRELEASE = (1<<6),
PATCH_FAST_REL = (1<<7), PATCH_FAST_REL = (1<<7),
PATCH_T_NO_ENVELOPE = (1<<8),
PATCH_T_NO_LOOP = (1<<9)
}; };
struct Sample struct Sample
@ -239,8 +232,6 @@ struct Sample
short release_vol; short release_vol;
} sf2; } sf2;
} envelope; } envelope;
float
volume;
sample_t *data; sample_t *data;
SDWORD SDWORD
tremolo_sweep_increment, tremolo_phase_increment, tremolo_sweep_increment, tremolo_phase_increment,
@ -316,11 +307,12 @@ struct Instrument
struct ToneBankElement struct ToneBankElement
{ {
ToneBankElement() : ToneBankElement() :
note(0), amp(0), pan(0), strip_loop(0), strip_envelope(0), strip_tail(0) note(0), pan(0), strip_loop(0), strip_envelope(0), strip_tail(0)
{} {}
FString name; FString name;
int note, amp, pan, fontbank, fontpreset, fontnote, strip_loop, strip_envelope, strip_tail; int note, pan, fontbank, fontpreset, fontnote;
SBYTE strip_loop, strip_envelope, strip_tail;
}; };
/* A hack to delay instrument loading until after reading the entire MIDI file. */ /* A hack to delay instrument loading until after reading the entire MIDI file. */
@ -608,8 +600,6 @@ const double log_of_2 = 0.69314718055994529;
#define calc_gf1_amp(x) (pow(2.0,((x)*16.0 - 16.0))) // Actual GUS equation #define calc_gf1_amp(x) (pow(2.0,((x)*16.0 - 16.0))) // Actual GUS equation
#define cb_to_amp(x) (pow(10.0, (x) * (1 / -200.0))) // centibels to amp #define cb_to_amp(x) (pow(10.0, (x) * (1 / -200.0))) // centibels to amp
#define db_to_amp(x) (pow(10.0, (x) * (1 / -20.0))) // decibels to map
#define timidityxx_perceived_vol(x) (pow((x), 1.66096404744))
/* /*
timidity.h timidity.h

View file

@ -942,6 +942,10 @@
RelativePath=".\src\parsecontext.cpp" RelativePath=".\src\parsecontext.cpp"
> >
</File> </File>
<File
RelativePath=".\src\pathexpander.cpp"
>
</File>
<File <File
RelativePath=".\src\po_man.cpp" RelativePath=".\src\po_man.cpp"
> >
@ -1479,6 +1483,10 @@
RelativePath=".\src\parsecontext.h" RelativePath=".\src\parsecontext.h"
> >
</File> </File>
<File
RelativePath=".\src\pathexpander.h"
>
</File>
<File <File
RelativePath=".\src\po_man.h" RelativePath=".\src\po_man.h"
> >