Cubase 15 Expression Map unexpected behavior with CSS

Hi all,

Long story short, I upgraded Cubase from 13 to 15 (15.0.10 Build 164 (x64) Jan 20 2026) a couple of days ago to benefit from the promising new Expression Map system, but I’ve experienced some really weird behavior with CSS. Here is a hopefully reproductible streamlined user case. Feel free to play with the provided Cubase 15 project.

OK, so the project is comprised of the following:

  • 1 Rack with 1 instance of Kontakt 7 (7.10.9) loaded with 2 instances of ‘CSS 1st Violins’ (Cinematic Studio Strings 1.7.1). The 1st one is assigned to MIDI Channel 1, the 2nd to MIDI Channel 2. Both output to default ‘St 1’.

  • 2 notes: D4 (CSS articulation: Marcato no Legato) immediately followed by E4 (CSS Sustain + Basic Legato), with some constant Modulation (CC1) and Expression (CC11).

  • 1 custom Expression Map ‘CSS17 Violins DEBUG’ with 4 Sound Slots (only 3 are used here):

    • Long Sus’ and ‘Long Leg.’ triggering the 1st ‘CSS 1st Violins’ instance (see MIDI Modifiers Channel = 1).
    • Marcato’ and ‘Marcato Leg.’ triggering the 2nd ‘CSS 1st Violins’ instance (see MIDI Modifiers Channel = 2).

The harcoded MIDI Modifiers Channel are here to prevent the ‘Long’ (i.e. CSS Sustain) note from triggering before the end of the ‘Marcato‘ note, as all Sound Slots use some Attack Compensation.

In short, the Ouput Mapping of ‘Long Sus’ triggers CSS Sustain no Legato, ‘Long Leg.’ triggers CSS Sustain + Basic Legato. ‘Marcato’ triggers CSS Marcato (no legato), ‘Marcato Leg.’ triggers CSS Marcato + Legato.

The Expression Map is split into 2 Groups: ‘Main’ which includes ‘Long’ (i.e. CSS Sustain) and Marcato, ‘Legato’ which includes the optional CSS Basic Legato mode.

Now let’s see how this behaves by opening Kontakt MIDI Monitor (KSP button > Preset > Factory > Utilities > MIDI Monitor).

When you hit Play (Space key), the following MIDI Note On are sent to Kontakt in this order:

  • Lines 1 to 3: ‘CSS Marcato (no Legato)’ F#0,64 ; G#0,64 ; B0,64 at Channel 2 → OK :+1:
  • Line 4: note D4 → OK, CSS plays D4 at Channel 2 in ‘Marcato (no Legato)’. :+1:
  • Lines 5 to 7: ‘CSS Sustain + Basic Legato’ C0:64 ; G#0:127 ; B0:64 at Channel 1 → OK :+1:
  • Line 8: note E4 → OK, CSS plays E4 at Channel 1 in ‘Sustain + Legato’ mode. :+1:
  • Lines 9 to 11: ‘CSS Sustain (no Legato)’ C0:127 ; G#0:64 ; B0:64 → Err… WHAT?! :grimacing:

The last 3 lines make CSS flicker from ‘CSS Sustain + Basic Legato’ to ‘CSS Sustain no Legato’, and eventually play the note E4 in the latest ‘Sustain no Legato’ mode. You can add a note after E4 (with some overlap) to hear that CSS is playing them as a chord, i.e. without Legato.

I’m wondering what is causing that unwanted jump to ‘Sustain no Legato’? I thought this was due to the ‘Long Sus’ Sound Slot being tagged as ‘(Default)’, but nothing changes when another Sound Slot is used as ‘(Default)’.

Looking at the List Editor (MIDI > Open List Editor), we can see that the note E4 is located between its articulations (although at the same time), but Kontakt receives the information in the correct order, so that doesn’t seem to be the problem.

Well, can anyone reproduce this behavior? Maybe I’m using Expression Maps the wrong way? Or maybe this is already a reported bug? Please let me know, I’m a bit puzzled at the moment…
Cheers!

Cubase 15 Project (4.18 Mb)
Expression Map (17.3 Kb)

If you use two different groups of expressions you need to define the output of each combined slot.

There is a tool to generate these combined expressions automatically ExpressionMap Helper Tool

Thanks @Joshua_Reiners for your reply.

