Super MIDI Pak Documentation

Table of Contents

Introduction

Thank you for purchasing Super MIDI Pak! Super MIDI Pak is a cartridge that turns your SNES/SFC into a standard MIDI synthesizer. Here is a list of available features:

Web Application

The web application is available at https://www.supermidipak.com/app. It provides easy access to the advanced features of Super MIDI pak, in particular converting and uploading custom samples.

Uploading Samples

The "Sample Uploader" page of the web application allows you to import and upload custom samples onto Super MIDI Pak.

The right pane shows the "sample catalogue." This is the catalogue of all samples that have been imported into the web application. These samples are not uploaded to Super MIDI Pak, they are simply available to choose from when deciding which samples you want to actually upload. Samples must first be imported into the catalogue before they can be selected in the "sample directory." You can import samples by pressing the "Import Samples" button and selecting the source file. To remove a sample catalogue entry, select the "X" button.

The left pane shows the "sample directory." These are the samples that will actually be uploaded to Super MIDI Pak.

The numbers to the left of each entry specify the index of the directory entry. This is the value that should be used to select this sample when changing the program using the MIDI "Program Change" message. To change the index of the directory entry, just click the index number button and enter a new value.

You can use the dropdown to select the specific sample that you'd like to occupy the directory entry. You may select any sample that you have imported into the sample catalogue.

You can edit the Volume ADSR and Pitch AD settings of each directory entry by selecting the corresponding "Patch Settings" button. These settings are automatically used by the channel when the program directory entry's program is selected on the channel, as long as CC#83 is disabled. You may also edit the patch settings of multiple directory entries at once by selecting the checkbox on the left of the desired directory entries and pressing the "Edit Selected Patch Settings" button.

To remove a sample directory entry, select the "X" button.

Once you are done setting up your desired sample directory, you can upload your samples by pressing the "Upload" button at the bottom of the pane. Be sure that the correct "MIDI Input Port" and "MIDI Output Port" have been selected at the top of the application. This takes approximately 30 seconds when using the entire SNES sample memory.

Test Mode

Super MIDI Pak includes a basic test mode that allows you to trigger notes with your SNES/SFC control pad. This mode is primarily intended for testing but can be used for performances as well.

To access this mode, hold down start and press the right shoulder button. This activates the menu. In the menu, select "Test Mode."

Basic Controls

In test mode, each d-pad direction and the four front-facing buttons, A, B, X, and Y map to a specific degree in a predefined scale. The mapping from button to scale degree was chosen to maximize the ease of playing the triads of the scale. The mapping is as follows:

Button Scale Degree C Major (example)
X1C
Down2D
Up3E
Y4F
A5G
Right6A
Left7B
B8C

Playing Accidentals

To pitch shift the currently playing notes up by a half step hold the left shoulder button. To pitch shift downward by a half step, hold the right shoulder button.

Changing Scales

To scroll through different scales, hold select and press either the X button or Y button.

Changing Key

To scroll through different keys, hold select and press either the left or right shoulder buttons.

Operation from Windows

Please note that Windows currently only allows a single application to access a MIDI device at a time. For example, if you are accessing Super MIDI Pak from the web application, you will not be able to use it from another Windows application. This is not a limitation of Super MIDI Pak, it is a limitation of Windows.

One possible workaround is to use the loopMIDI application to create a virtual MIDI port for each application that you plan to use concurrently with Super MIDI Pak.

CosmicGem has provided a guide on how to workaround this limitation on Windows.

Echo System

The echo system is modified by the EON, FLG, EVOLL, EVOLR, ESA, EDL, EFB, FIR0, FIR1, FIR2, FIR3, FIR4, FIR5, FIR6, and FIR7 registers. Here is a quick map of how they are all interrelated (source):

          ________                        _____                   _____
  c0 --->| ADD    |                      |MVOLc| Master Volume   |     |
  c1 --->| Output |--------------------->| MUL |---------------->|     |
  c2 --->| Mixing |                      |_____|                 |     |
  c3 --->|        |                       _____                  | ADD |--> c
  c4 --->|        |                      |EVOLc| Echo Volume     |     |
  c5 --->|        |   Feedback   .------>| MUL |---------------->|     |
  c6 --->|        |   Volume     |       |_____|                 |_____|
  c7 --->|________|    _____     |                      _________________
                      | EFB |    |                     |                 |
     EON  ________    | MUL |<---+---------------------|   Add FIR Sum   |
  c0 -:->|        |   |_____|                          |_________________|
  c1 -:->|        |      |                              _|_|_|_|_|_|_|_|_
  c2 -:->|        |      |                             |   MUL FIR7..0   |
  c3 -:->|        |      |         ESA=Addr, EDL=Len   |_7_6_5_4_3_2_1_0_|
  c4 -:->| ADD    |    __V__  FLG   _______________     _|_|_|_|_|_|_|_|_
  c5 -:->| Echo   |   |     | ECEN | Echo Buffer c |   | FIR Buffer c    |
  c6 -:->| Mixing |-->| ADD |--:-->|   RAM         |-->| (Hardware regs) |
  c7 -:->|________|   |_____|      |_______________|   |_________________|
                                   Newest --> Oldest    Newest --> Oldest
    

