Status: This specification is in drafting. Please feel free to edit this page and add your comments.
DJs often augment their mixes with effects. Mixxx is severely lacking in this department, as released versions of Mixxx only offer EQs and a flanger.
This project aims to bring effects to Mixxx, both via native effects and effects plugins via LADSPA, LV2, or VST.
The goal is that the DJ can enhance their performance through the use of audio effects. To present this in a simple-to-use and powerful way, we introduce the metaphor of “Effect Chains”. An effect chain is nothing more than a list of effects which are applied sequentially to audio. An effect chain can be applied to decks, samplers, the headphone out, and the master output.
The DJ configures effect chains by selecting effects that are available to her from any variety of effect sources (native built-in plugins, LADSPA plugins, LV2 plugins, VST plugins, etc.) and adding them to the chain. She does this from a view called “Effect Chain Edit Mode” that takes the place of where the Mixxx library normally sits.
Once the DJ has selected the effects that she desires to be in the chain, then the parameters of that effect are made available to her to tweak to her liking. Each parameter can be adjusted in the following ways:
Once the DJ is done configuring the effect chain and the parameters of the effects that are in the effect chain, she may save the effect chain and give it a name. Alternatively, she can also load a previously saved chain from the Chain Edit Mode.
The key idea here is that the DJ should invest time in crafting and creating the unique sounds she would like to make via Effect Chains prior to her sets. While it will be possible to create Effect Chains on the fly, it will be a lot less stressful if she has invested the time beforehand.
TODO: Insert marketing name here :) Candidates: SuperKnob, WonderKnob, MetaKnob, HyperKnob, AwesomeKnob, FunkyKnob, MagicKnob
Every effect chain has a single knob called the “Wonder Knob”. This knob is meant to be the go-to knob for the DJ to tweak during her set to make awesome effect noises happen. If you look at a lot of Ean Golden's videos on DJTechTools, this is how many of his combinations of effects work. There is one knob to turn that produces the desired effect. This is both a huge usability win (no knob soup) and allows the DJ to focus on what she is doing. As previously outlined, when creating an effect chain in Chain Edit Mode, the DJ can link one or more of each effect's parameters to the chain's “Wonder Knob”. This, combined with with the ability to tweak the min/max ranges, and the linear/log settings of the knobs, allows the DJ to create one knob that does the work of what she would normally do by tweaking multiple knobs simultaneously.
One benefit of having a “Wonder Knob” is that it maps very naturally to many MIDI controllers, which often have a limited number of knobs available for tweaking effets. One example of this is the Numark V7/NS7, which only has a single effect-selector knob and an effect-parameter knob. In this case, we would make the effect selector knob select the active effect chain, and the effect-parameter knob tweak the “Wonder Knob”. In ITCH, the V7/NS6/NS7FX are limited to only a single effect at a time, and these knobs are designed to reflect that. By mapping this knob to effect chains, we will allow NS7/V7 owners to achieve a categorically more flexible effect setup.
The properties of an effect are described by an EffectManifest object. An EffectManifest is an immutable data type (should always be const) that fully describes all of the effect's properties that are relevant to user-facing aspects of effects. This includes a description of each user-facing parameter of each effect, along with metadata describing hints for how the parameter should be presented to the user, limits of the parameter's values, and default values for the parameter. An EffectManifest is strictly an abstract description of the effect, and has nothing to do with an actual instantiation of an effect. An Effect object is an instantiation of an EffectManifest, and manages actual instance values for each parameter described in the EffectManifest.
| EffectManifest Properties | |
|---|---|
| Property | Description |
| name | Effect name (internationalizable) |
| author | Author name |
| version | Effect version (string) |
| description | Effect description (internationalizable) |
| parameters | A list of EffectParameter objects, describing user-facing parameters |
| EffectParameter Properties | |
|---|---|
| Property | Description |
| name | Effect name (internationalizable) |
| description | Effect description (internationalizable) |
| defaultValue | Parameter's default value |
| minimumValue | Parameter's minimum value, if any |
| maximumValue | Parameter's maximum value, if any |
| valueHint | A hint describing the type of the parameter's value (boolean, float, integer, etc.) |
| controlHint | A hint describing the most logical control type for the parameter (potmeter, log-potmeter, toggle, slider, etc.) |
| semanticHint | A hint describing the semantic type of the value (pitch, samples, time, duration) |
| unitsHint | A hint describing the units of the value (time, hertz, fraction of samplerate) |
NOTE: The hints are still under development. Please give feedback!
The effects system will implement a backend model similar to Mixxx's MIDI backend. Multiple backends will provide Effects that are aggregated by an EffectsManager class. Each backend will provide effects either loaded from a plugin system such as LADSPA, LV2, or VST. Alternatively, a backend can implement effects natively and expose them via the same Effect interface used by the plugin-based backends.
Given an Effect instance, a buffer of audio can be processed given the parameter settings in the instance.
The EffectsManager uses the EffectsBackends to instantiate Effects from EffectManifests. Once the EffectsManager instantiates an Effect, it is able to ask the Effect to process a buffer of audio.
An EffectSlot is an abstraction over an Effect. It provides a ControlObject interface for controlling the parameters of an Effect. To a user, an EffectSlot is the equivalent of a “selected” effect. Knobs in the GUI and MIDI controllers connect to the EffectSlot's controls, which in turn are used to control the Effect that is loaded into the slot. Similarly, an EffectChainSlot is an abstraction over an EffectChain. It provides a ControlObject interface to controlling an EffectChain that is loaded into it. To a user, an EffectChainSlot is an “effect unit” which is a chain of EffectSlots.
One or more EffectSlots are grouped into an EffectChainSlot. The EngineMaster and EngineChannels interact with the effects framework at the level of EffectChains. Every EffectChain is conditionally applied to multiple EngineChannel's (e.g. [Channel1], [Channel2], [Sampler1], etc). In addition to EngineChannels, EffectChains are conditionally applied to both the EngineMaster master output ([Master]) and the headphone output ([Headphone]).
The EffectsManager class provides the following global information controls:
| [Group] | Key/Control | Range | What it does | ||||
|---|---|---|---|---|---|---|---|
| [Effects] | num_effectchains | integer, read-only | The number of EffectChains that exist |
EffectChains and EffectSlots both provide a ControlObject interface for both the GUI and MIDI controllers to interact with. At creation time, all EffectChains are assigned a sequential, unique ID starting at 1. All EffectChains have the group [EffectChainN] where N is the EffectChain's ID.
| [Group] | Key/Control | Range | What it does | ||||
|---|---|---|---|---|---|---|---|
| [EffectChainN] | num_effects | integer, read-only | The number of Effects that this EffectChain has | ||||
| [EffectChainN] | mix | 0.0..1.0 | The dry/wet mixing ratio for this EffectChain with the EngineChannels it is mixed with | ||||
| [EffectChainN] | enabled | binary | Whether the EffectChain is enabled | ||||
| [EffectChainN] | metaknob | 0.0..1.0 | The EffectChain master control knob. Controls all parameters that are linked to the chain's metaknob. | ||||
| [EffectChainN] | next_chain | binary | Cycle to the next EffectChain preset after the currently loaded preset. | ||||
| [EffectChainN] | prev_chain | binary | Cycle to the previous EffectChain preset before the currently loaded preset. | ||||
| [EffectChainN] | channel_[ChannelI] | binary | Whether or not this EffectChain applies to Deck I | ||||
| [EffectChainN] | channel_[SamplerJ] | binary | Whether or not this EffectChain applies to Sampler J | ||||
| [EffectChainN] | channel_[Master] | binary | Whether or not this EffectChain applies to the Master output | ||||
| [EffectChainN] | channel_[Headphone] | binary | Whether or not this EffectChain applies to the Headphone output | ||||
| [Group] | Key/Control | Range | What it does | ||||
| [EffectChainN_EffectM] | enabled | binary, read-only | Whether an Effect is loaded into this EffectSlot | ||||
| [EffectChainN_EffectM] | num_parameters | integer, read-only | The number of parameters the currently loaded effect has. 0 if no effect is loaded | ||||
| [EffectChainN_EffectM_ParameterK] | enabled | binary, read-only | Whether or not the Kth parameter is enabled. | ||||
| [EffectChainN_EffectM_ParameterK] | linked | binary | Whether or not the Kth parameter is linked to the EffectChain superknob. | ||||
| [EffectChainN_EffectM_ParameterK] | value_type | integer, read-only | The type of the Kth parameter value. See the Parameter Value Types table. | ||||
| [EffectChainN_EffectM_ParameterK] | value_min | double | The minimum configured value of the Kth parameter. | ||||
| [EffectChainN_EffectM_ParameterK] | value_max | double | The maximum configured value of the Kth parameter. | ||||
| [EffectChainN_EffectM_ParameterK] | value_min_limit | double, read-only | The minimum allowable value of the Kth parameter's minimum. | ||||
| [EffectChainN_EffectM_ParameterK] | value_max_limit | double, read-only | The maximum allowable value of the Kth parameter's minimum. | ||||
| [EffectChainN_EffectM_ParameterK] | value_default | double, read-only | The default value of the parameter. | ||||
| [EffectChainN_EffectM_ParameterK] | value | double | The raw value of the Kth parameter. See the Parameter Values section for more information. | ||||
| [EffectChainN_EffectM_ParameterK] | value_normalized | 0.0..1.0 | The value of the Kth parameter, normalized to the range of 0.0 to 1.0. |
In the above table,
NOTE: The reason for 1-indexing versus 0-indexing is the significant precedent within the Control system for 1-indexing. (e.g. hotcues, Deck/Sampler names, etc.)
Since the Control system is not capable of representing values other than numeric values, for the first iteration of the effects system, we must use a numeric coding system for representing the parameter types. If the GUI or MIDI Script author does not care about choosing correct values, he or she can use the parameterK_value_normalized control, which will always represent the parameter value as normalized to the range of 0.0 to 1.0. To use the parameterK_value control, the setter must check the value against parameterK_type (see the Parameter Types table below), parameterK_value_min, and parameterK_value_max to ensure the value is within the correct range. Invalid settings of any parameterK_value controls will be ignored.
| Parameter Value Type | Integer Value | Intepretation |
|---|---|---|
| Boolean | 0 | Set only to values of 0 (false) or 1 (true) |
| Integer | 1 | Set to any integral value |
| Double | 2 | Set to any double value. |
Brainstorming for now. Basing heavily off of Jus's mockups from Summer 2010: Effects Units Mockup Effects Units Editor Mockup
Mockup of Effect-Chain Compact Interface. Only MetaKnobs are showing.
TODO: Need to formalize what “Fit” means. In general, a fit is good if it matches the paradigm of effect-chains being
| Controller | Effects? | Settings | Fit? |
|---|---|---|---|
| American Audio VMS4 | Y | Per-deck effect-select knob, effect parameter knob, effect enable button, parameter toggle button? | Good |
| Behringer BCD3000 | Y | 4-effect parameter knobs plus on/off button, FX select up/down buttons, and “action” button | Good |
| Denon DN-MC6000 | Y | Per-deck 4-effect parameter knob plus on/off button. Per-deck FX select for FX unit 1 and 2 | Good |
| Gemini CTRL-47 | Y | Per-deck 2 effects controls. Each control has FX select and 2 parameter knobs plus on/off button. | Good |
| Hercules DJ Console RMX | N | N/A | |
| Hercules DJ Console 4MX | N | N/A | |
| Hercules DJ 4set | N | N/A | |
| Hercules DJ Console Mk4 | N | N/A | |
| Hercules DJ Control Steel | N | N/A | |
| Hercules DJ Control MP3 e2 | N | N/A | |
| M-Audio Torq Xponent | Y | 4 effect parameter knob + 4 enabled buttons per deck | Medium |
| NI Traktor Kontrol S4 | Y | Per chain: 1 dry/wet knob, 3 effect parameter knobs, 1 chain on/off button, 3 effect option buttons, menu button (?). Per-deck effect chain (2x) enable buttons | Good |
| NI Traktor Kontrol X1 | Y | Per chain: 1 dry/wet knob, 3 effect parameter knobs, 1 chain on/off button, 3 effect option buttons. Per-deck effect chain (2x) enable buttons | Good |
| Numark MIXTRACK | Y | Per-deck effect enable, effect select knob, 2x parameter knob | Perfect |
| Numark NS6 | Y | Per-deck effect selector, parameter, mix, source knobs. Effect on/off and tap buttons. | Perfect |
| Numark NS7 | N | N/A | |
| Numark NSFX | Y | Per-deck effect selector, parameter, mix, source knobs. Effect on/off and tap buttons. | Perfect |
| Numark V7 | Y | Effect selector, parameter knobs. Effect Mix fader, Effect on/off button and tap buttons | Perfect |
| Pioneer DDJ-S1 | Y | Serator ITCH style. Per-deck effect selector, parameter, mix, source knobs. Effect on/off and tap buttons. | Perfect |
| Pioneer DDJ-T1 | Y | Traktor style. 2 effects units. Per unit dry/wet, 3 parameters per unit, each with on/off buttons. Effect 1/2/3 select buttons. Advanced/Chained toggle button. Random button associated with the Dry/Wet knob. FX Unit selectors on the EQ section for FX unit 1/2 | Good |
| Reloop Digital Jockey 2 | Y | 3 effect enable/select/parameter knobs per deck | Medium |
| Reloop Digital Jockey 3 Master Edition | Y | Effect enable/select/parameter knob for 2 effects units. 4 FX enable buttons for each deck. | Medium |
| Stanton SCS.1d | Y | Four re-defineable pressable endless knobs each with LED rings, 8-char LCDs, and soft button, plus bank button and preset button section | Perfect+++ |
| Stanton SCS.1m | Y | Four re-defineable pressable endless knobs each with LED rings and 8-char LCDs, plus preset button section | Perfect++ |
| Stanton SCS.3d | Y | Three pages each with three relative or absolute touch sliders (or one jog and one slider) and four soft buttons | Perfect+ |
| Stanton SCS.3m | Y | Four touch sliders (relative or absolute) in FX mode plus four soft buttons, per deck | Perfect |
| Vestax Spin | Y | 2 FX enabled buttons?? WTF | Medium |
| Vestax Typhoon | Y | 2 wet/dry knobs + enabled buttons | Good |
| Vestax VCI-100SE DJTT Edition | Y | Wet-dry, 3-effect parameter knobs per effects unit | Medium |
| Vestax VCI-100 MK2 | Y | 2 effects units, 4 knobs per unit and 4 buttons. FX enable in the mixer section. Shift key addresses up to 4 effects units. | Good |
| Vestax VCI-300 | N | N/A | |
| Xone:DX | Y | Per-deck dry/wet, 3x parameter, knobs. Source select, on/off, tap, beats/free, and effect-select buttons. | Good |
This feature has been attempted twice by two GSoC students. There is a lot of old code lying around, and we will try to reuse whenever possible. The current branch for work on this feature is the lp:~mixxxdevelopers/mixxx/features_effects branch.