option to mix output of effects units without reducing dry signal

Bug #1662049 reported by Be
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
Mixxx
Fix Released
Wishlist
Be

Bug Description

Currently effect chains are always mixed as inserts. There is a capability in Mixxx to change effect chains to a send mode, but this is not exposed in the GUI presently and it does not work well. Insert chains use the unit's mix knob to crossfade between the dry and wet signal, whereas send chains should use the mix knob to control the input volume to the chain and mix 100% of the wet signal with 100% of the dry signal. This web site depicts the difference in the signal flows with diagrams:
http://l2pnet.com/insert-effects-vs-send-effects-2/

We have some effects, namely Echo and Reverb, that are hardcoded to act like individual send effects within an insert chain. Their output is a mix of 100% of their wet signal with 100% of their dry signal and they have a Send parameter controlling the volume of the input. This does not have the same capability as a whole chain mixed as a send, which would allow for use cases like applying an Echo to the mid and high frequencies but not bass without taking the bass out of the dry signal. To work properly in a send mode chain, these effects would have to adjust to only output their wet signal and not copy the dry signal. In an insert chain, the effects' Send parameter allows for controlling the relative prominence of the effects within the chain, but in a send chain the Send parameters of the effects make no sense because they would only reduce the volume of the whole chain (which is the responsibility of the unit's mix knob). When these effects are loaded into a send chain, I think Mixxx should hardcode the effect's Send parameter to 1, hide the parameter, and allow for a different default metaknob linking because the Send parameters are linked to the metaknob by default. This would require implementing the capability to hide effect parameters first (Bug #1653325).

For example use cases of send effect chains, watch the videos linked in:
http://djtechtools.com/2016/04/04/3-techniques-pioneer-djm-900nxs2s-eq-effects/
With the Components EffectUnit, an EQ effect could be loaded first in a send chain and that effect could be focused. That would give the user control over the frequency band kill switches with the effect buttons on their controller similar to the Pioneer DJM-900NXS2, or the user could use the effect parameter knobs for more precise control.

Another use case aside from EQing the input to an effect chain would be chaining Reverb after Echo. In Mixxx 2.1 this does not have the expected effect because the Reverb is applied to both the dry signal and the echoed sound instead of adding reverb to only the echoed sound.