My Sound Slots are already combinations of both Groups:
Long Sus.’ outputs the combination of ‘CSS Sustain (no Legato)’ (C0:127 + G#0:64) + ‘No Sordino’ (B0:64).
Long Leg.’ outputs the combination of ‘CSS Sustain (Legato)’ (C0:64 + G#0:127) + ‘No Sordino’ (B0:64).
Marcato’ outputs the combination of ‘CSS Marcato (no Legato)’ (F#0:64 + G#0:64) + ‘No Sordino’ (B0:64).
Marcato Leg.’ outputs the combination of ‘CSS Marcato (Legato)’ (F#0:64, G#0:127) + ‘No Sordino’ (B0:64).

In the articulation lanes of the Key Editor:
.nat alone triggers ‘Long Sus.’
.nat & legato triggers ‘Long Leg.’
marcato alone triggers ‘Marcato’
marcato & legato triggers ‘Marcato Leg.’

This is highlighted in the Sound Slot header in the Key Editor:

As a result, the correct Sound Slot is automatically selected in the Inspector when I click on the individual notes D4 or E4.

The problem lies in Cubase apparently sending an extra ‘Long Sus.’ when playing the E4 as illustrated in the screencopy of Kontakt MIDI Monitor in the original post above.

Please correct me if I misunderstood your suggestion.

@Joshua_Reiners Also thanks for the link, I’ll definitely take a look at the ExpressionMap Helper Tool.

No you are right, you do have the combined slots, this was my fault, I didn’t recognize it yesterday.

I’ve opened your project now and it seems that I can’t reproduce the issue. This is what I get when hit play and I think lines 9-11 are correct here…

@Joshua_Reiners Thanks a lot for your feedback! Now that’s interesting. Just in case, I checked the Chase Events in Edit > Preferences… > MIDI, but everything looked fine to me.
So I tried this:

  1. I deleted the E4 and both ‘nat.’ and ‘legato’ articulations associated to it in the Key Editor, and wrote them back. It yielded the same results as yours, which is indeed the expected result! Now we’re going somewhere.
  2. I then reset the ‘legato’ articulation (clicked on its down arrow > Reset) and played again. Correct output (Long no legato).


3. Then I clicked again on the ‘legato’ arrow, selected ‘Legato’ to get it back and played again. That yielded the same buggy MIDI data as in my original post! :neutral_face:
4. I then reset the ‘nat.’ articulation (clicked on its down arrow > Reset) and played again. Correct output (marcato legato).


5. Then I clicked again on the ‘nat.’ arrow, selected ‘Long’ to get it back and played again. Correct output (Long Leg.). Yey! :grinning_face:

We might have a culprit here. Interestingly enough, whenever the state of an articulation is changed, the MIDI events are automatically re-ordered in the MIDI List Editor. Setting the ‘legato’ off then on puts it the back of the event list, separating the ‘nat.’ and ‘legato’ events with the E4 note. That might have something to do with it after all.

When you have a minute, could you be so kind to test the ‘legato’ and ‘nat.’ off then on (steps 2 to 5), in the very same order? This now looks very much like a bug in Cubase 15 to me.

Yes can confirm, the same thing happens on my end. After step 2 and 3 I had the weird buggy non legato output, and after step 4 and 5 it worked correctly again.

Thanks @Joshua_Reiners for helping get to the bottom of this!

Now would be the perfect time for Steinberg to step in and take a look at this nasty bug. @Martin.Jirsak perhaps? The apparent reordering of unseparable MIDI events might actually be the root cause of many other weird behaviors in Cubase 15.0.10.

Hi,

I’m sorry, I tried to reproduce the issue, but I’m afraid I don’t have enough information.

I inserted MIDI Monitor, but I don’t know what the expected result is or what the buggy result is.

Thank you @Martin.Jirsak for your reply.

Unfortunately, using the MIDI Monitor plugin as a MIDI Insert in the Inspector doesn’t seem to show enough information to debug the issue. Cubase hides a lot of details about the MIDI events it triggers, especially their order, for the sake of readability.

The List Editor seems to display more accurately the order the MIDI events are actually sent to Kontakt. But I’m afraid only through Kontakt’s own MIDI Monitor will you be able to monitor the actual MIDI stream sent by Cubase, as described above.

You really don’t need to load CSS in Kontakt, a simple instance of Kontakt with any VST loaded and its MIDI Monitor active is enough to observe the incoming event stream. Of course, loading CSS would show how it interprets the incoming stream, but the core issue is visible from Kontakt’s MIDI Monitor. The event stream gets *corrupted* depending on how the user edits the articulations in the Key Editor’s Articulation lane, that is.

image
Shot in the dark, but does this setting in midi chase events have any effect on this situation…….

Thanks @jpaesano for your suggestion.

That’s actually what I initially suspected might be the issue when I mentioned checking the Chase Events in Edit > Preferences… > MIDI, but unfortunately, it didn’t make a difference. Enabling or disabling chasing has no effect on the outcome.

From what I’ve observed, the unexpected triggering of a Sound Slot appears to be directly related to the order in which Grouped Articulations are edited in the Key Editor.

But thanks again for your insight, that could have been the origin of the issue. Please don’t hesitate to share any other ideas and even try them with the demo project file if you can.