From 3fb0fdac05d293f92a616dd1b234ff8e069f365f Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Mon, 2 Jan 2012 23:40:38 +0000 Subject: [PATCH] genmidi: Add script to make GENMIDI lump. --- lumps/genmidi/instrument.py | 6 +-- lumps/genmidi/mkgenmidi | 104 ++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 lumps/genmidi/mkgenmidi diff --git a/lumps/genmidi/instrument.py b/lumps/genmidi/instrument.py index f42917fc..85ae612e 100644 --- a/lumps/genmidi/instrument.py +++ b/lumps/genmidi/instrument.py @@ -73,12 +73,12 @@ def load_instrument(filename): class Instrument: def __init__(self, file1, file2=None, off1=0, off2=0, note=None): - self.instr1 = load_instrument(file1) + self.voice1 = load_instrument(file1) if file2 is not None: - self.instr2 = load_instrument(file2) + self.voice2 = load_instrument(file2) else: - self.instr2 = None + self.voice2 = None self.fixed_note = note self.offset1 = off1 diff --git a/lumps/genmidi/mkgenmidi b/lumps/genmidi/mkgenmidi new file mode 100644 index 00000000..cb227313 --- /dev/null +++ b/lumps/genmidi/mkgenmidi @@ -0,0 +1,104 @@ + +from instrument import NullInstrument +import struct +import sys + +GENMIDI_HEADER = "#OPL_II#" + +FLAG_FIXED_PITCH = 0x0001 +FLAG_TWO_VOICE = 0x0004 + +KSL_MASK = 0xc0 +VOLUME_MASK = 0x3f + +# Order of fields in GENMIDI data structures. + +GENMIDI_FIELDS = [ + "m_am_vibrato_eg", + "m_attack_decay", + "m_sustain_release", + "m_waveform", + "m_ksl", + "m_volume", + "feedback_fm", + "c_am_vibrato_eg", + "c_attack_decay", + "c_sustain_release", + "c_waveform", + "c_ksl", + "c_volume", + "null", + "note_offset" +] + +# Encode a single voice of an instrument to binary. + +def encode_voice(data, offset): + result = dict(data) + + result["m_ksl"] = data["m_ksl_volume"] & KSL_MASK + result["m_volume"] = data["m_ksl_volume"] & VOLUME_MASK + result["c_ksl"] = data["c_ksl_volume"] & KSL_MASK + result["c_volume"] = data["c_ksl_volume"] & VOLUME_MASK + + result["null"] = 0 + result["note_offset"] = offset + + return struct.pack("> sys.stderr, "Usage: %s " % sys.argv[0] + sys.exit(-1) + +from config import INSTRUMENTS, PERCUSSION + +f = open(sys.argv[1], "w") +f.write(encode_genmidi()) +f.close() +