The capability for switching a chain between send and insert modes should be available with a toggle button in the skin section for each effect unit. The insertion type should be a property of the chain, not the effect unit, so that chains of effects in send mode could be easily reloaded without the user having to think about the insertion mode (refer to Bug #1707961).

Tags: effects
Be (be.ing)
Changed in mixxx:
milestone: none → 2.2.0
summary: - SEND effect chain insert type does not work
+ SEND effect chains
Be (be.ing)
description: updated
summary: - SEND effect chains
+ option to mix effect units as sends
description: updated
description: updated
description: updated
Be (be.ing)
description: updated
Be (be.ing)
description: updated
summary: - option to mix effect units as sends
+ option to mix effect chains as sends
description: updated
Be (be.ing)
Changed in mixxx:
assignee: nobody → Be (be.ing)
importance: Undecided → Wishlist
tags: added: effects
Be (be.ing)
description: updated
description: updated
description: updated
Be (be.ing)
Changed in mixxx:
status: New → Confirmed
Revision history for this message
Daniel Schürmann (daschuer) wrote : Re: option to mix effect chains as sends

Let's discuss the exact signal flow here, before starting to code.
I like to prevent long discussion when the work is done like in the postfader branch. I think I have not fully understand your approach. Can you draw a picture? I hope I will find some tonight to ask some details.

Revision history for this message
Be (be.ing) wrote :

hand drawing of signal flows. Each diagram is separated by a dashed line (---). The top diagram shows the generic signal flow in Mixxx 2.1 with an insert chain. The middle diagram shows how the Echo effect works in 2.1 to be usable within an insert chain (the Reverb effect works the same way). The bottom diagram shows the desired signal flow for 2.2 with a send chain.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

Looking at your drawings, I think we are almost there.

Instead of an insert knob, we have currently the effect routing switches.

Can't we just add an insert knob? How will this be assigned to the controllers? Should the controller be switch able between the D/W and Send knob? Or should we introduce a special knob behaviour that has both on one knob like the filter super knob?

Instead of fiddling with the effect knobs of existing effects, I would introduce a real delay effect, without the dry path. We can do the same for Reverb and flanger. This will give us more freedom as developer (to optimize the effect for either the insert or the send use case) and a user (to allow to use an insert effect in a send chain).

All filtering Effect like EQs will not work well as send effects, because they have a small delay.
The result is an unwanted flanger effect. We have it already if we use an EQ with a centred dry/wet knob. To avoid this, we need to compensate the dry path with all pass filter with the same characteristics. I bet, this is what the djm-900nxs2s-eq does.

It looks sound like the frequency selective effect chain is your original use case. So we should probably model this in a first class way.
Instead of a dry and a wet path, we may consider to introduce a LOW MID HI path. This will solve the unwanted flanger issue very well.

Revision history for this message
Be (be.ing) wrote :

It would be possible to make a separate Send knob for the unit, but I do not think that is a good solution. Controller mappings would have to implement logic to switch one knob between the unit's send and dry/wet knobs. It would be confusing to expose both knobs at the same time to users in skins. I would rather hide that complexity in EngineEffectChain and keep the single knob for the effect unit that changes between a send and dry/wet knob depending on the chain's insertion type.

Is there a use case for a simple delay effect in an insert chain? I do not think there is. I would rather pass the chain insertion type to the effects so the existing effects could adapt their mixing appropriately than create effects that are confusingly similar to another effect but useless in one chain insertion type.

Regarding the phase shifting, that is a separate issue that also affects chains in insert mode. I have opened a new bug for it: Bug #1740521. With a send mode chain, the phase shift would not matter though if an Echo effect is chained after the isolator effect that produces the phase shift.

Frequency selective effects are the main use case for me, but not the only one. I would also like to put Reverb in a chain after Echo and only have the echoed sound reverberated. We could hack this together in a new effect, but I would like to avoid such hacks. I would rather work on making the effects system flexible and keep each effect simple.

Revision history for this message
Be (be.ing) wrote :

Hmm, this is going to require some changes to how effect units are chained together when an input channel is routed to multiple units in send mode to be able to chain more than 3 effects together. EngineEffectChain will need to be aware of whether the next active chain that it is passing its output to is in send mode to avoid mixing the dry signal into the input for the next send mode unit. This could be implemented by having the EngineEffectRack loop through each EngineEffectChain to check its insertion mode and pass that information down to each call to EngineEffectChain::process. So we cannot remove the EffectRack layer after all. With insert mode units this is not a big deal because they can be set to output 100% wet and 0% dry. I haven't yet thought through what to do when a send unit is followed by an insert unit or the other way around.

Revision history for this message
Ferran Pujol (ferranpujol) wrote :

I'm so happy you are taking this :) I've been awaiting this for so long. Also thank you for the effort you put in post-fader effects.

I also think the dry/wet signal path is the best. Just take your favourite DAW and try putting a filter after a reverb wet signal. It's super sweet to swipe the filter through the reverb tail :)

Quick and maybe obvious reminder: the send knob of the insert effects (whether one per chain or one per deck) should be pre-fader. This way we'll be able to feed an effect chain without letting the dry signal reach the main mix.

Revision history for this message
Ferran Pujol (ferranpujol) wrote :

About the per deck insert knob / effect assign switch issue I propose the following:

- Keep the current effect assign switches CO
- Add a full send knob matrix (one send knob per deck and effect chain) with new COs
- In the UI, only show either the switches or the send knobs. Let user choose what they prefer with a checkbox in the preferences pane.

What do you think?

Having full send knob matrix allows us to do cool tricks, like smoothly changing the sound that is feeding an echo effect. Quite nice.

Revision history for this message
Be (be.ing) wrote :

> Quick and maybe obvious reminder: the send knob of the insert effects (whether one per chain or one per deck) should be pre-fader. This way we'll be able to feed an effect chain without letting the dry signal reach the main mix.

I am not sure it would be possible to have some effect units prefader and some postfader in our effect system. Regardless, I do not understand why you want that. If you want 0% dry and 100% wet you can already do this with an insert chain by turning the dry/wet knob fully wet.

> Having full send knob matrix allows us to do cool tricks, like smoothly changing the sound that is feeding an echo effect. Quite nice.

I have actually tried something like this using Ableton with my friend's APC 40 Mk2. It seemed like a cool idea but we didn't think it ended up being more interesting than a simple crossfade. Is there a particular technique you have used in Ableton that you like? If so, please describe it step-by-step and maybe we can come up with a way to implement it in Mixxx. But keep in mind that we are constrained by the designs of DJ controllers. If we invent features that add a bunch of knobs to Mixxx but there are no controllers that can map them sensibly, then it's not really useful. If a whole MIDI Fighter Twister is required to use one feature, we have not designed it well. Also, if we think we need to add a preference option, that is another sign that we are probably not designing it well.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

If I understand your proposal right, you are planning to do this:
* Add an Insert/Send mode switch
* Reuse the D/W knob as Send knob in Send mode.
* Adopt the effect internal behaviour for Send mode (remove the internal bypass, from native send effects)

Right?

The issue with this is, that our current state is already Send, because we have already the Dry bypass. Only send effects have a D/W button. Mixing Dry signal to insert effects is probably undesired in most cases so a pure Insert solution has no Dry bypass. This can be achieved by turning the D/W button fully to Wet though in our case.

Since we loose original D/W knob in your proposal, we have no chance to fade out an infinity effect.

Ferrans idea of a pre fader send is valid. In this case we can control the dry signal with the line fader and the wet signal with the send knob. However, it might be unexpected to hear the wet signal if the line fader is down, and you forgot about the send knob.
A pre-fader send is usually used for monitor outputs and not that much for effects. Sometimes it is labeled "Aux Mon". We have discussed this in an other bug, passing this to the booth output.

So I think it is better to take the send knob post fader but keep a knob in the return path.

The native send effects have currently an internal Dry bypass, which parents to use it in a pure wet chain. I am against any magic auto behaviour. This limits the creativity. The calf plugins have solved this by a "Dry Ammount" parameter. This sounds like a reasonable solution for me.

The remaining problems are:
* The D/W knob has -6 dB at center position, for the pure send use case a FX return knob will suit better.
* How to map these buttons to a controller.

I think a switch for the D/W knob would be nice D/W <-> Return behaviour or "Don't Change Dry" or Bypass Dry". The controller IMHO can always be mapped to this knob. For the effect amount it does not matter if the input or the output is controlled. The input for transitions is controlled by the fader anyway.

What do you think?

Revision history for this message
Be (be.ing) wrote :

> I am against any magic auto behaviour. This limits the creativity. The calf plugins have solved this by a "Dry Ammount" parameter. This sounds like a reasonable solution for me.

You are right, thank you for questioning that. Adding a Dry Amount parameter to Echo and Reverb would accomplish what I want. The trade-off with less magic behavior is that the user needs to have a deeper understanding of the signal flow and how changes in various knobs will affect the sound. After implementing support for saving and loading effect chain presets (Bug #1707961), we could assist users in learning how to use the effects by including a handful of default chain presets with Mixxx.

To clarify, are you proposing to add a switch to change the effect unit between:
* crossfading between dry and wet with mix knob (current behavior)
* 100% dry + wet amount controlled by mix knob

I think that together with adding a Dry Amount parameter to Echo and Reverb, that would accomplish what I want.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

> To clarify, are you proposing to add a switch to change the effect unit between:
> * crossfading between dry and wet with mix knob (current behavior)
> * 100% dry + wet amount controlled by mix knob

Yes.

Revision history for this message
Sébastien BLAISOT (sblaisot) wrote :

> a switch to change the effect unit between:
> * crossfading between dry and wet with mix knob (current behavior)
> * 100% dry + wet amount controlled by mix knob

Just for my understanding, is it about a swith in the interface or an option in preferences ?
I mean, should one be able to easily swith the behaviour during a gig or is this a matter of personal preference "forever" ?

Revision history for this message
Be (be.ing) wrote :

This will be a switch in the main GUI, not buried in the preferences. Any ideas for how to represent these different behaviors with icons? The best I have come up with so far is switching between "D/W" and "D+W".

Revision history for this message
Be (be.ing) wrote :

To clarify further, each effect unit will have its own switch. There will not be a global switch for all effect units. And as stated earlier, the state of this switch will be saved with chain presets (Bug #1707961).

Be (be.ing)
summary: - option to mix effect chains as sends
+ option to mix output of effects units without reducing dry signal
Revision history for this message
Be (be.ing) wrote :

> Adding a Dry Amount parameter to Echo and Reverb would accomplish what I want.

I played with a proof-of-concept for this. While it does accomplish what I want, I do not think this would be a good UX design. There is no use case for having the Add Dry parameter off in the dry/wet crossfade mode and there is no use case for having the Add Dry parameter on in the dry + wet mode. Therefore, the Add Dry parameter only adds a step for the user to do manually when switching between dry/wet crossfade and dry + wet modes. Even if the user understands what this parameter is for, it would be easy to forget to change it. I think it would be better to pass the effect unit mixing mode to the effects so they could automatically adjust their output appropriately. I think the comb filtering effects (Flanger and Phaser) may need some adjusting as well as Echo and Reverb.

Revision history for this message
Be (be.ing) wrote :

A question I am still wondering about is how to handle chaining multiple effect units in dry + wet mode when multiple effect units are assigned to the same input channel. I think it should be possible to chain more than 3 effects together in this mode, for example BQ EQ -> Echo -> Autopan -> Reverb. With the way the "insertion mode" switch is currently handled, this does not work as expected. Using BQ EQ -> Echo -> Autopan in Effect Unit 1 with dry + wet mode ("send" insert mode) then Reverb in Effect Unit 2 also in dry + wet mode, the reverb is not applied only to the echoed signal from Effect Unit 1 as expected, it is applied to both the echoed signal plus the dry unechoed signal.

Thus, I think when multiple effect units in dry + wet mode are assigned to the same input channel, the dry signal should not be mixed in until the output of the last consecutive effect unit in dry + wet mode for that input channel. I am not sure what the best way to implement that will be. I think it may make sense to move mixing the dry and wet signals up from EngineEffectChain to EngineEffectRack.

Revision history for this message
Be (be.ing) wrote :

> The calf plugins have solved this by a "Dry Ammount" parameter. This sounds like a reasonable solution for me.

For an LV2 effect plugin, that does make sense. An LV2 effect host may or may not add the dry signal to the output of the effect. To handle either case, the LV2 effect plugin should have parameters that let the user adjust the effect to handle either use case. However, with our built in effects in Mixxx, the effects can automatically adjust their behavior appropriately so the user doesn't have to worry much about these complicated signal path details during a performance.

Revision history for this message
Be (be.ing) wrote :

Here is the proof-of-concept if anyone is interested in playing with it: https://github.com/Be-ing/mixxx/tree/add_dry_parameter

Revision history for this message
Daniel Schürmann (daschuer) wrote :

If we think of a filter plus and Echo (Delay) effect, we have two desired use cases:
1. Filter the dry and wet path of the echo
2. Filter the wet path of the delay, producing a filtered echo.

1. is already possible, the D/W knob does not work well, because if the phase shift of the filter, it needs to stick on fully wet.
2. this is what we need a solution for!

Options:
a) create a dedicated Delay effect in Addition to Echo
b) Add a switch "Add Dry" to the related effects
c) User the prepared "insert_type" CO per effect unit

