Timing imprecision in LFO and formula device?

The LFO and the formula device delay the input signal by some milliseconds, even if the LFO is using a line as transfer function and the formula device is using y=A.

grafik

grafik

Both devices should introduce the exact PDC instead.

Steps to reproduce:

  • Use a hydra to control two signals/parameters of a later effect device, using the same settings.
  • Now insert a LFO and later the formula device into the signal chain of the second signal
  • The second slider now is a bit delayed.

Correct behaviour:

Laggy behaviour with LFO:

Laggy behaviour with formula device:

Any idea how big this lag is exactly, in milliseconds?

Also it looks like that the formula device is incompatible with a lookahead of a sending signal follower. If the lookahead is >0, the formula device will cause heavy aliasing.

Audio example with lookahead 0

Audio example with lookahead 16

This is the doofer with the formulas. Route a signal follower onto the knob “signal”:

Copy paste doofer
<?xml version="1.0" encoding="UTF-8"?>
<FilterDeviceClipboard doc_version="0">
  <DeviceSlot type="DooferDevice">
    <IsMaximized>true</IsMaximized>
    <IsSelected>true</IsSelected>
    <SelectedPresetName>ffx upwrads verdichtung 2</SelectedPresetName>
    <SelectedPresetLibrary>User Library</SelectedPresetLibrary>
    <SelectedPresetIsModified>true</SelectedPresetIsModified>
    <IsActive>
      <Value>1.0</Value>
      <Visualization>Device only</Visualization>
    </IsActive>
    <Macro0>
      <Value>27.1999588</Value>
      <Visualization>Device only</Visualization>
      <Name>Sens</Name>
    </Macro0>
    <Macro1>
      <Value>11.9999914</Value>
      <Visualization>Device only</Visualization>
      <Name>Att</Name>
    </Macro1>
    <Macro2>
      <Value>22.3999767</Value>
      <Visualization>Device only</Visualization>
      <Name>Rel</Name>
    </Macro2>
    <Macro3>
      <Value>25</Value>
      <Visualization>Device only</Visualization>
      <Name>In Gain</Name>
      <Mappings>
        <Mapping>
          <DestDeviceIndex>0</DestDeviceIndex>
          <DestParameterIndex>1</DestParameterIndex>
          <Min>0.0</Min>
          <Max>1.0</Max>
          <Scaling>Linear</Scaling>
        </Mapping>
      </Mappings>
    </Macro3>
    <Macro4>
      <Value>30.9999866</Value>
      <Visualization>Device only</Visualization>
      <Name>Out Gain</Name>
      <Mappings>
        <Mapping>
          <DestDeviceIndex>5</DestDeviceIndex>
          <DestParameterIndex>1</DestParameterIndex>
          <Min>0.0</Min>
          <Max>1.0</Max>
          <Scaling>Linear</Scaling>
        </Mapping>
      </Mappings>
    </Macro4>
    <Macro5>
      <Value>75.1999817</Value>
      <Visualization>Device only</Visualization>
      <Name>Knee</Name>
      <Mappings>
        <Mapping>
          <DestDeviceIndex>4</DestDeviceIndex>
          <DestParameterIndex>6</DestParameterIndex>
          <Min>0.0</Min>
          <Max>1.0</Max>
          <Scaling>Linear</Scaling>
        </Mapping>
      </Mappings>
    </Macro5>
    <Macro6>
      <Value>50</Value>
      <Visualization>Device only</Visualization>
      <Name>Macro 7</Name>
    </Macro6>
    <Macro7>
      <Value>91.0567627</Value>
      <Visualization>Device only</Visualization>
      <Name>signal</Name>
      <Mappings>
        <Mapping>
          <DestDeviceIndex>1</DestDeviceIndex>
          <DestParameterIndex>1</DestParameterIndex>
          <Min>0.0</Min>
          <Max>1.0</Max>
          <Scaling>Linear</Scaling>
        </Mapping>
      </Mappings>
    </Macro7>
    <NumActiveMacros>8</NumActiveMacros>
    <ShowDevices>true</ShowDevices>
    <DeviceChain>
      <SelectedPresetName>Init</SelectedPresetName>
      <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
      <SelectedPresetIsModified>true</SelectedPresetIsModified>
      <Devices>
        <GainerDevice type="GainerDevice">
          <IsMaximized>false</IsMaximized>
          <IsSelected>false</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <Volume>
            <Value>1.0</Value>
            <Visualization>Mixer and Device</Visualization>
          </Volume>
          <Panning>
            <Value>0.5</Value>
            <Visualization>Device only</Visualization>
          </Panning>
          <LPhaseInvert>false</LPhaseInvert>
          <RPhaseInvert>false</RPhaseInvert>
          <SmoothParameterChanges>true</SmoothParameterChanges>
        </GainerDevice>
        <HydraDevice type="HydraDevice">
          <IsMaximized>true</IsMaximized>
          <IsSelected>false</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <VisiblePages>1</VisiblePages>
          <InputValue>
            <Value>0.910567641</Value>
            <Visualization>Mixer and Device</Visualization>
          </InputValue>
          <Out1DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out1DestTrack>
          <Out1DestEffect>
            <Value>2</Value>
            <Visualization>Device only</Visualization>
          </Out1DestEffect>
          <Out1DestParameter>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out1DestParameter>
          <Out1Min>
            <Value>0.950000048</Value>
            <Visualization>Device only</Visualization>
          </Out1Min>
          <Out1Max>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out1Max>
          <Out1Scaling>Linear</Out1Scaling>
          <Out2DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out2DestTrack>
          <Out2DestEffect>
            <Value>3</Value>
            <Visualization>Device only</Visualization>
          </Out2DestEffect>
          <Out2DestParameter>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out2DestParameter>
          <Out2Min>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out2Min>
          <Out2Max>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out2Max>
          <Out2Scaling>Linear</Out2Scaling>
          <Out3DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out3DestTrack>
          <Out3DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out3DestEffect>
          <Out3DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out3DestParameter>
          <Out3Min>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out3Min>
          <Out3Max>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out3Max>
          <Out3Scaling>Linear</Out3Scaling>
          <Out4DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out4DestTrack>
          <Out4DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out4DestEffect>
          <Out4DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out4DestParameter>
          <Out4Min>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out4Min>
          <Out4Max>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out4Max>
          <Out4Scaling>Linear</Out4Scaling>
          <Out5DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out5DestTrack>
          <Out5DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out5DestEffect>
          <Out5DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out5DestParameter>
          <Out5Min>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out5Min>
          <Out5Max>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out5Max>
          <Out5Scaling>Linear</Out5Scaling>
          <Out6DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out6DestTrack>
          <Out6DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out6DestEffect>
          <Out6DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out6DestParameter>
          <Out6Min>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out6Min>
          <Out6Max>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out6Max>
          <Out6Scaling>Linear</Out6Scaling>
          <Out7DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out7DestTrack>
          <Out7DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out7DestEffect>
          <Out7DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out7DestParameter>
          <Out7Min>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out7Min>
          <Out7Max>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out7Max>
          <Out7Scaling>Linear</Out7Scaling>
          <Out8DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out8DestTrack>
          <Out8DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out8DestEffect>
          <Out8DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out8DestParameter>
          <Out8Min>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out8Min>
          <Out8Max>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out8Max>
          <Out8Scaling>Linear</Out8Scaling>
          <Out9DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out9DestTrack>
          <Out9DestEffect>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out9DestEffect>
          <Out9DestParameter>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </Out9DestParameter>
          <Out9Min>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </Out9Min>
          <Out9Max>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </Out9Max>
          <Out9Scaling>Linear</Out9Scaling>
        </HydraDevice>
        <FormulaMetaDevice type="FormulaMetaDevice">
          <IsMaximized>true</IsMaximized>
          <IsSelected>false</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <FormulaParagraphs>
            <FormulaParagraph>A</FormulaParagraph>
          </FormulaParagraphs>
          <FunctionsParagraphs>
            <FunctionsParagraph/>
          </FunctionsParagraphs>
          <InputNameA>A</InputNameA>
          <InputNameB>B</InputNameB>
          <InputNameC>C</InputNameC>
          <EditorVisible>true</EditorVisible>
          <InputA>
            <Value>0.0849607587</Value>
            <Visualization>Device only</Visualization>
          </InputA>
          <InputB>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </InputB>
          <InputC>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </InputC>
          <DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </DestTrack>
          <DestEffect>
            <Value>4</Value>
            <Visualization>Device only</Visualization>
          </DestEffect>
          <DestParameter>
            <Value>2</Value>
            <Visualization>Device only</Visualization>
          </DestParameter>
        </FormulaMetaDevice>
        <FormulaMetaDevice type="FormulaMetaDevice">
          <IsMaximized>true</IsMaximized>
          <IsSelected>true</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <FormulaParagraphs>
            <FormulaParagraph>A</FormulaParagraph>
          </FormulaParagraphs>
          <FunctionsParagraphs>
            <FunctionsParagraph/>
          </FunctionsParagraphs>
          <InputNameA>A</InputNameA>
          <InputNameB>B</InputNameB>
          <InputNameC>C</InputNameC>
          <EditorVisible>true</EditorVisible>
          <InputA>
            <Value>0.0894323587</Value>
            <Visualization>Device only</Visualization>
          </InputA>
          <InputB>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </InputB>
          <InputC>
            <Value>0.0</Value>
            <Visualization>Device only</Visualization>
          </InputC>
          <DestTrack>
            <Value>-1</Value>
            <Visualization>Device only</Visualization>
          </DestTrack>
          <DestEffect>
            <Value>4</Value>
            <Visualization>Device only</Visualization>
          </DestEffect>
          <DestParameter>
            <Value>5</Value>
            <Visualization>Device only</Visualization>
          </DestParameter>
        </FormulaMetaDevice>
        <BusCompressorDevice type="BusCompressorDevice">
          <IsMaximized>true</IsMaximized>
          <IsSelected>false</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <Threshold>
            <Value>-41.7602158</Value>
            <Visualization>Device only</Visualization>
          </Threshold>
          <Ratio>
            <Value>0.0849607587</Value>
            <Visualization>Device only</Visualization>
          </Ratio>
          <Attack>
            <Value>0.364010036</Value>
            <Visualization>Device only</Visualization>
          </Attack>
          <Release>
            <Value>0.0360000022</Value>
            <Visualization>Device only</Visualization>
          </Release>
          <MakeUp>
            <Value>1.60978246</Value>
            <Visualization>Mixer and Device</Visualization>
          </MakeUp>
          <Knee>
            <Value>22.5599937</Value>
            <Visualization>Device only</Visualization>
          </Knee>
        </BusCompressorDevice>
        <GainerDevice type="GainerDevice">
          <IsMaximized>false</IsMaximized>
          <IsSelected>false</IsSelected>
          <SelectedPresetName>Init</SelectedPresetName>
          <SelectedPresetLibrary>Bundled Content</SelectedPresetLibrary>
          <SelectedPresetIsModified>true</SelectedPresetIsModified>
          <IsActive>
            <Value>1.0</Value>
            <Visualization>Device only</Visualization>
          </IsActive>
          <Volume>
            <Value>1.23999941</Value>
            <Visualization>Mixer and Device</Visualization>
          </Volume>
          <Panning>
            <Value>0.5</Value>
            <Visualization>Device only</Visualization>
          </Panning>
          <LPhaseInvert>false</LPhaseInvert>
          <RPhaseInvert>false</RPhaseInvert>
          <SmoothParameterChanges>true</SmoothParameterChanges>
        </GainerDevice>
      </Devices>
    </DeviceChain>
  </DeviceSlot>
