windowsmusic computerphillipreesepc visit our online shopaudio plugin
Phil Rees Music Tech
musicmidi accessoriessoft synth
Essential MIDI accessories MIDI home
MIDI products
MIDI service
MIDI sales

to contents page for C16 support
to C16 product description

C16 MIDI System Exclusive format

This page includes details of the additions to the SysEx format to support the extensions in C16 firmware versions 1.1, 1.2 and 1.3. The firmware version of a C16 is shown briefly on the TARGET NUMBER display, at power-up.

Note, the stuff below should be viewed with monospaced type, and at least 75 columns.


USER TARGETS: 98 & 99

To reduce the chance of obsolescence C16 allows 32 sliders to be individually programmed.  Setting up these 32 sliders means sending C16 SysEx from a sequencer.  Any numbers ending in 'H' are hexadecimal, and in MIDI the sliders are numbered 0~15 (not 1~16!).  It is also possible to send a command on entry into Targets 98 and 99.

Slider Numbers
panel number:  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
hexadecimal:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f --->Target 98
hexadecimal:  10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f --->Target 99
Alert! Before sending these SysEx messages to the C16, the MIDI out of C16 should be disconnected first, then the MIDI out of the sequencer connected to the MIDI in of C16.  Alternatively leave the cable in C16's MIDI out but disable the sequencer's 'echo' or 'thru' feature first as it is very easy to set up a MIDI feedback loop because C16's MIDI out and thru are combined.


        General C16 SysEx format:

F0H  ID1 ID2 ID3  ID4 ID5  Slider#  Type  Chan  ....data....  F7H

        > The IDs are the three-byte manufacturer's ID for Phil Rees Music Tech (00H 20H 43H), followed by the two-byte C16 product ID (00H 02H).
        > Slider# is the slider to be set numbered 0~15 (00H~0FH) for Target 98, and 16~31 (10H~1FH) for Target 99. Slider# 7EH and 7FH are used for the entry events for Targets 98 and 99, respectively. See below for more info about the entry events.
        > The Type element specifies the the type of MIDI messages to be sent, Controller, SysEx etc. - see list below.
        > Channel is MIDI channel (channel 1 is represented as 00H, channel 16 is represented as 0FH). If the value of this element is over 0FH, the MIDI channel is determined by the position of the C16 front panel rotary switch. This element is omitted for the all of the SysEx Types, where special provision is made for Device ID - see below.
        > The number of bytes in the data element depends on the Type.


