VOGONS


About Roland Virtual Sound Canvas 3

Topic actions

Reply 281 of 353, by kitrinx

User metadata
Rank Newbie
Rank
Newbie
mattw wrote on 2020-12-16, 20:05:

So, SCC-1, SCB-55, SC-55/MKII are all using the exact same scrambling. BTW, have you looked at SC-88, I found the scrambling:

Re: About Roland Virtual Sound Canvas 3

but I haven't looked at the control rom at all.

Yes. In fact I think there is actually only two *real* sets of wave data that only has minor formatting changes to update the header or split differently onto rom chips. It seems All the "MKI" level things are interchangeable with different MKI control roms , and the SCB and MKII control roms are compatible with the SCB wave roms (if you tweak the banks to match the odd rom split). The rest is just tweaks to various preset or sample parameters throughout the versions.

I have not yet looked in detail at the SC-88. The control rom is in a significantly different format, and so I felt it's best to focus on one thing at a time.

Reply 282 of 353, by mattw

User metadata
Rank Member
Rank
Member
kitrinx wrote on 2020-12-16, 21:03:

I have not yet looked in detail at the SC-88. The control rom is in a significantly different format, and so I felt it's best to focus on one thing at a time.

ok, I think then I can look at it and try to locate (at least some of) the things you located in SC-55 control rom.

Reply 283 of 353, by kitrinx

User metadata
Rank Newbie
Rank
Newbie
mattw wrote on 2020-12-17, 13:58:

ok, I think then I can look at it and try to locate (at least some of) the things you located in SC-55 control rom.

From a cursory inspection I saw names present at 0x30000 but they seem to be a different size than sc55 presets, they might be just names or display data here or possibly sample/breakpoint data, then another table starts at 0x36100 which I think are around 0x60 bytes, then preset stuff around 0x40000 which are 0xB6 bytes or 0x14A bytes, it seems they vary perhaps based on the number of partials, 0x78000 the presets finally end and there is what looks like a collection of smaller tables for unknown things.

Edit:
Also I think 0x20000 is start of variations tables, 128 elements of 3 bytes each, 128 of them probably.
Drums start at 0x23DB0, about 0x38c bytes each. Note the name for drum tables is at the end of the record. This looks nearly identical to sc55.
0x2B6D0 something starts.. but not sure what, possibly sample related since I didn't see that obviously elsewhere.

Edit2:
Preset structure appears to be:

char name[12]
uint8_t header[22]
uint8_t partial0[148]
uint8_t partial1[148] // this may or may not exist.
Last edited by kitrinx on 2020-12-17, 15:39. Edited 1 time in total.

Reply 284 of 353, by mattw

User metadata
Rank Member
Rank
Member
kitrinx wrote on 2020-12-17, 15:15:

...unknown things.

yeah, it seem SC-88 control rom is quite different and I don't even know the CPU/uC type of SC-88. I was able to partially dissemble the SC-55 control rom:

Re: About Roland Virtual Sound Canvas 3

not that my Hitachi H8/532 assembler is any good... easiest to dissemble is the CM-32P control rom, because it uses Intel P8098, which essentially is Intel MCS-96 (80196) compatible Microcontroller. however, I still was not able to fully follow:

https://git.redump.net/mame/tree/src/mame/dri … oland_cm32p.cpp

In any way, I have no idea if CM-32P has any useful clues for SoundCanvas, as it's a previous generation.

Reply 285 of 353, by Alex-aut

User metadata
Rank Newbie
Rank
Newbie

@Mattw: I did the readout on SCC1 Control ROM, and yes, it is byte-exaclty the same as kitrinx SCC1A_R00128567_GS4-PRM_v4_(program).BIN.
Resoldering was successful, but i am not shure, to do such a hazard again 😀

Attachments

  • Filename
    SCC1_ContRom.zip
    File size
    52.64 KiB
    Downloads
    60 downloads
    File comment
    SCC1 Control Rom, same as V4 from kitrinx
    File license
    Fair use/fair dealing exception
  • SCC1-Resoldered.JPG
    Filename
    SCC1-Resoldered.JPG
    File size
    1.65 MiB
    Views
    778 views
    File comment
    Desoldered roms resoldered on SCC1
    File license
    Fair use/fair dealing exception

