Bassmidi incorrect Chorus effect behavior on Drum channels in GS mode

Started by Falcosoft,

Falcosoft

Hi Ian,
I think we have discussed somewhat previously the changes in newer Bassmidi versions regarding the Chorus effect disabling on drum channels.

Spesek has made a deep investigation and found the following problems:
https://www.vogons.org/viewtopic.php?p=1406273#p1406273

For me the moral of the story is the following:

1. The current version of BassMidi incorrectly applies chorus effect disabling on drum channels when it meets a simple GS reset since the original SC-55 does not apply such disabling. The 1st Roland device that applies such disabling is the SC-88 but there are separate SC-88 mode reset messages for SC-88 and above devices.
So I think that by receiving a simple GS reset Bassmidi should not do this since it will kill compatibility with SC-55 moreover also with legacy Creative SB HW SF2 synths that also do not do this.
Another argument why this is a bad default for Bassmidi in GS mode: end users can simply disable chorus effect on drum channels if they want but the opposite is not true with current Bassmidi versions.

2. What's more with this new behavior Bassmidi cannot gain full compatibility even with newer Sound Canvas devices (SC-88 and beyond) since it missed to implement chorus settings on individual drum keys.

The above problems can be tested with Nuked SC-55 as well as with Roland's Sound Canvas VA. Nuked SC-55 clearly shows that chorus is never disabled even on drum channels while on SC-VA chorus is not disabled in SC-55 mode, or in any other modes when SC-55 drum map is selected.

Thanks in advance.   



Ian @ un4seen

BASSMIDI does support per-drum chorus levels, but it resets all per-drum settings to defaults upon a program change. The "2. Paradise ~ Deep Mountain (ZUN).mid" file in the linked post has a program=30 event after the drum key 40 chorus level NRPN, so that's why the chorus level gets reset back to 0. Checking with Roland VSC, it seems to be doing the same, ie. there's no chorus on drum key 40 unless I remove the program=30 event. Do you see something different happening in your tests?

Yamaha XG also resets per-drum settings upon a program change, so I figure it's standard behaviour, which makes sense because different programs may have different defaults for each key.

Roland VSC also resets per-drum settings upon a GS reset sysex. Are you seeing something different in this case too, and if so, are you seeing them reset to different values or not reset at all?

Falcosoft

Hi Ian,
I think you missed the point. The most important thing is that a real SC-55 does NOT disable chorus effect after a GS reset on drum channels. You can simply use CC#93 controller messages to set any level of chorus just like on melodic channels. Only SC-88 and higher do disable chorus effect after a GS reset on drum channels.
But you should not presuppose that all GS files were written for SC-88(+).
It's quite the contrary. Midi files written for SC-88(+) more often than not contain SC-88 specific mode set messages instead of/together with classic GS reset messaages. So a simple GS reset is more likely an indicator of SC-55 and not SC-88 or higher.
Overall I do not think that Bassmidi does the right thing when it sets all drum keys to 0 chorus level send after a GS reset (thus effectively disabling chorus effect on drum channels). Bassmidi only should do this when it gets an SC-88 mode set message.
 
Moreover I do not think you should use Roland VSC as a reference point. It has never meant to be an accurate emulator.
So for SC-55 testing I suggest trying Nuked SC-55 instead that is really an accurate SC-55 emulator:
https://github.com/nukeykt/Nuked-SC55

For SC-88 and higher Roland SC-VA is more accurate than Roland VSC but it's not so accurate as Nuked SC-55.

Back to your answer:
I think you are right and according to my tests even SC-VA sets per-drum settings to defaults after a program change in SC-88(+) modes.

@Edit:
Spesek's response:
"Indeed it looks like I overlooked that... But the chorus issue from the th19 MIDI still applies. I just checked again with SC-VA and the chorus is noticeably applied to the snare 1 drum (and a pitch change). Neither are present in BASSMIDI's rendering."


Ian @ un4seen

