Dorico 4 Fader Lag

I have updated to Version 4.0.10.1044 (Jan 28 2022). I noticed this really annoying fader lag problem in the original version 4 as well and it does not appear to be fixed in the latest update.

  • There appears to be a lag in the Play mode mixer window and the standalone mixer window. Moving faders in either window, the other took seconds to update.
  • Because this slow update, even one of them is closed, the faders are still slow to respond and any adjustment after the initial drag/release will delay subsequent adjustments.

Please see a recording here on youtube: youtube dot come / watch?v=800-3hZWss8

Seriously, how did this software get released?

The youtube video you appear to be referring to is located at
https://www.youtube.com/watch?v=2NLzC8nPK8s

It looks like you are a new user and I welcome you to the forum.

Does your work with music notation involve heavy usage of the faders? I am confused by the circumstances under which fader lag is so important as to make Dorico 4 of questionable utility to you. In any event, members of the Dorico team check every comment on this forum and are responsive to user’s needs to the extent possible within the constraints of time and team size and the relative priority of competing goals.

Thanks. I’m indeed a new user to Dorico. I heard many great things about Dorico on forums, blogs, Youtube, etc. I was really excited to use this to learn music composition as a hobbyist. I come from Cubase, which works quite well for me playing with virtual instruments and synth.

To my surprise, within a few weeks of using Dorico 4, I ran into multiple bugs. They are not some complex features. In my other post the bug was changing VST caused FX channel to disconnect (fixed in the latest update), but the other VST playback issue didn’t get fixed. As a reminder, VST is a big selling point of Dorico.

This fader lag is even more puzzling. Sure it’s a notation software, but again, the direction and the big revolutionary feature is how well it integrates with MIDI recording/playback and VST. And fader is such a basic functional unit of these.

I’m probably being harsher than I should. But as a software engineer myself, I despise such obvious issues in an expensive professional software from both a usability point of view and the technical aspect. How are these fader synchronizations implemented? The fact that it work in such a cumbersome way, makes me think there’s some really ugly underlying software code. These are the kind of technical debts that take a long time to payback and eventually engineers leave because the software is so crappy to work on. I as a customer just spent the money feels like I probably should have waited.

I am unable to comment on the programming/coding front but have had years of experience with Dorico’s main competitors (Sibelius and Finale) and find Dorico to be faster and more logical and, honestly, a real joy to use after becoming familiar with its somewhat differently focussed user interface. I hope and expect you will find the same but leave it to those more knowledgeable than myself to respond more completely to your concerns in the programming area.

As you are coming from Cubase which is quite different (like all DAWs), I recommend watching some of the excellent videos and starter projects included in the “new users start here” posting at the top of this forum and then work on some smaller projects just to get a good feel for how the various aspects of Dorico work together. Lillie Harris is Dorico’s documentation guru and her “First Steps” guide is an excellent introduction and can be found at https://steinberg.help/dorico-manuals/dorico-first-steps/. The “demo” piano project attached there is also an excellent place to start becoming really comfortable with the user interface. (Those materials were first written for version 3.5 but will work just fine with Dorico 4.)

Best of luck with Dorico 4!

1 Like

Thanks for your feedback, @lofe. We addressed the more important issue with the performance of the Mixer faders in Dorico 4.0.10, which concerns their affect on the actual sound.

It is not intended that as you pull the fader in either of the Mixer displays that the fader will also move correspondingly in real-time in the other. But the position of the fader should update immediately in the other display after the end of the drag, and indeed that works reliably for me.

This is implemented using the standard property-binding mechanism in Qt Quick, with no additional trickery or complexity. You don’t need to be concerned that there is some significant underlying technical debt in this area.

3 Likes

Thanks guys for chiming in. If you can not reproduce the problem on your side. I wonder what options or other causes could impact this delay.

