Mapping Note Length to Velocity in Custom Expression Maps

Yeah, that was a leftover from an earlier test :slight_smile: transpose doesn’t work at all by me, so…

Yes, you’re right, the Transpose data isn’t being sent either (so it didn’t make any difference).

So, @dspreadbury, I need to update my claim. It now seems that when Note Length Conditions are being used, neither the Velocity nor the Transpose set in the Expression Map is making it to the VST. However, setting the Channel and CC work correctly.

Here are my new tests, using the same format as before.

Setting the Channel in the Expression Map works fine; this produces |CCCCCCCCCCCCCCCC|DDDDDDDD|EEEE|FF|G|.

Setting the Transpose in the Expression Map does not work; this produces |CCCCCCCCCCCCCCCC|CCCCCCCC|CCCC|CC|C|.

Setting the Velocity in the Expression Map does not work; this produces |CCCCCCCCCCCCCCCC|CCCCCCCC|CCCC|CC|C|.

Setting the CC11 in the Expression Map works fine; this produces |cccccccccccccccc|cccccccc|CCCC|CC|C!|.

I don’t really understand how the Secondary Dynamics work, so I’m not confident in testing them. Perhaps someone else could do this.

(FWIW, I also tested the Secondary Dynamics - no difference)

In my tests with Note Length Condition entries in my Expression Map, I find that the velocity information does get sent successfully. (In my case to a VSL instrument in a VEPro Instance). However, changing the transpose setting in the Expression Map does not work for those entries, but does work for my custom Playing Techniques. This might be a bug?
Latest version of Dorico.

The Velocity Data are indeed generated as expected and communicated to the VST - but upon playback these Velocity data (as seen in the key editor) are being ignored and replaced by some default value… (?!?)

@Grainger2001, this surprises me. I don’t have VSL, but have tested this setup (Note Length Condition trigging Velocity choices) on 5 VSTs and can’t get it to work on any of them. Would you mind uploading a file with your Expression Map so that I may have a look?

I can’t seem to attach a .doricolib file. Please send me a private message with your email address and I will email it to you. Unless there is a way to attach a .doricolib file to a post?

you could ZIP it…

Perfect - Thank you!
-NLC Velocity (4.1 KB)

Thank you, @Grainger2001. Are you sure this was the Expression Map you were testing Velocity with? From what I can see, it is only sending CC11 data to the VST, not Velocity. This is what was in your Expression Map.

You’ll need to set the Volume dynamic control to Note velocity to test my claim with VSL.


Also, for anyone who is looking to test this on their own, you don’t need to set Velocity = 101, 102, 103, 104, 105. I’m using these values with the VST setup above so I can detect (through the VST’s Velocity filtering, and then transposing) which Velocities are making it through. You could equally set Velocity = 14, 38, 64, 90, 114 in combination with a VST instrument that reacts to Velocity (which in many cases will be a simple change in volume) and listen for any differences that way.

Yes, this was the Expression Map I tested. I use CC11 to send velocity information to the VSL VI Player. I was just showing that it was sending the set velocity information to the VST because if I had the min and max set to 100, then my VI Player was indeed showing a fixed velocity of 100. Selecting ‘Note Velocity’ as the volume dynamic and restricting the min and max to 100 did not send any velocity information, just as you are experiencing. Certainly PT’s such as Staccato send velocity information to the VST’s, but it does seem that the NLC entries do not if Note Velocity is chosen as the controller. If a CC is chosen as the driver of the velocity, then they do work.
I’m not sure if any of this information is useful to you, or if this is expected behavior. I would think that NLC’s should send velocity information, but in all my Expression Maps, I drive the velocities for NLC entries with a CC.

I’m sorry, @Grainger2001, I’m having a little difficulty decoding what you’ve written.

I use CC11 to send velocity information to the VSL VI Player.

By this, do you mean either of the following?
(a) VSL VI Player uses CC11 to determine which sample to play, so setting CC11 as the volume driver is all I need to achieve the volume I want.
(b) When I set CC11 as the volume driver, the default Velocity value of 100 is sent to VSL VI Player, hence proving that at least some Velocity data is making it to VSL VI Player.

If either of these is true, this doesn’t mean that you’re able to successfully send Velocity information which is determined by Note Length Condition to VSL VI Player, which was your claim from a few posts up. I wonder if you mean something else?

You then go on to say.

I was just showing that it was sending the set velocity information to the VST

What do you mean by “the set velocity”? Do you mean the default Velocity of 100 that Dorico uses when CC is the volume driver? Or do you mean a Velocity level that you’ve been able to set yourself some other way? If the latter, how did you set it?

