mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- Add DMXGUS parsing, thanks to Gez.
SVN r3494 (trunk)
This commit is contained in:
parent
cfb9329c7f
commit
89790ac313
3 changed files with 149 additions and 1 deletions
|
@ -30,10 +30,14 @@
|
||||||
#include "c_dispatch.h"
|
#include "c_dispatch.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
#include "w_wad.h"
|
||||||
|
|
||||||
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(Bool, midi_timiditylike, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
|
CVAR(String, gus_patchdir, "", CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
|
CVAR(Bool, midi_dmxgus, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
|
CVAR(Int, gus_memsize, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
|
|
||||||
namespace Timidity
|
namespace Timidity
|
||||||
{
|
{
|
||||||
|
@ -551,7 +555,135 @@ int LoadConfig(const char *filename)
|
||||||
|
|
||||||
int LoadConfig()
|
int LoadConfig()
|
||||||
{
|
{
|
||||||
return LoadConfig(midi_config);
|
if (midi_dmxgus)
|
||||||
|
{
|
||||||
|
return LoadDMXGUS();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return LoadConfig(midi_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int LoadDMXGUS()
|
||||||
|
{
|
||||||
|
int lump = Wads.CheckNumForName("DMXGUS");
|
||||||
|
if (lump == -1) lump = Wads.CheckNumForName("DMXGUSC");
|
||||||
|
if (lump == -1) return LoadConfig(midi_config);
|
||||||
|
|
||||||
|
FWadLump data = Wads.OpenLumpNum(lump);
|
||||||
|
if (data.GetLength() == 0) return LoadConfig(midi_config);
|
||||||
|
|
||||||
|
// The GUS put its patches in %ULTRADIR%/MIDI so we can try that
|
||||||
|
FString ultradir = getenv("ULTRADIR");
|
||||||
|
if (ultradir.IsNotEmpty())
|
||||||
|
{
|
||||||
|
ultradir += "/midi";
|
||||||
|
add_to_pathlist(ultradir.GetChars());
|
||||||
|
}
|
||||||
|
// Load DMXGUS lump and patches from gus_patchdir
|
||||||
|
add_to_pathlist(gus_patchdir);
|
||||||
|
|
||||||
|
char readbuffer[1024];
|
||||||
|
long size = data.GetLength();
|
||||||
|
long read = 0;
|
||||||
|
BYTE remap[256];
|
||||||
|
|
||||||
|
FString patches[256];
|
||||||
|
memset(remap, 255, sizeof(remap));
|
||||||
|
char temp[16];
|
||||||
|
int current = -1;
|
||||||
|
int status = -1;
|
||||||
|
int gusbank = (gus_memsize >= 1 && gus_memsize <= 4) ? gus_memsize : -1;
|
||||||
|
|
||||||
|
data.Seek(0, SEEK_SET);
|
||||||
|
|
||||||
|
while (data.Gets(readbuffer, 1024) && read < size)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (readbuffer[i] != 0 && i < 1024)
|
||||||
|
{
|
||||||
|
// Don't try to parse comments
|
||||||
|
if (readbuffer[i] == '#') break;
|
||||||
|
// Actively ignore spaces
|
||||||
|
else if (readbuffer[i] == ' ') {}
|
||||||
|
// Comma separate values
|
||||||
|
else if (status >= 0 && status <= 4 && readbuffer[i] == ',')
|
||||||
|
{
|
||||||
|
if (++status == gusbank)
|
||||||
|
{
|
||||||
|
remap[current] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Status -1: outside of a line
|
||||||
|
// Status 0: reading patch value
|
||||||
|
else if (status == -1 && readbuffer[i] >= '0' && readbuffer[i] <= '9')
|
||||||
|
{
|
||||||
|
current = readbuffer[i] - '0';
|
||||||
|
status = 0;
|
||||||
|
}
|
||||||
|
else if (status == 0 && readbuffer[i] >= '0' && readbuffer[i] <= '9')
|
||||||
|
{
|
||||||
|
current *= 10;
|
||||||
|
current += readbuffer[i] - '0';
|
||||||
|
}
|
||||||
|
// Status 1 through 4: remaps (256K, 512K, 768K, and 1024K resp.)
|
||||||
|
else if (status == gusbank && readbuffer[i] >= '0' && readbuffer[i] <= '9')
|
||||||
|
{
|
||||||
|
remap[current] *= 10;
|
||||||
|
remap[current] += readbuffer[i] - '0';
|
||||||
|
}
|
||||||
|
// Status 5: parsing patch name
|
||||||
|
else if (status == 5 && i < 1015)
|
||||||
|
{
|
||||||
|
memcpy(temp, readbuffer + i, 8);
|
||||||
|
for (int j = 0; j < 8; ++j)
|
||||||
|
{
|
||||||
|
if (temp[j] < 33)
|
||||||
|
{
|
||||||
|
temp[j] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
temp[8] = 0;
|
||||||
|
patches[current] = temp;
|
||||||
|
// Prepare to parse next line
|
||||||
|
status = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
read += i;
|
||||||
|
if (i == 0) continue;
|
||||||
|
readbuffer[i-1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tonebank[0] == NULL)
|
||||||
|
{
|
||||||
|
tonebank[0] = new ToneBank;
|
||||||
|
drumset[0] = new ToneBank;
|
||||||
|
}
|
||||||
|
|
||||||
|
// From 0 to 127: tonebank[0]; from 128 to 255: drumset[0].
|
||||||
|
ToneBank *bank = tonebank[0];
|
||||||
|
for (int k = 0; k < 256; ++k)
|
||||||
|
{
|
||||||
|
int j = (gusbank > 0) ? remap[k] : k;
|
||||||
|
if (k == 128) bank = drumset[0];
|
||||||
|
// No need to bother with things that don't exist
|
||||||
|
if (patches[j].IsEmpty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int val = k % 128;
|
||||||
|
bank->tone[val].note = bank->tone[val].amp = bank->tone[val].pan =
|
||||||
|
bank->tone[val].fontbank = bank->tone[val].fontpreset =
|
||||||
|
bank->tone[val].fontnote = bank->tone[val].strip_loop =
|
||||||
|
bank->tone[val].strip_envelope = bank->tone[val].strip_tail = -1;
|
||||||
|
bank->tone[val].name = patches[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::Renderer(float sample_rate)
|
Renderer::Renderer(float sample_rate)
|
||||||
|
|
|
@ -623,6 +623,7 @@ timidity.h
|
||||||
*/
|
*/
|
||||||
struct DLS_Data;
|
struct DLS_Data;
|
||||||
int LoadConfig(const char *filename);
|
int LoadConfig(const char *filename);
|
||||||
|
int LoadDMXGUS();
|
||||||
extern int LoadConfig();
|
extern int LoadConfig();
|
||||||
extern void FreeAll();
|
extern void FreeAll();
|
||||||
|
|
||||||
|
|
|
@ -1364,6 +1364,15 @@ OptionMenu SoundOptions
|
||||||
*
|
*
|
||||||
*=======================================*/
|
*=======================================*/
|
||||||
|
|
||||||
|
OptionValue GusMemory
|
||||||
|
{
|
||||||
|
0, "Unlimited"
|
||||||
|
1, "256K"
|
||||||
|
2, "512K"
|
||||||
|
3, "768K"
|
||||||
|
4, "1024K"
|
||||||
|
}
|
||||||
|
|
||||||
OptionMenu AdvSoundOptions
|
OptionMenu AdvSoundOptions
|
||||||
{
|
{
|
||||||
Title "ADVANCED SOUND OPTIONS"
|
Title "ADVANCED SOUND OPTIONS"
|
||||||
|
@ -1373,6 +1382,12 @@ OptionMenu AdvSoundOptions
|
||||||
StaticText " "
|
StaticText " "
|
||||||
StaticText "OPL Synthesis", 1
|
StaticText "OPL Synthesis", 1
|
||||||
Option "Only emulate one OPL chip", "opl_onechip", "OnOff"
|
Option "Only emulate one OPL chip", "opl_onechip", "OnOff"
|
||||||
|
StaticText " "
|
||||||
|
StaticText "GUS Emulation", 1
|
||||||
|
Slider "MIDI voices", "midi_voices", 16, 256, 4, 0
|
||||||
|
Option "Emulate TiMidity", "midi_timiditylike", "OnOff"
|
||||||
|
Option "Read DMXGUS lumps", "midi_dmxgus", "OnOff"
|
||||||
|
Option "GUS memory size", "gus_memsize", "GusMemory"
|
||||||
}
|
}
|
||||||
|
|
||||||
/*=======================================
|
/*=======================================
|
||||||
|
|
Loading…
Reference in a new issue