On the programming side, the Qt programming model used in this case is signal/slot. When the signal fires, the slot function gets called and executes. This execution can be synchronized (direct call) or async (queued). If it’s synchronized, whatever the fader is updating might be taking a while on my system, about 1 to 2 seconds after a drag the slider. During that time, the whole UI is blocked until the slot call is finished.

I think the solution is either make the signal/slot call queued connection, or do whatever the fader is updating (model in MVC) in a separate thread.

Also let me share the diagnostic logs, where you can see the mixer fader change takes about 2 sec:

2022-02-06 15:08:27.480 [info] Posting command (requested): Window.Mixer MixerShown=false, Post=true
2022-02-06 15:08:27.481 [info] Executing command: Window.Mixer?MixerShown=false
2022-02-06 15:08:28.957 [info] Attempting to remap output ports: 
0: Output 1
1: Output 2

2022-02-06 15:08:29.017 [info] notifyPostCommandExecute: Window.Mixer?MixerShown=false (1536 ms)
2022-02-06 15:08:29.017 [info] Remapped outputs: 
Mixer output port ID 7 =>  
-  => Audio DevicePortID 12: O|Focusrite USB ASIO|Output 1  OK
-  => Audio DevicePortID 13: O|Focusrite USB ASIO|Output 2  OK

