#!/usr/bin/env python3 # SPDX-License-Identifier: BSD-3-Clause # # 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( "