MIDI Sample Dump Standard

Contents

  1. Introduction
  2. Sample Dump Formats
    - Format: Dump Header

    - Format: Data Packet
  3. Sample Dump Messages
    - Message: Dump Request

    - Handshaking Messages
  4. Dump Procedure: Master (dump source)
  5. Dump Procedure: Slave (dump destination)
  6. Loop Point Extension
    - Format: Loop Point Transmit

    - Message: Loop Point Request
  7. Overview

1. Introduction

The MIDI SDS was adopted in January 1986 by the MIDI Manufacturers Association and the Japanese MIDI Standards Committee.

The SDS defines the standard method for transfer of sound sample data between MIDI-equipped devices. Sample dumps may be accomplished with either an open loop or closed loop system>

The open loop method simply involves the straight dump of all sample data from its source to the destination, with no timeouts, packet acknowledgements, or any other form of handshaking, much as in the manner of a sysex bulk dump, usually intiated at the source.

The closed loop method allows the use of handshaking messages between the dump source and destination, and usually places the dump process under the control of the slave, to allow it time to process the incoming data as necessary.

As with any standard, it can not be assumed that a device adheres to it unless the accompanying documentation specifically indicates it. Even then, it is best to check its conformity with non-critical data.

top


2. Sample Dump Formats

Format: Dump Header

F0 7E cc 01 ss ss ee ff ff ff gg gg gg hh hh hh ii ii ii jj F7

where

cc = channel number
ss ss = sample number (LSB first)
ee = sample format (number of significant bits; 8->28)
ff ff ff = sample period (1/sample rate) in nanoseconds (LSB first)
gg gg gg = sample length, in words
hh hh hh = sustain loop start point (word number) (LSB first)
ii ii ii = sustain loop end point (word number) (LSB first)
jj = loop type (00:forwards only; 01:alternating; F7:loop off)

Format: Data Packet

F0 7E cc 02 kk <120 bytes> mm F7

where

cc = channel number
kk = running packet count (00->7F)
mm = checksum (XOR of 7E, cc, 02, kk <120 bytes>)

The total size of a data packet is 127 bytes. This is to avoid overflow of the MIDI input buffer of a device that may want to receive an entire packet before processing it.

A data packet consists of its own header, a packet number, 120 bytes of data, a checksum, and an EOX. The packet number begins at 00 and increments with each new packet. It resets to 00 after it reaches 7F, and continues counting. The packet number is used by the receiver to distinguish between a new data packet, or a resend of a previous packet. The packet number is followed by 120 bytes of data, which form 60, 40, or 30 words (MSB first for multiword samples), depending on the length of a single data sample.

Each data byte hold seven bits, with the msb in each byte set to 0, in order to conform to the requirements of MIDI data transmission. Information is left justified within the 7-bit bytes, and unused bits are filled with 0.

Example: Assume a data point in the memory of a 16-bit sampler, with the value 87E5. In binary, that would be

1000 0111 1110 0101

and would be encoded as the following MIDI data stream:

01000011 01111001 00100000

The checksum is the running XOR of all the data after the SYSEX byte, up to but not including the checksum itself.

top


3. Sample Dump Messages

Message: Dump Request

F0 7E cc 03 ss ss F7

where

cc = channel number
ss ss = sample number requested (LSB first)

Upon receiving the request, the sampler checks the sample number to see if it is within legal range. If it is not, the request is ignored. If it is, the sample dump is started. One packet at a time is sent, under control of the handshaking messages outlined below.

See also: Dump Header and Data Packet.

Messages: Handshaking Messages

For all below:

cc = channel number
pp = packet number

Packet numbers are included in the handshaking messages to accomodate machines that have the intelligence to re-transmit specific packets after an entire dump is finished, or if synchronization is lost.

ACK : F0 7E cc 7F pp F7

Means last packet was recieved correctly (checksum OK, etc), please send next one. Packet number is packet being acknowledged as correct.

NAK : F0 7E cc 7E pp F7

Means last packet not received correctly, please send again. Packet number is packet being rejected.

CANCEL : F0 7E cc 7D pp F7

Means abort dump immediately. Packet number is packet on which abort occurs.

WAIT : F0 7E cc 7C pp F7

Means pause dump indefinitely, until next message is sent. Allows the unit recieving the dump to perform other functions (disk access, etc), before receiving the remainder of the dump. The next message it sends (eg ACK, ABORT) will determine if the dump continues or aborts.

top


4. Dump Procedure: Master (dump source)

