Export Hoot memory dumps to VOPM instruments
Go to file
2022-06-07 16:04:44 -05:00
.gitignore lol how did i not notice this 2019-05-20 20:31:05 -05:00
hootvopm.py oh yeah maybe i should change the url 2022-06-07 16:04:44 -05:00
README.md added binary mode and "raw" input, opna now supports all 6 instruments 2022-06-07 14:28:35 -05:00

hootvopm

This script converts a Hoot memory dump into an .opm instrument pack, suitable for the VOPM VST plugin. It's an extremely rudimentary way of extracting FM instruments from games, but it works.

Usage

./hootvopm.py [-b] -t chip_type input_file

Input file can also be - to read from stdin.

Output is dumped straight to stdout; redirect it to a file if you want to save it.

Pass -b to instead read straight binary data instead of comma-separated values.

Currently-supported chip types

  • OPM
  • OPN
  • OPNA (equivalent to OPN)
  • Raw data in 32-byte groups (see below)

Raw data format

Offset Value
0x00 DT/MUL*
0x04 TL*
0x08 KS/AR*
0x0C AMS-EN/D1R*
0x10 DT2/D2R*
0x14 D1L/RR*
0x18 FL/CON
0x19 AMS/PMS

Rows marked with * are groups of 4 bytes, one per operator.

Capturing memory in hoot

  • Left- and right-clicking the "driver work" area flips between available memory pages. Scrolling the wheel in this area scrolls through the current page; you can also use Ctrl-(Up/Down/PgUp/PgDn) for this purpose.
  • When you see the area you need to capture, use Ctrl-C to copy it to the clipboard. This copies the entire page to the clipboard in a human-readable format, with 16 comma-separated hex bytes per line (plus a comma at the end for whatever reason, but this is ignored).
  • Paste this into a file, trimming it down to get the register area of the FM sound chip. Save it as whatever.

Tips

  • Most chips (read: all of the ones currently supported by this script) have a 256-byte register area, meaning you'll need to trim it down to 16 lines.
  • From what I've seen, the chip's register area almost always resides on the first page, starting either at 0x0000 or 0x0100.

Known issues

  • Since the script looks at a simple static memory dump, it has no way of capturing certain data, instead replacing it with placeholders. These include:
    • LFO data
    • Operator on/off state; all operators are considered to be in use (this could potentially be inferred, though)
    • Panning, though VOPM doesn't seem to use this