Types:        00H        Off
              01H        Controller
              02H        NRPN
              03H        RPN
              04H        SysEx (Normal)
              05H        SysEx + 00H
              06H        SysEx + Checksum (1)
              07H        Pitch Bend
              08H        Channel After Touch
              09H        Notes (introduced in C16 firmware version 1.1)
              14H        SysEx (2's Comp.) (introduced in firmware v1.2)
              15H        SysEx (Mod and Sign) (introduced in firmware v1.2)
              16H        SysEx + Checksum (3) (introduced in firmware v1.2)
              17H        SysEx (Nibbles) (introduced in firmware v1.2)
              26H        SysEx + Checksum (2) (introduced in firmware v1.3)


        Controller Example:
                         +--------- Slider (0FH = 16th slider of Target 98)
                         |   +------ Type (01H = controller)
                         |   |   +-- Midi channel (>0FH = rotary switch)
                         |   |   |   +- Controller no (01H = mod wheel)
F0H 00H 20H 43H 00H 02H 0fH 01H 7FH 01H F7H


        NRPN or RPN Example:
                         +----------- Slider(18H = ninth of Target 99)
                         |   +------------- NRPN Type
                         |   |   +--------- Midi Channel (0FH = channel 16)
                         |   |   |   +----- Param LSB
                         |   |   |   |   +- Param MSB
F0H 00H 20H 43H 00H 02H 1FH 02H 0FH 12H 34H F7H


        Pitch Bend Example:
                         +----------- Slider (11H = second of Target 99)
                         |   +------- Type (07H = Pitch Bend)
                         |   |  +---- Midi Channel (>0FH = rotary switch)
F0H 00H 20H 43H 00H 02H 10H 07 7FH F7H


        Channel After Touch Example:
                         +----------- Slider (00H = first of Target 98)
                         |   +------- Type (08H = Channel After Touch)
                         |   |   +--- Midi Channel (>0FH = rotary switch)
F0H 00H 20H 43H 00H 02H 00H 08H 7FH F7H


        Notes Example:
                         +------------- Slider (10H = first of Target 99)
                         |   +--------- Type (09H = Legato MIDI Notes)
                         |   |   +----- Midi Channel (02H = channel 3)
                         |   |   |   +- Note number (3CH = middle C)
F0H 00H 20H 43H 00H 02H 10H 09H 02H 3CH F7H
This Type produces legato notes, with the slider position represented in the Note-On velocity. A Note-Off (8nH kkH 40H) is sent immediately before each Note-On (9nH kkH vvH). If you require a terminating Note-Off (9nH kkH 00H), pull the slider down to the zero position. This Type is intended primarily for various MIDI lighting controllers. and is unlikely to find serious applications in music production. This Type is only supported by C16 firmware versions 1.1 or higher.


        System Exclusive Example:

        SysEx stream to recreate in this example: JX8P's filter parameter.

         +------------------------------ Roland ID
         |       +---------------------- Device ID (as JX8P's MIDI channel)
         |       |               +------ Filter param number
         |       |               |   +-- Value(range= 00H~7FH)
    F0H 41H 36H 00H 21H 10H 01H 22H vvH F7H
Note that there 7 bytes between F0H and vvH, and JX8P doesn't use checksums.

         SysEx stream to send to C16:
                         +------------------ Slider 02 (third of Target 98)
                         |   +------------------------- SysEx (normal) Type
                         |   |   +------- Top limit of the data byte(range)
                         |   |   |   +----- lower nibble: Indicates 7 bytes
                         |   |   |   |                               follow
                         |   |   |   |      upper nibble: Value from rotary
                         |   |   |   |      switch should be added to third
                         |   |   |   |       data byte, to create Device ID
                         |   |   |   |
                         |   |   |   |   +---+---+---+---+---+---+- 7 bytes
                         |   |   |   |   |   |   |   |   |   |   |from JX8P
                         |   |   |   |   |   |   |   |   |   |   |   stream
F0H 00H 20H 43H 00H 02H 02H 04H 7FH 37H 41H 36H 00H 21H 10H 01H 22H F7H

When the third slider of Target 98 is moved C16 will recreate the original stream and automatically insert a seven-bit data value after the '22H' and before the 'F7H'.  This data value will be scaled to a maximum set by the top limit (range).  The front panel switch value (in the range 00H~0FH) will be added to the third data byte to sythesise a Device ID.

In C16 firmware versions 1.0 and 1.1, there are two other Types of SysEx available, SysEx + 00H and SysEx + Checksum (1). In C16 firmware version 1.2, there are four additional SysEx command Types. Version 1.3 adds yet one more SysEx Type:

        > SysEx + 00H
Type 05H is implemented in the same way as a Normal SysEx except this Type automatically appends a byte of value zero after the data byte. This is mostly used to insert a dummy (positive) sign byte after the data byte, or for MSB-first double-precision data.

        > SysEx + Checksum (1)
Type 06H appends a Roland-format negative checksum after the data byte and is calculated by C16 without the user having the calculate it. It does not include the first four data bytes of the stream (which is the usual situation). When merely performing parameter changes via SysEx, checksums are mainly implemented only on Roland instruments. This is the most common kind of SysEx checksum.

        > SysEx + Checksum (2)
Type 26H also appends a Roland-format checksum after the data byte and the checksum is again automatically calculated by the C16. To accomodate devices with a two-byte Model ID, the first five data bytes in the message are not included in the sum. This Type is only supported by C16 units with firmware versions 1.3 or higher.

        > SysEx + Checksum (3)
Type 16H appends a Waldorf-format positive checksum after the data byte and is also automatically calculated by the C16. The first four data bytes in the message are not included in the sum. This Type is only supported by C16 units with firmware versions 1.2 or higher.

        > SysEx (2's Comp.)
Type 14H is a two-byte data format. The first data byte contains the righthand seven bits of a two's complement value. The second data byte is a sign byte, which has the code 00H for positive values and 7FH for negative values. This Type is only supported by C16 units with firmware versions 1.2 or higher.

        > SysEx (Mod and Sign)
Type 15H is also a two-byte data format. The first data byte contains a seven bit modulus or absolute value. As above, the second byte is a sign byte, which has the code 00H for positive values and 7FH for negative values. This Type is only supported by units with firmware versions 1.2 or higher.

        > SysEx (Nibbles)
Type 17H is a two-byte data format, intended to provide for Peavey-style 'nibblized' data. The first data byte contains the most significant three bits of a seven-bit value.  The second data byte contains the least significant four bits of said value. This Type is only supported by firmware 1.2 or higher.

Here are some notes about using the SysEx Types:
        > Be sure that the number of bytes between the 'F0H' and the data byte are counted correctly or erroneous MIDI may be sent from C16.
        > The longest stream that can be stored is 12 bytes.
        > Type 05H's can only send '00H' so synths that use this byte as a 'sign byte' will behave positively only.
        > Setting the range value to 0 is generally pointless!
        > All bytes between the opening F0H and closing F7H must be 7FH or lower.
        > The Device ID's location can only exist in the first eight data bytes (rarely a problem).
        > Be sure that any byte the rotary switch position value (Device ID) is added to, the result won't exceed 7FH (C16 will limit the result to 7FH).
        > If the Device ID location byte is set to zero it is not used.

TARGET ENTRY EVENTS:

It is possible to send one command as soon as a User Target has been selected without having to touch a slider.  This is mostly useful to send a mode change message required before any slider movements will take effect - usually this message is likely to be SysEx, but C16 can send all command Types available for the sliders. The entry events are triggered when the TARGET SELECT pushbutton is released.

There is no slider position associated with the entry events, so the value is fixed at 40H for Controllers, NRPNs, RPNs, Channel After Touch, Pitch Bend MSB and Note-On velocity. For SysEx, the data byte's value must be set explicitly as part of the stream, and therefore the Number of bytes to be specified is one greater than it would be for a slider generating the same message.

        Controller Example:
                            +---------------- 7EH = 'On entry to Target 98'
                            |   +------------ Type (01 = Controller)
                            |   |   +-------- Midi Channel
                            |   |   |   +---- Controller Number
   F0H 00H 20H 43H 00H 02H 7EH 01H 00H 0AH F7H

        SysEx Example:
                         +------------------- 7FH = 'On entry to target 99'
                         |   +--------------- Type (04 = SysEx normal)
                         |   |   +----------- Data Limit (irrelevant here)
                         |   |   |   +------- Number of bytes and
                         |   |   |   |        Device ID location
                         |   |   |   |   +---+---+---+---+---+---+---+SysEx
                         |   |   |   |   |   |   |   |   |   |   |   |bytes
                         |   |   |   |   |   |   |   |   |   |   |   |incl.
                         |   |   |   |   |   |   |   |   |   |   |   | data
                         |   |   |   |   |   |   |   |   |   |   |   |= 55H
                         |   |   |   |   |   |   |   |   |   |   |   |
F0H 00H 20H 43H 00H 02H 7FH 04H xxH 38H 41H 36H 00H 21H 10H 01H 22H 55H F7H

In these examples, when Target 98 is selected controller message 0AH (Pan position) will be sent with its data set to 40H (centre).  And when 99 selected the SysEx stream: F0H 41H 36H, 00H 21H 10H 01H 22H 55H F7H would be sent with the third data byte also the device ID.

MIDIto contents page for C16 support
to C16 product description

to Phil Rees home page