</FilterDeviceClipboard>

Maybe an interpolation is missing on the output.

This seems to point into a similar direction:

The song in that thread causes a lot of audio dropouts. If the automatic PDC now is disabled, the stuttering is almost gone (yet a bit existing). Seems to be related to formula device + PDC enabled + macos

I’m trying to make a LFO Ducker where I copy popular sidechain curves from LFOtool, Kickstart etc. and was using PsyScope to see the changes and noticed a lag too.

Check out these screenshots and notice the volume doesn’t reach zero at the beginning of the beat when the LFO should be at zero!?!

renoise LFO

renoise LFO 2

I have to set the custom endpoint at zero long time in advance for the LFO to reach zero.
renoise LFO 3

Well, I believe Taktik did here the best possible regarding the oldschool tick based system in Renoise. You are sure there is no PDC in your track which could cause the delay? No PDC introduced by the synth, none by every used DSP? AFAIK meta devices are not automatically compensated here, due the bypassing of the logical audio stream or so.

I think you can always compensate manually by placing two TrackControl VSTs before and after the meta signal generator.

This looks like the fade out of a previously played note. Could you share a little demonstration song, so we can check this in detail?

That shouldn’t matter as the LFO is supposed to duck the track volume with a gainer.

LFO timing.xrns (351.9 KB)

