genmidi: Move GENMIDI C code to subdirectory.

Move C code into subdirectory as it will soon be only of historical
interest. Add extra program to dump SBI instrument patches, switch
to using OPL2 instruments, and ignore "null" instruments (all-zero).
This commit is contained in:
Simon Howard 2011-12-27 03:01:47 +00:00
parent 5ce7690612
commit b754214379
8 changed files with 138 additions and 20 deletions

View file

@ -1,16 +0,0 @@
CFLAGS = -Wall
OBJS = genmidi-gen.o oplinstrs.o instrnames.o
genmidi.lmp : genmidi-gen
./genmidi-gen $@
genmidi-gen : $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $^ -o $@
clean:
rm -f $(OBJS) genmidi-gen genmidi.lmp

View file

@ -0,0 +1,19 @@
CFLAGS = -Wall
OBJS = oplinstrs.o instrnames.o
genmidi.lmp : genmidi-gen
./genmidi-gen $@
genmidi-gen : $(OBJS) genmidi-gen.o
$(CC) $(LDFLAGS) $(OBJS) genmidi-gen.o -o $@
dump-sbi : $(OBJS) dump-sbi.o
$(CC) $(LDFLAGS) $(OBJS) dump-sbi.o -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $^ -o $@
clean:
rm -f $(OBJS) genmidi-gen genmidi.lmp

View file

@ -1,4 +1,7 @@
This is the "original" code previously used to generate a GENMIDI
lump, and the original set of patches.
This code generates a functional GENMIDI lump using the free patch data
from the OpenBSD OPL MIDI driver. The result doesn't sound quite as
good as the original Doom lump; however, most source ports don't use

View file

@ -0,0 +1,94 @@
//
// Copyright (c) 2011, Simon Howard
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of Freedoom project nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "oplvar.h"
#define SBI_HEADER "SBI\x1a"
struct sbi {
char header[4];
char name[32];
char opldata[16];
};
extern char *genmidi_instr_names[];
static int is_null_instr(struct opl_operators *instrument)
{
int i;
for (i = 0; i < 10; ++i) {
if (instrument->ops[i] != 0x00) {
return 0;
}
}
return 1;
}
static void write_sbi(char *filename, char *instrname, struct opl_operators *opl)
{
FILE *fs;
struct sbi data;
memset(&data, 0, sizeof(data));
memcpy(data.header, SBI_HEADER, 4);
strcpy(data.name, instrname);
memcpy(data.opldata, opl->ops, 16);
fs = fopen(filename, "wb");
fwrite(&data, 1, sizeof(data), fs);
fclose(fs);
}
int main(int argc, char *argv[])
{
char filename[32];
int i;
for (i = 0; i < 175; ++i) {
if (is_null_instr(&opl2_instrs[i])) {
continue;
}
if (i < 128) {
sprintf(filename, "instr%03i.sbi", i + 1);
} else {
sprintf(filename, "perc%02i.sbi", i - 128 + 35);
}
write_sbi(filename, genmidi_instr_names[i], &opl2_instrs[i]);
}
return 0;
}

View file

@ -83,6 +83,19 @@ static void write_sbi_data(FILE *fstream, unsigned char *data)
fputc(0, fstream);
}
static int is_null_instr(struct opl_operators *instrument)
{
int i;
for (i = 0; i < 10; ++i) {
if (instrument->ops[i] != 0x00) {
return 0;
}
}
return 1;
}
static void write_instrument(FILE *fstream,
struct opl_operators *instrument,
int percussion)
@ -101,7 +114,12 @@ static void write_instrument(FILE *fstream,
fputc(0x00, fstream);
fputc(0x80, fstream); // finetune
fputc(0x00, fstream); // fixed note
if (is_null_instr(instrument)) { // fixed note
fputc(0x00, fstream);
} else {
fputc(0x10, fstream);
}
write_sbi_data(fstream, instrument->ops);
write_sbi_data(fstream, instrument->ops + 11);
@ -143,7 +161,7 @@ static void output_genmidi(char *filename)
write_header(fstream);
write_instrument_data(fstream, opl3_instrs);
write_instrument_data(fstream, opl2_instrs);
write_instrument_names(fstream, genmidi_instr_names);
fclose(fstream);