The problem: Currently, when running Renoise as ReWire slave to whatever master, and theres something in your song that introduces latency, Renoise will miss “notes” while being triggered from the master. This only happens with PDC enabled.
The why/how/wtf? is a bit hard hard to explain, so let me try do so slowly, step by step.
An example: Lets say you are using just one FX, a bus-compressor, in your song on track 01. A bus compressor introduces a latency of 2ms on the track its sitting on, so PDC magically shifts all other tracks also by 2ms, to get everything played back perfectly in sync. This also means that the whole song in Renoise now has a latency of 2ms. Remember, track 01 + all other tracks are now shifted by 2ms!
Lets now say we are running Renoise as ReWire slave. ReWire unfortunately has no kind of support for PDC/custom latencies, so if we would simply run this song in a ReWire master, Renoise would be 2ms off - always.
OK, this sucks, you want that Renoise plays perfectly in sync with your master, so what we are currently doing, is shifting our timeline forward by 2ms:
For example, if the host plays at time 1ms, Renoise is playing time 3ms and so on. This way Renoise is again in sync with the master. This unfortunately leads to another problem:
If you start playing from the master, Renoise will always start a bit too late. Lets say you are starting the master at beat pos 2.1.1, then Renoise will start at 2.1.1 + 2ms to compensate its latency. This offset, even when its just one tiny ms, will lead to the problem that notes which start !exactly! at pos 2.1.1 are not triggered.
When you start playing from Renoise, we do a little trick to avoid this problem: We tell the master to start playing at “2.1.1 - 2ms” which means that Renoise will start exactly at 2.1.1. This only works for times greater than 1.1.1. and ONLY works if you start the song from within Renoise. Again: the ReWire master does not know anything from Renoises latency.
Maybe a simple example XRNS makes this more clear (see attachment). This is a simple drum loop with a compressor on it. This compressor, as in our example above, adds a latency of 2ms. Thats it.
Now load this song into a ReWire master of your choice and set the loop in the master from 5.1.1 to 9.1.1, to cover Renoises 2. pattern (where the amen plays).
-> With PDC in Renoise enabled, starting to play from 5.1.1 in the master will miss the drumloops start.
-> With PDC in Renoise disabled, starting to play from 5.1.1 in the master should always work as you expect it.
-> With PDC in Renoise enabled or disabled, starting to play from Renoise should always work (some ReWire masters might probably behave wrong though).
513 PDC_ReWireSlave_Example.xrns
Possible solutions/workarounds:
Now, finally: Why do I have to bore you with all these technical details? Well, because the current way we are dealing with this simply confusing if this results into “lost” notes. This feels wrong / like a bug / doesn’t make sense if you don’t know the technical details.
On the other hand, ignoring these latencies would suck as well, because then Renoise is always a bit off. 2 or 5 ms might not be a problem, but as soon as you are using lots of VSTs and lots of FX in general, this can easily sum up to noticeably more.
Possible solutions/workarounds:
- We ignore the problem (latencies) and prefer that notes are always triggered correctly (thats what we do with Jack Transport btw)
- We Ignore the latency only when starting to play. As soon as Renoise is running, it would then “catch up” the latency by playing faster until its synced. This can be annoying as well, and lead to artifacts in FX because of the BPM changes. Especially when the latencies are big.
- We disable PDC by default as ReWire Slave
- We keep things as they are and try to explain that somehow, so that everyone knows whats happening. Kind of impossible? Who the heck should understand this?
5-X Your ideas!
Any ideas, suggestions are very welcome!