Thanks for the Nuked SC-55 suggestion; very useful for testing. After some of that, here's an update that reverts the GS/GM default drum chorus levels to like before and adds a new GS_88 mode enabled by the "System Mode Set" sysex (41 xx 42 12 00 00 7F 00) that sets them to 0, which I think is what you were suggesting?

    www.un4seen.com/stuff/bassmidi.zip

The default drum userfx levels are also 127 again instead of 0 when not in GS_88 mode. Note the settings are still reset to defaults by a GS reset, just the default drum chorus/userfx levels are changed.

Regarding using sysex instead of NRPN for per-drum settings, that isn't currently supported because those sysex apply to drum maps (1 of 2) rather than MIDI channels. BASSMIDI has per-channel settings rather than drum maps. I suppose some way to have those sysex applied to all current drum channels may be possible.

Falcosoft

Hi,

QuoteThanks for the Nuked SC-55 suggestion; very useful for testing. After some of that, here's an update that reverts the GS/GM default drum chorus levels to like before and adds a new GS_88 mode enabled by the "System Mode Set" sysex (41 xx 42 12 00 00 7F 00) that sets them to 0, which I think is what you were suggesting?

Yes, I suggested exactly that.

I have made some quick tests and it seems everything is working perfectly regarding default settings for GS/SC-88 modes.

Thank you, I like these defaults much better!

Falcosoft

Regarding the Drum part chorus SysEx messages: I do think that these messages should be considered as global. That is they should be applied to all drum/percussion channels of Bassmidi.

Looking at some of these messsges in Spesek's example Midi file it seems they should be treated like that.


Ian @ un4seen

Good to hear the update is working well.

Regarding the GS drum sysex, I guess treating them as global settings that apply to all drum channels should be fine if only 1 drum map is used, but if 2 are used then it may sound wrong, ie. if a modified key is used in both drum maps. Have you seen (m)any MIDI files using both drum maps? Also, any suggestions on how to indicate when a per-drum event (eg. MIDI_EVENT_DRUM_CHORUS) is global? I'm currently thinking of having chan=-1 (0xffffffff) indicate that. Another option is to have HIWORD=1 in param do it, or add new events for them.

The equivalent XG sysex are also currently unsupported because they apply to drum maps rather than channels, but the proposed new "global" event option could be used to enable them too. The equivalent GM2 sysex are already supported, as they apply to channels rather than drum maps.

Ian @ un4seen

Here's something for you to try:

    www.un4seen.com/stuff/bassmidi.zip

Rather than making the GS drum sysex global, the parser remembers the drum map of each MIDI channel and sends the event to the channels that are currently set to use the sysex's drum map. Note this means the channels need to be set to use the drum map before it's modified. Channel 10 defaults to drum map 1, and most MIDI files just leave the drum maps at that, but in the few files that I found customising both the channel drum maps and the drum map keys, they did seem to set the channel drum maps first, so no problem. But I haven't checked a lot of files yet, so there may well be problematic ones. Let me know if you have any such files.

The equivalent XG sysex are also supported in the same way. The GS drum pitch sysex isn't currently supported because it has an absolute value instead of relative like the NRPN.

tharii314

I'm currently testing the latest demo version of BASSMIDI with both VirtualMIDISynth and the updated x64 version of Falcosoft Player. So far, things are working great on my end.

However, I did notice a slight increase in minimum possible envelope attack times. In particular, the filter envelopes feel a bit less snappy now. There seems to be a small attack present even when the attack value is set to zero in the relevant field of my soundfont editor.

I first noticed this while testing my "Sub Aqua" preset, which I roughly recreated from memory. For reference, the sound produced by the older x86 version of Falcosoft Player (the black screen version) still matches what I expect more closely.

For context, here is the sound I am referring to:
https://www.youtube.com/watch?v=tTHG1XxfSdg

Ian @ un4seen

