The latest version of Decent Sampler (1.0.11) has experimental support for legato. In this post, I go over what has been implemented and also ask for some feedback from instrument creators.
I’ve based my implementation on SFZ, with some notable differences. In fact, what I’m doing (with tags) is a little different from any other sampler I’ve seen, and I want to make sure that I’m not inviting more problems than I’m solving.
Voice Muting (SFZ vs Decent Sampler)
Before we get into legato, let’s talk about voice muting. This is the behavior wherein one set of samples causes another set of samples to stop playing. This can be desirable in situations where two samples should not be sounding at the same time.
Here’s how voice-muting works in SFZ:
- A sample creator will assign a
groupnumber to a sample or a group of samples.
- They will they specify an
off_byis the number of the group that should silence the current group.
For example, you might have all of your hi-hats with
group=1 and then have them also be self-muting by adding
off_by=1. Since both of these are set to the same number, if you trigger any samples in that group it will stop any other samples that might always be playing.
The way I have implemented these in Decent Sampler is slightly different. In a previous release of the sampler, I introduced the concept of tags. These are text labels that you can use to identify samples or groups of samples. Right now, voice muting works using those same tags. You can add a
silencedByTags attribute to groups or sample elements. This consists of a comma-separated list of tags. When a sample with a tag matching one of the tags in the
silencedByTags is played, it will silence the current sample (or group). Here’s an example:
<DecentSampler> <groups> <group tags="hihat" silencedByTags="hihat" silencingMode="fast"> <!-- Your samples go here. --> </group> </groups> </DecentSampler>
silencingMode attribute as well (a value of “fast” means we immediately silence, whereas “normal” means we trigger the ADSR release phase).
So there are really two changes from SFZ here (other than the naming differences, of course). The first change is that we are using tags instead of numbers. The second change is that each sample can potentially be silenced by more than one tag. This sounds useful to me, but is it? Would love to get some feedback on this.
Legato is handled exactly like SFZ. There is a
trigger attribute that can be added to the group or samples tag. The default value is
attack, but there are two useful new values:
first: This value means that this sample will only trigger if no other notes are playing
legato: This value means that this sample will only trigger if other notes are already playing
It’s sometimes useful to limit polyphony for a specific sample or set of samples. SFZ allows you to specify this at group, local, or global levels. I’ve once again taken a different approach and I’ve again made it tag-based. At the top-level of your file, you can specify a
<tags> element as follows:
<DecentSampler> <groups> <group tags="some-tag" > <!-- ... --> </group> </groups> <tags> <tag name="some-tag" polyphony="1" /> </tags> </DecentSampler>
I would love to get some feedback from the sample developer community as to whether the direction I’ve taken with this is the right one. Does this tag-based approach seem like a reasonable system? Or should I simply adopt the SFZ way of doing things?