a or b can be decided on the effect level. So we have to decide finally between a/b or c.

After playing with the "Add Dry" parameter b), it feels a kind of cumbersome in the Echo case, because it is more like a routing or mode switch, not intended to create an effect by switching, turning the Echo into a Delay. In this particular case I would prefer a dedicated Delay effect a).
c) Would help, if we only have the two effects as described. It limits the creativity in a three effects case a bit, but this would be OK in favour of a nice concept.

In case b) and c) we have an issue with map this to a controller. Since this is a kind of preparation work like selecting the effect. It would be OK to map that only to the skins. You need not use the GUI for selecting effects anyway.

In my example case, it does not matter if it is a "Add Dry" b) or "Insert" c) button, because it is still one button.

The "Insert" button is probably confusing, because this is not the normal "Insert"/"send" behaviour known from hardware Mixers. It is the internal routing inside the effect unit.

My vote is for a a/b.

What we may discuss, if "Add Dry" should pollute the Parameters, or if we make it something special.

Revision history for this message
Be (be.ing) wrote :

> Options:
a) create a dedicated Delay effect in Addition to Echo
b) Add a switch "Add Dry" to the related effects
c) User the prepared "insert_type" CO per effect unit

a) That would be an ugly hack that satisfies only a single use case.
b) As I explained in comment #15, this creates unnecessary work for the user.
c) Yes, I thought we already agreed to this.