Please confirm what BASSMIDI.DLL version you were using before. I suspect it's something older than 2.4.15 because that introduced auto-enabling/disabling of SB hardware limits emulation based on what software a soundfont is created with (ie. the emulation is disabled when a soundfont is created with modern software like Polyphone), and an extended filter range when that emulation is disabled, which I think could explain the difference you're hearing. SB limits can be forced on and off via the BASS_MIDI_FONT_SBLIMITS and BASS_MIDI_FONT_NOSBLIMITS flags. Does VirtualMIDISynth have an option for that? If so, try switching it on.

tharii314

There's some weird bug that hangs my touchpad with newer versions of BASS (not bassmidi) running with virtualmidisynth, so I'm stuck with VirtualMIDISynth ver 2.12.8, and in it there is no option to toggle the SB limits. Anyhow, I was able to successfully mount the all new test build version 2.4.15.16.

That "un-limited?" old version of bassmidi is from Falcosoft MIDI Player 5.8 and according to the file properties, it uses bassmidi version 2.4.13.0.

What my ears find "better" is of course the snappy attacks of the old version, but I find the filters of the new build more pleasing, dynamic and heavy-duty. In fact, [spoiler
] the old bassmidi can't quite reach the insane pitch envelope depth required by the roland starship sound effect, meanwhile the new bassmidi pulls it off easily.

My apologies if I reiterated things that were mentioned before if there are any. Also thank you very much for your time and consideration <3

Ian @ un4seen

Quote from: tharii314That "un-limited?" old version of bassmidi is from Falcosoft MIDI Player 5.8 and according to the file properties, it uses bassmidi version 2.4.13.0.

That older BASSMIDI version enabled the SB hardware limit emulation by default (with an option to disable it), so those limits are probably in effect in this case. And they're probably not in effect when you're using the latest BASSMIDI version.

Quote from: tharii314What my ears find "better" is of course the snappy attacks of the old version, but I find the filters of the new build more pleasing, dynamic and heavy-duty.

BASSMIDI 2.4.15 did also have a change in the modulation envelope attack shape to better match the SF2 spec's convex curve. There is an option (BASS_MIDI_FONT_LINATTMOD) to use a linear attack instead, which you could perhaps try. Do you know if VirtualMIDISynth has that option?

Falcosoft

Quote from: Ian @ un4seen
Quote from: tharii314That "un-limited?" old version of bassmidi is from Falcosoft MIDI Player 5.8 and according to the file properties, it uses bassmidi version 2.4.13.0.

That older BASSMIDI version enabled the SB hardware limit emulation by default (with an option to disable it), so those limits are probably in effect in this case. And they're probably not in effect when you're using the latest BASSMIDI version.

Quote from: tharii314What my ears find "better" is of course the snappy attacks of the old version, but I find the filters of the new build more pleasing, dynamic and heavy-duty.

BASSMIDI 2.4.15 did also have a change in the modulation envelope attack shape to better match the SF2 spec's convex curve. There is an option (BASS_MIDI_FONT_LINATTMOD) to use a linear attack instead, which you could perhaps try. Do you know if VirtualMIDISynth has that option?

I do not think that Coolsoft's VMS has any of these advanced options but OP should be able to test them with the help of my Midi Player's built in Bassmidi output mode. As I have already written before in my Vogons topic OP should do the following:
https://www.vogons.org/viewtopic.php?p=1406215#p1406215

The point is that Midi Player's BassMidiFontInitFlags should be set the following way to test what Ian suggested:
BASS_MIDI_FONT_SBLIMITS flag + BASS_MIDI_FONT_LINATTMOD flag. That is:
0x100000 + 0x2000000 = 0x2100000 (34603008 in decimal).

tharii314

Found the flags and I played with them. Introducing the SBLimits flag did wreck my starship, so that helped me identify that I didn't wreck my windows registry. However, none of those flags, i.e. sblimits, nosblimits, linattmod, and noramping, or combinations of them rectified that unwanted extended attack. :(

Falcosoft

Hi,
In the latest test version of Midi Player you can experiment easily with all the FontInitFlags:
https://falcosoft.hu/midiplayer_66_test.zip