Super Advanced Setup: MIDI NRPNs & RPNs

Note: I would recommend skipping this section for now unless you are very comfortable with MIDI CCs and/or the SNES soundchip already. This section covers using multiple MIDI CCs in conjunction to write specific values to the soundchip's "DSP Register", which is both powerful and dangerous.

If you checked out the CC list in the VST as described in the MIDI CCs section (by clicking "C700 [?]" in the top left), you might have noticed a portion not yet covered:

NRPN
rrH(LSB)
7eH(MSB): DSP Register Write

RPN
00H(LSB)/
00H(MSB): Pitch Bend Sensitivity

Oh god, right? Well, once we make some sense of what all this is telling us, it's manageably complicated. "NRPN" and "RPN" are MIDI terms that refer to two CCs each#98-99 for NRPN, and #100-101 for RPN. They both receive additional parameter data from MIDI CC#6 (Data Entry LSB) and MIDI CC#38 (Data Entry MSB). This means that in total, four CCs are used to send a single parameter change. There's a lot of MIDI terminology nested in there; if you (optionally) want to know more about what the terms mean, I recommend this brief guide.


NRPN: DSP Register Write

⚠️ Warning! ⚠️ Before we dive into this advanced feature, please use caution with the volume of your system. You may cause glitches and unexpected sounds by writing to the DSP Register, and in particular, modifying echo delay settings has the potential to cause a feedback loop, resulting in very loud distorted sound; so be prepared to mute or otherwise disable sound, especially if using headphones. Hearing damage is no joke. Be extremely careful.

The arcane text that C700 gives us for NRPN is actually explaining the proper values to set for MIDI CC#98 (NRPN LSB) as well as MIDI CC#99 (NRPN MSB):

CC#98: The indicated value of "rrH" means a variable in hexadecimal; rr will be the hexadecimal value of the DSP Register you're writing to. The potentially useful ones are listed below, but a full list of those DSP Register hex values can be found here. Convert the hexadecimal value to decimal to get the appropriate CC value. (Visit hextodecimal.com if you need help with that.) For example, 0C is the value for "Main Volume (left output)", which is 12 in decimal. You would then set this CC to 12 to indicate you'd like to control "Main Volume (left output)".

CC#99: The indicated value "7eH" means "7E in hexadecimal", which is 126. This CC will be set to 126. Easy.

C700 FL NRPNs

Once you've set both the NRPN CCs, the two Data Entry CCs are used to actually choose the value you're sending to your chosen DSP Register. CC#6 is your main controller for the value. In our example above, setting it to 0 will mute the left Main volume (meaning sound will only come out of the right speaker in a stereo setup). In theory, CC#38 could be used for additional fine control in the neighborhood of the CC#6 value, but this may not be useful in practice, since in the SNES's case, these values don't have a wide enough range to take advantage of this. (Its presence is likely due to standard MIDI implementations of this feature, though as a fun piece of trivia for C700, CCs #6 and #38 are actually swapped from their usual MIDI usage.)

Since these CCs are assigned to MIDI channels, if you wish to control more than one DSP Register parameter simultaneously in your song, you will need to set up a new group of these CCs on a different channel. It doesn't matter which channel(s) you use in this case. A channel isn't locked into the one parameter forever though; changing CC#98 mid-song will allow you to control a different parameter instead (be careful to not immediately write the same CC#6 value again to your new parameter!).

The NPRN DSP Register Write is the only way to automate certain parameters of C700, such as the volume sliders and the echo delay time, feedback, and filter. One limitation of this feature, however, is that the values can only be positive, despite the soundchip possessing a range of -128 to +127 for many settings*.

* If you are determined, another fork of the software by blower5 adds a negative/positive switcher to CC#38.)

Take extra care when handling the echo settings; it is very easy to create a feedback loop or horrible distortion by tweaking these settings, and you do not want hearing damage! Careful use of this feature can lead to some pretty amazing sounds, though.

Potentially Useful NRPN (CC#98) Values

0C (12) - Main Volume (left output) - set CC#98 to 12, then use CC#6 to control
1C (28) - Main Volume (right output) - set CC#98 to 28, then use CC#6 to control; etc
2C (44) - Echo Volume (left output)
3C (60) - Echo Volume (right output)
0D (13) - Echo Feedback ⚠️ BE CAREFUL
7D (125) - Echo Delay Time - use values 0-15 (0 = 0ms delay, 15 = 240ms delay); higher values are technically unsupported by the system (and will fail in .spc export specifically). If used they will wrap around in some players including C700 (meaning 16-31 is another instance of 0-15, etc.)
xF (15, 31, 47, 63, 79, 95, 111, 127) - Echo Delay Filter coefficients ⚠️ ⚠️ ⚠️ BE EXTRA CAREFUL! It's very easy to create feedback loops with these, and moreso with each successive one because of the math behind them. These values control the prevalence of frequency ranges within the echo delay – they are the 8 values above the 5 sliders at the bottom-right of C700 (covered in section C: Echo Delay).

The other DSP Register options are either controllable via other built-in MIDI CCs or are likely not useful unless you're involved in SNES game or tool development. If you are, check the list.

RPN: Pitch Bend Sensitivity

This advanced function is considerably more benign than handling the SNES's DSP Registers yourself, but it does provide a unique option. C700 already has a "Bend Range" global behavior setting (see section B), but it can't be automated. It is limited to a full span of +/- 2 octaves, which is quite substantial already.

Pitch Bend Sensitivity, however, proportionally changes the sensitivity of pitch data in general. This means that 1 cent of pitch-change will no longer represent 1 cent – could be more, could be less – but it also means that you can pitch bend farther than two octaves! In fact you can pitch bend to the whole playable range of the sample, if you want.

The setup is as follows:

CC#100 - 0
CC#101 - 0
CC#38 - 0 (changing this will affect how the start of your sample sounds, so play around with it if you're curious)
CC#6 - the main control for the setting, ranged 0-127, but most values above 40-50 exceed the entire span of the sound's playable range. 0 is no pitch bend at all. 12 is approximately 1 octave (though not exactly).

It is not easy to control this feature, but if enormous pitch bends are desired, perhaps as an effect, RPN Pitch Bend Sensitivity can be used. Note that this can't be used on a channel currently controlling NRPNs, since they share CCs #6 and #38, so if you wish to use multiple parameters, place this one on a different MIDI channel.

It may be useful to use CC#121 (Reset All Controllers) to "deactivate" your Pitch Bend Sensitivity changes if the desired effect is only temporary. This will indeed reset all other CCs as well, though. You may need to reapply others that were utilized prior.