> The "Insert" button is probably confusing, because this is not the normal "Insert"/"send" behaviour known from hardware Mixers.

I agree, we should change the name of the insert_type Control of the EffectUnit. I think mix_mode would be a good name. We need clear names for the different modes. I propose "Crossfade" mode for the default (current) behavior and "Add" mode for the new behavior. Then we need to modify the Echo and Reverb effects to automatically change their output depending on the mix mode of the effect unit.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

> a) That would be an ugly hack that satisfies only a single use case.

What exactly is ugly and hacky in this solution? Which use cases are not covered?

> b) As I explained in comment #15, this creates unnecessary work for the user.

I am not able to follow your arguments in #15.
b) creates pretty much the same amount of work for the user, gives the additional option to decide this question per effect and does not clutter the GUI with an additional knob that is useless for the most effects. If you want to release the user from an extra Klick, a) schould be your friend.

In our current routing, without a dedicated send and insert effect path like in Hardware Mixers, it is in the responds of each effect to adjust their mixing scheme. We did this already with the send knob in some effects, and it follows this way, if we do it with the dry amount knob as well. This will be IMHO finally much easier to use, because the knob is only available if relevant (for 4 effects only).
The mapping issue is cleared, and the knob is hidden for effect chains that are already set up. After the parameter reordering an hiding is in place, this offers all flexibility for the advanced users, and is simply out of sight if not relevant.

