Zerberus features & fixes needed for upcoming percussion library
While developing the new SFZ percussion library for MuseScore, I have run across a number of shortcomings in Zerberus that we will need to fix before we can release this library. Everything mentioned in this report can be tested using the attached project file. Instructions:
- Download the attached test file.
- Copy the .sfz file and sample folder to MuseScore's SoundFont directory.
- Load the test .mscz file into MuseScore.
- Go to "View" -> "Synthesizer" and click "Load from Score" to load the samples.
- Play the project. WARNING! The third test can get quite loud, so be ready to turn down the volume.
Here is what needs to be addressed:
Add Support for the Following Opcodes
delay= [0 to 100 seconds]
Description: Region delay time, in seconds. If a delay value is specified, the region playback will be postponed for the specified time. If the region receives a note-off message before delay time, the region won't play, unless the loop mode for the region is set to "one_shot". All envelope generators delay stage will start counting after region delay time.
Comments: This opcode is necessary to create a realistic ensemble effect out of solo samples.
pan= [-100 to 100]
Description: The panoramic position for the region, in percent. If a mono sample is used, pan value defines the position in the stereo image where the sample will be placed. When a stereo sample is used, the pan value defines the relative amplitude of one channel in respect to the other. A value of zero means centered, negative values move the panoramic to the left, positive to the right.
Comments: Stereo positioning is necessary for even the most basic sound design. I was surprised that Zerberus doesn't support this. In addition to "pan", the "width" and "position" opcodes should ideally be supported as well. More info regarding SFZ stereo positioning can be found here: http://www.drealm.info/sfz/plj-sfz.xhtml#stereo
offset= [0 to 4294967296]
Description: The offset used to play the sample, in sample units. The player will reproduce samples starting with the very first sample in the file, unless "offset" is specified. It will start playing the file at the "offset" sample in this case.
Comments: This opcode is needed for simulating release samples and section rolls.
group_volume= [-144 to 6 dB]
Description: The volume for the group, in dB.
Comments: This opcode is unique to the ARIA engine, but in my opinion should be implemented by other SFZ players as well. The "group_volume" opcode will adjust the volume of an entire group at once, which is especially useful in cases where the "volume" opcode is being used to adjust individual sample balance within the group. Here is a brief example to show why "group_volume" is desirable:
Observe the following SFZ code:
<group>
<region> sample=1.wav
<region> sample=2.wav
<region> sample=3.wav volume=-2
<region> sample=4.wav
You can see that sample "3.wav" has been attenuated by 2 dB. Now, let's say that I later determine that the entire group is too loud and I want to reduce the entire group -6 dB in volume. If I add the opcode "volume=-6" to , the actual result would be that samples 1,2 and 4 would now be playing at -6 dB, but sample 3 would still be playing at -2 dB, making it now louder than the rest of the group. I would have to manually change sample 3 to "volume=-8" to keep it 2 dB quieter than the rest of the group. In this example, such an adjustment is trivial, but in more complex groups, it can be a lot of work, especially if the SFZ author has to test different group attenuation values to find the right one.
This is why the "group_volume" opcode exists. If I use "group_volume=-6" in instead, then every sample is adjusted down 6 dB from where it is individually set to be. So, in this example, samples 1,2 and 4 would now be playing at -6 dB and sample 3 would be playing at -8 dB.
filters (fil_type=, cutoff=, etc.)
It appears that filters are currently not implemented at all in Zerberus. Adding support for filters (lowpass, highpass, 1 pole, 2 pole, etc.), filter envelopes and velocity tracking would be a nice addition that would allow us to create more realistic changes in an instrument's tone as the dynamic level changes. Without support for filters, quiet drum hits will sound identical to the loud hits, just quieter.
Bugs
For the bugs, I have created individual bug reports, linked here:
1. Bug #271719: zerberus: repeated release samples play louder and louder until everything is a distorted mess. If a "trigger=release" region is still playing when a second instance of the same region is triggered, the second instance will play louder than the first. If further instances continue to be triggered in a similar manner, subsequent samples will play progressively louder until you are left with a distorted mess.
2. Bug #271722: zerberus: long release samples do not play in their entirety. Release samples only play for about 3 seconds then quit.
3. Bug #271718: zerberus: frequent clicking noises when playing samples.
Attachment | Size |
---|---|
Zerberus_test_01.zip | 427.27 KB |
Comments
Chris, could you please specify the exact minimal (must have) and desired (nice to have) lists of filters you want to see in 2.3?
FYI, I've implemented offset, delay and pan in MuseScore, but the code in a state of pull request. I hope (realistically) to finish the development of opcodes by the end of next week and fixing the mentioned bugs by the end of the first week in June.
The following filters are needed for the new percussion library:
lpf_1p
lpf_2p
hpf_1p
hpf_2p
I am not using the resonance feature, and probably won't need to. Also, do you know if custom/alternate curves are supported in Zerberus? The README file wasn't clear on this.
Thank you for clarification. As I can see, `` tag is not supported.
Chris, I need test file with the mentioned filter opcodes required for percussion library. Could you please attach the .sfz and .mscz if possible?
Fixed in branch 2.3, commit 2c816de49e
fix #271723: support for opcodes required for percussion library
delay, pan (there is a bug - effects are applied despite on pan mixing
channels), offset, group_volume support
Fixed in branch 2.3, commit 87ee2302da
Merge pull request #3690 from anatoly-os/SfzOpcodesSupport23
fix #271723: support for opcodes required for percussion library
Fixed in branch master, commit 5c7c5f4148
fix #271723: support for opcodes required for percussion library
delay, pan (there is a bug - effects are applied despite on pan mixing
channels), offset, group_volume support
Fixed in branch master, commit 936b9307b8
Merge pull request #3676 from anatoly-os/OpcodesSfzImplementation
fix #271723: support for opcodes required for percussion library
Filters and bugs require more development and will be fixed in future PRs.
Chris, Daniel, I've added support for delay, pan, offset and group_volume. Could you please test it and verify?
Packages are:
Windows: https://ftp.osuosl.org/pub/musescore-nightlies/windows/MuseScoreNightly…
Linux: http://ftp.osuosl.org/pub/musescore-nightlies/linux/x86_64/MuseScoreNig…
Mac is coming soon.
In reply to Chris, I need test file with… by Anatoly-os
Attached is a test for the filter opcodes. Page 1 of the MuseScore file runs the tests through Zerberus, and page 2 plays reference recordings of the same tests rendered using Plogue Sforzando. Instructions for loading the samples are included at the top of page 1 in the MuseScore file.
It is not necessary that Zerberus be able to pass tests #5 (custom curve for filter velocity tracking) and #7 (filter resonance), but I wanted to test for those features in case they were added. They would be useful features to have for the future, but are not critical for the percussion library. The remaining tests should cover all of the filter functionality that will be needed for now.
Chris, is it really necessary (required) to support mentioned filters in 2.3?
In reply to Chris, is it really… by Anatoly-os
The cymbal line will sound very wrong if we don't. I have had to fake several missing samples for the cymbal line, and this fakery makes heavy use of the filters.
See https://github.com/musescore/MuseScore/pull/3709 (for 2.3) and https://github.com/musescore/MuseScore/pull/3708 (for master)
Fixed in branch master, commit 6c24484408
fix #271723: implement filters in Zerberus
Implement cutoff, fil_veltrack, fil_type (lpf_2p and hpf_2p).
Fixed in branch master, commit 1ad5ebf9b9
Merge pull request #3708 from anatoly-os/FilterOpcode30
fix #271723: implement filters (hpf_2p and lpf_2p) in Zerberus
Fixed in branch 2.3, commit b7ae0542ce
fix #271723: implement filters in Zerberus
Implement cutoff, fil_veltrack, fil_type (lpf_2p and hpf_2p).
Fixed in branch 2.3, commit d0d38d18db
Merge pull request #3709 from anatoly-os/FilterOpcodes23
fix #271723: implement filters (hpf_2p and lpf_2p) in Zerberus
More filters are going to be implemented, lpf_1p and hpf_1p in particular and maybe bpf_2p and brf_2p.
Fixed in branch 2.3, commit 72272425bd
fix #271723: implement filters in Zerberus
Implement bpf_2p, brf_2p, lpf_1p and hpf_1p filters.
Make refactoring: extract filter logic to separate class, make voice class simpler and easier. Optimize and fix code in applying filters.
Fixed in branch 2.3, commit a96e259a11
Merge pull request #3711 from anatoly-os/FiltersZerberus23
fix #271723: implement filters in Zerberus
Fixed in branch master, commit ebb5e9c15f
fix #271723: implement filters in Zerberus
Implement bpf_2p, brf_2p, lpf_1p and hpf_1p filters.
Make refactoring: extract filter logic to separate class, make voice class simpler and easier. Optimize and fix code in applying filters.
Fixed in branch master, commit 3fbae040e9
Merge pull request #3710 from anatoly-os/FiltersZerberus30
fix #271723: implement filters in Zerberus
Fixed in branch 2.3, commit 964c301d03
fix #271723: implement filters in Zerberus
Test for parsing new opcodes added
Actualized Zerberus readme file
Add reading bpf and brf filters.
Fixed in branch 2.3, commit 26036d0c64
Merge pull request #3713 from anatoly-os/CodeReviewFiltersZerberus23
fix #271723: implement filters in Zerberus
Fixed in branch master, commit 608e398484
fix #271723: implement filters in Zerberus
Test for parsing new opcodes added
Actualized Zerberus readme file
Add reading brf and bpf filter opcodes.
Fixed in branch master, commit 2c1837b9d6
Merge pull request #3714 from anatoly-os/CodeReviewFilters30
fix #271723: implement filters in Zerberus
Automatically closed -- issue fixed for 2 weeks with no activity.