music: DMX's "GUS instrument mappings bug" emulation
This commit is contained in:
parent
0fd26e606c
commit
bd0a63d92b
1 changed files with 33 additions and 5 deletions
|
|
@ -35,7 +35,9 @@
|
|||
typedef struct
|
||||
{
|
||||
char *patch_names[MAX_INSTRUMENTS];
|
||||
int used[MAX_INSTRUMENTS];
|
||||
int mapping[MAX_INSTRUMENTS];
|
||||
unsigned int count;
|
||||
} gus_config_t;
|
||||
|
||||
char *gus_patch_path = "";
|
||||
|
|
@ -109,6 +111,7 @@ static int SplitLine(char *line, char **fields, unsigned int max_fields)
|
|||
static void ParseLine(gus_config_t *config, char *line)
|
||||
{
|
||||
char *fields[6];
|
||||
unsigned int i;
|
||||
unsigned int num_fields;
|
||||
unsigned int instr_id, mapped_id;
|
||||
|
||||
|
|
@ -120,11 +123,33 @@ static void ParseLine(gus_config_t *config, char *line)
|
|||
}
|
||||
|
||||
instr_id = atoi(fields[0]);
|
||||
|
||||
// Skip non GM percussions.
|
||||
if ((instr_id >= 128 && instr_id < 128 + 35) || instr_id > 128 + 81)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mapped_id = atoi(fields[MappingIndex()]);
|
||||
|
||||
free(config->patch_names[instr_id]);
|
||||
config->patch_names[instr_id] = M_StringDuplicate(fields[5]);
|
||||
config->mapping[instr_id] = mapped_id;
|
||||
for (i = 0; i < config->count; i++)
|
||||
{
|
||||
if (config->used[i] == mapped_id)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == config->count)
|
||||
{
|
||||
// DMX uses wrong patch name (we should use name of 'mapped_id'
|
||||
// instrument, but DMX uses name of 'instr_id' instead).
|
||||
free(config->patch_names[i]);
|
||||
config->patch_names[i] = M_StringDuplicate(fields[5]);
|
||||
config->used[i] = mapped_id;
|
||||
config->count++;
|
||||
}
|
||||
config->mapping[instr_id] = i;
|
||||
}
|
||||
|
||||
static void ParseDMXConfig(char *dmxconf, gus_config_t *config)
|
||||
|
|
@ -137,8 +162,11 @@ static void ParseDMXConfig(char *dmxconf, gus_config_t *config)
|
|||
for (i = 0; i < MAX_INSTRUMENTS; ++i)
|
||||
{
|
||||
config->mapping[i] = -1;
|
||||
config->used[i] = -1;
|
||||
}
|
||||
|
||||
config->count = 0;
|
||||
|
||||
p = dmxconf;
|
||||
|
||||
for (;;)
|
||||
|
|
@ -225,8 +253,8 @@ static boolean WriteTimidityConfig(char *path, gus_config_t *config)
|
|||
}
|
||||
|
||||
fprintf(fstream, "\ndrumset 0\n\n");
|
||||
|
||||
for (i = 128 + 25; i < MAX_INSTRUMENTS; ++i)
|
||||
|
||||
for (i = 128 + 35; i <= 128 + 81; ++i)
|
||||
{
|
||||
if (config->mapping[i] >= 0 && config->mapping[i] < MAX_INSTRUMENTS
|
||||
&& config->patch_names[config->mapping[i]] != NULL)
|
||||
|
|
|
|||
Loading…
Reference in a new issue