The LFO envelope goes to zero at the end:
RenLFOenvelope

Here’s a render to file where I’ve selected the tail that in my opinion shouldn’t be there:
RenLFOselection

Misread that, sorry. It’s an LFO in the track DSPs, not in the instrument modulation, so it’s not a previously played note. A little demonstration song would nevertheless be helpful.

An example song is attached the post just above.

On a dedicated track I have a silent note on every beat and set up following devices:
KeyTracker > Reset a custom one-shot LFO envelope > Hydra

The Hydra then duck Gainers on tracks with bass etc. essentially functioning like all the fancy kick/bass duckers out there.

You beat me above with the reply.


The timing of the LFO is okay, but the parameter smoothing of the gain DSP device indeed is introducing a small delay.

By default all volume related (any many other) parameter changes are smoothed (low pass filtered) to avoid clicks on abrupt changes. This usually is doing good things. In this case, where the gain change already is “smoothed” by the LFO, this is unwanted behaviour.


The Gainer DSP has a hidden “SmoothParameterChanges” option, which can only be seen in the XML representaiton. When disabling it, as in the attached song, the delay is gone.

LFO timing no smoothing.xrns (352.0 KB)

We probably should make this “SmoothParameterChanges” option a regular option in the GUI so it can be disabled, when it’s useful.