Finally, you say.

If a CC is chosen as the driver of the velocity, then they do work.

Possibly, you’ve misinterpreted my debugging setup as the actual Expression Map I am trying to create, and you’re telling me that I have another option if my goal is to trigger different samples loaded up in different slots of the VST.

If that’s the case, then no, I’m aiming for something much simpler. I’m working with a VST that simply uses Velocity to trigger its samples, in such a way that low Velocity triggers a short sample and high Velocity triggers a long sample, which is why I want my Expression Map to control the Velocity via Note Length. Something like this is what I’m aiming for.


Dorico has no problem calculating these Velocities from the Expression Map, with some internal variation.

But when I send this to any VST, I only hear samples triggered at L1’s Velocity range. In this example, the VST is playing back fine for L1, but at Velocity=25 for the rest of the passage.

Yes, the second one, - it sends the value I put in the EM, not a Dorico default. This is where I think our wires are crossed…the velocity being sent is from the EM, not anything in the score.

Well it does…look at the Expression Map I sent you. Each entry had a specific velocity max and min, and those values were sent through to the VSL VI player via CC11. Therefore the short note length condition sent one value through, and medium, another etc.
This is obviously not any use to you, and I don’t want to keep going around in circles, so I don’t think I can offer anything else of value, but just out of interest, which VST are you trying to use with this method?

@Grainger2001, perhaps we can continue this conversation through private messaging. I think we need to sort out our terminology regarding “Volume” and “Velocity”. :slight_smile:

@dspreadbury, through some more investigations, I’ve been able to further narrow down the issue. To my surprise, the order of entry of the Base Switches is affecting the Velocity sent to the VST.

Consider, again, this passage.

I’m using HALion Sonic 7 with GM001 Acoustic GrandPiano in Channel 1 as my VST. Nothing fancy.

With this Expression Map, which I’ll call EM A,


the whole passage is very quiet. Specifically, the notes in Bar 1 are correct, but notes in Bars 2, 3, 4, and 5 are playing at Velocity=25.

Now with this Expression Map, which I’ll call EM B, which is identical to EM A except that the L5 Base Switch was entered first,


the whole passage is very loud. Specifically, the note in Bar 5 is correct, but the notes in Bars 1, 2, 3, and 4 are playing at Velocity=103.

Finally, with this Expression Map, which I’ll call EM C, which is identical to both EM A and EM B except that the L3 Base Switch was entered first,


the whole passage is medium in volume. Specifically, Bars 1 and 2 play at Velocity=52, Bar 3 plays correctly, and Bars 4 and 5 play at Velcoity=76.

So it seems that the Velocity range from the first entered Base Switch is also applying to the other Base Switches.

This gave me an idea for a workaround. This Expression Map, which I’ll call EM D,


gives the required behaviour; all of the correct Velocities are making it through to the VST, because the Velocity range from the first entered Base Switch, L0, is not affecting the Velocities in L1, L2, L3, L4, and L5.

Here is my Dorico file if anyone else wants to hear this without building the Expression Maps themselves. However, you won’t be able to see any difference between EM A, EM B and EM C, because the Base Switches are always listed in name order, not order of entry, so you’ll have to believe me that I constructed these in the method described above.

Mapping Note Length to Velocity in Custom Expression Maps.dorico (511.7 KB)

1 Like

Interesting discovery. I just tried it on my own project and you are right. The switch L0 in your example has to be created/configured first (removing it later, and re-adding it again after the other switches have been created does not restore correct behavior.)

If you ask me (don’t) this cannot be intended behavior. It could be a bug introduced after Dorico 3.5.1 or it could of course also be a nasty side effect of some added, not yet finalized functionality. We shall see…

Hi Robert,

I’m just looking at this now - would you be able to confirm for me that the problem doesn’t occur for exported MIDI? I just want to make sure that I’m looking at the same thing as you.


That’s correct, @Richard_Lanyon. The exported MIDI from these four Expression Maps produces identical results.

The exported Audio, however, produces the same incorrect results, just as with Playback.

Great - I’ve logged this for someone to look at. (Though I don’t know when that will be.)

Thank you! FYI, Daniel already said he was going to look into this (the first reply to my original post, before I really understood what the issue was). I’m just mentioning this to prevent any doubling-up of investigations on your end.

Anyway, I have a workaround now, (see EM D above for anyone reading this in the future), so this problem won’t hold me up anymore. :slight_smile:

Yep, don’t worry, it was Daniel who asked me to take a look!