![]() |
Groups serve several purposes. Firstly, they allow for some organization of strips. Groups also allow parallel relationships of mixer strips to be made explicit. This has important performance implications in JACK2. Non Mixer supports an unlimited number of groups, each of which can contain an unlimited number of mixer strips.
-All strips in a group should be completely parallel with no feedback loop connections. A typical group might be named 'Input' and contain all input strips (strips that accept input from Non Timeline and have outputs all connecting to some master bus).
To put it another way, if you have 100 inputs strips with identical output configurations (e.g. stereo or B-Format), that all connect to a master bus, then you have a candidate for a group.
-JACK provides immense flexibility. But, as in most situations, that flexibility comes with a cost. In JACK the cost is a context switch per client. This applies even for many clients which belong to the same process, as in Non Mixer. Various factors go into determining the price of a context switch on any given system. It's not very expensive, but it does add up. It becomes problematic in sessions involving many clients (think 100s), each of which having a small DSP load (often smaller than the cost of JACK's context context switch). JACK could be smart enough to recognize that some clients belong to the same process and could be executed serially without requiring a context switch, but at the time of writing neither JACK1 nor JACK2's scheduling is that smart.
@@ -120,7 +124,7 @@ Groups mitigate this cost by reducing the number of JACK clients required for a To illustrate this point here are some figures from an actual song session including the whole Non suite plus a sampler, a synth and an ambisonics convolution reverb with a total of 13 strips in 4 groups in different configurations on the same system.-JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph \(if there are enough clients in parallel signal flow\). +JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph (if there are enough clients in parallel signal flow).
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms) @@ -171,23 +175,30 @@ Of course, results will vary depending on the system and the mix. On the dual co
So, for maximum capacity the combination of a multicore CPU with JACK2 and mixer groups is best.
-Groups can be created by selecting the group dropdown on any mixer strip and choosing 'New Group'. A window will popup asking for a group name. Group names must be unique. The group will then be created and the selected strip added to it.
-To add a strip to an existing group, simply select a group name from the group dropdown on the strip.
-Select '---' from the group dropdown. The strip will be removed from the group and will run in an independent JACK client.
-Groups are destroyed automatically as soon as they contain zero strips.
-+Above the grop dropdown on each strip is a DSP load meter for the selected group. For ungrouped strips or strips which are the only one in their group, this is simply the DSP load of the single strip. +
++If DSP usage goes up when strips are fed silence, then you're probably running a plugin which has denormal issues. +
+![]() |
![]() |
The Module Parameter Editor is used to alter the values of a module's parameters, and in addition, to bind its parameters to controls. A menu button in the upper left-hand corner allows you to select between knob, vertical slider and horizontal slider controls.
-![]() |
![]() |
Underneath each control is a bind button. Clicking adds a new control to the chain's Controls view and binds it to the parameter in question. For simplicity, only one control at a time may be bound to a given parameter.
-![]() |
![]() |
The control view of a chain groups together all of the controls bound to parameters of modules in that chain. The default mode of controls is Manual. Right click on a control to bring up a menu which will allow you to select one of the available control I/O methods to use. When Control Voltage (CV) is selected, a CV input port will be created on the containing mixer strip's JACK client. The control will now accept values from that input. A control bound and configured in this way can then be connected to the output of a Non-DAW control sequence using your favorite connection manager. @@ -355,7 +356,7 @@ events. Hold down the `Ctrl` key while scrolling the mousewheel to achieve finer resolution.
The control voltage concept should be familiar to anyone who has experience with analog modular synthesizers. MIDI, while having definite advantages in many respects, multiplexes control data in such a way as to make connecting one MIDI control to a parameter involve a significant inconvenience, usually requiring the adjustment of settings on both ends of the connection in order to separate the control data streams.
@@ -374,23 +375,71 @@ of parameter automation, as LADSPA plugins are incapable of processing Control Voltage signals at full audio resolution anyway.![]() |
+The Spatializer Module included with Non Mixer allows one to not only control the position of a sound source (angle and elevation), but also to control it's apparent distance from the listener. +
++Distance cues are based on physical properties--the speed of sound in air, the damping effect of humidity, the ratio of reverb early and late reflections, the volume of the sound. +
++In legacy mixers, all of these properties must be controlled individually by the engineer. This is nearly always a process of trial and error. Much of a studio engineers' skill lies in his ability to guess at these values and arrive at a reasonably realistic sounding result. +
++Non Mixer eliminates the guesswork and combines all of these controls into a single spatialization point encoding both a sound source's position relative to the listener and its distance. No matter where the point is placed, the result will be realistic. +
++Use of the Spatializer Modules eliminates much complexity from the mixing process. No more back and forth, no more guessing at values for reverb sends and predelay and EQ. The Spatializer does it all for you. +
++The B-Format outputs of the Spatializer Module are in the order standard order WXYZ. +
++All Spatializer Module instances will present controls and aziumuth, elevation, and radius. Additionally, a Highpass control is provided to compensate for the proximity effect in close-mic'd signals. The default cutoff is 200Hz. Adjust it according to the nature of the input signal. +
++A Spatializer Module fed stereo input will perform stereo encoding and will present a Width control. +
++The Spatializer module is intended to work with an external reverb engine having Ambisonics B-Format inputs for early reflections and a Mono input for reverb tail (and, of course, B-Format outputs). +
+![]() |
+The Spatializer Module has two sets auxiliary outputs for reverb send. One, consisting of a single mono signal, is intended to be connected to the input of a reverb tail, otherwise known as a diffuse field. Another set of outputs in B-Format is indended to be connected to the B-Format inputs of an early reflection reverb engine. The output of the reverb engine should be 100% 'wet'. +
++I have crafted several jconvolver config files that meet these specifications. They can be found in ambiverb.tar.bz2 +
++The main outputs of the strip should go to a master bus, into which the output of the reverb engine is also fed. +
++There are several Ambisonics panners/encoders released as LADSPA plugins. When one of these plugins is added to a strip, Non Mixer will detect its parameter signature and create a Spatialization Control for it just as with the Spatializer Module. +
+![]() |
![]() |
-Non-Mixer supports Ambisonic spatialization via the excellent amb-* LADSPA plugin set and others. Whenever a LADSPA plugin is added to a strip whose set of parameters include parameters named Azimuth and Elevation, Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor. +Whenever a module is added to a strip whose set of parameters include parameters named Azimuth and Elevation (and perhaps Radius), Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
-![]() |
![]() |
The spatialization control may be visualized as moving the sound source across the surface of a hemispherical dome enclosing the listener. @@ -398,7 +447,23 @@ The spatialization control may be visualized as moving the sound source across t
The output of the spatializing plugin may be routed into a decoding plugin following it the same strip or, more usefully, the output of a number of Ambisonic panning plugins on different strips may be routed (through JACK) into a single master decoder instance on a final strip.
-![]() |
+The Spatialization Console allows the user to view and control all of the source positions in an Ambisonics mix at once. +
++The visibility of the Spatialization Console may be toggled with the F8 key. +
++The console will display a point for each Spatializer Module or other Ambisonics panner plugin contained in the mix. +
++There are two projections available, Planar and Spherical. The range of the view can be adjusted with the range dropdown in the lower lefthand corner. +
+A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, project specific settings, and some meta-data. A project is completely self-contained. You can rename a project as simply as:
@@ -406,7 +471,7 @@ A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, pro $ mv Project-A Project-BEach mixer strip is presented as a separate JACK "client". This helps to avoid the necessity of internally duplicating JACK's routing logic and, with JACK2, permits the possibility of parallel execution of mixer strip signal chains.
@@ -420,12 +485,12 @@ The JACK API makes implementing this far more difficult and kludgey than it shou Please petition your local JACK developer to accept jack_client_set_name() into the API.![]() |
![]() |