144 lines
6.6 KiB
Plaintext
144 lines
6.6 KiB
Plaintext
= The dark and forgotten art of GENMIDI
|
|
|
|
Doom's music consists (effectively) of MIDI music files. MIDI is an odd
|
|
beast. The General MIDI standard defines a set of 128 common instruments
|
|
supported by MIDI playback systems. For example, instrument #10 is
|
|
“Glockenspiel”. You can think of them like the instrument presets on
|
|
an electronic keyboard. You can find a full list of instruments
|
|
https://secure.wikimedia.org/wikipedia/en/wiki/General_MIDI[on Wikipedia].
|
|
|
|
Modern synthesizers, keyboards and operating systems with MIDI playback
|
|
capability use recorded samples of real musical instruments, so when
|
|
the MIDI file specifies “Glockenspiel” as the instrument, you hear
|
|
notes from a real glockenspiel playing the song. But Doom is from an
|
|
older, more primitive age.
|
|
|
|
Computers in the early '90s (at least, the ones that had sound cards)
|
|
often had a SoundBlaster-compatible sound card. As well as the digital
|
|
playback functionality that provides the sound effects in Doom, these
|
|
cards also had a YM3812 (OPL2) or YMF262 (OPL3) chip that was used for
|
|
music playback. These are FM synthesis chips designed and made by Yamaha
|
|
for their range of electronic keyboards.
|
|
|
|
Back then, music playback with samples was difficult (or at least
|
|
expensive / CPU intensive), so FM synthesis provided a more primitive
|
|
alternative. By generating two waves and modulating one with the other,
|
|
it's possible to create noises that at least vaguely resemble real
|
|
musical instruments.
|
|
|
|
The OPL2 could generate 9 simultaneous voices simultaneously. You can
|
|
think of each of these voices as being like a noise-making box with a
|
|
bunch of knobs on the front to control the sound. Turn the knobs to
|
|
one set of settings and the noise that comes out sounds like a
|
|
Glockenspiel, change the settings and it sounds like a bass guitar or
|
|
a snare drum instead.
|
|
|
|
These “knob settings” are commonly stored in .sbi instrument files.
|
|
Looking online you can find huge collections of .sbi files created back
|
|
when people still actually used them.
|
|
|
|
To play back MIDI music using an OPL chip, you need a bank of instrument
|
|
data - effectively, instrument data for each instrument in the General
|
|
MIDI set. Doom uses an IWAD lump named GENMIDI that contains exactly
|
|
this - effectively 175 SBI files merged together (128 main instruments
|
|
+ 47 percussion effects).
|
|
|
|
It turns out that Doom's instrument data is a particularly good set.
|
|
Freedoom is using a set of instruments that comes from OpenBSD's kernel,
|
|
which isn't so good. So this directory has a script that builds a
|
|
GENMIDI lump out of individual SBI files, the idea being that they can
|
|
individually be replaced with better ones to improve it.
|
|
|
|
== Editing instruments
|
|
|
|
First of all, make sure you follow the same rules as any other Freedoom
|
|
submissions. DO NOT USE SBI FILES OFF WEBSITES. Everything has to be
|
|
completely original content.
|
|
|
|
Lots of editors exist for OPL instrument data. Probably the most powerful
|
|
one out there is http://www.adlibtracker.net/[AdlibTracker2].
|
|
AT2 is actually a tracker for making songs, but it has an instrument
|
|
editor built-in. I'll give some instructions for how to use this.
|
|
|
|
First of all, modern computers don't have an OPL chip, so you'll need to
|
|
use http://www.dosbox.com/[DOSbox], which can emulate one. You need to do
|
|
this even if you're using Windows. Download a copy of AT2 off the website
|
|
and a copy of DOSbox, and get the one running in the other.
|
|
|
|
Once you've opened up AT2, press Ctrl-I to bring up the instrument
|
|
control panel. You should see a list of instruments, which will
|
|
currently be empty. It's probably best to start by loading an existing
|
|
instrument file and editing it, so press Ctrl-L to load an instrument
|
|
into the first slot. Find one of the existing SBI files that you want
|
|
to improve and press enter to select it; you should see the instrument
|
|
appear next to “iNS_01” in the first slot.
|
|
|
|
To hear what the instrument currently sounds like, you can use the keys
|
|
on your keyboard like a piano:
|
|
|
|
S D G H J 2 3 5 6 7
|
|
Z X C V B N M Q W E R T Y U
|
|
|
|
To improve the current instrument settings, press tab to bring up the
|
|
instrument editor. You'll get a panel with a wide range of different
|
|
settings to play with, and you can still use the “piano keys” to hear
|
|
what effect your changes are having. Press enter to switch between
|
|
editing the carrier and the modulator - they both affect the sound in
|
|
different ways.
|
|
|
|
One thing to be aware of when editing instruments is that you should
|
|
only use the first four waveform types (Sine, Half-Sine, Abs-Sine,
|
|
Pulse-Sine). Do NOT use the last four waveform types (Sine (EPO),
|
|
Abs-Sine (EPO), Square, Derived square). The reason is that the full
|
|
eight are only supported by the OPL3 chip - the OPL2 only suported
|
|
the first four. You will get a warning message later if you use these.
|
|
|
|
When it comes to saving your changes, press Ctrl-S and type a filename
|
|
for your new file. There's a slight catch here in that although AT2 can
|
|
load SBI format instrument files, it can only save in its own “a2i”
|
|
instrument format. Fortunately we can convert back into SBI format
|
|
later.
|
|
|
|
== Generating a new GENMIDI
|
|
|
|
Now you've made your snazzy new instrument, you'll want to hook it into
|
|
the GENMIDI lump and try it out in-game. Put your .a2i file into the
|
|
lumps/genmidi/instruments directory, then open up config.py in your
|
|
favorite text editor.
|
|
|
|
You'll see two lists of instrument definitions, for the main instruments
|
|
and for percussion. There are some instructions at the top of the file
|
|
for how to write these definitions, so I won't repeat them here. But if
|
|
your file is named eg. snazzy.a2i, you'll want to write something like:
|
|
|
|
Instrument("snazzy.a2i"),
|
|
|
|
If you're editing a percussion instrument, make sure that you remember
|
|
to specify a note you want to play. For example, for 'C#' in Octave -3:
|
|
|
|
Instrument("snazzy.a2i", note=On3.Cs)
|
|
|
|
Once you're done, save your changes and type this to build a new GENMIDI
|
|
for testing:
|
|
|
|
python3 mkgenmidi genmidi.lmp
|
|
|
|
To try it out, get a source port with OPL emulation support (eg. Chocolate
|
|
Doom) and add genmidi.lmp on the command line, eg.
|
|
|
|
chocolate-doom -file genmidi.lmp
|
|
|
|
== Converting back to SBI
|
|
|
|
Once you have your finished instrument, it's probably best if you convert
|
|
from the rather ugly .a2i format into the more common .sbi format. More
|
|
tools support .sbi and some people might prefer to use other instrument
|
|
editors instead of AT2. There's a useful script included that will do
|
|
exactly this. Specify the name of the a2i file and the name of the
|
|
desired output file, as follows:
|
|
|
|
python3 a2i-to-sbi snazzy.a2i snazzy.sbi
|
|
|
|
Don't forget to update config.py to use the .sbi version of the file
|
|
instead of the .a2i version!
|