Super MIDI Pak does not interfere with these registers except in a couple of cases. CC#102 will cause Super MIDI Pak to automatically modify EON to enable/disable echo on voices triggered by the channel. Super MIDI Pak will also not allow ESA/EDL to overlap the first 256 bytes of the SPC700 memory. Any writes to those registers that would cause the echo buffer to overlap that memory space will be ignored.

It is up to the user to select their desired echo parameters. A common echo setting to get started is:

Drum Kit Mode

In Drum Kit Mode, Super MIDI Pak will choose the sample to play based on a direct mapping from note played to sample number. In this mode all program settings are ignored.

This mode can be used to create custom mappings from keys to samples. Potential applications include:

See the section on Drum Kit Mode Switch NRPN#0 for more information on how to use this mode.

Control Pad Keycombos

The following keycombos are permitted when Super MIDI Pak is at the title screen. They are designed to be easy to trigger even when no video output is connected to the system. They are also designed to be unlikely to be triggered accidentally, i.e. each keycombo requires a front-facing button to be held while pressing the Left and/or Right shoulder buttons.

Reset Unit to Factory Settings

Hold Select, Press Left Shoulder + Right Shoulder.

This clears the synth state that was saved with Save Settings #9 so that it powers on with default factory state. It also loads the default factory state.

Load Factory Settings

Hold Up, Press Left Shoulder + Right Shoulder.

This puts Super MIDI Pak into the default factory state but does not modify the settings that were saved with Save Settings #9.

Load Saved Settings

Hold Down, Press Left Shoulder + Right Shoulder.

This puts Super MIDI Pak into the exact state that was saved with Save Settings #9.

Increment Device ID

Hold Left, Press Right Shoulder.

This increments the device ID. Device ID dictates which SysEx messages the unit accepts and responds to. It is not recommended to change this except in advanced use cases.

Decrement Device ID

Hold Left, Press Left Shoulder.

This decrements the device ID. Device ID dictates which SysEx messages the unit accepts and responds to. It is not recommended to change this except in advanced use cases.

Reset Device ID

Hold Left, Press Left Shoulder + Right Shoulder.

This resets the device ID to 0. Device ID dictates which SysEx messages the unit accepts and responds to. It is not recommended to change this except in advanced use cases.

Increment Basic Channel

Hold Right, Press Right Shoulder.

This increments the basic channel. Basic Channel dictates which MIDI messages the unit accepts when omni mode is off. It is not recommended to change this except in advanced use cases.

Decrement Basic Channel

Hold Right, Press Left Shoulder.

This increments the basic channel. Basic Channel dictates which MIDI messages the unit accepts when omni mode is off. It is not recommended to change this except in advanced use cases.

Reset Basic Channel

Hold Right, Press Left Shoulder + Right Shoulder.

This resets the basic channel to channel 1, which is the first MIDI channel. Basic Channel dictates which MIDI messages the unit accepts when omni mode is off. It is not recommended to change this except in advanced use cases.

Controller Reference

Channel Voice Controllers

Vibrato CC#1

This CC controls the amplitude of the vibrato. At max value (127) the vibrato shifts the pitch by +-50 cents, with a total swing of 100 cents, i.e. 1 semitone. At min value, no vibrato can be detected. It works on a linear scale, i.e. at a value of 64, the vibrato shifts the pitch by +- 25 cents.

Portamento Time CC#5

This value multiplied by 128 and added to Portamento Time Fine CC#37 makes up the duration in milliseconds of a portamento note transition.

Data Entry MSB CC#6

This value multiplied by 128 and added to Data Entry LSB CC#38 make up the value to be set for the parameter specified by RPN LSB CC#100 and RPN MSB CC#101. See RPN Reference for more information.

Volume CC#7

At max value (127), no attenuation occurs, i.e. the channel is at max volume. The min value (0) is special, infinite attenuation occurs, i.e. the channel is silenced. The power of the signal is attenuated according to this equation: dB = 40 * log(volume / 127).

