Roland CM-64 tricks

Chat about anything related to the QuestStudios Archive, Classic PC Games, MIDI, Etc.

Moderator: Quest Studios Archive moderators

Post Reply
jaffa225man
Quest Studios Veteran
Quest Studios Veteran
Posts: 72
Joined: Mon Jul 13, 2015 6:26 pm

Roland CM-64 tricks

Post by jaffa225man » Thu Nov 23, 2017 1:11 am

I've created an initial Rosegarden studio definition for the Roland CM-64 with a separate fully-contained device for each PCM memory card permutation (Edited 2019-02-01 - Corrected SN-U110-02 Keymappings now that I own one and noticed missing percussion elements):
Rosegarden-Roland-CM-64.7z
(18.79 KiB) Downloaded 55 times
There's an undocumented SysEx command that was discovered by Cloudschatze in 2009 on the archive.org mirror of queststudios (https://web.archive.org/web/20140910135 ... 30286.html) that sets overflow assign on the CM-64 which I, luckily, stumbled upon recently! Cloudschatze's discovery was quite amazing, but would probably be more useful to me if I had a CM-32L or another CM-64. I don't think the MT-32 and CM-64 really work together that well. Or, perhaps I need to assign a '1' to each device, enabling it on both? Either that, or I have to send all instrument programming SysEx to each sound module prior to connecting to an OUT port for overflow. Too many questions, I really need to do more tests sometime...

Anyway, I also noticed in the Dr. T manual that the MT-32 modifies the patch bank to use memory patches since it's already allocated all 128 program change numbers to the built-in patches. This, along with my realization that one of the CM-64's cards (SN-U110-07 - Electric Guitar) can't be used with all of its patches (due to overrunning the 128 program limit), got me wondering if there exists SysEx to use higher numbered card patches in the CM-32P/CM-64. It probably is documented in the CM-64's (or CM-32P's) manual, but I have yet to gain much of a grasp on the address maps there.

If anyone has considered this before, please let me know.

Thanks,

Lucas
Last edited by jaffa225man on Sat Feb 02, 2019 12:14 am, edited 1 time in total.

jaffa225man
Quest Studios Veteran
Quest Studios Veteran
Posts: 72
Joined: Mon Jul 13, 2015 6:26 pm

Re: Roland CM-64 tricks

Post by jaffa225man » Tue Jun 26, 2018 10:42 pm

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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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) (&amp; -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!

jaffa225man
Quest Studios Veteran
Quest Studios Veteran
Posts: 72
Joined: Mon Jul 13, 2015 6:26 pm

Re: Roland CM-64 tricks

Post by jaffa225man » Thu Oct 11, 2018 2:14 am

Recently I noticed that Munt 2.3 adds a configuration option to set the number of partials! After trying it out with success, I was curious about how many partials generally overflow in the real hardware. To get meaningful output, I decided to put the CM-64 into overflow assign mode with the unofficial Cloudschatze SysEx and used the MT-32 as the overflowed-to module with its display (beyond the flashing "MIDI MESSAGE" LED of the CM-64 with it as the overflowed-to module). Only then did I notice the bug in this unofficial (perhaps for this reason) overflow mode... The last NewRisingSUn post (on the archive.org page linked to in my first post) described and solved it beautifully, though. Being on GNU/Linux I had to look for a compatible MIDI message mangler, and I chose QMidiRoute as I'd used it for other things. Now, it didn't have a filter type for "Note Off" messages, so I edited its source code and came up with a patch (and filter configuration file) that works nicely for this purpose. I've just finished submitting the patch to the developers, so I hope the functionality will be added eventually for everyone. Then I added this functionality to my custom MIDI device which works regardless of OS and I hope to release someday to the community.

Anyway, the MT-32 displays what are probably controller, pitch bend and SysEx messages on its "MIDI MESSAGE" LED (just like the CM-64), and parts are always set (and likewise custom patches are shown when loaded) and sometimes play (as you're used to seeing normally when it's the only or the overflowed-from module) by the part number(s) becoming a solid box. It does seem that a fair amount of compositions for the MT-32 do overflow partials at least somewhat. With Munt configured for 64 partials, I've seen it run out, but it gets too slow on the computer I compiled it on to test that out without stuttering. If I ever get another module in this family, I'll have to try three-module overflow, but I don't actually hear dropouts with the two I have. It's not surprising, but putting it in overflow assign mode, and sending both modules the MTGM SysEx reveals that much more partial overflows arise when General MIDI compositions are played, as they weren't being designed around these devices.

It is truly a joy to hear no dropouts (& sometimes a more full sound) on the sierra soundtracks I've become fond of. Of course, they're great either way. Thanks to Tom for capturing them (as I'm not too good at the games yet ;))!

I'm attaching the Overflow Assign enable and disable MIDI files I created from the SysEx described by Cloudschatze, and the fix described by NewRisingSun in the form of my QMidiRoute patch (I used debian's source for version 0.4.0, but it may apply to others) and configuration (.qmr) file:

Post Reply