MIDI System Exclusive Format ============================ for PMM-88E, MP-88, MT-16X The manufacturer-ID of MIDITEMP is: 00 20 0D (all numbers: Hex) General SysEx-format: F0
F7 ID: Device-address, 7F= 'all devices' (not for opcode 0 to 37) other: =FORNET-Baseaddress/2 DT: Type of device: 20: PMM-88E 30: MT-16X 40: MP-88 42: MP-88W 43: MP-88CDW 52: MP-44W 53: MP-44CDW 56: MP-44WII 62: MP-22W 63: MP-22CDW 70: MT-16X with MP-upgrade 7F: undefined Mode: Bit 6 = Format: 0 - are 7-bit data, no trans- forming 8<->7 bit and no checksum (e.g. names - ASCII, 7 Bit) 1 - are 8-bit data, transformed to 7-bit bytes with checksum Bit 2 = Handshake-flag: 1 - Handshaking enabled 0 - Handshaking disabled Setting of this bit in a dump request message enables handshaking for the data dump. There is no ACK needed for the dump request! Bit 0,1 = Msg.Type: = 0 - All data are transfered in this single packet. = 1 - First packet of a "Multi-Packet Message" (next byte is opcode) = 2 - "Continued Message" - another packet and there are more packets. (next byte is packet-number) = 3 - "Last Packet" Opcode: Bit 6 gives information whether the message is a dump-request or a data-dump. Bit 6 = 0: Data Dump Bit 6 = 1: Dump Request Bits 0 to 5 = dump item (see next section). Opcodes > 7C: 7F: ACK (handshaking flag: Acknowledge) 7D: CAN (handshaking flag: Cancel) Packet number: If a packet is Msg.-Type 2 or 3, the byte at -position contains a packet number. It starts at 0 for the very first packet. Since the packet number is transmitted from the second packet on (the first packet is Msg.Type 0 or 1), the first transmitted packet number is 01. Format of -field: If the Format-bit of (Mode) is 0, data are not converted from 8-bit to 7-bit bytes. This is possible only for some type of data where the MSBs are not used (e.g. ASCII-data). If the Format-bit of (Mode) is 1, the data-field contains a packet of 8-to-7-bit converted bytes: = The "7-bitizing"-method is very similar to the method used in MIDI File Dump: = number of encoded data bytes minus one. That means: max. length of is 128, a packet contains a maximum of 112 user-bytes. = Each group of seven user-bytes is trans- mitted as 8 bytes. The MSBs of these 7 bytes are sent in the first byte. The stored bytes: AAAAaaaa BBBBbbbb CCCCcccc DDDDdddd .... GGGGgggg are sent as: 0ABCDEFG 0AAAaaaa 0BBBbbbb 0CCCcccc .... 0GGGgggg If less than 7 bytes are transmitted, the MSBs of the missing bytes are sent as zeros. For example: AAAAaaaa BBBBbbbb CCCCcccc are sent as: 0ABC0000 0AAAaaaa 0BBBbbbb 0CCCcccc = 1 byte checksum (2th-complement). The sum of all transmitted data after F0, incl. chksum, only the lowest 7 bits are used, must be zero. Even a request-message may be transmitted 7-bitized if there are parameter-values > 7F (i.e. port-addresses). The receiver must always evaluate bit 6 of the "Mode"-byte to detect the current format of the message. The MIDI input processing will do this so that there is no difference for further evaluation. The time between data-packets must not exceed 10 seconds. Otherwise, a time-out error may occur and the data-transfer will be aborted. For reception of some kind of data (e.g. program-data), the device must not be switched to any function-mode by it's control-panel. The device will respond with a "Cancel"-message if it cannot evaluate received data. Identity Request ================ F0 7E 06 01 F7 The system does not respond to this Universal System Exclusive Message but simply routes it according to the current routing connections. This is to keep the possibility to request and receive the identity of connected MIDI devices through the matrix. Dump Items: =========== 01 Matrix Program 02 MIDI I/O-names of a device 03 Add/Remove MIDI-Processor of Matrix-Program 04 Add/Remove MIDI-Processor to/from I/O-processing 05 Set user defined Device-Prefix/Name 30 Programs which are currently selected 31 Add/Remove/Rename Program Bank 32 Numerical list of existing Program Banks 33 FORNET Address Map 34 Send FORNET System Message 35 FORNET Inquiry Description of Dump Items: ========================== 01 - Matrix Program: Dump Request: F0 00 20 0D 7F XX 41 F7 XX = don't care mode = 00: no handshaking mode = 04: wait after each packet until ACK received. Program Dump: F0 00 20 0D
01 F7 ... The format of a program (8 bit format!): Byte-#: 0 Length of program, lower byte (incl.bytes 2..15) 1 Length of program, higher byte 2 Bank number (0..63) 3 Program number (0..127) 4..15 Name of this program (ASCII, 12 chars) 15..x Processor Data If an empty program is requested for dump, only bytes 0..3 are sent. If a device receives an empty program, it just deletes a program which is stored under this program-number. If a bank doesn't exist in the device's memory, there will be no response when trying to dump or receive a program to/from this non existing bank. The processor data sets have to be sorted numerically. So the routing processors (#0) are at the beginning of the program while the processors with higher numbers are following. Multiple processors of the same type are sorted in ascending order, too. For detailed information about Processor Data see section "Format of MIDI-Processors". 02 - MIDI I/O-names of a device Dump Request: F0 00 20 0D XX 00 42 F7 Dump of a device's I/O names: F0 00 20 0D
00 02 F7 data: IN1-Name, OUT1-Name, IN2-Name, OUT2-Name.... Names = 8 characters, ASCII (7 bit), shorter names are filled up by blanks. All names are transmitted as one single packet by the device. The length of this packet depends on the number of MIDI ports of the device. 03 - Add/Remove MIDI-Processor of Matrix-Program Request: not supported Add/Remove Processor-Data to/from the given program: F0 00 20 0D XX 03 F7 The format of the data field (8 bit format!): Byte-#: 0 Bank number (0..63) 1 Program number (0..127) 2 flag (see below) 3 Processor-type (see "Format of MIDI-processors") 4 I/O-number 5 Channel (if applicable) 6..x further processor data (if applicable) Regarding contents of "flag": MSB=1 and lower nibble (bits 0..3) = 0: add processor. The device will insert the processor data into the given program. If this program is active, the processor will be activated, too. Data for "Send Data"-function will always replace existing data for the same output. MSB=1 and lower nibble=n (>0): replace processor. The device will search for the first n+1 bytes of given processor data in the given program. If these n+1 bytes are equal, the rest of the processor will be replaced by the new data. If the program is active, the corresponding I/O-processor will be re- placed, too. E.g. to change the data of the program-changer for Out 3, channel 6 of the first program, data-field is: 00 00 82 63 02 05 MSB=0: remove processor (lower nibble= don't care). The device will search for the given processor data and remove them from the program. If the program is active, it will switch off the processor, too. To remove data of "Send Data"-function (6F), a dummy- string (length=0) may be sent to remove data of any length from the program. 04 - Add/Remove MIDI-Processor to/from I/O-processing This function is to temporary change the current I/O- processing without affecting the stored programs. (Not usable for "Send Data" (6F)). Request: not supported Add/Remove MIDI-Processor: F0 00 20 0D XX 04 F7 The format of the data field (8 bit format!): Byte-#: 0 flag: MSB=1: add processor. MSB=0: remove processor other bits: should be 0. 1 Processor-type (see "Format of MIDI-processors") 2 I/O-number 3 Channel (if applicable) 4..x further processor data (if applicable) 05 - Set user defined Device-Prefix/Name Dump Request: F0 00 20 0D XX 00 45 F7 Using "All Device"-ID in a multi-device system will cause each device to send it's name. This will result in transmission of n messages in a system of n devices. Dump: Prefix/Name of device: F0 00 20 0D
05 F7 Prefix = User-defined letter to distinguish MIDI-ports of multiple devices. ASCII, 1 character, Valid chars: Space, A-Z Name: User-defined name of device, ASCII, 8 chars. 30 - Selected Programs Dump Request: F0 00 20 0D XX 00 70 F7 Dump: selected bank/program-numbers: F0 00 20 0D
30 F7 Gives the information, which programs are currently active in the system. All 9 program-groups (1..8: Matrix, 9: Sequencer) are given, even if there is no sequencer/player connected. When received, the system selects it's programs according to the received values. should not be $7F, as this would make multiple devices respond to this message in a multi-device system. The format of the data-field is: ... bnkN = bank-number of current program of group N prgN = program-number of current program of group N A negative value of prgN means: "program off". Value of bnkN in this case = don't care. A negative value of bnkN while prgN is positive means: "keep current program of that group unchanged". 31 - Name of Program Bank (create/delete program bank) Requestion of bank-name: F0 00 20 0D XX 00 71 F7 If the requested bank exists in more than one device of a multi-device system, using "All Device"-ID will cause multiple devices to send their bankname. There will be no reply if the name of a non-existing bank is requested. Dump: Name of program-bank: F0 00 20 0D
31 F7 bank: bank-number (0..63) name: name of program bank, ASCII, 3 chars. If the dump message (31) is sent to a device, the device will: - create a new bank in it's memory if the bank does not yet exist. A NAK-message will be sent if creation fails. - rename an existing bank to given new name. - remove an existing bank from memory if is blank. This is possible for empty banks only. A NAK-message will be sent if remove operation fails. It is allowed to send multiple banknames to a device by con- catenating multiple data sets into one message. Note: In the current implementation, this item works for Matrix-Banks (0..63) only! 32 - List of existing Matrix Program Banks Dump Request: F0 00 20 0D XX 00 72 F7 Using "All Device"-ID in a multi-device system will cause each device to send it's bank-list, resulting in transmission of N messages in a system of N devices. Dump of bank-list: F0 00 20 0D
32 [ ...] F7 bank: bank-number (0..63) Gives information, which program banks are existing in a device's memory. This message is just a reply to (72); it is not usable to create new banks (use item 31)! 33 - FORNET Address Map Dump Request: F0 00 20 0D XX 00 73 F7 Using "All Device"-ID in a multi-device system will cause each device to send it's address map, resulting in transmission of N messages in a system of N devices. Dump of FORNET Address Map: F0 00 20 0D
33 <#adr> <#ports> ... F7 #adr = Number of FORNET addresses which are used by the device. #ports= Number of MIDI I/O-pairs of the device. portad= FORNET addresses of MIDI-I/Os, one byte for each existing pair (IN/OUT) of MIDI-ports. 34 - FORNET System message Dump Request: not supported Generate FORNET System Message: F0 00 20 0D XX 34 [ ...] F7 Sends a FORNET broadcast message ((Hd) F5 sys-opcode data) to the FORNET system. This message will be available to all devices of the system, even if is not $7F. However, must be either $7F or a valid device-ID in order to proper work on this message. See FORNET documentation for details. 35 - FORNET inquiry message Reply to FORNET inqiry: F0 00 20 0D
35 [...] F7 This is a reply to the inquiry message ($75). The device which has sent the reply is specified by the field, not by the field! Multiple reply messages (of different devices) are possible for a single inquiry. Generate FORNET Inquiry Message: F0 00 20 0D XX 75 [ ...] F7 len = number of following data bytes (inq-opcode + data) Sends a FORNET broadcast message: (Hd) F5 08 [ ...] This message will be sent to all devices of the system, even if is not $7F. However, must be either $7F or a valid device-ID in order to proper work on this message. System replies are sent to MIDI (message $35). See FORNET documentation for details. Special Opcodes --------------- 38/39 - Examine MIDI connections Port Address Inquiry (causes transmission of Port.Addr.Id): F0 00 20 0D 7F 7F 00 78 F7 (for all outputs) F0 00 20 0D 7F 7F 00 79 F7 (for one output) Port Address Identification: F0 00 20 0D
00 38 F7 Used to detect, to which IN/OUT a device (e.g. a computer with editor-program) is connected. 3A - Set MIDI output for communication via MIDI SysEx: F0 00 20 0D 7F 7F 00 3A F7 By default, the output-address for SysEx-response is equal to the input-address where SysEx requests or data have been received (e.g. dump-request at input 3 causes dump at output 3). This message re-directs SysEx-output to another port. To release a fixed response-output, must be 255. The whole release-message is therefore: F0 00 20 0D 7F 7F 40 3A 01 40 7F 1B F7 7F - Acknowledge F0 00 20 0D
00 7F F7 Sent after reception of each data packet (if handshaking is enabled). ID,DT: same values as received in the data packet which has to be acknowledged. 7D - Cancel F0 00 20 0D
00 7D F7 Used to abort a transmission. Regarding Port-Numbers ( or ): --------------------------------------- A port-number is given as the FORNET-address of this particular port (valid range: 0..255). A stand-alone device without FORNET interface has it's Base-Address always set to 0. Therefore the port address ranges of those devices are fixed: PMM-88E, MP-88: 0 to 7 MT-16X without Player: 0 to 15 with Player-option: 0 to 7 (I/O 1 to 8), 64 to 71 (I/O 9 to 16). Format of MIDI-processors (Processor data of matrix programs): ============================================================== General Structure: Proc.-type, I/O-number, [Channel] [P0..Pn = parameters] Proc.-type is the type of MIDI data processor (Routing, Filter, Keyboard Split etc.). An even number as processor type specifies processing parameters for a MIDI-input, an odd number specifies a MIDI-output processor. Routing-parameters are always given as input-processing (the connected output is given as parameter). The following table specifies the code of the MIDI-processors (hex) and their length in program data field: 0 Routing length = 5 00H Input Channel: 80=omni, 0N=channel N Output Channel: 80=orig, 0N=channel N 2/3 note-events filter length = 3 Removes MIDI-events with statusbytes 8n/9n/An. Channel: 00=omni, 8N=ch.N 4/5 channel event filter length = 3 Removes specified event from datastream. Channel: value of bits 6,5,4 = 0-6 means Statusbyte 8n-En bits 0..3 = channel number If MSB is clear: omni (bits 0..3 =0) 8/9 filter Note Off messages length = 3 A/B filter even/odd notes length = 4 Removes events (8n/9n/An) if first MIDI-databyte has an even or odd value. (device allows applying this filter for MIDI OUTs only) Channel: 00=omni, 8N=ch.N P0: LSB = 1: remove even notes LSB = 0: remove odd notes C/D filter lower notes length = 4 Removes events (8n/9n/An) if value of first MIDI-databyte (=note-number) is less than (P0) Channel: 00=omni, 8N=ch.N P0: note number E/F filter higher notes length = 4 Removes events (8n/9n/An) if value of first MIDI-databyte (=note-number) is greater than (P0) Channel: 00=omni, 8N=ch.N P0: note number 10/11 filter specified note length = 4 Removes events (8n/9n/An) if value of first MIDI-databyte (=note-number) is equal to (P0) Channel: 00=omni, 8N=ch.N P0: note number 16/17 controller-filter length = 4 Removes event (Bn) if value of first MIDI-databyte (=controller number) is equal to (P0). Channel: 30=omni, BN=ch.N P0: controller number 18/19 real-time filter length = 2 Removes events (F8) to (FF). (incl. active sensing filter) 1A/1B active sensing filter length = 2 Removes event (FE) 1C/1D sys ex filter length = 2 Removes System Exclusive messages (F0 dd dd ...). 1E/1F sys common filter length = 2 Removes Events (F1 to F6). 20/21 Transpose length = 4 Adds transpose value to each first MIDI-databyte of note-events (Statusbyte = 8n/9n/An). Channel: 00=omni, 8N=ch.N, CN= omni-ch.N P0: transpose value (2th-compl.) Valid range of P0: -64..+63 = C0H .. 3FH 22 Split length = 7 Adds an offset to the left zone channel of note-events (SB: 8n/9n/An). The value of this offset depends on the current split- zone of the event (from low to high: +0/+1/+2/+3). Channel: 00=omni, 8N=ch.N P0: channel of left split-zone, (if MSB =1: keep original channel) P1..P3: three split points (give four split zones, a split point is the lowest note of it's zone) 24/25 Velocity proc. length = 8 Computes a new value for the second MIDI data byte of note events. The received value is used as an input-parameter for this function. Channel: bit 7: = 0 for omni, bits 0..3 must be 0 = 1 for channel given by bits 0..3 bits 6..4 = 001 for Note-On velocity, = 000 for Note-Off velocity, = 010 would result in changing of polypressure-data (An). (just 001 is used!) P0: Position of processor, forces to place multiple velocity processors in a defined order. This is important, because the output value of one prc. may be used as input value of a another one to get more complex functions. Valid range of this byte is 0..7, processors are placed in ascending order. P1: Threshold, cuts the range of input values into two parts: values below and values above Thrsh. Valid range: 0..127 P2: Gradient of the velocity function for input values below the threshold value. Range: -128..+127 = -16 ..+15.875 P3: Gradient of the velocity function for input values above the threshold value. Range: -128..+127 = -16 ..+15.875 P4: Offset to add to the output value. Range: -128..+127 26/27 Contrl.Reassign length = 5 Maps one controller-number (NN of msg. Bn NN VV) into another controller number. Channel: 00=omni, BN=ch.N, P0: source contrl.number P1: destination contrl.number 28 store bank-sel.val. length = 4 When a bank select message (MIDI event: Controller 0) is received, this processor stores the second data byte. This is used in connection with the "Remote Program Chg." (Processor 2A) to select another program bank. The given default bank number is used if there is a Program Change without any preceding Bank Select message. Channel: BN=ch.N, omni: n.a. P0: default bank-# (for 2A) 2A Remote Prog.Chg. length = 4 Generates an internal Program Change if a MIDI Program Change message (Cn pp) is received. Channel: CN=ch.N, omni:n.a. P0: 0..7F: number of bank to switch to. 80..88: group number to work on - the selected bank will not change. >88: bank is given by processor #28. 2C/2D Play Wave length = 6 Plays Waveprogram of given bank, triggered by Note event. The note number is used as program number for selection. (available only on Multiplayer devices) Channel: 8N=ch.N, omni is not supported P0: Wave-bank (WVA..WVH =$68..$6F) P1: lowest note of key window to work on P2: highest note of key window to work on 61 Progr.Changer 6 Sends a Bank Select message and a Program Change message. (Bn 00 bh 20 bl Cn pp) Channel: 0N=ch.N P0: Ctrl.0 value (bh) P1: Ctrl.32 value (bl) P2 prg.chg. number to send (pp) 63 Progr.Changer 4 Sends a Program Change message (Cn pp) Channel: 0N=ch.N P0: prg.chg. number to send (pp) 69 Volume Controller 4 Sends a Volume Control message (Bn 07 vv). Channel: 0N=ch.N P0: volume value to send (vv) 6F Send Data x Sends given data to MIDI OUT. no channel is given! P0,P1: length(L,H) and data to send 70 Call Another Program 4 Calls up another internal program after activation of program that contains this data. I/O-number has no meaning and should be 0 (dummy) no channel-byte! P0 = bank number P1 = program number