mirror of
https://github.com/freedoom/freedoom.git
synced 2025-09-02 16:25:47 -04:00
Some of the DMXGUS instrument names seem to have long sections of whitespace like this, and we can clean it up while dumping.
60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
# Module to load Creative SBI OPL instrument files.
|
|
#
|
|
|
|
import struct
|
|
import sys
|
|
|
|
HEADER_VALUE = "SBI\x1a"
|
|
|
|
FIELDS = [
|
|
"m_am_vibrato_eg",
|
|
"c_am_vibrato_eg",
|
|
"m_ksl_volume",
|
|
"c_ksl_volume",
|
|
"m_attack_decay",
|
|
"c_attack_decay",
|
|
"m_sustain_release",
|
|
"c_sustain_release",
|
|
"m_waveform",
|
|
"c_waveform",
|
|
"feedback_fm",
|
|
]
|
|
|
|
|
|
def read(filename):
|
|
with open(filename, "rb") as f:
|
|
data = f.read()
|
|
|
|
header, name = struct.unpack("4s32s", data[0:36])
|
|
header = header.decode("ascii")
|
|
|
|
if header != HEADER_VALUE:
|
|
raise Exception("Invalid header for SBI file!")
|
|
|
|
instr_data = data[36:]
|
|
result = {"name": name.decode("ascii").rstrip("\0").rstrip()}
|
|
|
|
for i in range(len(FIELDS)):
|
|
result[FIELDS[i]], = struct.unpack("B", instr_data[i : i + 1])
|
|
|
|
return result
|
|
|
|
|
|
def write(filename, data):
|
|
with open(filename, "wb") as f:
|
|
f.write(struct.pack("4s", HEADER_VALUE.encode("ascii")))
|
|
f.write(struct.pack("32s", data["name"].encode("ascii")))
|
|
|
|
for field in FIELDS:
|
|
f.write(struct.pack("B", data[field]))
|
|
for x in range(16 - len(FIELDS)):
|
|
f.write(struct.pack("B", 0))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
for filename in sys.argv[1:]:
|
|
print(filename)
|
|
print(read(filename))
|