After posing my question, I began investigation of a way to use the extra SN-U110-07 sounds with the CM-64 (although this applies to the CM-32P as well, I should think). I turned to Dr.T's MT-32 Editor/Librarian and captured some of its SysEx while programming patches to the temporary area. Then I compared it to the relevant SysEx section in the MT-32 manual, and later looked for similar PCM SysEx in the CM-64 manual. I cobbled this together from it, which worked in programming the CM-64's channel 11 to guitar harmonics with the SN-U110-07 card plugged in:
Code: Select all
F0 41 10 16 12 50 00 00 01 46 0C 42 06 00 7F 00 0F 40 40 40 07 07 07 07 07 19 3F 64 68 F7
So, amazingly, my first attempt had worked (guitar harmonics was a good choice to make it extra obvious), and I decided to move on to another, more versatile, method: mapping the 7 unusable SN-U110-07 patches to PC#11-17 (previously "A.GUITAR 1" to "SLAP 4") in the CM-64's (PCM) patch memory. That way panning, volume, etc. can be set separately using standard controllers and any combination of CM-64/CM-32P PCM channels (11-16) can be assigned to the card's patches. It took me a while notice in the CM-64 manual, that addressing is 7-bit, but realizing that made it easier.
Another main goal I was focused on was in being able to revert any patch mapping painlessly, and programatically, without resorting to the reset command (which resets the entire sound module, turns all notes off, etc.). Here's how I attempted to decode the SysEx commands:
F0 41 10 16 12 {base address} 01 {tone number} 0C 32 06 00 7F 00 01 0F 40 40 40 07 07 00 07 0F 00 {checksum} F7
01 == tone media (0..1==internal,card)
{tone number} (0..127==1 to 128, Electric Guitar card unusable 64 to 70 normally==0x40,0x41,0x42,0x43,0x44,0x45,0x46)
0C == key shift of 0 (0..24==-12 to 12, 12(0x0C)==0)
32 == fine tune of 0 (0..100==-50 to 50, 50(0x32)==0)
06 == bender range of 6 (0..12, 6==CENTER)
00 == key range lower (0..127==c1 to g9, 0==c1)
7F == key range upper (0..127==c1 to g9, 127(0x7F)==g9)
00 == assign mode (0..3==poly1,poly2,poly3,poly4, "assn mode" is defined in Dr.T's manual on page 66 and on page 45 all shown are 1 (0))
01 == reverb switch to on (0..1==off,on, 1==on)
0F == velocity sensitivity (0..15, 15(0x0F)=MAX)
40 == envelope attack rate of 64 (0..127, 64(0x40)==MID)
40 == envelope release rate of 64 (0..127, 64(0x40)==MID)
40 == lfo rate of 64 (0..127, 64(0x40)==MID)
07 == lfo auto delay time (0..15, 7==MID)
07 == lfo auto rise time (0..15, 7==MID)
00 == lfo auto depth (0..15, 0==MIN)
07 == lfo max rise time (0..15, 7==MID)
0F == lfo max depth (0..15, 15(0x0F)==MAX)
00,32 == detune depth (0..50, 25(0x19)==MID, Use the instrument definition?: If "DETUNE" then==50 (0x32), else==0). All the card patches need 0, see the CM-64 manual, page 32 (internal PCM sounds) to derive the reset DETUNE or not values. I think this "DETUNE or not" guess was incorrect in practice, but maybe not. It could have just been envelope or lfo settings.
But I just couldn't seem to get the reset commands to return to the exact same sound. That is, until I discovered that page 32 of the CM-64 manual gives an "Internal Tone list" that differs in numbering from the PC#, and also that if I sent less bytes (like, stopping at velocity sensitivity) I didn't have to guess at values for the envelopes, etc. when rewriting the original patches. Of course, there could be differences in the patches depending on the PC# they're mapped to because of the trailing values left behind, but I've only tried them at these PC#s, and the SN-U110-07 patches sound correct to me there. It's also noteworthy that any SysEx command that changes a PC# mapping, must be followed by a program change message (to the PC#) before the patch will actually be loaded and may be heard.
These are what I finally came up with:
Code: Select all
F0 41 10 16 12 51 01 3E 01 40 0C 32 06 00 7F 00 01 6B F7
Sets pc#11 to <program id="128" name="DSG FB 7 (2Ptl) (Forte & Feedback (Harmonics, Slow))"/>
Code: Select all
F0 41 10 16 12 51 01 51 01 41 0C 32 06 00 7F 00 01 57 F7
Sets pc#12 to <program id="129" name="DSG FB 8 (2Ptl) (Forte & Feedback (Fundamental, Slow))"/>
Code: Select all
F0 41 10 16 12 51 01 64 01 42 0C 32 06 00 7F 00 01 43 F7
Sets pc#13 to <program id="130" name="DSG FB 9 (2Ptl) (Forte & Feedback (2nd Harmonics, Slow))"/>
Code: Select all
F0 41 10 16 12 51 01 77 01 43 0C 32 06 00 7F 00 01 2F F7
Sets pc#14 to <program id="131" name="DSG FB 10 (2Ptl) (Forte & Feedback (3rd Harmonics, Slow))"/>
Code: Select all
F0 41 10 16 12 51 02 0A 01 44 0C 32 06 00 7F 00 01 1A F7
Sets pc#15 to <program id="132" name="DSG FB 11 (2Ptl) (Forte & Feedback (4th Harmonics, Slow))"/>
Code: Select all
F0 41 10 16 12 51 02 1D 01 45 0C 32 06 00 7F 00 01 06 F7
Sets pc#16 to <program id="133" name="DSG FB 12 (2Ptl) (Forte & Feedback (5th Harmonics, Slow))"/>
Code: Select all
F0 41 10 16 12 51 02 30 01 46 0C 32 06 00 7F 00 01 72 F7
Sets pc#17 to <program id="134" name="PICKING HM (1Ptl) (Picking Harmonics)"/>
All Concatenated:
Code: Select all
F0 41 10 16 12 51 01 3E 01 40 0C 32 06 00 7F 00 01 6B F7 F0 41 10 16 12 51 01 51 01 41 0C 32 06 00 7F 00 01 57 F7 F0 41 10 16 12 51 01 64 01 42 0C 32 06 00 7F 00 01 43 F7 F0 41 10 16 12 51 01 77 01 43 0C 32 06 00 7F 00 01 2F F7 F0 41 10 16 12 51 02 0A 01 44 0C 32 06 00 7F 00 01 1A F7 F0 41 10 16 12 51 02 1D 01 45 0C 32 06 00 7F 00 01 06 F7 F0 41 10 16 12 51 02 30 01 46 0C 32 06 00 7F 00 01 72 F7
And to revert them:
Code: Select all
F0 41 10 16 12 51 01 3E 00 0F 0C 32 06 00 7F 00 01 1D F7
Sets pc#11 back to default 16==15==0x0F <program id="10" name="A.GUITAR 1 (1Ptl)"/>
Code: Select all
F0 41 10 16 12 51 01 51 00 11 0C 32 06 00 7F 00 01 08 F7
Sets pc#12 back to default 18==17==0x11 <program id="11" name="A.GUITAR 3 (2Ptl)"/>
Code: Select all
F0 41 10 16 12 51 01 64 00 12 0C 32 06 00 7F 00 01 74 F7
Sets pc#13 back to default 19==18==0x12 <program id="12" name="A.GUITAR 4 (2Ptl) (& -1 octave)"/>
Code: Select all
F0 41 10 16 12 51 01 77 00 14 0C 32 06 00 7F 00 01 5F F7
Sets pc#14 back to default 21==20==0x14 <program id="13" name="E.GUITAR 1 (1Ptl) (Mute/Non-mute)"/>
Code: Select all
F0 41 10 16 12 51 02 0A 00 15 0C 32 06 00 7F 00 01 4A F7
Sets pc#15 back to default 22==21==0x15 <program id="14" name="E.GUITAR 2 (1Ptl) (Mute)"/>
Code: Select all
F0 41 10 16 12 51 02 1D 00 1A 0C 32 06 00 7F 00 01 32 F7
Sets pc#16 back to default 27==26==0x1A <program id="15" name="SLAP 3 (1Ptl) (Thump/pull, H>F#4)"/>
Code: Select all
F0 41 10 16 12 51 02 30 00 1B 0C 32 06 00 7F 00 01 1E F7
Sets pc#17 back to default 28==27==0x1B <program id="16" name="SLAP 4 (2Ptl) (Thump/pull, H>F#4)"/>
All Concatenated:
Code: Select all
F0 41 10 16 12 51 01 3E 00 0F 0C 32 06 00 7F 00 01 1D F7 F0 41 10 16 12 51 01 51 00 11 0C 32 06 00 7F 00 01 08 F7 F0 41 10 16 12 51 01 64 00 12 0C 32 06 00 7F 00 01 74 F7 F0 41 10 16 12 51 01 77 00 14 0C 32 06 00 7F 00 01 5F F7 F0 41 10 16 12 51 02 0A 00 15 0C 32 06 00 7F 00 01 4A F7 F0 41 10 16 12 51 02 1D 00 1A 0C 32 06 00 7F 00 01 32 F7 F0 41 10 16 12 51 02 30 00 1B 0C 32 06 00 7F 00 01 1E F7
Figuring that out felt great, but then I'd noticed (on page 32 of the CM-64 manual) that there are more internal PCM sounds than the 64 mapped to PC#s, so I decided to hear each of them at PC#17 (SLAP 4) and came up with these to perform my tests:
Code: Select all
F0 41 10 16 12 51 02 30 00 05 0C 32 06 00 7F 00 01 34 F7
0x05 A. Piano 6 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 07 0C 32 06 00 7F 00 01 32 F7
0x07 A. Piano 8 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 0B 0C 32 06 00 7F 00 01 2E F7
0x0B E. Piano 2 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 0D 0C 32 06 00 7F 00 01 2C F7
0x0D E. Piano 4 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 10 0C 32 06 00 7F 00 01 29 F7
0x10 A. Guitar 2 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 14 0C 32 06 00 7F 00 01 25 F7
0x14 A. Guitar 5 (V-SW)
Code: Select all
F0 41 10 16 12 51 02 30 00 16 0C 32 06 00 7F 00 01 23 F7
0x16 E. Guitar 3 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 17 0C 32 06 00 7F 00 01 22 F7
0x17 E. Guitar 4 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 18 0C 32 06 00 7F 00 01 21 F7
0x18 Slap 1 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 19 0C 32 06 00 7F 00 01 20 F7
0x19 Slap 2 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 1E 0C 32 06 00 7F 00 01 1B F7
0x1E Slap 7 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 1F 0C 32 06 00 7F 00 01 1A F7
0x1F Slap 8 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 29 0C 32 06 00 7F 00 01 10 F7
0x29 Fretless 2 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 33 0C 32 06 00 7F 00 01 06 F7
0x33 E. Organ 1 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 35 0C 32 06 00 7F 00 01 04 F7
0x35 E. Organ 3 (SINGLE) (Just like Old Time Radio Shows!)
Code: Select all
F0 41 10 16 12 51 02 30 00 37 0C 32 06 00 7F 00 01 02 F7
0x37 E. Organ 5 (SINGLE)
Code: Select all
F0 41 10 16 12 51 02 30 00 39 0C 32 06 00 7F 00 01 80 F7
0x39 E. Organ 7 (SINGLE) (Not working, still sounds like a slap bass; I suspect the 0x80 checksum is the cause)
Code: Select all
F0 41 10 16 12 51 02 30 00 39 0C 32 06 00 7F 00 01 0F 71 F7
0x39 E. Organ 7 (SINGLE) (Try 2: Extended it so not a 0x80 checksum. It worked!)
Code: Select all
F0 41 10 16 12 51 02 30 00 41 0C 32 06 00 7F 00 01 78 F7
0x41 Soft Tp 2 (DETUNE)
Code: Select all
F0 41 10 16 12 51 02 30 00 4C 0C 32 06 00 7F 00 01 6D F7
0x4C Sax 4 (DETUNE)
I also wrote a non-graphical GNU/Linux program that I used to perform the checksum calculations, but it has some UI bugs I want to fix before releasing it.
Finally, I'm delighted to report, probably to nobody's surprise, that the MT-32 in overflow mode, communicates perfectly with the CM-64. First, I tried loading a custom SysEx patch with the CM-64's IN port connected to the MT-32's OUT port, moved the CM-64's input to the MT-32's THRU, and played that patch, verifying that each sound module had been programmed properly. That's proof that SysEx is passed through the MT-32's OUT port when it's got "Overflow Assign" enabled. Next, I tested a file I've long suspected to run out of partials: EOX Studios' "CM-32L song" (downloadable in the description at
https://www.youtube.com/watch?v=xg_F7Zy_ygg). And monitoring just the CM-64's output, separately with an audio level meter, I could see certain partials being played through it, while the MT-32 played all the rest! Finally, it sounded like no notes were being dropped while the sound modules were mixed and set to the same audio volume. These tests passed, and should suffice, but so far I've been too lazy to create a real test file that would purposefully overflow partials while using all custom SysEx patches. Anyway, Rhizome's "Reply #38 on: August 09, 2009, 08:00:49 AM" (again at
https://web.archive.org/web/20140910135 ... 30286.html), assuming that TFX uploads custom patches, implies that they work in "Overflow Assign" too. I haven't tested making the CM-64 the overflowing module with the SysEx there from Cloudschatze yet either, but am confident it will work in the same way. The only reason I can think of for previously believing that the MT-32 and CM-64 were incompatible with "Overflow Assign", is that I may have been under the misapprehension that it applied to channel overflow (mysteriously remapping all channels above 10 to the second sound module).
Whew, sorry that's such a mountain of text. Enjoy!