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:
- send a 'create object' message to the Polaris (to create a new, program - if the section is currently empty);
- send a 'open object in write mode' message; and,
- 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:
- take whatever patch is defined in the main program (i.e., instrument 0) and write it to each of the 132 patch locations);
- send a 'open object in write mode' message; and,
- 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