MMC and System Exclusive The following information explains how to use SYSX messages to further enhance your automated studio, and control even the most stubborn recording device. The MMC protocol allows very specific control of many features of remote recording equipment. Unfortunately, many MMC commands are not that user friendly, requiring intensive bit manipulations to phrase a command correctly. Not all devices support all commands, so if a command doesn't seem to produce the desired effect, it may just be that the command is not implemented. Consult the device's MIDI implementation chart or contact the manufacturer to determine the availability of specific commands. All SYSX messages in this document are specified in hexadecimal, except for lower-case symbolic place holders. Other numbers are in decimal, unless preceeded by a lower-case "x" (as in "x4C"). If you have difficulty manipulating hexadecimal numbers, try using the Calculator application provided with Windows. (You must select the "View Scientific" option.) This allows you to convert decimal numbers to/from hexadecimal, as well as perform mathematical and logical operations in either base. You can send commands individually from within Cakewalk's SYSX view, or insert a SYSX event into one of your MIDI tracks to trigger commands at specific times during playback or record. You may wish to put MMC command events into their own track so that you can easily mute the track and disable all MMC commands. Stop: F0 7F 7F 06 01 F7 Play: F0 7F 7F 06 03 F7 Fast Forward: F0 7F 7F 06 04 F7 Rewind: F0 7F 7F 06 05 F7 Pause: F0 7F 7F 06 09 F7 Eject: F0 7F 7F 06 0A F7 Punch-In*: F0 7F 7F 06 06 F7 Punch-Out*: F0 7F 7F 06 07 F7 (*The deck must already be playing with some armed tracks for these commands to work.) If your equipment supports the MMC "Event" command, you can use Cakewalk's automated punch-in record mode instead, for more precise operation. Locating the deck to specific times on the tape is a bit trickier. The SYSX commands to do this contain the SMPTE time to locate, with other bits set to indicate the frame rate in which the time is specified. So whenever a new locate point is desired, the SYSX bank would have to be editted to contain the proper time: Locate: F0 7F 7F 06 44 06 01 hr mn sc fr ff F7 hr = hours(0-23 or x00-x17) + Frame Rate: + x00=24 frame, x20=25, x40=30D, x60=30ND mn = minutes, (0-59 or x00-x3B) sc = seconds, (0-59 or x00-x3B) fr = frames, (0-29 or x00-x1D) ff = subframes (0-99 or x00-x63) eg: "Locate 1:05:45:03.67 (30ND)" (hh mm ss fr ff = 61 05 1D 03 43) Send: F0 7F 7F 06 44 06 01 61 05 1D 03 43 F7 eg: "Locate 1:05:45:03.67 (24)" (hh mm ss fr ff = 01 05 1D 03 43) Send: F0 7F 7F 06 44 06 01 01 05 1D 03 43 F7 eg: "Locate 1:02:03:04.05 (25)" (hh mm ss fr ff = 21 02 03 04 05) Send: F0 7F 7F 06 44 06 01 21 02 03 04 05 F7 Arming tracks is also a bit tricky. The SYSX message must be edited to contain the list of tracks to be enabled or disabled. The basic format of the Record Ready command is as follows: Record Ready: F0 7F 7F 06 40 len1 4F len2 tb... F7 len1 = number of bytes starting at the x4F, up to (but not including) the xF7. len2 = number of bytes in tb... (not including len2) tb... = track bitmap. The length of the track bitmap depends on how many tracks are involved. 0 tracks: 0 bytes. 1 or 2 tracks: 1 byte. 3-9 tracks: 2 bytes. 10-16 tracks: 3 bytes. (add 1 additional byte per each 7 tracks) Each track is assigned a bit in the track bitmap. To set a track, you must know both the byte in which the track's bit lives, and also the bit corresponding to that track: Track 1: byte 1 + x20 Track 2: byte 1 + x40 Track 3: byte 2 + x01 Track 4: byte 2 + x02 Track 5: byte 2 + x04 Track 6: byte 2 + x08 Track 7: byte 2 + x10 Track 8: byte 2 + x20 Track 9: byte 2 + x40 Track 10: byte 3 + x01 Track 11: byte 3 + x02 Track 12: byte 3 + x04 Track 13: byte 3 + x08 Track 14: byte 3 + x10 Track 15: byte 3 + x20 Track 16: byte 3 + x40 etc. eg: Record Ready Tracks 1, 3, 5, 11, 12, 13, and 16: (byte 1) = (track 1) = x20 (byte 2) = (tracks 3 + 5) = x01 + x04 = x05 (byte 3) = (tracks 11 + 12 + 13 + 16) = x02 + x04 + x08 + x40 = x4C Send: F0 7F 7F 06 40 05 4F 03 20 05 4C F7 None (all safe): F0 7F 7F 06 40 02 4F 00 F7 Record Ready 1: F0 7F 7F 06 40 03 4F 01 20 F7 Record Ready 1 & 2: F0 7F 7F 06 40 03 4F 01 60 F7 Record Ready 3: F0 7F 7F 06 40 04 4F 02 00 01 F7 Record Ready 1-8: F0 7F 7F 06 40 04 4F 02 60 3F F7 Record Ready 5 & 6: F0 7F 7F 06 40 04 4F 02 00 0C F7 Although the MMC specification states that it is only necessary to transmit as many bytes as would be required for the highest non-zero track bit, some equipment requires that the track bitmap always be the same size, to match the physical number of tracks on the machine. If you get unexpected results with your higher tracks, try sending explicit 0 bits for all physical tracks. Assuming an 8-track tape recorder, the above examples would instead be: None (all safe): F0 7F 7F 06 40 04 4F 02 00 00 F7 Record Ready 1: F0 7F 7F 06 40 04 4F 02 20 00 F7 Record Ready 1 & 2: F0 7F 7F 06 40 04 4F 02 60 00 F7 Record Ready 3: F0 7F 7F 06 40 04 4F 02 00 01 F7 Record Ready 1-8: F0 7F 7F 06 40 04 4F 02 60 3F F7 To mute tracks, the command format is the same, except that you must replace the x4F byte with a x62. Commands that follow this format are: Track Record Ready: x4F Track Sync Monitor: x52 Track Input Monitor: x53 Track Mute: x62