Revision history for this message
Be (be.ing) wrote :

> I am not able to follow your arguments in #15.

Perhaps I was not clear enough in how to test the proof-of-concept branch. The insertion_type of the EffectUnit needs to be toggled by running in Developer Mode and using the Developer Tools window. If you do this, it should be clear that there is no use case for having the Add Dry parameter off in the default Crossfade mode (insertion_type 0) and no use case for having the Add Dry Parameter on in Add mode (insertion_type 1).

Revision history for this message
Be (be.ing) wrote :

Because there will only be one binary switch to toggle for each effect unit and I don't think there is a use case for toggling the switch while the effect unit is audible as a performance technique, I do not think it is important to map this switch to controllers.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

But the main issue remains, this button clutters the Mixxx Gui, but is only relevant for a hand full effects. It also limits the creativity compared to an parameter knob where it is required.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

Can you explain the usecase that are not covered by a "dry amount" parameter?

Revision history for this message
Be (be.ing) wrote :

The switch for the effect unit is necessary. There is no way around that. There is no use case for the "Add Dry" parameter without this. Removing the dry signal from the output of Echo and Reverb with the current default Crossfade ("Insert") mode is useless because the effect unit mix knob reduces the volume of the input.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

Ah yes, sorry I missed that during my tests.

OK, since we need the per unit knob anyway. It is reasonable to adjust the effects accordingly and use just this single knob.
"Dry/Wet" <-> "Return" seams to be the "right" nomenclature.
We can label it "100% Dry" or "All Dry" for a better understanding.

Revision history for this message
Be (be.ing) wrote :

I don't like calling the new mode "Return". I don't think that conveys what it does at all. I propose either
Dry/Wet and Dry + Wet; or
Crossfade and Add
I like the latter better. I think it would be easy to confuse the former pair.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

We are talking about the additional toggle button.
I think it should be default of and the D/W knob in the normal Dry/Wet crossfade mode.
What should be the label under knob?
I propose "All Dry"

What is your proposal?

Revision history for this message
Be (be.ing) wrote :

I agree that the default should be the dry/wet crossfade behavior that has been the only one available before now. I don't think it makes much sense to think of this as a boolean enable/disable or on/off switch. They're two different modes with different use cases. I like "Crossfade" and "Add" modes the best so far, but I'm open to new ideas. I don't think we should add words to the GUI; I think we should choose names that we can make sensible icons for (with tooltips of course). Maybe Ronso has some ideas for icons?

I don't like "All Dry" to refer to the new Add mode. Crossfade mode with the mix knob fully left is also all dry.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

All knobs have a single label, at least tin the tooltips. So we need one here as well.
We also need a programmatic name. Changing icons are only on top.
I do not like the term "Crossfade" here. It may bes misleading that it has something to do with the crossfader. "Add mode" as the label works for me.

Revision history for this message
Be (be.ing) wrote :

Hmm, yeah using "crossfade" for this could be somewhat confusing. Maybe "Dry/Wet" and "Add Wet" modes?

Revision history for this message
Daniel Schürmann (daschuer) wrote :

We can't have "and" we need a single name for the toogle switch.
The knob itself does not add wet, It is the "Dry/Wet" knob which adds wet in the same way in both cases. The toggle switch adds Dry, if you toggle it, except the "Dry/Wet" is already fully Dry or the the effect has an dry bypass.

Revision history for this message
Be (be.ing) wrote :

In both cases the knob adds wet. In one case it also removes dry.

Maybe someone else has suggestions for names?

Revision history for this message
Daniel Schürmann (daschuer) wrote :

We are talking about the toggle switch, mode selector, not about the Dry/Wet knob.

Revision history for this message
Daniel Schürmann (daschuer) wrote :

   [ ] ( )
 Add mode Dry/Wet

Revision history for this message
Be (be.ing) wrote :

I will work on implementing this. Maybe someone will think of good names after trying it.

Revision history for this message
Be (be.ing) wrote :
Changed in mixxx:
status: Confirmed → In Progress
Revision history for this message
Be (be.ing) wrote :
Be (be.ing)
Changed in mixxx:
status: In Progress → Fix Committed
Changed in mixxx:
status: Fix Committed → Fix Released
Revision history for this message
Swiftb0y (swiftb0y) wrote :

Mixxx now uses GitHub for bug tracking. This bug has been migrated to:
https://github.com/mixxxdj/mixxx/issues/8790

lock status: Metadata changes locked and limited to project staff
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.