From 3b96d7f1decff57af07d7e251e20f86cca6cc93b Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Wed, 4 Jan 2012 01:20:38 +0000 Subject: [PATCH] genmidi: Split off GENMIDI code into separate file. Split out code for handling the GENMIDI format into a separate genmidi.py file. Add routine to load the contents of a GENMIDI lump. --- lumps/genmidi/genmidi.py | 214 ++++++++++++++++++++++++++++++++++++ lumps/genmidi/instrument.py | 7 ++ lumps/genmidi/mkgenmidi | 96 +--------------- 3 files changed, 223 insertions(+), 94 deletions(-) create mode 100644 lumps/genmidi/genmidi.py diff --git a/lumps/genmidi/genmidi.py b/lumps/genmidi/genmidi.py new file mode 100644 index 00000000..88b1f1dc --- /dev/null +++ b/lumps/genmidi/genmidi.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python +# +# Copyright (c) 2011, 2012 +# Contributors to the Freedoom project. 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 the 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. +# +# ---------------------------------------------------------------------- +# +# Module for interacting with Doom GENMIDI lumps. +# + +from instrument import Instrument, NullInstrument +import struct +import sys + +GENMIDI_HEADER = "#OPL_II#" +NUM_INSTRUMENTS = 175 +INSTR_DATA_LEN = 36 +INSTR_NAME_LEN = 32 + +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() +genmidi.write(sys.argv[1], INSTRUMENTS + PERCUSSION)