Pan CC#10

Pan maintains constant signal power. Min value (0) shifts all output to the left channel, max value (127) shifts all output to the right channel.

Expression CC#11

At max value (127), no attenuation occurs. The min value (0) is special, infinite attenuation occurs, i.e. the channel is silenced. The power of the signal is attenuated according to this equation: dB = 40 * log(expression / 127).

Left Balance CC#12

Left/Right Balance CCs are an alternative to using Pan CC#10. These CCs map more naturally to the DSP voice registers VOLL and VOLR, giving the musician greater control over left/right levels. In particular, this allows musicians to access negative amplitudes. The exact mapping to VOLL is as follows:

VOLL = ((Value * 2) - 128 + (Value_Fine >> 6)) * Volume_Velocity_Expression_Scalar

When all of volume, expression, and velocity are at their max value (127), then no scaling is done, i.e. Volume_Velocity_Expression_Scalar = 1.

A value of 64 results in silence, while min value (0) is maximum negative amplitude and max value (127) is maximum positive amplitude.

Right Balance CC#13

This CC functions similarly to Left Balance CC#12 except it applies to the DSP voice register VOLR.

Portamento Time Fine CC#37

Portamento Time CC#5 multiplied by 128 then added to this value makes up the duration in milliseconds of a portamento note transition.

Data Entry LSB CC#38

This value added to to 128 multiplied by Data Entry MSB CC#6 make up the value to be set for the parameter specified by RPN LSB CC#100 and RPN MSB CC#101. See RPN Reference for more information.

Left Balance Fine CC#44

This CC fine tunes Left Balance. In practice when it is >= 64 then 1 will be added to the scaled value set in VOLL when a note is triggered. See Left Balance CC#12 for more info.

Right Balance Fine CC#45

This is the same as Left Balance Fine CC#44 except it applies to the right audio channel.

Sustain Pedal CC#64

When this value is >= 64, sustain is active. That means that notes that are turned off while sustain is active are left on. When this value < 64, sustain is off.

Portamento Pedal CC#65

When this value is >= 64, portamento is enabled. This means that notes played legato will transition in a portamento fashion. When this value < 64, portamento is disabled.

Sostenuto Pedal CC#66

When this value becomes >= 64, sostenuto is activated. This means that all notes that are currently held will continue to be held once released. When this value becomes < 64, then all notes that were held due to sostenuto will be released.

Legato Pedal CC#68

When this value is >= 64, new notes will take over the last played still active note in a legato fashion. When this value is < 64, new notes are played according to the current poly or mono mode.

Note that notes played in a legato fashion will transition to the new pitch using portamento if it is enabled.

This pedal is primarily for live performance in polyphonic mode. It gives the musician the ability to temporarily play new notes in a legato fashion.

Vibrato Rate CC#76

At min value (0) vibrato oscillates at 1Hz, at mid value (64) the vibrato oscillates at 6.5Hz, at max value (127) vibrato oscillates at 15Hz. This CC is on logarithmic scale.

Attack Time CC#81

This CC chooses the attack time that the channel will use. At the min value (0), attack lasts for 0 milliseconds, at max value (127) attack lasts 4.1 seconds.

This setting only takes effect if CC#83 is enabled.

Decay Time CC#82

This CC chooses the decay time that the channel will use. At the min value (0), decay lasts for 37 milliseconds, at max value (127) decay lasts 1.2 seconds.

This setting only takes effect if CC#83 is enabled.

Use Channel Synth Parameters CC#83

When the value of this CC is >= 64 then the this channel will use CC#81, CC#82, CC#85, CC#86, NRPN#1, NRPN#2, and NRPN#3 for the Volume ADSR and Pitch AD settings, respectively. When the value of this CC < 64, then it will use the Volume ADSR and Pitch AD settings that are bundled with the current program.

Set this CC to >= 64 when you want to interactively design how a patch should sound.

Portamento Control CC#84

This CC specifies from which note the portamento should shift. It only applies to the next "Note On" message received on this channel and is reset afterward.

This has the extra effect that if a currently sounding voice is playing the note specified by this CC, then the new note will trigger without re-attacking in a legato fashion, even in polyphonic mode without the legato pedal enabled. This gives the player extra control over which currently sounding voice is used for a legato transition instead of just the most recently played voice.

Sustain Time CC#85

This CC chooses the sustain time that the channel will use. At the min value (0), sustain lasts for 18ms, at max value (127) sustain lasts forever.

This setting only takes effect if CC#83 is enabled.

Sustain Level CC#86