Reply 287 of 353, by mattw

User metadata
Rank Member
Rank
Member
Alex-aut wrote on 2020-12-17, 19:59:

Caps C51 C52 exploded on desoldering, but this will not be a problem

they are just bypass caps, it will work without them. It was unfortunate that the SCC dumps were shared at the same time you desoldered your roms.

Reply 288 of 353, by yawetaG

User metadata
Rank Oldbie
Rank
Oldbie
kitrinx wrote on 2020-12-16, 13:54:
yawetaG wrote on 2020-12-16, 07:42:

Some instrument samples have vibrato/tremolo/LFO-like effects by default, but it's internal to the sample (i.e. it was present in the sample when the sample was recorded).

This is not the case. Roland's samples were very, very short with lots of looping to save rom space. Most of them have no baked in LFO effects.

Okay. That's interesting (and different from some other Roland synths - but those may have better quality/larger samples).

There is definitely, without question, three independent LFO settings in each partial in the control rom. Most of them are usually not on for most instruments. Vibrato is used quite a lot, sometimes even when you would not expect it to, like a very low value for piano1. Please, go ahead and familiarize with the spreadsheet I posted a couple of pages back if you'd like to learn more about how the internals of the control rom are organized. I will say again that the numbers used for sysex really have no correlation at all to what is present as the base data for each *partial* of a preset, which can have up to two partials.