Once a dump has been requested, either via MIDI or through the front panel, the DUMP HEADER is sent. After sending the header, the master must time out for at least two seconds, to allow the receiver to decide if it will accept this sample (has enough memory, etc).

If it receives a CANCEL, within this time, it should abort immediately. If it receives an ACK, it will start sending packets immediately. If it receives a WAIT, it pauses until another message is received, and then processes that mesage normally. If nothing is recieved within the timeout, an open loop is assumed, and the dump starts with the first packet.

After sending each packet, the master should time out for at least 20 milliseconds and watch its MIDI In. If an ACK is received, it sends the next packet immediately. If it receives an NAK, and the packet number matches the number of the last packet sent, it resend that packet If the packet numbers don't match, and the device is incapable of sending packets out of order, the NAK will be ignored.

If a WAIT is received, the master should watch its MIDI In port indefinitely for another ACK, NAK, or CANCEL message, which it should then process normally.

If no messages are received within 20 milliseconds of the transmission of a packet, the master may assume an open loop configuration, and send the next packet.

This process continues until there are less than 121 data bytes to send. The final packet will still consist of 120n bytes, regardless of how many significant bytes actually remain, and the unused bytes will be filled with zeroes. The receiver should handshake after receiving the last packet.

top


5. Dump Procedure: Slave (dump destination)

When receiving a sample dump, a device should keep a running checksum during reception. If its checksum matches the checksum in the data packet, it will send an ACK and wait for the next packet. If it does not match, it will send an NAK containing the number of the packet that caused the error, and wait for the next packet. If, after sending an NAK, the packet number of the next packet doesn't match the previous packet number (the one that was NAK'd), and the unit is not capable of accepting packets out of order, the error is ignored and the dump continues as if the checksums had matched.

If a receiver runs out of memory before the dump is completed, it should send a CANCEL to stop the dump.

top


6. Loop Point Extension

Two messages were added to the SDS later. These were Loop Point Transmit and Loop Point Request.

Thanks to these you don't have to resend the whole sample if you want to change the loop settings! It is also possible to send/receive multiple loop points (up to 16384).

Format: Loop Point Transmit

F0 7E cc 05 01 ss ss ll ll jj hh hh hh ii ii ii F7

where

cc = channel number
ss ss = sample number (LSB first)
ll ll = loop number (LSB first;
loop number 00 00 is the sustain loop;
7F 7F is 'delete all loops')
jj = loop type (00:forwards only; 01:alternating; 7F:loop off)
hh hh hh = loop start point (word number) (LSB first)
ii ii ii = loop end point (word number) (LSB first)

The number of loops supported might vary from device to device but loop number 0000 will always be supported as this is the sustain loop.

Sending this message with loop number 7F7F will cause all loops to be deleted (might not be supported by all devices).

Message: Loop Point Request

F0 7E cc 05 02 ss ss ll ll F7

where

cc = channel number
ss ss = sample number (LSB first)
ll ll = loop number (LSB first)

Sending this message to a device will cause the device to send a Loop Point Transmit.

top


7. SDS Overview

SAMPLE DUMP DATA FORMAT: DUMP HEADER

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: Header
Sample Number (2 bytes, LSB first)
Sample Format
Sample Period (3 bytes, LSB first)
Sample Length (3 bytes, LSB first)
Sustain Loop Start Point (3 bytes, LSB first) Sustain Loop End Point (3 bytes, LSB first) Loop Type

Eox

 

SAMPLE DUMP DATA FORMAT: DATA PACKET

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: Data Packet
Packet Number
Sample Data (120 bytes)
Checksum

Eox

 

SAMPLE DUMP MESSAGES: DUMP REQUEST

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: Dump Request
Sample Number (2 bytes, LSB first)

Eox

 

SAMPLE DUMP MESSAGES: HANDSHAKING FLAGS

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: ACK or NAK or CANCEL or WAIT
Packet Number

Eox

 

SAMPLE DUMP LOOP FORMAT: LOOP POINT TRANSMIT

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: Loop Point Transmit (2 bytes)
Sample Number (2 bytes, LSB first) Loop Number (2 bytes, LSB first) Loop Type
Loop Start Point (3 bytes, LSB first) Loop End Point (3 bytes, LSB first)

Eox

 

SAMPLE DUMP LOOP MESSAGE: LOOP POINT REQUEST

Sysex

ID: Universal Non-Real Time
Channel Number
Sub ID: Loop Point Request (2 bytes)
Sample Number (2 bytes, LSB first) Loop Number (2 bytes, LSB first)

Eox

top