This CC chooses the sustain level that the channel will use. At the min value (0), the sustain level is 1/8 of the max envelope amplitude, at max value (127) the sustain level is the same as the max envelope amplitude.

This setting only takes effect if CC#83 is enabled.

Noise Frequency Slider CC#87

Noise frequency is typically controlled by the FLG register but the bits of that register are shared with other functions. This CC makes changes only the noise frequency bits of that register, making it convenient for using with a physical knob.

Use Left/Right Balance Pedal CC#89

This pedal decides whether to set relative left/right audio channels using the Pan CC or the Left/Right balance CCs. When it is <64 the Pan CC will be used to control left/right audio levels, when it is >=64 the Left/Right balance CCs will be used.

Echo Delay (EDL) CC#90

EDL is a 4-bit value while MIDI CCs are 7-bit values, This CC maps the CC range of values to the EDL range. Specifically EDL will take on the value of this CC shifted to the right by 3 bits. This makes it convenient to modify echo delay from a physical knob. If you decrease EDL you must wait 300ms before increasing ESA, otherwise the write to ESA results in undefined behavior. Setting EDL to a value that would result in the first 256 bytes of SPC memory being overwritten is undefined.

NRPN LSB CC#98

This sets the LSB of the NRPN that is affected by Data Entry MSB CC#6, and Data Entry LSB CC#38. See NRPN Reference for more information.

NRPN MSB CC#99

This sets the MSB of the NRPN that is affected by Data Entry MSB CC#6, and Data Entry LSB CC#38. See NRPN Reference for more information.

RPN LSB CC#100

This sets the LSB of the RPN that is affected by Data Entry MSB CC#6, Data Entry LSB CC#38, Data Increment CC#96, and Data Decrement CC#97. See RPN Reference for more information.

RPN MSB CC#101

This sets the MSB of the RPN that is affected by Data Entry MSB CC#6, Data Entry LSB CC#38, Data Increment CC#96, and Data Decrement CC#97. See RPN Reference for more information.

Echo Pedal CC#102

When this value is >= 64, all notes played on this channel will be echoed. When this value < 64, all notes will not be echoed.

Noise Pedal CC#103

When this value is >= 64, all notes played on this channel will instead use the SPC700's white noise generation with no correspondence to the specific note played. When this value < 64, all notes will play as normal.

DSP Register Controllers

Super MIDI Pak maps all of the SPC700 DSP registers to MIDI CCs. This enables directly programming the SPC700 DSP without any interference from Super MIDI Pak's MIDI functionality. When MIDI running status is used, this allows a max throughput of approximately 1500 register writes per second.

Because the maximum number of data bits allowed by MIDI is 7 and all the SPC700 DSP registers are 8 bits wide, two MIDI CCs are allocated per register. The first CC multiplies the MIDI value by two and stores that as the register value. The second CC multiplies the MIDI value by two then adds one and stores that as the register value:

    Register = MIDI_CC_Value * 2
    if (is_second_cc) {
        Register = Register + 1
    }
    

The result of writing to these registers is out of the scope of this manual. Please consult an SNES/SFC programming guide to understand how modifying these registers affects sound production. One useful reference is the SFC Development Wiki.

Voice Registers

Each voice register can be written to by sending the corresponding CC to the channel that corresponds to the sum of the basic channel and the desired voice. For example, if the basic channel is channel 1 and you want to modify the register of the 2nd voice, then send the corresponding CC to channel 2.

Sending voice register CCs to channels past the 8th channel, starting at the basic channel, is undefined.

Channel Mode Messages

Reset All Controllers CC#121

This CC is primarily used to reset the state of all performance controllers and pedals of the channel. It is not intended as a way to reset the synth to a default state. It's useful after abruptly stopping a sequencer. Specifically for Super MIDI Pak it resets:

All Notes Off CC#123

This CC immediately sets all voices to the release stage of the envelope, exactly as if a "Note Off" message had been received for that voice. If sustain or sostenuto is active for that voice, the voice is held in sustain.

Omni Mode Off CC#124

By default Super MIDI Pak listens and reponds to messages on all 16 MIDI channels. To only listen to MIDI messages on the basic channel (often channel 1, the first channel), send this CC. In mono mode, it will listen to as many channels as requested, starting from the basic channel. Per the MIDI standard, this message causes an implicit "All Notes Off" command.

Omni Mode On CC#125

To get Super MIDI Pak back into a state where it listens to messages on all channels, send this CC. Per the MIDI standard, this message causes an implicit "All Notes Off" command.

Mono Mode On CC#126

By default Super MIDI Pak is in polyphonic mode. This means that multiple voices can play simultaneously. When in mono mode polyphony is restricted but exact operation depends on whether omni mode is enabled or not.

