------------------------------------------- README: This is a plain ASCII text file. It may be displayed by any editor which can handle plain text files. It may be printed with full formatting intact merely by "copying" the file to any ASCII printer. Lines are limited to 80 characters and pages are limited to 60 lines to facilitate display and printing. ----------------------------------------------------------------------------- EXPRESSIONMATE SYS-EX IMPLEMENTATION Rev. 1.1 March, 2003 H. Chamberlin CHANGES: 1. Applies to software version 1.0 and 1.1. FROM: 2. Corrects checksum calculation to include the Message Type byte. REV 1.0: 3. Documents problem with Global Parameter #20 when set to IGNORE. 4. Documents that checksum errors for Peek and Poke do not increment Global parameter #21. This document describes the MIDI System-Exclusive messages sent and recognized by version 1.0 and 1.1 of the Kurzweil ExpressionMate MIDI controller and processor. The level of detail is sufficient to implement a librarian program or even a complete editor. The reader is expected to be familiar with MIDI, bits, bytes, binary, and hexadecimal numbers and programming concepts like pointers and offsets. The ExpressionMate's brain is a small 8-bit microprocessor (Mitsubishi M37451 which is a derivitive of the 6502) and the ExpressionMate software is written entirely in assembly language. Consequently the data structures are not necessarily organized the way they might be had the software been written in a compiler language like C. In particular, hexadecimal values are represented in the following discussion as $XX where X is any hexadecimal digit (0-9, A-F). This is not only more compact than the "0Xxx" representation typically used by C, it is also far easier to read. Naturally, when playing around with the sys-ex commands to be described, one should be sure to have a secure backup copy of all user created setups in the unit. Kurzweil cannot be responsible for any loss of data that might occur while experimenting with these commands. We will start with an introduction which describes the general format of ExpressionMate sys-ex messages. Then Part 1 will deal with the sys-ex messages that are used to save and reload setups and global parameters. This will provide the information necessary to implement a librarian type program. Part 2 will deal with the memory Peek and Poke commands which, along with the thorough descriptions of each parameter, will enable implementation of a full setup, rhythm, scale, etc. editor on an external computer. SYS-EX MESSAGE FORMAT SOX KID UID PID MTY XXX XXX XXX ........ CKH CKL EOX where each 3-chracter field represents one MIDI byte. The fields are as follows: SOX - The standard MIDI Start of Esxclusive, $F0. KID - Kurzweil's coveted single byte manufacturer's ID, $07 UID - Unit ID, If 0-126, must match the unit's ID (Global Parameter #20). If 127, matches any unit. NOTE: The ExpressionMate's editor for Unit ID incorrectly labels a value of 255 as "Ignore". The correct value for Ignore is 127. PID - ExpressionMate product ID, $0E ("EX"). MTY - Message type, 1 byte. Presently there are only three: $01 - Parameter Block $02 - Memory Peek $03 - Memory Poke XXX .... XXX - variable length data block, see definitions below. CKH - High half of 14-bit checksum CKL - Low half of 14-bit checksum EOX - The standard MIDI End of Exclusive, $F7. Data Values in the XXX .... XXX bytes may be 7 bits, 8 bits, or 14 bits. A 7-bit data value is a single MIDI data byte. An 8-bit data value is a pair of MIDI data bytes, the first has the leftmost 4 bits of the data value and the second has the rightmost 4 bits. A 14-bit data value is a pair of MIDI data bytes. The first has the leftmost 7 bits of the data value and the second has the rightmost 7 bits. The checksum is the sum of 7, 8, and 14-bit data values following PID through the data value immediately prior to the checksum data value accumulated in a 14-bit accumulator. This is very important, read it again carefully! Refer to "Checking the Version" for an example of checksum calculation. Sys-ex messages may be received at any time from the Main input ONLY. No user action is required to enable receiving sys-ex messages (except ensuring that the SysEx ID in Global Parameter #20 matches the Unit ID of the incoming message). Note that sys-ex messages are buffered and must have a valid checksum before they are acted upon. For every message received that matches the Unit ID and has a valid message type but does not have a valid checksum, the SysEx Ers Global Parameter #21 will be incremented. PART 1 - SETUP SAVE/LOAD MESSAGES --------------------------------------- When Global Parameters and/or Setups are saved to a sequencer or reloaded from a sequencer, Parameter Block messages are used. The general format of Parameter Block messages is show below: MESSAGE TYPE $01 - Parameter Block ---------------------------------- SOX KID UID PID $01 SETU DISP SIZE XX XX XX .... CKH CKL EOX $01 - Parameter Block message type SETU (7) - Setup number (0 - 64) DISP (14) - Displacement into Setup Parameter set of first data value SIZE (7) - Count of data values that follow before the checksum Caution! Must be 32 or less! XX (8) - Data values (remember, each is 2 MIDI data bytes) The numbers shown in () indicate the data type as described earlier in Sys-ExMessage Format. "Setup" 0 is actually the Global Parameter set which includes all of the global parameters except #1, 20, and 21; the Rhythms, Scales, Setup Lists, Porgram Change Map, and Midi Message strings. The complete Global Parameter Set is $BB7 (2999) bytes. Later a map of where each of these objects is located will be given. Setups 1-64 correspond to the 64 setups in the unit. Setup data is in the compressed format used in non-volatile storage and thus is not easily editable. A complete setup is $16C (364) bytes long. The complete set of 64 setups is thus $5B00 (23,296) bytes long. A map of where major elements are in a setup will be given later. Obviously, with the large size of the globals and each setup, several Parameter Block messages must be used for each. The maximum number of data values in a Parameter Block message is 32. Do not attempt to use larger blocks; doing so will overwrite critical parts of memory and may crash the ExpressionMate! The minimum number of data values is one. Although the sys-ex dump software in the ExpressionMate will break up the globals of each setup into a sequence of 32-byte messages ending with a shorter message, the sys-ex loader will accept any mix of lengths. The messages need not even be in address sequential order. The 14-bit Displacement field in each message permits the loader to reassemble the pieces into a valid globals set or setup. This permits considerable flexibility in a librarian program to mix and match parts of setups and globals. When the ExpressionMate receives a Parameter Block message, it is saved until the checksum is verified. After verification, the data is written into non-volatile memory where specified by the SETU and DISP fields. If it is global data, the change will take effect immediately without operator intervention (see exception below). If it is setup data, it will not take effect until the setup containing that data is loaded into working storage, either by an operator front panel function or the unit receiving a MIDI Program Change that calls up that setup. (See Part 2 for a way to simulate button presses via sys-ex if one desires the just received setup parameters to become active automatically.) Also when a Parameter Block message is received successfully and non-volatile memory is altered, the Non-Vol Memory Checksum is invalidated until a new one, which includes the new data, can be calculated. This is done automatically in the background and requires about 2 seconds to complete. During that time the user should not turn the power off. If power is turned off before the new checksum calculation is complete, then at next power-on a "Memory Failure" message will be seen. This can be ignored if the user suspects its because power was turned off too fast and all non-vol memory data will be retained. Some global parameters are copied into a "page zero shadow location" for faster access by the software. The editors update the copy automatically when those parameters are changed so you will have to do the same to see an effect. Such parameters are indicated by a * just after their DISP field. See Other Useful Locations in Working Storage below for the location of the working copies. Following are location tables than can be used to extract and reload parts of the globals and setups. As mentioned before, setups are stored in a compressed format and so are not easily edited using Parameter Block messages. The globals however are uncompressed so each individual parameter is listed. GLOBAL PARAMETERS (SETUP 0) --------------------------- NAME DISP SIZE PARM # DESCRIPTION ------- ---- ---- ------ ------------------------------------------ TRGBLK 0 * 1 G2 DRUM TRIGGER BLANK TIME IN MILLISECONDS LEFTHAND 1 * 1 G3 BIT 7=1=LEFT HANDED RIBBON G8 BIT 3: MERGE UNPROC| 00=NONE 01=NOTES G8 BIT 2: MIDI MESSG | 11=BOTH 10=CONTROLS G10 BIT 1=SEND ARP CLOCK TO AUX OUTPUT G10 BIT 0=SEND ARP CLOCK TO MAIN OUTPUT MIMFLGS 2 * 1 G4 MIDI IN MAIN FLAGS: B7 - 1=MERGE TO BIT 6 G4 B6 - 0=MAIN, 1=AUX OUT G5 B5 - 1=MERGE REAL-TIME G5 B4 - 1=MERGE SYSEX G11 B3 - 1=LISTEN TO PRG CHG B2 - 1=LISTEN TO CTL CHG G9 B1 - 1=LISTEN TO CLOCK G14-16 B0 - 1=LISTEN TO NOTES MIXFLGS 3 * 1 G6 MIDI IN AUX FLAGS B7 - 1=MERGE TO BIT 6 G6 B6 - 0=MAIN, 1=AUX OUT G7 B5 - 1=MERGE REAL-TIME G7 B4 - 1=MERGE SYSEX G11 B3 - 1=LISTEN TO PRG CHG B2 - 1=LISTEN TO CTL CHG G9 B1 - 1=LISTEN TO CLOCK G14-16 B0 - 1=LISTEN TO NOTES PCCHAN 4 1 G11 MIDI CHAN TO RECEIVE PROG CHANGE ON, 0-32 PCBANKL 5 1 G12 MIDI BANK TO RECEIVE PROG CHANGE ON, LOW BYTE PCBANKH 6 1 G13 MIDI BANK TO RECEIVE PROG CHANGE ON, HIGH BYTE NTCHAN1 7 1 G14 MIDI CHANNEL TO RECEIVE NOTES ON, ZONE 1, 0-32 NTCHAN2 8 1 G15 MIDI CHANNEL TO RECEIVE NOTES ON, ZONE 2, 0-32 NTCHAN3 9 1 G16 MIDI CHANNEL TO RECEIVE NOTES ON, ZONE 3, 0-32 CCCHAN1 10 1 G17 MIDI CHANNEL TO RECEIVE CONTROLS ON, Z1, 0-32 CCCHAN2 11 1 G18 MIDI CHANNEL TO RECEIVE CONTROLS ON, Z2, 0-32 CCCHAN3 12 1 G19 MIDI CHANNEL TO RECEIVE CONTROLS ON, Z3, 0-32 SETUP LISTS: ------------ SULIST1 23 16 SETUP LIST 1 (16 STEPS, EACH IS A SETUP #) SULIST2 39 16 SETUP LIST 2 SULIST3 55 16 SETUP LIST 3 SETUP MAP: ---------- SUMAP 71 128 SETUP MAP, IN PROGRAM CHANGE NUMBER ORDER, EACH IS A SETUP NUMBER, 0=NONE MMSG STRINGS: ------------- ARBMSG1 199 16 MESSAGE STRING #1 (SEE USER'S MANUAL FOR CODING) ARBMSG2 215 16 MESSAGE STRING #2 ARBMSG2 231 16 MESSAGE STRING #3 ARBMSG2 247 16 MESSAGE STRING #4 ARBMSG2 263 16 MESSAGE STRING #5 ARBMSG2 279 16 MESSAGE STRING #6 CUSTOM SCALES: -------------- CSTSNPOC 295 8 NOTES PER OCTAVE FOR THE 8 SCALES CSTSOCSZ 303 8 OCTAVE SIZES FOR THE 8 SCALES CSTSITV1 311 16 INTERVALS IN THE OCTAVE FOR SCALE 1 CSTSITV2 327 16 INTERVALS IN THE OCTAVE FOR SCALE 2 CSTSITV3 343 16 INTERVALS IN THE OCTAVE FOR SCALE 3 CSTSITV4 359 16 INTERVALS IN THE OCTAVE FOR SCALE 4 CSTSITV5 375 16 INTERVALS IN THE OCTAVE FOR SCALE 5 CSTSITV6 391 16 INTERVALS IN THE OCTAVE FOR SCALE 6 CSTSITV7 407 16 INTERVALS IN THE OCTAVE FOR SCALE 7 CSTSITV8 423 16 INTERVALS IN THE OCTAVE FOR SCALE 8 CUSTOM RHYTHMS: --------------- CSTRHY1 439 CUSTOM RHYTHM 1 CSTRBVAL 439 1 BEAT VALUE CSTRNSTP 440 1 NUMBER OF STEPS CSTRSTEP 441 16*2 UP TO 16 STEPS, EACH: LENGTH,DURATION IN CLOCKS CSTRNAME 473 6 NAME, ASCII (NOT VISIBLE OR EDITABLE IN VER 1) CSTRHY2 479 40 CUSTOM RHYTHM 2 CSTRHY3 519 40 CUSTOM RHYTHM 3 ........ 559 2400 CUSTOM RHYTHMS 4-63 CSTRHY64 2599 40 CUSTOM RHYTHM 64 Following is the structure for each setup. Remember that the Parameter Block message has a field for setup number so the displacements listed below will be the same for any setup. For information about the individual parameters in a setup, see the next section. USER SETUPS 1-64 ---------------- NAME DISP SIZE PARM # DESCRIPTION ------- ---- ---- ------ ------------------------------------------ NAME 0 12 SETUP NAME, ASCII FLAGS1 12 2 2,3,5,7, VARIOUS BIT FLAGS FOR THE SETUP. INCLUDES 9 RIBBON MODES AND EDITED FLAGS. SECOND BYTE NOT USED IN V1. SPRINGPT 14 4 6,8,10 RIBBON SPRING POINTS: LONG, S1, S2, S3 ZONCHAN 18 3 1 PORT/CHANNEL FOR EACH ZONE PEDAL2 21 15 70-76 PEDAL 2 PARAMETERS PEDAL1 36 15 63-69 PEDAL 1 PARAMETERS WHEN IT IS A SWITCH BUTTON1 51 15 77-83 BUTTON 1 PARAMETERS BUTTON2 66 15 84-90 BUTTON 2 PARAMETERS CCPEDAL 81 21 55-62 PEDAL 1 PARAMETERS WHEN IT IS A CC PEDAL BREATH 102 21 47-54 BREATH CONTROLLER PARAMETERS LONGRBN 123 21 11-19 RIBBON PARAMETERS WHEN IT IS SINGLE SECTION SCT1RBN 144 21 20-28 SECTION 1 RIBBON PARAMETERS SCT2RBN 165 21 29-37 SECTION 2 RIBBON PARAMETERS SCT3RBN 186 21 38-46 SECTION 3 RIBBON PARAMETERS MIDIMAP1 207 21 100-107 MIDI REMAP 1 PARAMETERS MIDIMAP2 228 21 108-115 MIDI REMAP 2 PARAMETERS MIDIMAP3 249 21 116-123 MIDI REMAP 3 PARAMETERS FIXED1 270 9 91-93 FIXED CONTROLLER 1 FIXED2 279 9 94-96 FIXED CONTROLLER 2 FIXED3 288 9 97-99 FIXED CONTROLLER 3 NOTEPROC 297 18 124-130 MIDI NOTE PROCESSING PARAMETERS CCNOTE 315 9 131-133 CC NOTE PLAYING PARAMETERS ZONENOTE 324 3 134 ZONE NOTE MAP SPARE 327 3 NOT USED IN VER 1 ARPPARMS 330 34 ARP1-16 ARPEGGIATOR PARAMETERS PART 2 - MEMORY PEEK AND POKE MESSAGES -------------------------------------------- For advanced functions beyond what one would expect a librarian to do, the ExpressionMate's sys-ex command set includes Memory Peek and Memory Poke commands. With these one can examine and alter the ExpressionMate's working memory (actually any memory) contents live and without user intervention or indeed knowledge. Of course with this power comes the responsibility to only make proper alterations of the proper locations. The information below is believed to be complete enough to implement any reasonable editing function. MESSAGE TYPE $02 - Memory Peek ------------------------------ SOX KID UID PID $02 ADRH ADRL CKH CKL EOX ADRH (8) - High byte of memory address to read ADRL (8) - Low byte of memory address to read Upon successful receipt of this message, a Memory Poke message with the content of ADRH,ADRL will be sent out the main port (see below). A new Memory Peek message should not be sent until the reply from the previous message has been received completely. MESSAGE TYPE $03 - Memory Poke ------------------------------ SOX KID UID PID $02 ADRH ADRL DATA CKH CKL EOX ADRH (8) - High byte of memory address to write ADRL (8) - Low byte of memory address to write DATA (8) - Data value to write Upon successful receipt of this message, the data value will be written to ADRH,ADRL. Successive Memory Poke messages may be sent as quickly as desired. Although these messages are not very efficient for reading and writing large blocks of data, they are believed adequate for common editing applications. CHECKING THE VERSION All of the parameter size and location information given above and below is version dependent. Therefore it is prudent for a librarian or editor to check the software version number of the client ExpressionMate. This is done with Memory Peeks to the following addresses: $801A Version Number Single ASCII character giving the major Version $801C Revision Numnber Single ASCII character giving the minor revision Global Parameter and Setup Parameter format, size, and location will not change within a version but might change from version to version. Addresses within working storage can change from revision to revision. For released software, these fields will always be ASCII digits, 0-9. For beta releases, the Revision Number may be greater than 9 (e.g., 1.17). The numbering sequence is 0-9, A-Z, [, \, ], ^, _, `, a-z. On the next page is an example showing use of the Memory Peek command for reading the version byte. It also illustrates how checksums are calculated. This example assumes that the Unit ID is its default value of 1. Memory Peek at $801A Example Sent to E-Mate: --------------- SOX $F0 Start of Exclusive KID $07 Kurzweil's ID UID $01 Unit ID (Global #20 default) PID $0E E-Mate Product ID MTY $02 Message Type = Peek ADRH $08 $00 Address high byte, $80 ADRL $01 $0A Address low byte, $1A CKSH $01 Checksum high 7 bits CKSL $1C Checksum low 7 bits EOX $F7 End of Exclusive Checksum Calc: MTY = $02 (7 bits) ADRH = $80 (8 bits) ADRL = $1A (8 bits) ------ $009C = 0000 0000 1001 1100 HH HHHH HLLL LLLL H=$01 L=$1C Received from E-Mate: --------------------- SOX $F0 Start of Exclusive KID $07 Kurzweil's ID UID $01 Unit ID PID $0E E-Mate Product ID MTY $03 Message type = Poke ADRH $08 $00 Address high byte ADRL $01 $0A Address low byte DATA $03 $01 Data, $31 = "1" CKSH $01 Checksum high 7 bits CKSL $4E Checksum low 7 bits EOX $F7 End of Exclusive Checksum Calc: MTY = $03 (7 bits) ADRH = $80 (8 bits) ADRL = $1A (8 bits) DATA = $31 (8 bits) ------ $00CE = 0000 0000 1100 1110 HH HHHH HLLL LLLL H=$01 L=$4E SIMULATING BUTTON PRESSES An editor may wish to trigger some action within the ExpressionMate by simulating a button press. Other Kurzweil gear uses a special sys-ex message for this purpose but the ExpressionMate uses a simpler method. Within working storage is a single byte called the Button Queue (BUTQ). Normally it is zero but when the scanner routine detects a button event, it places an event code there. A different part of the program periodically looks at the button queue and upon seeing a non-zero value, performs the appropriate action based on the event code and the current editing mode. When the action is complete, BUTQ is zeroed. There is no mechanism to prevent a collision between a user initiated button press and a simulated press via sys-ex. The possibility of collisions can be minimized however by using a Memory Peek to verify that BUTQ is zero before Poking a value into it. There is also no easy way to ascertain the current editing mode. However 4 EXIT codes is guarenteed to return to Setup Select mode regardless of the current editing mode. Below is the full set of button codes. Please refer to the User Manual for the effect of each of these in each of the possible editing modes. Note that SW1 and SW2 buttons are not listed. These are actually performance controls and are handled differently. ; BUTTON NAMES: NORMAL PRESS, UI QUEUE BLSOFT = 1 LEFT SOFT (ALSO <) BRSOFT = 2 RIGHT SOFT (ALSO >) BDEC = 3 DECREMENT (ALSO - AND NO) BINC = 4 INCREMENT (ALSO + AND YES) BRCLXIT = 5 EXIT BSTORE = 6 STORE BLEARN = 7 LEARN BCTLR = 8 CONTROLLER BARP = 9 ARPEGGIATOR BGLOBAL = 10 GLOBAL ; BUTTON NAMES: NORMAL RELEASE, UI QUEUE BLEARNUP = 11 LEARN BUTTON RELEASED BCTLRUP = 12 CONTROLLER BUTTON RELEASED ; BUTTON NAMES: DOUBLE-PRESS, UI QUEUE BDLRSOFT = 14 LEFT & RIGHT SOFT BDINCDEC = 15 INC AND DEC ; PSEUDO BUTTONS (USED TO SIGNAL EVENTS THROUGH BUTTON QUEUES) INTENTCM = 13 PHYSICAL CONTROLLER MOVED WHILE GFLAGS(4) SET SPINKNOB = 16 SPINKNOB MOVED, SIGNED AMOUNT AT $0017 PRGCHGRC = 17 QUALIFIED PROGRAM CHANGE RECEIVED FROM MIDI OTHER USEFUL LOCATIONS IN WORKING STORAGE Below are the addresses of variables that may be useful to an external editor. Note that many of these may lead to a crash if manipulated inappropriately. Please note that 16-bit values are in "Little Endian" order (low byte first). NAME ADDRESS DESCRIPTION ------ ------- ------------------------ GFLAGS $0000 Bit 0 selects between decimal/symbolic display and hexadecimal display. TOD $0005 Time-of-day, 2 byte unsigned integer incremented every 500uS "scan". SULISTN $001A Current Setup List number (1-3) SULISTS $001B Current Setup List step (1-16) ZONCUR $001D Current zone (1-3) for editing/button LEDS PRMCUR $001E Current parameter for editing ICLKPSCD $0086 INTERNAL TEMPO CLOCK POSTSCALE DIVISOR (1-4) ICLKPSCC $0087 INTERNAL TEMPO CLOCK POSTSCALE COUNTER ICLKTICK $0088 INCREMENTED EVERY INTERNAL TEMPO CLOCK TICK ARCLKDSB $0089 BIT 7: 1=DISABLE ARP RESPONSE TO CLOCKS MIMFLGS_ $008F MIDI IN MAIN FLAGS (COPY OF GLOBAL PARAMETER) MIXFLGS_ $0090 MIDI IN AUX FLAGS (COPY OF GLOBAL PARAMETER) TRGBLK_ $0091 DRUM TRIGGER BLANK TIME IN MS (COPY OF GLOBAL PARAMETER) LEFTHAN_ $0092 RIBON DIRECTION, ETC. (COPY OF GLOBAL PARAMETER) CPRMCUR $064C LAST SELECTED CONTROL PARAMETER NUMBER GPRMCUR $064D LAST SELECTED GLOBAL PARAMETER NUMBER APRMCUR $064E LAST SELECTED ARPEGGIATOR PARAMETER NUMBER PRMVCUR $064F LAST STORED PARAMETER VALUE EDITOBJ $0662 LAST EDITED GLOBAL OBJECT, 0-5 UTILOBJ $0663 LAST SELECTED UTILITY, 0-2 EDITSCL $0664 LAST SELECTED CC NOTE SCALE TO EDIT, 0-7 EDITRHY $0667 LAST SELECTED ARP RHYTHM TO EDIT, 0-7 MINBANKL $098E LAST RECEIVED BANK SELECT LOW, NEG=NONE MINBANKH $098F LAST RECEIVED BANK SELECT HIGH, NEG=NONE MINPGCH $0990 LAST RECEIVED QUALIFIED PROG CHANGE, NEG=NONE EXPANDED SETUP INFORMATION In the ExpressionMate, user setups are stored in compressed form in non-volatile memory. The currently active setup however is stored in expanded form in Current Setup Memory. It is here that the built-in setup editing functions (Control Editor and Arpeggiator Editor) do their thing. A computer-based editor should do the same not only for simplicity but so that changes become effective immediately. The vast majority of parameters are in reality 3 parameters, one for each zone. These are called Zone Parameters can be recognized as requiring 3 bytes of storage. Zone 1 would be at the lowest address and Zone 3 at the highest. Parameters requiring only a single byte are called Common Parameters and influence all 3 zones. Some of the information in the expanded setup are more properly classified as real-time control information rather than parameters. An example is the "last sent" control values. An editor should just leave them alone. When the active setup is compressed for saving in the non-volatile memory, this kind of data is thrown away. When studying the following parameter descriptions, pay special attention to the coding. The ExpressionMate software was developed over a period of more than two years and many of its features were not in its original "spec". Consequently there are variations in coding conventions. For example, some parameters may use zero to specify "Off" or "None" whereas other parameters may use -1 ($FF) for that purpose. Some parameters may be zero-origin (start numbering from zero) while others may be 1-origin. The run-time system and the built-in editors assume that parameters have legal values so a computer-based editor should assure that edited values remain legal. HEX NAME ADDR SIZE PARM # DESCRIPTION ------- ------ ---- ------ ------------------------------------------ SUNAME 1257 12 12 BYTE NAME, STD ASCII CMFLAGS 1263 1 2 COMMON FLAGS: B7 - 0=LONG, 1=3-SECT 3 B6 - 0=ABS, 1=REL LONG 9 B5 - 0=ABS, 1=REL SECT. 3 7 B4 - 0=ABS, 1=REL SECT. 2 5 B3 - 0=ABS, 1=REL SECT. 1 B2 B1 - 0=VIRGIN, 1=ARP EDITED B0 - 0=VIRGIN, 1=CONTROLS EDITED CMFLAGS2 1264 1 NOT USED BY VER 1 SECLSP 1265 1 4 LONG RIBBON SPRING POINT, NEG=OFF SEC1SP 1266 1 6 RIBBON SECTION 1 SPRING POINT, NEG=OFF SEC2SP 1267 1 8 RIBBON SECTION 2 SPRING POINT, NEG=OFF SEC3SP 1268 1 10 RIBBON SECTION 3 SPRING POINT, NEG=OFF ZONECH 1269 3 1 MIDI CHANNEL FOR ZONES (1-32, 0=ZONE OFF) 1-16=MAIN, 17-32=AUX **PEDAL 2 FSFLGS 126C 3 70 FLAGS: B7 - 0=MOMENTARY, 1=TOGGLE B6 - LAST SENT SWITCH STATE IN ZONE 75 B3:2 - 0 0 = DON'T SEND AN ENTRY STATE 0 1 = SEND CURRENT STATE ON ENTRY 1 0 = SEND OFF STATE ON ENTRY 1 1 = SEND ON STATE ON ENTRY 76 B1:0 - 0 X = DON'T SEND AN EXIT STATE 1 0 = SEND OFF STATE ON EXIT 1 1 = SEND ON STATE ON EXIT FSCTLON 126F 3 71 ON CONTROLLER NUMBER (0-127, NEG=NONE) FSCTLOF 1272 3 73 OFF CONTROLLER NUMBER (0-127, NEG=NONE) FSVALON 1275 3 72 ON VALUE (0-127) FSVALOF 1278 3 74 OFF VALUE (0-127) **PEDAL 1 VSFLGS 127B 3 63 FLAGS: B7 - 0=MOMENTARY, 1=TOGGLE B6 - LAST SENT SWITCH STATE IN ZONE 68 B3:2 - 0 0 = DON'T SEND AN ENTRY STATE 0 1 = SEND CURRENT STATE ON ENTRY 1 0 = SEND OFF STATE ON ENTRY 1 1 = SEND ON STATE ON ENTRY 69 B1:0 - 0 X = DON'T SEND AN EXIT STATE 1 0 = SEND OFF STATE ON EXIT 1 1 = SEND ON STATE ON EXIT VSCTLON 127E 3 64 ON CONTROLLER NUMBER (0-127, NEG=NONE) VSCTLOF 1281 3 66 OFF CONTROLLER NUMBER (0-127, NEG=NONE) VSVALON 1284 3 65 ON VALUE (0-127) VSVALOF 1287 3 67 OFF VALUE (0-127) **SWITCH 1 B1FLGS 128A 3 77 FLAGS: B7 - 0=MOMENTARY, 1=TOGGLE B6 - LAST SENT SWITCH STATE IN ZONE 82 B3:2 - 0 0 = DON'T SEND AN ENTRY STATE 0 1 = SEND CURRENT STATE ON ENTRY 1 0 = SEND OFF STATE ON ENTRY 1 1 = SEND ON STATE ON ENTRY 83 B1:0 - 0 X = DON'T SEND AN EXIT STATE 1 0 = SEND OFF STATE ON EXIT 1 1 = SEND ON STATE ON EXIT B1CTLON 128D 3 78 ON CONTROLLER NUMBER (0-127, NEG=NONE) B1CTLOF 1290 3 80 OFF CONTROLLER NUMBER (0-127, NEG=NONE) B1VALON 1293 3 79 ON VALUE (0-127) B1VALOF 1296 3 81 OFF VALUE (0-127) **SWITCH 2 B2FLGS 1299 3 84 FLAGS: B7 - 0=MOMENTARY, 1=TOGGLE B6 - LAST SENT SWITCH STATE IN ZONE 89 B3:2 - 0 0 = DON'T SEND AN ENTRY STATE 0 1 = SEND CURRENT STATE ON ENTRY 1 0 = SEND OFF STATE ON ENTRY 1 1 = SEND ON STATE ON ENTRY 90 B1:0 - 0 0 = DON'T SEND AN EXIT STATE 1 0 = SEND OFF STATE ON EXIT 1 1 = SEND ON STATE ON EXIT B2CTLON 129C 3 85 ON CONTROLLER NUMBER (0-127, NEG=NONE) B2CTLOF 129F 3 87 OFF CONTROLLER NUMBER (0-127, NEG=NONE) B2VALON 12A2 3 86 ON VALUE (0-127) B2VALOF 12A5 3 88 OFF VALUE (0-127) **CONTINUOUS PEDAL CPFLGS 12A8 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 60 B3 - 0=7 BITS, 1=14 BITS CPXDEST 12AB 3 -- (DUMMY HERE; USED FOR RIBBONS) CPDEST 12AE 3 55 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) CPENT 12B1 3 61 ENTRY VALUE (0-127, NEG=NONE) CPXIT 12B4 3 62 EXIT VALUE (0-127, NEG=NONE) CPCURVT 12B7 3 56 CURVE TYPE, 0-11, 0=LINEAR CPCURVA 12BA 3 57 CURVE AMOUNT, 0-8 CPSCALE 12BD 3 58 SCALE FACTOR FRACTIONAL PART AMOUNT 12C0 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 CPOFFS 12C3 3 59 OFFSET (-127 - +127) CPLSENT 12C6 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **BREATH CONTROLLER BCFLGS 12CC 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 52 B3 - 0=7 BITS, 1=14 BITS BCXDEST 12CF 3 -- (DUMMY HERE; USED FOR RIBBONS) BCDEST 12D2 3 47 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) BCENT 12D5 3 53 ENTRY VALUE (0-127, NEG=NONE) BCXIT 12D8 3 54 EXIT VALUE (0-127, NEG=NONE) BCCURVT 12DB 3 48 CURVE TYPE, 0-11, 0=LINEAR BCCURVA 12DE 3 49 CURVE AMOUNT, 0-8 BCSCALE 12E1 3 50 SCALE FACTOR FRACTIONAL PART AMOUNT 12E4 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 BCOFFS 12E7 3 51 OFFSET (-127 - +127) BCLSENT 12EA 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **RIBBON IN LONG (SINGLE SECTION) MODE RLFLGS 12F0 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 17 B3 - 0=7 BITS, 1=14 BITS RLXDEST 12F3 3 12 AUX DESTINATION (0-127, NEG=NONE) RLDEST 12F6 3 11 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) RLENT 12F9 3 18 ENTRY VALUE (0-127, NEG=NONE) RLXIT 12FC 3 19 EXIT VALUE (0-127, NEG=NONE) RLCURVT 12FF 3 13 CURVE TYPE, 0-11, 0=LINEAR RLCURVA 1302 3 14 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX RLSCALE 1305 3 15 SCALE FACTOR FRACTIONAL PART AMOUNT .DS 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 RLOFFS 130B 3 16 OFFSET (-127 - +127) RLLSENT 130E 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **RIBBON IN 3-SECTION MODE, SECTION 1 R1FLGS 1314 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 26 B3 - 0=7 BITS, 1=14 BITS R1XDEST 1317 3 21 AUX DESTINATION (0-127, NEG=NONE) R1DEST 131A 3 20 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) R1ENT 131D 3 27 ENTRY VALUE (0-127, NEG=NONE) R1XIT 1320 3 28 EXIT VALUE (0-127, NEG=NONE) R1CURVT 1323 3 22 CURVE TYPE, 0-11, 0=LINEAR R1CURVA 1326 3 23 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX R1SCALE 1329 3 24 SCALE FACTOR FRACTIONAL PART AMOUNT 132C 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 R1OFFS 132F 3 25 OFFSET (-127 - +127) R1LSENT 1332 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **RIBBON IN 3-SECTION MODE, SECTION 2 R2FLGS 1338 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 35 B3 - 0=7 BITS, 1=14 BITS R2XDEST 133B 3 30 AUX DESTINATION (0-127, NEG=NONE) R2DEST 133E 3 29 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) R2ENT 1341 3 36 ENTRY VALUE (0-127, NEG=NONE) R2XIT 1344 3 37 EXIT VALUE (0-127, NEG=NONE) R2CURVT 1347 3 31 CURVE TYPE, 0-11, 0=LINEAR R2CURVA 134A 3 32 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX R2SCALE 134D 3 33 SCALE FACTOR FRACTIONAL PART AMOUNT 1350 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 R2OFFS 1353 3 34 OFFSET (-127 - +127) R2LSENT 1356 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **RIBBON IN 3-SECTION MODE, SECTION 3 R3FLGS 135C 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND CURRENT STATE NOW 44 B3 - 0=7 BITS, 1=14 BITS R3XDEST 135F 3 39 AUX DESTINATION (0-127, NEG=NONE) R3DEST 1362 3 38 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) R3ENT 1365 3 45 ENTRY VALUE (0-127, NEG=NONE) R3XIT 1368 3 46 EXIT VALUE (0-127, NEG=NONE) R3CURVT 136B 3 40 CURVE TYPE, 0-11, 0=LINEAR R3CURVA 136E 3 41 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX R3SCALE 1371 3 42 SCALE FACTOR FRACTIONAL PART AMOUNT 1374 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 R3OFFS 1377 3 43 OFFSET (-127 - +127) R3LSENT 137A 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **MIDI CONTROLLER 1 M1FLGS 1380 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND ENTRY/EXIT STATE NOW B4 - 0=ENTRY STATE, 1=EXIT STATE M1SORC 1383 3 101 MIDI 1 SOURCE CONTROLLER NUMBER (ONLY Z1 USED) M1DEST 1386 3 100 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) M1ENT 1389 3 106 ENTRY VALUE (0-127, NEG=NONE) M1XIT 138C 3 107 EXIT VALUE (0-127, NEG=NONE) M1CURVT 138F 3 102 CURVE TYPE, 0-11, 0=LINEAR M1CURVA 1392 3 103 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX M1SCALE 1395 3 104 SCALE FACTOR FRACTIONAL PART AMOUNT 1398 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 M1OFFS 139B 3 105 OFFSET (-127 - +127) M1LSENT 139E 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **MIDI CONTROLLER 2 M2FLGS 13A4 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND ENTRY/EXIT STATE NOW B4 - 0=ENTRY STATE, 1=EXIT STATE M2SORC 13A7 3 109 MIDI 2 SOURCE CONTROLLER NUMBER (ONLY Z1 USED) M2DEST 13AA 3 108 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) M2ENT 13AD 3 114 ENTRY VALUE (0-127, NEG=NONE) M2XIT 13B0 3 115 EXIT VALUE (0-127, NEG=NONE) M2CURVT 13B3 3 110 CURVE TYPE, 0-11, 0=LINEAR M2CURVA 13B6 3 111 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX M2SCALE 13B9 3 112 SCALE FACTOR FRACTIONAL PART AMOUNT 13BC 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 M2OFFS 13BF 3 113 OFFSET (-127 - +127) M2LSENT 13C2 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **MIDI CONTROLLER 3 M3FLGS 13C8 3 FLAGS: B7 - 1=ENABLED TO SEND IN ZONE B6 - 0=<, 1=> POSITION:ENTRY VALUE B5 - 1=SEND ENTRY/EXIT STATE NOW B4 - 0=ENTRY STATE, 1=EXIT STATE M3SORC 13CB 3 117 MIDI 3 SOURCE CONTROLLER NUMBER (ONLY Z1 USED) M3DEST 13CE 3 116 DESTINATION CONTROLLER NUMBER (0-127, NEG=NONE) M3ENT 13D1 3 122 ENTRY VALUE (0-127, NEG=NONE) M3XIT 13D4 3 123 EXIT VALUE (0-127, NEG=NONE) M3CURVT 13D7 3 118 CURVE TYPE, 0-11, 0=LINEAR M3CURVA 13DA 3 119 CURVE AMOUNT, 0-8, 0=LINEAR, 1=MIN, 8=MAX M3SCALE 13DD 3 120 SCALE FACTOR FRACTIONAL PART AMOUNT 13E0 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 M3OFFS 13E3 3 121 OFFSET (-127 - +127) M3LSENT 13E6 6 LAST SENT CONTROL VALUE IN ZONE, MIDI UNITS **FIXED CONTROLLER 1 F1DEST 13EC 3 91 DESTINATION F1ENT 13EF 3 92 ENTRY VALUE (0-127, NEG=NONE) F1XIT 13F2 3 93 EXIT VALUE (0-127, NEG=NONE) **FIXED CONTROLLER 2 F2DEST 13F5 3 94 DESTINATION F2ENT 13F8 3 95 ENTRY VALUE (0-127, NEG=NONE) F2XIT 13FB 3 96 EXIT VALUE (0-127, NEG=NONE) **FIXED CONTROLLER 3 F3DEST 13FE 3 97 DESTINATION F3ENT 1401 3 98 ENTRY VALUE (0-127, NEG=NONE) F3XIT 1404 3 99 EXIT VALUE (0-127, NEG=NONE) MDNCURVT 1407 3 127 **MIDI NOTE VELOCITY CURVE TYPE, 0-11 MDNCURVA 140A 3 128 MIDI NOTE VELOCITY CURVE AMOUNT MDNSCALE 140D 3 129 SCALE FACTOR FRACTIONAL PART AMOUNT 1410 3 SCALE FACTOR INTEGER PART, B7=SIGN, B1-0=MAG 0-3 MDNOFFS 1413 3 130 OFFSET (-127 - +127) MDNLOKEY 1416 3 124 MIDI NOTE LOW KEY MDNHIKEY 1419 3 125 MIDI NOTE HIGH KEY MDNOTXPO 141C 3 126 MIDI NOTE TRANSPOSE $80=CTLR #39; -64 - +63 CCNOTSCL 141F 3 131 **SCALE FOR CC NOTES, 13 LIST, 8 USER, ARP LATCH, NEG=CTLR #46) CCNOTVEL 1422 3 132 VELOCITY FOR CC NOTES, 0-127, NEG=CTLR #44 CCNOTXPO 1425 3 133 TRANSPOSE FOR CC NOTES, -64 - +63, $80=CTLR#43 ZNNOTMAP 1428 3 134 **ZONE NOTE MAP SELECTION 0-12 (13 CHOICES) 142B 3 --- NOT USED BY VER 1 ARTEMPO 142E 1 A1 **INITIAL TEMPO, CODED FOR 30-600 OR DEST 51 1-70=30-99, 71-170=100-298, 171-231=300-600 0=DEST 53 ARLOW 142F 3 A2 LOWEST KEY # ACCEPTED FOR INPUT, MIDI 21-108 ARHIGH 1432 3 A3 HIGHEST KEY # ACCEPTED FOR INPUT, MIDI 21-108 ARBEATS 1435 3 A6 CLOCKS PER BEAT, 1-96, 0=DEST 52 ARNTDUR 1438 3 A7 NOTE DURATION, 1-128=MIN-400%, 0=DEST 53 ARSHLMT 143B 3 A11 SHIFT LIMIT, 1-89=0-88, 0=DEST 55 ARNTVEL 143E 3 A14 NOTE VELOCITY, 1-127, 128=PLAYED, 129=LAST 0=DEST 56 ARRHYTM 1441 3 A15 RHYTHM SELECTION, 0 - (STD LIST + 8 USER) ARXPOSE 1444 3 A16 ARP TRANSPOSE, $80=CTLR #47, OR +-88 ARPOWER 1447 3 A4 POWER SWITCH: INITIALLY OFF, ON, DEST 50 B7=1=DEST 48; B0=0=OFF, =1=ON ARGLISS 144A 3 A13 GLISSANDO, B7=1=DEST 50, B0=0=OFF, =1=ON ARNTORD 144D 3 A9 NOTE ORDER, 0-15 FOR THE 16 CHOICES ARNTSRC 1450 3 A5 NOTE SOURCE: 8 CHOICES, 0-7 0-2=MIDI Z1-3; 3-5=CC NOTE PLAY Z1-3; 6-8=ARP OUT Z1-3 (SAME ZONE NOT ALLOWED) ARLACHM 1453 3 A8 LATCH MODE, 0-12 CODING FOR THE 13 MODES ARLMOPT 1456 3 A12 LIMIT OPTION, 0-6 CODING FOR 7 CHOICES ARSHAMT 1459 3 A10 SHIFT AMOUNT, 1-25=-12-+12, 0=DEST 54