The M models support two categories of data exchange: parameter-based and bulk-based. P.214/215 of the 'En_G0' data list manual documents these two categories:
1. (3-5-3) PARAMETER CHANGE
2. (3-5-4) BULK DUMP
3. (3-5-5) DUMP REQUEST
4. (3-5-6) PARAMETER REQUEST
PARAMETER CHANGE - this involves sending ONE SysEx Record to the instrument to change one value.
PARAMETER REQUEST - this results in receiving ONE SysEx Record from the instrument and contains one value.
The one value may be one or two bytes representing the actual/entire value of a parameter. Or it may be a single byte representing one piece/part of a parameter. For example, if the parameter is a name that can be 20 bytes long the value would be one character of that name. Specifically it will NOT be the entire name.
BULK DUMP - this involves sending MULTIPLE SysEx records to the instrument to change multiple values. The records sent ALWAYS include a 'bulk header' and a 'bulk footer'. Note - each data record will include a checksum byte.
DUMP REQUEST - this involves receiving MULTIPLE SysEx records from the instrument representing one or more parameters or sets of parameters. The one record sent in the request contains a 'bulk header' address. The records received ALWAYS include both a 'bulk header' and 'bulk footer'.
The below uses the LIVE SET USER BANK PAGE data block shown on P.220 of the manual. Notice the 'bulk header' and 'bulk footer' at the top and bottom of the block.
Using a (3-5-5) DUMP REQUEST you would specify the appropriate 4 bytes of the 'bulk header' address. Those are shown as '04 07 1b 0p' and '05 07 1b 1p'. A bulk header ALWAYS uses '04' as adr1 and a bulk footer uses '05'.
The 'b' in the adr3 of '1b' is used to specify the live set 'bank' (0-f) while the 'p' in the adr4 of '1p' is the live set page.
The data received will include records for ALL FIVE of the parameter types listed in that block in the doc. If you only want data for one of them you need to filter out the records you don't want.
A (3-5-4) DUMP REQUEST would be used to send data for one, or more, of the parameter types listed in that block to the instrument.
For example, to send 'Slot Audio File Path' data (the 4th param in the block) you would: send one 'bulk header' record ('04 07 1b 0p'), one audio-file-path record ('03 4p 0s 00') and one 'bulk footer' record ('05 07 1b 0p').
The audio-file-path record would be constructed using the format defined in that table as shown on p.229 and include a check sum byte.
NOTE: the table on p.229 appears to show only one item of size 256. But the '00' in the address '03 40 0s 00' only refers to the 1st byte. Similar to how the Live Set Slot Name table on the left side of the page is laid out.
So if you specify the '03 rp 0s 00' address in a parameter request you will only receive one byte. To get then entire table (which in this case is only one parameter) you must use a dump request and provide a bulk header and footer.
SUMMARY: use a parameter request to get the value of a single item and a parameter change request to change the value of a single item. Use a bulk request to received an entire set of records for a category and use a bulk dump to SEND one, or more, sets of records to the instrument.
In particular a dump request always returns an entire set of data wrapped by a bulk header and footer. But a bulk dump allows you to submit only the sets of data you wish to update. The data sets returned by the instrument iwll be in the order shown in the Data List. But the data sets you provide in a bulk dump can be in any order.
In this case the term BULK DUMP does NOT mean the instrument is dumping data to you but just the opposite.
Hopefully the above will help explain how the bulk data is organized.
Thanks for the useful post, Toby. A few things to add, which can be useful when dealing with Yamaha data.
When requesting a dump, do not assume that the data to be received from the synth will consist solely of the data described in the documentation, or you will run into trouble. Instead, look for addresses and data offsets in which you are interested, and interpret these according to your needs.
To send data back to the synth in a bulk dump, your data must match the format in which the synth sends it, rather than just assembling the data described in the documentation. If you don't know what some of the data means, just take it from the dump request and add it in the correct location in your bulk dump.
One prime example of this is the various Live Set dump types, which prepend the documented material with data from the 00 00 7F 00 table (SoundMondo Format Version). If you miss this, the synth will reject the data as invalid.
Thanks Toby, that was exactly what I needed.
Simon