2022-02-06 15:08:30.231 [info] Executing command: Play.SetProjectAudioEngineState?BlobID=1
2022-02-06 15:08:30.371 [info] notifyPostCommandExecute: Play.SetProjectAudioEngineState?BlobID=1 (140 ms)
2022-02-06 15:08:30.403 [info] Process ActivateDocumentSetup message (0)
2022-02-06 15:08:30.523 [warning] WARNING: requested plugin state for slot index 1, but this doesn't exist in audio engine data
2022-02-06 15:08:30.523 [info] Document setup and activation complete but sync messages still in the queue
2022-02-06 15:08:30.528 [info] Process SetMIDIMonitorDestination
2022-02-06 15:08:30.575 [info] Sync video soundtrack with engine
2022-02-06 15:08:30.668 [info] Process SetMIDIMonitorDestination
2022-02-06 15:08:30.716 [info] Loading Plugin into slot : 
2022-02-06 15:08:31.185 [info] Plugin load finished
2022-02-06 15:08:31.185 [info] Loading Plugin into slot : 
2022-02-06 15:08:32.023 [info] Posting command (requested): Play.ChangeMixerControls BlobID=2, Post=true
2022-02-06 15:08:32.024 [info] Executing command: Play.ChangeMixerControls?BlobID=2
2022-02-06 15:08:34.065 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=2 (2041 ms)
2022-02-06 15:08:34.094 [info] Posting command (requested): Play.ChangeMixerControls BlobID=3, Post=true
2022-02-06 15:08:34.095 [info] Executing command: Play.ChangeMixerControls?BlobID=3
2022-02-06 15:08:36.334 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=3 (2239 ms)
2022-02-06 15:08:36.385 [info] Posting command (requested): Play.ChangeMixerControls BlobID=4, Post=true
2022-02-06 15:08:36.386 [info] Executing command: Play.ChangeMixerControls?BlobID=4
2022-02-06 15:08:38.526 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=4 (2141 ms)
2022-02-06 15:08:38.528 [info] Posting command (requested): Play.ChangeMixerControls BlobID=5, Post=true
2022-02-06 15:08:38.540 [info] Executing command: Play.ChangeMixerControls?BlobID=5
2022-02-06 15:08:40.645 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=5 (2105 ms)
2022-02-06 15:08:40.888 [info] Plugin load finished
2022-02-06 15:08:40.888 [info] Loading patch ch1: vstsound:/VST3 Presets/Steinberg Media Technologies/HALion Sonic SE/Program/YAMAHA S90ES Piano.vstpreset?archive=5A8B0B33AD1148AD8D2C452130D272C5
2022-02-06 15:08:41.028 [info] Patch load finished
2022-02-06 15:08:41.028 [info] Process pluginAndPatchLoadComplete message
2022-02-06 15:08:42.154 [info] Process event audition message
2022-02-06 15:08:42.154 [info] addEventsForAudition() adding 2 events to buffer #:0
2022-02-06 15:08:42.174 [info] processAuditionEvents() - processed 2 events
2022-02-06 15:08:42.200 [info] Sync complete
2022-02-06 15:08:42.200 [info] notifyMessageFinished() - request queue empty
2022-02-06 15:08:52.781 [info] Posting command (requested): Window.SwitchMode WindowMode=kPlayMode, Post=true
2022-02-06 15:08:52.781 [info] Executing command: Window.SwitchMode?WindowMode=kPlayMode
2022-02-06 15:08:53.007 [info] ping response received: from silk service
2022-02-06 15:08:53.056 [info] Posting command (force): View.ShowInvisibles
2022-02-06 15:08:53.183 [info] notifyPostCommandExecute: Window.SwitchMode?WindowMode=kPlayMode (402 ms)
2022-02-06 15:08:53.183 [info] Executing command: View.ShowInvisibles
2022-02-06 15:08:53.194 [info] notifyPostCommandExecute: View.ShowInvisibles (10 ms)
2022-02-06 15:08:59.107 [info] Posting command (requested): Play.ChangeMixerControls BlobID=6, Post=true
2022-02-06 15:08:59.108 [info] Executing command: Play.ChangeMixerControls?BlobID=6
2022-02-06 15:09:01.204 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=6 (2097 ms)
2022-02-06 15:09:04.029 [info] Posting command (requested): Play.ChangeMixerControls BlobID=7, Post=true
2022-02-06 15:09:04.029 [info] Executing command: Play.ChangeMixerControls?BlobID=7
2022-02-06 15:09:06.207 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=7 (2178 ms)
2022-02-06 15:09:07.528 [info] Posting command (requested): Play.ChangeMixerControls BlobID=8, Post=true
2022-02-06 15:09:07.528 [info] Executing command: Play.ChangeMixerControls?BlobID=8
2022-02-06 15:09:09.626 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=8 (2098 ms)
2022-02-06 15:09:11.388 [info] Posting command (requested): Play.ChangeMixerControls BlobID=9, Post=true
2022-02-06 15:09:11.388 [info] Executing command: Play.ChangeMixerControls?BlobID=9
2022-02-06 15:09:13.523 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=9 (2135 ms)
2022-02-06 15:09:25.090 [info] Posting command (requested): Play.ChangeMixerControls BlobID=10, Post=true
2022-02-06 15:09:25.090 [info] Executing command: Play.ChangeMixerControls?BlobID=10
2022-02-06 15:09:27.186 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=10 (2096 ms)
2022-02-06 15:09:30.458 [info] Posting command (requested): Play.ChangeMixerControls BlobID=11, Post=true
2022-02-06 15:09:30.458 [info] Executing command: Play.ChangeMixerControls?BlobID=11
2022-02-06 15:09:32.535 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=11 (2076 ms)
2022-02-06 15:09:35.465 [info] Posting command (requested): Play.ChangeMixerControls BlobID=12, Post=true
2022-02-06 15:09:35.465 [info] Executing command: Play.ChangeMixerControls?BlobID=12
2022-02-06 15:09:37.541 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=12 (2076 ms)
2022-02-06 15:09:38.321 [info] ping response received: from silk service
2022-02-06 15:09:46.029 [info] Posting command (requested): Play.ChangeMixerControls BlobID=13, Post=true
2022-02-06 15:09:46.029 [info] Executing command: Play.ChangeMixerControls?BlobID=13
2022-02-06 15:09:48.100 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=13 (2072 ms)
2022-02-06 15:09:50.247 [info] Posting command (requested): Play.ChangeMixerControls BlobID=14, Post=true
2022-02-06 15:09:50.248 [info] Executing command: Play.ChangeMixerControls?BlobID=14
2022-02-06 15:09:52.349 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=14 (2101 ms)
2022-02-06 15:09:53.057 [info] Posting command (requested): Play.ChangeMixerControls BlobID=15, Post=true
2022-02-06 15:09:53.057 [info] Executing command: Play.ChangeMixerControls?BlobID=15
2022-02-06 15:09:55.188 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=15 (2131 ms)
2022-02-06 15:09:55.210 [info] Posting command (requested): Play.ChangeMixerControls BlobID=16, Post=true
2022-02-06 15:09:55.210 [info] Executing command: Play.ChangeMixerControls?BlobID=16
2022-02-06 15:09:57.281 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=16 (2070 ms)
2022-02-06 15:09:57.916 [info] Posting command (requested): Play.ChangeMixerControls BlobID=17, Post=true
2022-02-06 15:09:57.916 [info] Executing command: Play.ChangeMixerControls?BlobID=17
2022-02-06 15:10:00.020 [info] notifyPostCommandExecute: Play.ChangeMixerControls?BlobID=17 (2104 ms)
2022-02-06 15:10:23.611 [info] ping response received: from silk service