8 Likes

that would be great :+1:

1 Like

long story short, it cost $200 in 1999 dollars (mailed a check) for me to get J.Lim to add the ability to disable “Initial Volume Ramp” in Impulse Tracker :stuck_out_tongue:
Now all the attacks/transients/etc of samples can be sharp and clicky!

IT29

2 Likes

Okay, sounds good making it an option, unfortunately it sounds like distortion is added, take a look at the render below where it looks like a “step” in the sound is introduced around where the smoothing process is supposed to initiate?

It’s obvious if you listen to it, doesn’t sound like a clean sinewave anymore.

renoise LFO b4b

renoise LFO b4

1 Like

That last artifact in the waveform is not what changes the tone of the whole sound, there some event that run for every step the LFO change position!? Try listen to my original and then yours.

Wow, that’s great! Will an LFO controlled gainer then also have increased precision? But I guess that Garf spotted now a bug, which was covered by the smoothing…?

I remember many years ago that a dirty sinewave sample could cause odd artifacts in the sound but I’ve tested this with a sinewave out of Sylenth and it still sounds garbled, it looks like something is being applied at a cycle and not every step as I said before?

Here’s a few more screenshots I’ve taken of the issue.

Renoise LFO after
before and after

Yes, the LFO spits out value changes once per tick and not per sample. Automating parameters on a sample level would create a huge overhead, actually wouldn’t be possible with some parameters. Remember that you can connect the meta devices to anything.

Due to the missing smoothing in the gainer, this will precisely, but apruptly change the volume and thus create the artifacts that you’ve described above.

No, the timing is okay. The smoothing delays the applied parameter changes.