So each partial has a set of attributes associated with it that basically sets the default sound of a preset. AFAIK, it's similar on JV-80 etc. synths, and in those the rate(s) at which the user-controllable parameters affect the preset sound is basically baked into the preset. Although apparently Roland didn't ensure those rates were sane in all cases, as depending on the preset changing parameters to extreme values really mangles the sound (that's easier on the JV-series than on a Sound Canvas...).
I'm not too surprised by vibrato being present in a piano, it is, after all, a string instrument in a fashion...

One thing I did notice is that it appears to be impossible to edit a non-drum sound so it sounds like a drum sound on a Sound Canvas. Setting the release too short produces audible clicking and/or popping, while the attack clearly has a fixed minimum value for each sound (so shortest attack setting does not actually equal a very short attack with some presets).

I'll have a look at your table this weekend.

In addition to this there is also a short preset header which contains the overall attenuation, some note off/on flags, reverb and chorus send levels, master pan, and some other bits I'm unsure of.

Per partial or in general? Going by the settings you name the other bits could include portamento/portamento time (both get set for the whole synth at once), default aftertouch & velocity values, well, maybe just the default values for the channel messages the SC55 can recognize (because the things you mention are all from that).

The role of the values in the partials though is to shape the very compressed and flat sample into a nice sounding instrument.

...by providing template values for the LFOs, envelopes, etc.

Things like synth bass sound like just buzzing without these.

Somewhere it's too bad that the buzzy bare samples can only be accessed by extracting the ROM... 😜

Just a thought, but perhaps the relationship between editable values/sysex and the values in the ROM could be clarified by exploiting the (slightly hidden) user banks in the Sound Canvas - there's an option to save your modified presets on a Sound Canvas, accessible via sysex (and on the Sound Canvas-based keyboards via some handy buttons). There should be some logical connection between the values in the partials and those used to modify the presets from the user interface...with some luck modified presets are saved in a similar format as the base data.

Reply 289 of 353, by yawetaG

User metadata
Rank Oldbie
Rank
Oldbie
mattw wrote on 2020-12-16, 14:52:

@kitrinx

in VSC code (dissembled) the function that reads the structures of size 0xD8 is named GetToneNames(). So, I do believe what is described by those structures in Roland-terminology is called "tone". Also, that function calls another one named AssignVariation(). I have no idea what those "variation"-s are, but could it be another word for what you're calling "partials". I am really lost...

In Roland-speak, a variation is an alternate preset for a given location in the General MIDI list. So Piano in the SC55 tone map has two variations, Piano1w and Piano 1d. These are located at slightly different memory locations, accessible via MIDI using program change and CC00 values.

There are another 2 functions : GetRhythmSetNames(), that I cannot understand clearly from where it reads the names, but the name parsing is very close to how GetToneNames() parse the names. In any way GetRhythmSetNames() calls another function AssignVariationRhythm(), which is very simple - it checks if it's a drum ("0, 8, 16, 24, 25, 32, 40, 48, 56, 57, 58, 59, 60, 127") and if yes, extracts the VariationRhythm from some table, otherwise returns 255. So, do "drums" in Roland-terminology called "Rhythm"-s or "RhythmSet"-s.

Drums are one kind of rhythmic instruments 😀 Have a look at the drumset tables in the manual. You'll notice the leftmost drumset shows all of the drums, but the subsequent ones only show the instruments that are different. Those are your variations, identified internally by those numbers I've bolded. So that range (well, array) of numbers probably tells the function whether there is a VariationRhythm and which VariationRhythm to pick based on the selected drum set.

Kitrinx' explanation is better...

kitrinx wrote on 2020-12-16, 19:30:

The top level is a variation (bank). There are 128 variation banks numbering from 0 to 127. Variation 0 is the standard 128 GM instrument set. Higher banks have other instruments. In SC55 variation bank 127 is mt32.

Within each bank are up to 129 presets, with 128 being drums in soundfont terms. These are sometimes also called instruments or tones, but to avoid confusion, I use the same term as soundfonts "preset"

A small addition to this: In some synths by other manufacturers this hierarchy is swapped around. So you get presets (bank), each of which contains the variations. Which is confusing.

Reply 290 of 353, by kitrinx

User metadata
Rank Newbie
Rank
Newbie
yawetaG wrote on 2020-12-17, 23:14:
So each partial has a set of attributes associated with it that basically sets the default sound of a preset. AFAIK, it's simila […]
Show full quote

So each partial has a set of attributes associated with it that basically sets the default sound of a preset. AFAIK, it's similar on JV-80 etc. synths, and in those the rate(s) at which the user-controllable parameters affect the preset sound is basically baked into the preset. Although apparently Roland didn't ensure those rates were sane in all cases, as depending on the preset changing parameters to extreme values really mangles the sound (that's easier on the JV-series than on a Sound Canvas...).
I'm not too surprised by vibrato being present in a piano, it is, after all, a string instrument in a fashion...

One thing I did notice is that it appears to be impossible to edit a non-drum sound so it sounds like a drum sound on a Sound Canvas. Setting the release too short produces audible clicking and/or popping, while the attack clearly has a fixed minimum value for each sound (so shortest attack setting does not actually equal a very short attack with some presets).

I'll have a look at your table this weekend.

A preset has a 12 byte name, a header and two partials. Most of the time one partial is unused. Partials contain the majority of the parameters, including the envelopes, attenuation, pitch adjustment, pan, etc etc. The header has a few parameters that apply to both partials at once, but far fewer parameters than the partials have. The bytes I cant identify appear in pairs and seem to mostly apply to brass instruments.

Most drums have the flag for ignore note-off. It would be hard to have them work properly without this. They each have their own block of parameters similar to the preset headers as well. They're organized basically like a single preset with one instrument per key.

I have captured the sysex dump from he midi out on the sc55, but the block data doesn't really help much.

Reply 291 of 353, by yawetaG

User metadata
Rank Oldbie
Rank
Oldbie
kitrinx wrote on 2020-12-18, 04:08:

A preset has a 12 byte name, a header and two partials. Most of the time one partial is unused. Partials contain the majority of the parameters, including the envelopes, attenuation, pitch adjustment, pan, etc etc. The header has a few parameters that apply to both partials at once, but far fewer parameters than the partials have. The bytes I cant identify appear in pairs and seem to mostly apply to brass instruments.

Default auto-bend settings, for making those instruments more realistic, perhaps? Consists of a bend rate and bend depth pair. The parameter does not officially exist on Sound Canvasses, but does exist (and usually is editable) in almost all other Roland TVA/TVF-based romplers...

Most drums have the flag for ignore note-off. It would be hard to have them work properly without this. They each have their own block of parameters similar to the preset headers as well. They're organized basically like a single preset with one instrument per key.

That's because they are. On the synth keyboards that make use of the Sound Canvas engines you select a drum set by pushing a specific button to switch the part to drum mode, and then select one of the drum sets the same way you'd select a regular preset. Except for memory locations and much more limited editing and control options they behave exactly like a single regular preset from an user perspective.

Reply 292 of 353, by kitrinx

User metadata
Rank Newbie
Rank
Newbie
yawetaG wrote on 2020-12-18, 08:04:

Default auto-bend settings, for making those instruments more realistic, perhaps? Consists of a bend rate and bend depth pair. The parameter does not officially exist on Sound Canvasses, but does exist (and usually is editable) in almost all other Roland TVA/TVF-based romplers...

I'm not sure. It falls in a section that usually takes the form

ff ff ff ff ff ff 00 00 00 00 00 00

An entry with these mystery numbers would be

00 97 ff ff ff ff 3C 00 00 00 00 00

The second number is always 3c, the first is usually around 0x95
I thought it might be some kind of scale tuning or limiting, which Roland suggests should be in there somewhere. Also possibly exclusive classes. Changing these in the rom and using the altered rom on a real device showed no changes I could discern when testing.

Reply 293 of 353, by yawetaG

User metadata
Rank Oldbie
Rank
Oldbie

@kitrinx: Could you please expand your table so it also includes all variation presets?

I think the settings with index 11 and 12 are TVP LFO rate (vibrato rate) and TVP LFO delay (vibrato delay), and I also suspect the Sound Canvas range emulates instruments with a detuned component or other form of variable pitch by applying (delayed) vibrato.

Seems like transposing the keyboard on my JV35 (SC50 ROM) to its highest setting brings out some weird effects in some ostensibly simple waveform patches in the highest octave (sounds like delayed vibrato/modulation of part of the preset) that can't be heard in lower octaves. I've tried this with the Square, Saw, Dr. Solo presets. Also works with presets that have a high value for one of the TVP settings. Finally it sounds like a real synthesizer (especially when using the modulation/pitchbend joystick, completely crazy sounds) 😁

I've also checked how the preset settings I can change from the keyboard interface affect the preset sound. These settings ultimately correspond to the TONE MODIFY 1-8 settings in the sysex implementation, and all start at default value 0 (in range -63 to +63; 64 in range 0-127, 40 in hex) on the slider when I start modifying the presets. Yet moving a slider and then changing it back to zero does not change the preset, i.e. a default sysex setting always corresponds to the original preset, even if the preset has a different preset value for affected parameters.
e.g. preset has vibrato depth of 18? corresponding sysex setting is hex 40. vibrato depth 2? sysex setting is still 40. vibrato depth 5? Still 40. etc.
Like on the professional JV range changing parameters via sysex changes them relative to their preset settings...

Reply 294 of 353, by kitrinx

User metadata
Rank Newbie
Rank
Newbie
yawetaG wrote on 2020-12-20, 10:47:

@kitrinx: Could you please expand your table so it also includes all variation presets?

I think the settings with index 11 and 12 are TVP LFO rate (vibrato rate) and TVP LFO delay (vibrato delay), and I also suspect the Sound Canvas range emulates instruments with a detuned component or other form of variable pitch by applying (delayed) vibrato.

Most detuned instruments seem to do so by using a second partial along with the tvp or even the fine tuning having a different setting. There is also a parameter that seems to influence the pitch over time shift.
Vibrato Depth is index 10, TVF LFO is 38, and TVA LFO (Tremolo) is 68. These are things I have observed by altering the rom, so I am pretty sure those are correctly the depth for those 3 LFO's.

I will stress again, do not use sysex. They don't necessarily correspond with what the *control rom* does. They are *interpreted* parameters and could influence one or multiple things when used, and as such aren't reliable for really modifying things. To test these you should get yourself a cheap rom burner and an AT29C020 eeprom (new, since their headers can be locked if used) and modify these values to observe the effects.

This is a table of the raw data from presets, originally formatted by Cloudschatze at some time in the past. I've modified it a bit and relabeled some things as I've been working
https://docs.google.com/spreadsheets/d/1936Cg … dit?usp=sharing

This is my heatmap table which represents the preset data after the break table pointer. This is where the observed results of changing parameters in the control roms are mostly documented:
https://docs.google.com/spreadsheets/d/13LyKT … dit?usp=sharing

Unused presets use a set of "default" values (at least I consider them that way) which I base that heatmap around. It's formatted like that to make it easier to see patterns and correlations.

Here is the code I have written for the structures of these elements:

packed_struct ins_partial { // 92 bytes
uint8_t spacer1; // Always 0
uint8_t unknown1; // Has value, usually 0x40
uint16_t part_index; // Part table index, 0xFFFF for unused
uint8_t pp[88];// Unknown set of Part parameters
};

packed_struct preset{ // 204 bytes
char name[NAME_SZ];
uint8_t header[20]; // {7F, 10, 00, 3C, 4F, 01, 02?} // {FF?, FF?, FF, FF, FF, FF} // {00?, 00, 00, 00, 00, 00}
struct ins_partial parts[2];
};

packed_struct part { // 48 bytes
char name[NAME_SZ];
uint8_t breaks[16]; // Note breakpoints corresponding to sample addresses
uint16_t samples[16]; // Set of addresses to the sample table. 0 is default, and above corresponds to breakpoints
};

packed_struct sample { // 16 bytes
uint8_t volume; // Volume attenuation 7F to 0
uint8_t offset[3]; // Offset on vsc, bank + scrambled address on SC55. Bits above 20 are wave bank.
uint16_t attack_end; // boundry between attack and decay? Unconfirmed.
uint16_t sample_len; // Sample Size
uint16_t loop_len; // Loop point, used as sample_len - loop_len - 1
uint8_t loop_mode; // 2 if not a looping sound, 1 forward then back, 0 forward only.
uint8_t root_key; // Base pitch of the sample
uint16_t pitch; // Fine pitch adjustment, 2048 to 0. Positive increases pitch.
uint16_t fine_volume; // Always 0x400 on VSC, appears to be 1000ths of a decibel. Positive is higher volume.
};

packed_struct drum { //1164 bytes
uint16_t preset[128];
uint8_t volume[128];
uint8_t key[128];
uint8_t assignGroup[128];// AKA exclusive class
uint8_t panpot[128];
uint8_t reverb[128];
uint8_t chorus[128];
uint8_t flags[128];// 0x10 == responds to note on 0x01 responds to note_off
char name[NAME_SZ];
};

and here are the enumerations I use for instrument header and partial parameters:

enum partial_bytes {
pp_panpot = 5,
pp_course_pitch = 6, // Shifts the instrument key
pp_fine_pitch = 7,
pp_random_pitch = 8,
pp_note_range = 9,
pp_tvp_lfo_depth = 10,
pp_tvp_p1_level = 14,
pp_tvp_p2_level = 15,
pp_tvp_p3_level = 16,
pp_tvp_p4_level = 17,
pp_tvp_p5_level = 18,
pp_tvp_p1_len = 19,
pp_tvp_p2_len = 20,
pp_tvp_p3_len = 21,
pp_tvp_p4_len = 22,
pp_tvp_p5_len = 23,
pp_tvf_lfo_depth = 38,
pp_tvf_p1_level = 41,
pp_tvf_p2_level = 42,
pp_tvf_p3_level = 43,
pp_tvf_p4_level = 44,
pp_tvf_p5_level = 45,
pp_tvf_p1_len = 46,
pp_tvf_p2_len = 47,
pp_tvf_p3_len = 48,
pp_tvf_p4_len = 49,
pp_tvf_p5_len = 50,
pp_part_attenuation = 65,
pp_tva_lfo_depth = 68,
pp_tva_p1_vol = 70,
pp_tva_p2_vol = 71,
pp_tva_p3_vol = 72,
pp_tva_p4_vol = 73,
pp_tva_p1_len = 74,
pp_tva_p2_len = 75,
pp_tva_p3_len = 76,
pp_tva_p4_len = 77,
pp_tva_p5_len = 78,
};

enum inst_header_bytes {
ih_attenuation = 0,
ih_note_flags = 1,
ih_reverb = 3,
ih_chorus = 4,
ih_panpot = 5,
ih_partial_en = 6,
};

Reply 295 of 353, by Lord Nightmare

User metadata
Rank Newbie
Rank
Newbie

All of this TVF/TVA with "5 segments" stuff reminds me of the Roland S-5xx and S-7xx sampler formats, which used floppy disks, and I guess were an ancestor/co-developed evolution of this format stuff. S-550 was made in 1988, S-770 was 1989.

S-5xx IIRC has 8 segments each with a 'level' and 'rate' value, while S-7xx has fewer segments (I forget how many, the sysex document says how many) and I never really finished making a sysex->disk format table for S-7xx, the document is incomplete. The S-5xx document probably has errors but is largely complete.

S-5xx RE: https://nc.rysk.us/s/nKxiF33Wwx4dQiD
S-7xx RE: https://nc.rysk.us/s/g64kFwpNP32H64B
I last worked on those documents in 2018.

EDIT: fixed S-7xx link, oops.
LN

Last edited by Lord Nightmare on 2020-12-21, 08:23. Edited 1 time in total.

"When life gives you zombies... *CHA-CHIK* ...you make zombie-ade!"

Reply 296 of 353, by midiphile

User metadata
Rank Newbie
Rank
Newbie
mattw wrote on 2020-12-17, 15:31:

not that my Hitachi H8/532 assembler is any good... easiest to dissemble is the CM-32P control rom, because it uses Intel P8098, which essentially is Intel MCS-96 (80196) compatible Microcontroller.

Another Roland GS device from the SC-55 era that might be worth looking into is the JW-50. It's using the NEC V25+ CPU which uses Intel 80188 instructions and thus may be more familiar and have better tooling available. It doesn't have an embedded boot ROM like the H8 chips. The control ROM is on DBWBP and service notes are publicly available. On the other hand it would have a lot of peripheral code due to being a sequencer workstation.

Reply 297 of 353, by mattw

User metadata
Rank Member
Rank
Member
Lord Nightmare wrote on 2020-12-21, 05:55:

S-5xx RE: https://nc.rysk.us/s/nKxiF33Wwx4dQiD
S-7xx RE: https://nc.rysk.us/s/nKxiF33Wwx4dQiD
I last worked on those documents in 2018.

you posted the same document twice, I presume that's an unintended mistake. in any way those things are more complicated than i expected. so many parameters... last day, in my fight with 94B format is the same - there for "loop mode" they have totally cryptic to me things like "flip", "forward clip" and by far my favorite "fmaya" - what that last one is supposed to mean, i haven't the slightest idea.

midiphile wrote on 2020-12-21, 06:53:

Roland GS device from the SC-55 era that might be worth looking into is the JW-50.... The control ROM is on DBWBP....

thanks, there are no Waveroms there though...

Reply 298 of 353, by Lord Nightmare

User metadata
Rank Newbie
Rank
Newbie
mattw wrote on 2020-12-21, 08:14:
Lord Nightmare wrote on 2020-12-21, 05:55:

S-5xx RE: https://nc.rysk.us/s/nKxiF33Wwx4dQiD
S-7xx RE: https://nc.rysk.us/s/g64kFwpNP32H64B
I last worked on those documents in 2018.

you posted the same document twice, I presume that's an unintended mistake. in any way those things are more complicated than i expected. so many parameters... last day, in my fight with 94B format is the same - there for "loop mode" they have totally cryptic to me things like "flip", "forward clip" and by far my favorite "fmaya" - what that last one is supposed to mean, i haven't the slightest idea.

Whoops. fixed the link for S-7xx.

Flip i assume is flip-flop/ping-pong loop. forward-clip I guess starts playing(?) from the loop start point forward and doesn't play any of the wave before that even if it exists? (i.e. so a different patch can use a different section of the same wave, overlapping?)

LN

"When life gives you zombies... *CHA-CHIK* ...you make zombie-ade!"

Reply 299 of 353, by mattw

User metadata
Rank Member
Rank
Member
Lord Nightmare wrote on 2020-12-21, 08:25:

Flip i assume is flip-flop/ping-pong loop. forward-clip I guess starts playing(?) from the loop start point forward and doesn't play any of the wave before that even if it exists? (i.e. so a different patch can use a different section of the same wave, overlapping?)

it's something like that and i kind of demystified "fmAyA" - it's actually "fm4y4". so, 94B instrument definition could be either PCM(Wavetable) or FM. that means "fm4y4" whatever it exactly means, is the only "loop mode" available with FM instrument. maybe, someone familiar with FM synthesis can make a guess in deeper technical details. So, most interesting new information (at least to me) is that synth chip, which understand 94B format, are like Yamaha YMF278B (aka OPL4, even technically it's OPL3+Wavetable) and provide both FM and Wavetable synthesis at the same time.