We’re quite familiar with how Qt’s signals and slots work – we’ve been building large-scale commercial applications based on Qt for over a decade. Another factor at play here is that the underlying data that the Mixer presents is maintained in the VST audio engine, which is a separate process, and Dorico communicates with that process through an IPC protocol. When you drag a fader, Dorico is updating its own model of the mixer data so that the UI is responsive, and sends messages to the audio engine asking it to update the fader value. The engine reports back the actual value that has been set periodically, but while the fader is being dragged, Dorico does not reset the fader to that value, so that it doesn’t feel like the program is fighting you and the fader is juddery or unresponsive. Once you have released the fader, Dorico then receives the final level set in the audio engine, and updates the fader position at that point. That is the part that appears to be taking a longer time on your system, which has very little to do with the Qt signals/slots mechanism (other than the fact that the mechanism ultimately used to relay that final value to the fader comes by way of a signal).

1 Like

Thanks for explaining more details. Here are some more data I found, which might be a bit surprising. I used Intel vTune profiler to just profile where I change the fader. The total collection time is about 27 seconds. I didn’t do anything for the first 18 seconds, then I started to move the fader (drag, release, drag again…repeat).

From the profiler these events are fairly clear on the timeline. We see the CPUs are mostly idle till about 19 sec. Then we see relatively high usage in one thread. If we look at the function with most instructions and time spent, it’s mostly in std::locale::_Locimp::_New_Locimp.

On the right side, there are call stacks from Qt to the Dorica functions, then into msvcp140.dll. If I include system calls (second image), it shows most time spent are in malloc in ntdll.dll. So I suspect in the code there are some string or stream manipulation that uses std::locale and creating new object repeatedly. The 3rd image shows almost all system calls are from the std::locale function.

I hope these information is helpful to pin down what might cause the fader drag slow down.





Bumping to see if these are reproduced on the developer side.

Please don’t bump: it’s considered impolite on this forum, though I understand you are eager for more information. I don’t have an update for you as yet. I will update this thread as and when I do.

1 Like

Looks like the problem is fixed in 4.0.30/31. Isn’t it beautiful? Good job!

Before

After

As someone who has been doing performance optimization and compiler work for over a decade, I hope with this simple demo of finding performance issues in Dorico, it’s clear that a tool like Intel VTune Profiler is extremely useful.

It used to cost hundreds of $$$ per license, now it’s FREE. Please use it and your software will be better.

I can echo the value of running your code in a profiler. You never know what you will find until you do, and you can often greatly increase speed / responsiveness and reduce CPU load with minor changes. These generally pay off in other ways as well. Low level functions like string manipulations, memory allocations and locking especially can benefit from profiling. The tools are pretty good for that now.

2 Likes

Confucius say: stack much faster than heap!

2 Likes