Preparing and Optimizing Samples

You may wish to use samples that aren't ripped from SNES games/songs already! You can totally do this; however there are a few quirks you must adhere to, as well as some things you can do to save space. As mentioned before, the tools try to handle the lion's share of the work for you, but you may have reasons to dig deeper, and that's what we're here to do.

Sample Rate

The SNES's sampler caps at a rate of 32000 Hz, while most samples use the CD-quality format of 44100 Hz or similarly-sized 48000 Hz. You can comfortably downsample your sound to 32000 Hz because it'll never get higher quality than that anyway. (Downsampling can be performed easily in OpenMPT using the default shortcut Ctrl+R in Samples tab, or in Audacity by editing the "Project Rate" in the lower-left corner.)

You can downsample as much as you want, but quality will be lost unusually quick thanks to the SNES's global "Gaussian filter" interpolation, which blunts a lot of the highest frequencies already in an attempt to cover up the noise created by its compressed sample format (.brr, which reduces each 32 bytes to only 9).

C700 will do this for you, but you may want to perform this yourself with SNESMOD to get a more accurate sound while you work.

Protip: Rather than continually downsampling to get what you want, first undo any previous downsampling to avoid extra loss in sound quality when you execute the new downsample.

Loop Points

One very significant quirk of the SNES sampler is its handling of loop points:

  1. The loop must start and end on a multiple of 16 samples (the tiny unit that pieces of audio are composed of). That means a loop can be 16 samples long at shortest, followed by 32, 48, and so on.
  2. There can be no data after the loop point ends. (This would be a waste of space anyway on the SNES!) In C700, any existing data after the loop point will be automatically truncated.

The first point is the one that may prove challenging. Both C700 and SNESMOD will automatically attempt to resample your sound in order to fit the loop point within a multiple of 16. With C700 you'll be able to hear the result right away, but with SNESMOD you will need to actually run the converter to check it out.

Slightly resampling your sound yourself (reducing its size proportionally, so thus also reducing the loop point's size proportionally) is one option at your disposal for getting the loop point sized as a multiple of 16. OpenMPT's sampler is a good tool for this. Unless you do some math, this may be a trial-and-error process: resample, check loop length, undo resampling if not divisible by 16, repeat.

However if you feel like doing some math, you could also check how many samples fewer the loop has to be to follow the "16 rule" and then proportionally reduce the size of the sample by just enough so that the loop is reduced to the proper size too. For example: Your sound has 200 samples in it and loops from 100-200. The loop size, 100, isn't divisible by 16; the next functional size down would be 96. That's a difference of 4 samples, and the loop comprises half the length of the sound, so if your sound is resampled to have 8 samples less, the loop will be the correct size.

If your sample's loop is fairly simple (like a cycle of a waveform), you may be able to include additional cycles within the boundary of the loop to achieve a number divisible by 16. For example: You have a loop that's 20 samples long; one cycle of the wave passes in 20 samples. If you incorporate 4 cycles instead, that's 80 samples, which is divisible by 16.

Once your loop point is divisible by 16, you can offset it by a few samples if necessary (adding silence to the start) so that the loop start & loop end are also multiples of 16.

That's it! Again, this may take a good bit of trial and error unless you are keen on math. Both programs attempt to do this for you, but it's possible that you are unhappy with the resampling, or that you end up wasting some storage space by your loop being "unrolled" (another option – simply adding more instances of the loop until its length is divisible by 16).

.brr Format

Although neither C700 nor SNESMOD require that you use the actual .brr format, you may for some reason want to convert your .wav samples yourself. For that, you can download wav2brr, one of a few tools in the linked program package. It includes its own tutorial and notably requires Python (coding language) installed.

C700 can also save samples in .brr format if you click "Save Smpl…" below the waveform indicator in the middle of the plugin.

Bit Rate Reduction, the name for .brr compression, is notable for reducing the size of a sample by over two-thirds – a ratio of 9 to 32 bytes! The compressed samples are a little noisier, which the SNES attempts to accommodate for using its "global Gaussian filter". The result is a big part of what gives the SNES its unique and easily identifiable sound quality.

Pre-Emphasis

In an attempt to counteract the "flatness" of the upper frequencies caused by the aforementioned global filter, samples can be "pre-emphasized" – essentially EQing the high frequencies to have greater presence. C700 does this automatically, and SNESMOD comes with preemp.py, a Python script that can pre-emphasize samples for you, though it too requires Python (coding language) installed. If you use this, lower your samples' volumes (amplitudes) before pre-emphasizing in order to keep them from clipping in the end. (Try reducing to ~60%, but your mileage may vary.)

By default C700 has pre-emphasis enabled, and it is a global setting, meaning it will either be On or Off for all loaded samples.