Skip Navigation.
Section 0

Polaris Sysex

by David Clarke [300831++] <agclarke@istar.ca>

The Polaris sysex is essentially a command-language, as noted in the MIDI Implementation Manual (see Polaris manuals).

To send program data you need to send a sysex message to 'open' an object, then 'write' to an object.

Ideally, a .syx file to place a patch would perform 3 steps:

  1. send a 'create object' message to the Polaris (to create a new, program - if the section is currently empty);
  2. send a 'open object in write mode' message; and,
  3. send the program data to the object.

During investigation, it appears that Rev 5 and Rev 9 firmware work differently with these commands. Specifically, it seems that Rev 5 firmware will fail on the first step - i.e., that it doesn't seem that a 'create' will successfully create a new program via MIDI with Rev 5 firmware.

As there are still quite a few units out there that have not been upgraded to Rev 9 firmware, the desire was to create some sysex commands that could work on either firmware release.

Both Rev 5 and Rev 9 can successfully overwrite existing programs. So, to work around the 'create' problem, additional steps can be done to fill any empty programs in a different way.

Specifically, the .syx files here perform 3 main functions:

  1. take whatever patch is defined in the main program (i.e., instrument 0) and write it to each of the 132 patch locations);
  2. send a 'open object in write mode' message; and,
  3. send the program data to the object with a 'write' message.

The data is sent to MIDI channel 1.

In terms of technical details the SYSEX is created as follows:

  FOR ProgNo = 1 to 132
     /* Can't be guaranteed that the patch exists, but we know that
        instrument 0 exists so, use the 'Send Message' capability to
        copy instrument 0's data into each of the Polaris' programs. 
        Send message:
           Sssiimmoo
             ss = stream number
             ii = instrument number
             mm = message
             oo = operand */
     0xF0             /* Start of Sysex */
     0x08             /* Fender Manuf. ID */
     0x01             /* Channel Number */
     0x53             /* "S" for Send Message */
                      /* Stream number = Instrument = 1E */
     0x31             /* ASCII 0x31 = the number "1" */
     0x45             /* ASCII 0x45 = the letter "E" */
                      /* Instrument Number = 0, always
                         exists */
     0x30
     0x30
                      /* Message = 7E = Store Program */
     0x37
     0x45
                      /* Operand = program number */
     {output 'ProgNo' - prog #}
                      /* End Sysex */
     0xF7
  ENDFOR

  FOR ProgNo = 1 to 132
     /* OPEN */
     0xF0             /* Start of Sysex */
     0x08             /* Fender Manuf. ID */
     0x01             /* Channel Number */
     0x4F             /* "0" for Open object */
                      /* 4 digit program number 1 - 132.
                         In hex, that's 1 - 0x84, so first
                         two digits always "0" */
     0x30             /* "0" for Open object */
     0x30             /* "0" for Open object */
     {output 'ProgNo' - prog #}
     0x30             /* 0x01, odd number = write enable */
     0x31
     0xF7             /* End Sysex */

     /* WRITE */
     0xF0             /* Start of Sysex */
     0x08             /* Fender Manuf. ID */
     0x01             /* Channel Number */
     0x57             /* "W" for Write object */
     0x32             /* Size of packet = 44 bytes, 0x2C */
     0x43
     0x30             /* Offset = 0x0 */
     0x30
     0x30
     0x30
     {Send 44 bytes of program data}
     0xF7             /* End Sysex */
  ENDFOR