When omni mode is enabled, only a single voice can play simultaneously across all channels.

When omni mode is disabled, multiple channels are enabled and each channel is mapped to a voice. All channels are monophonic on their own but can play their respective voices in tandem. This mode is primarily intended for use with specific MIDI controllers, for example a guitar controller. In that example, each guitar string would be mapped to a different channel and only trigger at most once voice per channel.

The control value sent by this CC message, known as M, tells Super MIDI Pak how many channels will be active while in this mode and omni mode is disabled, starting at the basic channel (often channel 1, the first channel). The value of 0 is special and signals to activate as many channels as there are voices, which for Super MIDI pak is 8. Setting M to a value larger than 8 is undefined. Sending MIDI messages to channels past the Mth channel, starting at the basic channel, is undefined.

Mono mode results in legato transition between notes by default, as long as the consecutive "note on" is sent before the "note off" for the preceding note.

Per the MIDI standard, this message causes an implicit "All Notes Off" command.

Poly Mode On CC#127

This CC puts Super MIDI Pak back into default polyphonic state. Per the MIDI standard, this message causes an implicit "All Notes Off" command.

RPN Reference

RPNs are a standard way of specifying a large amount of synth parameters beyond what is possible using CC messages. They require multiple CC messages which make them slower than CCs.

To send an RPN you must first send the MSB of the specific RPN to CC#101, then the corresponding LSB to CC#100. Then send the MSB of the desired RPN value to CC#6, then the LSB of the desired RPN value to CC#38.

Pitch Bend Sensitivity RPN#0

To access this RPN, send 0 to CC#101 and then 0 to CC#100.

Behaves the same as in the MIDI standard. For example, a data entry value of MSB=01 LSB=00 results in a pitch bend range of +/- one semitone (a total range of two semitones) for the channel.

Fine Tuning RPN#1

To access this RPN, send 0 to CC#101 and then 1 to CC#100.

Behaves the same as in the MIDI standard. More precisely, the MSB and LSB of the data entry value result in pitch shifting the channel by ((128 * MSB + LSB) - 8192) / 8192 semitones. For example, if MSB=65 and LSB=00, the channel is shifted by (65 * 128 - 8192) / 8192 = 0.015625 semitones, which is 0.015625 * 100 = 1.5625 cents.

Course Tuning RPN#2

To access this RPN, send 0 to CC#101 and then 2 to CC#100.

Behaves the same as in the MIDI standard. More precisely, the MSB of the data entry value results in pitch shifting the channel by MSB - 64 semitones, LSB is ignored. For example, if MSB=65, the channel is shifted by 65 - 64 = 1 semitone.

NRPN Reference

NRPNs are a standard way of specifying a large amount of propritary synth parameters beyond what is possible using CC messages. They require multiple CC messages which make them slower than CCs.

To send an NRPN you must first send the MSB of the specific NRPN to CC#99, then the corresponding LSB to CC#89. Then send the MSB of the desired NRPN value to CC#6, then the LSB of the desired NRPN value to CC#38.

Drum Kit Mode Switch NRPN#0

To access this NRPN, send 0 to CC#99 and then 0 to CC#98.

To enable Drum Kit Mode send a value of >= 8192 (MSB >= 64, LSB can be anything). When Drum Kit Mode is enabled, current Bank and Program settings are ignored, instead the sample played is 128 plus the MIDI value of the note triggered. E.g. when middle C is triggered (60), sample 188 in the sample directory is used.

Pitch Attack Time NRPN#1

To access this NRPN, send 0 to CC#99 and then 1 to CC#98.

This controls the amount of time that the attack phase of the pitch envelope takes to reach the max amount (chosen by Pitch Envelope Amount NRPN#3). At min value (0) the attack phase is 46.875ms, at max value (16383) the attack phase is 12 seconds. The CC is on a logarithmic scale.

This setting only takes effect if CC#83 is enabled.

Pitch Decay Time NRPN#2

To access this NRPN, send 0 to CC#99 and then 2 to CC#98.

This controls the amount of time that the decay phase of the pitch envelope takes to reach zero from the max amount (chosen by Pitch Envelope Amount NRPN#3). At min value (0) the decay phase is 46.875ms, at max value (16383) the decay phase is 12 seconds. The CC is on a logarithmic scale.

This setting only takes effect if CC#83 is enabled.

Pitch Envelope Amount NRPN#3

To access this NRPN, send 0 to CC#99 and then 3 to CC#98.

This is the max amount that the pitch of a new note is shifted by the pitch envelope when it is triggered. A value of 8192 results in no shifting. A value of 16383 results in a max shift upward by 31.5 semitones, a value of 0 results in a max shift downward by 32 semitones.

This setting only takes effect if CC#83 is enabled.

Set Unavailable Voices NRPN#4

To access this NRPN, send 0 to CC#99 and then 4 to CC#98.

You can prevent the channel from using specific voices at "note on" with this NRPN. The format is a bitmask, when the corresponding bit is 1 that voice can not be used, when that bit is 0 then that voice can be used. E.g. if you send the value 255 (11111111 in binary) to this NRPN, that will prevent "note on" events from using any voices. If you send the value 0 to this NRPN, that will allow "note on" events to use any voice for this channel. If you send the value 165 (10100101 in binary), that will prevent the channel from using voices 0, 2, 5, and 7.

The default value is 0, that means the channel will be able to make use of any voice.

This NRPN is useful when you need more fine-grain control over how Super MIDI Pak allocates voices. This is particularly useful when composing music that will be converted into an SPC file.

MIDI Tuning SysEx Reference

Super MIDI Pak supports a subset of the MIDI Tuning standard which allows custom "microtunings" (user-defined scales other than the 12-tone equal temperament).

Single Note Tuning Change #2

This is a "real-time" SysEx message that specifies new frequencies for the specified MIDI notes. It takes place immediately. The format of this SysEx is as follows:

F0 7F <device ID> 08 02 00 ll [kk xx yy zz] ... F7

F0 7F Universal Real Time SysEx header
<device ID> ID of target device, usually 0
08 02 MIDI Tuning Standard, Single Note Tuning Change code
00 Tuning program number, must be 0
ll number of changes (1 change = 1 set of [kk xx yy zz])
kk MIDI key number
xx yy zz New frequency, format described below
F7 SysEx footer (EOX)

Frequency Format

Frequencies are specified in terms of fractional semitones, where xx=69 yy=00 zz=00 corresponds to A440. Given a target frequency of f, the expressions to compute xx yy zz are as below:

s = 12 * log(f / 440) / log(2) + 69
xx = floor(s)
yy = floor(s * 2 ^ 7) % (2 ^ 7)
zz = floor(s * 2 ^ 14) % (2 ^ 7)

SysEx Reference

Reset Complete #1

This SysEx is sent by Super MIDI Pak after it has finished initializing when it is powered on or reset. The format is as follows:

F0 00 02 3E <device ID> 00 01 F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
01 Reset Complete SysEx code
F7 SysEx footer (EOX)

Handshake #3

Handshake packets are intended to be used with long-running SysExs that require the user to pause sending MIDI events until a handshake SysEx is received over the ouput MIDI port, or predefined amount of time passes. This SysEx is generally received from Super MIDI Pak rather than sent to it.

The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 03 tt <packet index> F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
03 Handshake SysEx code
tt Handshake code
<packet index> Packet index from the initiating SysEx
F7 SysEx footer (EOX)

The different handshake codes and their meanings are summarized below:

Name Code Meaning
ACK 7F Returned when the initiating SysEx completed successfully.
NAK 7E Returned when the data of the initiating SysEx was corrupted. User should resend initiating packet.
CANCEL 7D Returned when the initiating SysEx was incorrect, this usually indicates an erroneous client program. Resending will not fix the issue.
WAIT 7C Returned when the initiating SysEx may take longer than the predefined time to complete. User must wait for a subsequent ACK, NAK, CANCEL, or FAILURE Handshake SysEx.
FAILURE 7B Returned when the unit encountered an error while trying to complete the SysEx. Retrying may or may not solve the problem.

SPC Jump #6

This SysEx suspends normal operation of Super MIDI Pak and instructs the SPC to start executing code at the specified address. Before the SPC executes code, the specified values are written to the APU0{0,1,2,3} registers on the CPU side. Once any new MIDI message is received the custom SPC program will halt and operation will continue as normal. Note that Super MIDI Pak will not modify any SPC state once normal operation is resumed, allowing the user to make use of the leftover state, e.g. with DSP Jam Mode.

This SysEx is primarily intended to make it easy for users to run their own custom programs on the SPC. In particular it makes it easy to run existing SPC music files on Super MIDI Pak.

The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 06 aa bb cc dd ee ff gg F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
06 SPC Jump SysEx code
aa bb cc dd ee ff gg 7-bit encoding of [ ADDR_LOW, ADDR_HIGH, APU00, APU01, APU02, APU03 ]
F7 SysEx footer (EOX)

Save Settings #9

This SysEx causes Super MIDI Pak to save the current settings to internal memory. Please note that these settings will be loaded whenever the unit is powered on or reset. The settings include all channel settings, program settings, DSP registers, and SPC memory. The end result is that Super MIDI Pak will respond identically to MIDI messages when these settings are reloaded as when they were saved.

This SysEx is useful for when you are performing live or touring with Super MIDI Pak and need to minimize setup time.

This is a long-running SysEx. Do not send any MIDI messages after sending this SysEx until a Handshake message is received with the corresponding packet index. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 09 <packet index> F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
09 Save Settings SysEx code
<packet index> Packet index
F7 SysEx footer (EOX)

Load Saved Settings #10

This is the SysEx equivalent of the Load Saved Settings control pad keycombo. Unlike the control pad keycombo, the device ID is not altered. This is a long-running SysEx. Do not send any MIDI messages after sending this SysEx until a Handshake message is received with the corresponding packet index. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 0A <packet index> 00 F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
0A Load Saved Settings SysEx code
<packet index> Packet index
00 Reserved, must be set to 0
F7 SysEx footer (EOX)

Set Basic Channel #11

This SysEx allows the user to change the basic channel of the unit. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 0A <basic channel> F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
0a Set Basic Channel SysEx code
<basic channel> Desired basic channel of the unit. Operation is undefined if this is not in range of 0 to 15, inclusive.
F7 SysEx footer (EOX)

DSP Jam Mode Switch #14

This SysEx allows the user to prevent Super MIDI Pak from modifying any register aside from KON, KOFF, and P when handling the "Note On" MIDI Message. This is useful when wanting to jam off the leftover state of a custom SPC program that was run using SPC Jump #6. In practice it often makes sense to additionally disable omni mode and enable mono mode.

The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 0A <enable DSP Jam Mode> F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
0a Set Basic Channel SysEx code
<enable DSP Jam Mode> If this value is >= 64 then DSP Jam Mode will be enabled, it will be disabled otherwise
F7 SysEx footer (EOX)

Write SPC Memory #15

This SysEx allows the user to write to the memory of the SPC700. This is primarily intended for the user to upload custom samples but may also be used to upload custom programs to the SPC700, which can be run using the SPC Jump #6 SysEx.

Once the user sends this SysEx, they should not send any more MIDI events until either a Handshake SysEx is received on the output MIDI port or 100ms have passed. Doing otherwise will result in undefined behavior.

This SysEx can be used in either a "closed-loop" or "open-loop" configuration. An open-loop configuration is when the MIDI client is ignoring the output MIDI port of the Super MIDI Pak. In that case, the client should wait at least 100ms before sending subsequent MIDI events. This allows the user to include these SysExs in ".mid" files that can be played into the synth by a dumb player.

This SysEx can be sent while the synthesizer is normally operating. If timed correctly, this allows the user to dynamically swap out samples during a live performance.

All memory can be written except for the first 256 bytes of memory. Writes to that region are undefined.

The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 0F ii ll hh ss [ dd ] ... cc F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
0F Write SPC Memory SysEx code
ii (SPC_TARGET_ADDRESS & 0x3) << 5) | PACKET_IDX
ll (SPC_TARGET_ADDRESS >> 2) & 0x7f
hh (SPC_TARGET_ADDRESS >> 9) & 0x7f
ss Number of pre-encoded data bytes minus 1
dd A data byte, there will be ceil((ss + 1) * 8 / 7) of them.
cc XOR checksum of all preceding bytes, not included initial 0xF0
F7 SysEx footer (EOX)

If the checksum does not match, Super MIDI Pak will send a NAK Handshake SysEx back over the MIDI output port. Nothing will have been written. If it does match, Super MIDI Pak will send an ACK Handshake SysEx back. If Super MIDI Pak needs more time to process the data packet, it will return a WAIT Handshake SysEx. In this case, the user should not send any more data even if 100ms passes. The user should wait for an ACK or NAK Handshake.

7-bit Data Encoding

Since the data bytes cannot have their high bit set, a conversion must happen to the source data before being transmitted over MIDI. A simple 7-bit encoding algorithm is used, For every group of 7 input bytes, the bottom bits are shifted out and are used to make up the bits of a "header" byte from the least significant bit to the most significant bit. Python-like pseudocode to do the encoding is presented below:

buffer = []
header_byte = 0
while True:
  input_byte = read_byte()
  if input_byte is None: # no more data to encode
    break

  header_byte = ((input_byte & 0x1) << 6) | (header_byte >> 1)
  buffer.append(input_byte >> 1)

  if len(buffer) == 7:
    write_byte(header_byte)
    for byt in buffer:
      write_byte(byt)
    buffer = []
    header_byte = 0

# write out left over data
if buffer:
  write_byte(header_byte >> (7 - len(buffer)))
  for byt in buffer:
    write_byte(byt)
      

For example, consider the following group of 7 bytes:

aaaaaaaA bbbbbbbB cccccccC dddddddD eeeeeeeE fffffffF gggggggG

You would send that over the MIDI interface as:

0GFEDCBA 0aaaaaaa 0bbbbbbb 0ccccccc 0ddddddd 0eeeeeee 0fffffff 0ggggggg

Set Sample Root Pitch #16, #17

This SysEx allows the user to set the root pitch associated with a sample. The root pitch is the fundamental pitch of the sample when it is played at normal rate, i.e. 32000Hz. This information enables Super MIDI Pak to set the correct pitch when a note is triggered with the "Note On" MIDI Message.

Since the DSP allows for 256 samples but only 128 different values can be selected with a MIDI byte, two SysEx codes are allocated to this function. The code 0x10 (16 in decimal) modifies the root pitch for samples 0-127 and the code 0x11 (17 in decimal) modifies the root pitch for samples 128-255.

The pitch format is the same as in the Single Note Tuning Change #2 SysEx. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 <sysex code> <sample index> xx yy zz F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
<sysex code> Set Sample Root Pitch SysEx code. Use 0x10 for lower 128 samples, 0x11 for upper 128 samples.
<sample index> Sample index. Added to 128 if SysEx code is 0x11.
xx yy zz Desired root pitch, in MIDI Tuning Standard format
F7 SysEx footer (EOX)

Load Factory Settings #18

This is the SysEx equivalent of the Load Factory Settings control pad keycombo. Unlike the control pad keycombo, the device ID is not altered. It puts Super MIDI Pak into default factory state but it does not modify the settings that were saved with Save Settings #9. This is a long-running SysEx. Do not send any MIDI messages after sending this SysEx until a Handshake message is received with the corresponding packet index. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 12 <packet index> 00 F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
12 Load Factory Settings SysEx code
<packet index> Packet index
00 Reserved, must be set to 0
F7 SysEx footer (EOX)

Set Sample Volume ADSR #19, #20

This SysEx allows the user to change the default volume ADSR settings associated with a sample. These settings are used whenever the the channel is configured to use the sample synth parameters instead of the channel synth parameters.

Since the DSP allows for 256 samples but only 128 different values can be selected with a MIDI byte, two SysEx codes are allocated to this function. The code 0x13 (19 in decimal) modifies the volume ADSR settings for samples 0-127 and the code 0x14 (20 in decimal) modifies the volume ADSR settings for samples 128-255.

The meaning of the values used correspond exactly to the values used in CC#81, CC#82, CC#85, and CC#86. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 <sysex code> <sample index> aa dd ll ss F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
<sysex code> Set Sample Volume ADSR SysEx code. Use 0x13 for lower 128 samples, 0x14 for upper 128 samples.
<sample index> Sample index. Added to 128 if SysEx code is 0x14.
aa Attack time value, same meaning as in CC#81.
dd Decay time value, same meaning as in CC#81.
ll Sustain level value, same meaning as in CC#86.
ss Sustain time value, same meaning as in CC#85.
F7 SysEx footer (EOX)

Set Sample Pitch AD #21, #22

This SysEx allows the user to change the default pitch AD settings associated with a sample. These settings are used whenever the the channel is configured to use the sample synth parameters instead of the channel synth parameters.

Since the DSP allows for 256 samples but only 128 different values can be selected with a MIDI byte, two SysEx codes are allocated to this function. The code 0x13 (19 in decimal) modifies the volume ADSR settings for samples 0-127 and the code 0x14 (20 in decimal) modifies the volume ADSR settings for samples 128-255.

The meaning of the values used correspond exactly to the MSB values used in NRPN#1, NRPN#2, and NRPN#3. The format of this SysEx is as follows:

F0 00 02 3E <device ID> 00 <sysex code> <sample index> aa dd mm F7

F0 00 02 3E SysEx header
<device ID> ID of target device, usually 0
00 Product ID
<sysex code> Set Sample Pitch AD SysEx code. Use 0x15 for lower 128 samples, 0x16 for upper 128 samples.
<sample index> Sample index. Added to 128 if SysEx code is 0x14.
aa Attack time value, same meaning as MSB in NRPN#1.
dd Decay time value, same meaning as MSB in NRPN#2.
mm Envelope amount value, same meaning as MSB in NRPN#3.
F7 SysEx footer (EOX)

Copyright © 2022 Cejetvole, LLC