Assists music production by grouping standalone programs into sessions. Community version of "Non Session Manager".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

540 lines
21KB

  1. ! title Non Mixer User Manual
  2. ! author Jonathan Moore Liles #(email,male@tuxfamily.org)
  3. -- Table Of Contents
  4. : Non Mixer User Manual
  5. / Mixer
  6. < non-mixer-complex.png
  7. The Non-Mixer is a stand-alone audio mixer, utilizing JACK as an
  8. audio subsystem. At the time of writing, the architecture of
  9. Non-Mixer is unique. By making the mixer stand-alone, concepts such
  10. as busses, sends, and inserts are eliminated, as the same goals can
  11. be achieved by simply adding more strips to the mixer.
  12. Start by creating a new project (menu item `Project\/New`).
  13. / New Project
  14. < new-project.png
  15. After the project has been created. Hit `a` or choose `Mixer\/Add
  16. Strip` from the menu to add a new strip to the mixer.
  17. :: Mixer Groups
  18. < group-dropdown.png
  19. Groups serve several purposes. Firstly, they allow for some
  20. organization of strips. Groups also allow parallel relationships of
  21. mixer strips to be made explicit. This has important performance
  22. implications in JACK2. Non Mixer supports an unlimited number of
  23. groups, each of which can contain an unlimited number of mixer
  24. strips.
  25. ::: How to Choose Groupings
  26. All strips in a group should be completely parallel with no feedback
  27. loop connections. A typical group might be named 'Input' and contain
  28. all input strips (strips that accept input from Non Timeline and
  29. have outputs all connecting to some master bus).
  30. To put it another way, if you have 100 inputs strips with identical
  31. output configurations (e.g. stereo or B-Format), that all connect to
  32. a master bus, then you have a candidate for a group.
  33. ::: Considering JACK Overhead
  34. JACK provides immense flexibility. But, as in most situations, that
  35. flexibility comes with a cost. In JACK the cost is a context switch
  36. per client. This applies /even for many clients which belong to the
  37. same process/, as in Non Mixer. Various factors go into determining
  38. the price of a context switch on any given system. It's not very
  39. expensive, but it does add up. It becomes problematic in sessions
  40. involving many clients (think 100s), each of which having a small
  41. DSP load (often smaller than the cost of JACK's context context
  42. switch). JACK *could* be smart enough to recognize that some clients
  43. belong to the same process and could be executed serially without
  44. requiring a context switch, but at the time of writing neither JACK1
  45. nor JACK2's scheduling is that smart.
  46. If you're mixing a normal song (couple of dozen tracks) at low
  47. latency, this overhead will probably account for less than 1% of the
  48. total DSP load. If you're mixing an entire orchestra at ultra-low
  49. latency, then it might account for a quarter or more of the total
  50. DSP load.
  51. Groups mitigate this cost by reducing the number of JACK clients
  52. required for a mix. Strips in a group will execute serially without
  53. context switches or thread synchronization--reducing the total JACK
  54. overhead. However, if you have several groups, then they may all by
  55. run in parallel by JACK2.
  56. A mixer which uses a single JACK client (which is basically the way
  57. everything other than Non Mixer has been designed) is not a viable
  58. solution by this author's definition, because such a mixer cannot be
  59. from/to any other JACK clients without introducing an extra period
  60. of latency.
  61. To illustrate this point here are some figures from an actual song
  62. session including the whole Non suite plus a sampler, a synth and an
  63. ambisonics convolution reverb with a total of 13 strips in 4 groups
  64. in different configurations on the same system.
  65. JACK's DSP load figures are interpreted thus: if at a 2.7ms software
  66. latency setting the average time a proces cycle takes to complete is
  67. 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is
  68. 80%. This is true for both JACK1 and JACK2. The difference is that
  69. JACK2 may use all available CPU cores to execute the graph (if
  70. there are enough clients in parallel signal flow).
  71. 32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
  72. [[ JACK Ver, Groups, DSP Load
  73. [[ JACK1, N, 39%
  74. [[ JACK1, Y, 27%
  75. [[ JACK2, N, 24%
  76. [[ JACK2, Y, 31%
  77. AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
  78. [[ JACK Ver, Groups, DSP Load
  79. [[ JACK1, N, 28%
  80. [[ JACK1, Y, 12%
  81. [[ JACK2, N, 12%
  82. [[ JACK2, Y, 11%
  83. AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
  84. [[ JACK Ver, Groups, DSP Load
  85. [[ JACK1, N, 29%
  86. [[ JACK1, Y, 17%
  87. [[ JACK2, N, 17%
  88. [[ JACK2, Y, 17%
  89. AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
  90. [[ JACK Ver, Groups, DSP Load
  91. [[ JACK1, N, x
  92. [[ JACK1, Y, x
  93. [[ JACK2, N, 43%
  94. [[ JACK2, Y, 41%
  95. As you can see, for multiprocessor systems, JACK2 clearly has an
  96. advantage even without grouping.
  97. Of course, results will vary depending on the system and the mix. On
  98. the dual core system, performance actually degraded with JACK2 when
  99. using groups--this is because the number of parallel flows that
  100. JACK2 detected was reduced and the second core was being under
  101. utilized. Similarly, the performance of the 8-core AMD system
  102. doesn't seem that great even in the ungrouped mode--this is because
  103. the DSP load of each individual client is around the same as the
  104. cost of the context switching. It's a wash either way (if each strip
  105. had more or more complex modules on it, then the ungrouped mode
  106. would probably perform better). Since JACK1 cannot take advantage of
  107. more than 1 CPU core, there is no benefit to parallelism and grouped
  108. mode always outperforms ungrouped mode.
  109. So, for maximum capacity the combination of a multicore CPU with
  110. JACK2 and mixer groups is best.
  111. # All strips in a group *MUST* have the same output configuration. All
  112. # outputs will be mixed together by identity. That is, the 'AUX \(A\)'
  113. # outputs of each strip will be mixed together into a single 'AUX \(A\)'
  114. # output of the group. A strip within a group whose output
  115. # configuration differs from the group configuration will be marked as
  116. # invalid and will not be executed.
  117. ::: Creating a New Group
  118. Groups can be created by selecting the group dropdown on any mixer
  119. strip and choosing 'New Group'. A window will popup asking for a
  120. group name. Group names must be unique. The group will then be
  121. created and the selected strip added to it.
  122. ::: Adding a Strip to an Existing Group
  123. To add a strip to an existing group, simply select a group name from
  124. the group dropdown on the strip.
  125. ::: Removing a Strip from a Group
  126. Select '---' from the group dropdown. The strip will be removed from
  127. the group and will run in an independent JACK client.
  128. ::: Removing a Group
  129. Groups are destroyed automatically as soon as they contain zero
  130. strips.
  131. ::: Monitoring Group DSP Load
  132. Above the grop dropdown on each strip is a DSP load meter for the
  133. selected group. For ungrouped strips or strips which are the only
  134. one in their group, this is simply the DSP load of the single strip.
  135. If DSP usage goes up when strips are fed silence, then you're
  136. probably running a plugin which has denormal issues.
  137. :: Mixer Strips
  138. / Mixer Strip
  139. < single-strip.png
  140. Each mixer strip has a name and color, each of which may be defined
  141. by the user. Names, but not colors, must be unique. In addition,
  142. each strip has controls to move it left or right (the arrows) in the
  143. display and to remove it entirely (the 'X').
  144. Strips start out in /narrow/ mode, with the /fader/ view
  145. enabled. Click the desired button to toggle the mode or view.
  146. Each strip has a context menu which lists the available options
  147. and their associated key-bindings. To bring up the context menu, `Right
  148. The fader view comprises a large gain control and digital peak meter
  149. indicator. These are automatically connected to the default gain and
  150. meter modules of the strip's signal chain.
  151. To see how an audio signal traveling through this strip will be
  152. processed, switch to its /signal/ view.
  153. ::: Navigation
  154. A strip is focused when you click on it. Focus can be moved among
  155. strips with the `Tab` and `Shift-Tab` keys.
  156. ::: Control
  157. The focused strip can be moved in the display order via the `[` and
  158. `]` keys. `Delete` removes a strip (with confirmation dialog). `n`
  159. and `w` set the focused strip's width to /narrow/ or /wide/,
  160. respectively, and `f` and `s` switch between /fader/ and /signal/
  161. views. The strip's context menu can be invoked without the mouse by
  162. hitting the `Menu` key (assuming your keyboard has one).
  163. ::: MIDI Controllers
  164. Usual Midi bindings can be achieved by launching both non-mixer
  165. and non-midi-mapper through non-session-manager.
  166. non-midi mapper is usually included in non-mixer package.
  167. After launching them through non-session-manager connect JACK-Midi
  168. output to Non-MIDI-Mapper input.
  169. Then you can use 'Start learning', which is accesible through Remote
  170. Control menu of the Mixer. Select desirable control and use MIDI device.
  171. ::: Signal Chain
  172. The signal chain view of a mixer strip provides a way to view and
  173. manipulate the signal processing of a mixer strip.
  174. :::: Modules
  175. / Modules
  176. < modules.png
  177. All signal processing in Non Mixer occurs in /Modules/. Modules are
  178. signal processing abstractions providing ports for audio and control
  179. I\/O and, in addition, some simple user interface. Sink and source
  180. modules carry audio out of and into JACK.
  181. Modules are displayed as named blocks. Some modules (e.g. the Meter
  182. module) may have additional GUI components.
  183. Each module has zero or more audio I\/O ports and zero or more
  184. control ports. Audio routing between modules is handled
  185. automatically. Modules with mono audio configurations (one channel
  186. in, one channel out) can be automatically adjusted to support any
  187. number of discrete channels. Modules with more (related) channels,
  188. however, introduce restrictions on the order in which modules can be
  189. chained.
  190. An indicator in the upper left-hand corner of each module block
  191. indicates whether the module has any parameters bound to controls.
  192. Non Mixer has several built-in modules. They are:
  193. = JACK
  194. = Performs JACK I\/O
  195. = Gain
  196. = Applies gain in dB
  197. = Meter
  198. = Digital Peak Meter
  199. = Mono Pan
  200. = Performs intensity panning of a mono signal into a stereo signal.
  201. = Aux
  202. = Provides auxiliary outputs
  203. = Spatializer
  204. = Provides advanced Ambisonics spatialization with distance simulation.
  205. = Plugin
  206. = Hosts a LADSPA plugin
  207. ::::: OSC Control
  208. The input parameters of all modules are controllable via OSC,
  209. regardless of whether the parameter is set as controllable.
  210. The format of the automatically generated OSC path names is as follows:
  211. > /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]
  212. The UDP port that the OSC server binds to can be set by providing
  213. the `--osc-port` command-line option. Without this option, a random
  214. port will be bound automatically (the exact OSC URL will always be
  215. printed to the console as a line beginning with "OSC: ").
  216. The default path accepts a float value between 0.0 and 1.0 (a
  217. Control Voltage like signal) which will be automatically scaled to
  218. the allowable range of the control.
  219. A path ending in \/unscaled is also available, which accepts exact values,
  220. which will be clamped to the allowable range. For example:
  221. > /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]/unscaled
  222. If same module\/plugin is used twice in a signal chain
  223. (e.g. multiple Gain stages), then a position dependent sequence
  224. number will be appended to the module name. For example, a path
  225. might look like the following:
  226. > /strip/Foo/Gain.1/Gain_(dB)
  227. For the second instance of the Gain module on the strip named 'Foo'.
  228. There's a possibility to get exact OSC path for module controls.
  229. For this you need to switch strip mode to 'Signl', right click a
  230. module, for example 'Gain', and open 'Edit parameters' dialog. OSC
  231. path will be shown in a statusbar of the main window when you
  232. hover a parameter.
  233. Non-DAW accesses these same signals via a more advanced signal
  234. routing layer on top of OSC. Any module parameter is easily
  235. controlled via Control Sequences in Non-DAW without the need to
  236. specify an OSC URL.
  237. ::::: Manipulation
  238. Left-clicking on a module brings up a Module Parameter Editor window
  239. for the selected module.
  240. Right-clicking on a module brings up a context menu allowing you
  241. manipulate the module, as well as to pick a new module to insert
  242. before the selected one in the chain.
  243. Middle-clicking on a module toggles its activation state (the audio
  244. signal will bypass inactive modules).
  245. Control+Right-clicking on a module causes it to be removed from the
  246. chain (modules added by default cannot be removed).
  247. The focused module may also be controlled via the keyboard. `Menu`
  248. brings up the context menu for the focused module. `Space` opens the
  249. module parameter editor, `b` toggles the bypassed state, and
  250. `Delete` removes the module from the chain (without confirmation!).
  251. `Control-X`, `Control-C` and `Control-V`, cut, copy, and paste
  252. modules, respectively. Modules may be copied within or across chain
  253. boundaries. The normal module I\/O constraints also apply to pasted
  254. modules.
  255. ::::: Module Parameter Editor
  256. / Module Parameter Editor
  257. < module-parameter-editor.png
  258. The Module Parameter Editor is used to alter the values of a
  259. module's parameters, and in addition, to bind its parameters to
  260. controls. A menu button in the upper left-hand corner allows you to
  261. select between knob, vertical slider and horizontal slider controls.
  262. Underneath each control is a bind button. Clicking adds a new
  263. control to the chain's /Controls/ view and binds it to the parameter
  264. in question. For simplicity, only one control at a time may be bound
  265. to a given parameter.
  266. ::::: Controls
  267. / Control View
  268. < controls.png
  269. The control view of a chain groups together all of the controls
  270. bound to parameters of modules in that chain. The default mode of
  271. controls is /Manual/. Right click on a control to bring up a menu
  272. which will allow you to select one of the available control I\/O
  273. methods to use. When /Control Voltage/ (CV) is selected, a CV input
  274. port will be created on the containing mixer strip's JACK
  275. client. The control will now accept values from that input. A
  276. control bound and configured in this way can then be connected to
  277. the output of a Non-DAW control sequence using your favorite
  278. connection manager.
  279. { NOTE:
  280. { All knob and slider controls respond to mousewheel
  281. { events. Hold down the `Ctrl` key while scrolling the mousewheel to
  282. { achieve finer resolution.
  283. :::::: Control Voltages
  284. The control voltage concept should be familiar to anyone who has
  285. experience with analog modular synthesizers. MIDI, while having
  286. definite advantages in many respects, multiplexes control data in
  287. such a way as to make connecting one MIDI control to a parameter
  288. involve a significant inconvenience, usually requiring the
  289. adjustment of settings on both ends of the connection in order to
  290. separate the control data streams.
  291. Control Voltages, on the other hand, provide a simple 1:1 source to
  292. sink relationship and offer much higher resolution, both in time and
  293. value, than can be natively expressed through MIDI. The chief
  294. advantage of CV in the context of Non-DAW is the ease with which an
  295. control sequence can be connected to a mixer module parameter. If
  296. you have a MIDI controller that you'd like to use to control
  297. parameters of Non-Mixer, consider /jm2cv/, a JACK MIDI to Control
  298. Voltage daemon which was written by Peter Nelson specifically for
  299. use with Non-Mixer. jm2cv can be acquired by:
  300. > git clone git://fuzzle.org/jm2cv.git
  301. { NOTE:
  302. { The use of Control Signals (OSC) should be preferred for most types
  303. { of parameter automation, as LADSPA plugins are incapable of
  304. { processing Control Voltage signals at full audio resolution anyway.
  305. ::::: Spatialization
  306. :::::: Spatializer Module
  307. < spatializer-module.png
  308. The Spatializer Module included with Non Mixer allows one to not
  309. only control the position of a sound source (angle and elevation),
  310. but also to control it's apparent distance from the listener.
  311. Distance cues are based on physical properties--the speed of sound
  312. in air, the damping effect of humidity, the ratio of reverb early and
  313. late reflections, the volume of the sound.
  314. In legacy mixers, all of these properties must be controlled
  315. individually by the engineer. This is nearly always a process of
  316. trial and error. Much of a studio engineers' skill lies in his
  317. ability to guess at these values and arrive at a reasonably
  318. realistic sounding result.
  319. Non Mixer eliminates the guesswork and combines all of these
  320. controls into a single spatialization point encoding both a sound
  321. source's position relative to the listener and its distance. No
  322. matter where the point is placed, the result will be realistic.
  323. Use of the Spatializer Modules eliminates much complexity from the
  324. mixing process. No more back and forth, no more guessing at values
  325. for reverb sends and predelay and EQ. The Spatializer does it all
  326. for you.
  327. The B-Format outputs of the Spatializer Module are in the order
  328. standard order WXYZ.
  329. All Spatializer Module instances will present controls and aziumuth,
  330. elevation, and radius. Additionally, a /Highpass/ control is
  331. provided to compensate for the proximity effect in close-mic'd
  332. signals. The default cutoff is 200Hz. Adjust it according to the
  333. nature of the input signal.
  334. A Spatializer Module fed stereo input will perform stereo encoding
  335. and will present a /Width/ control.
  336. ::::::: Reverb Routing
  337. The Spatializer module is intended to work with an external reverb
  338. engine having Ambisonics B-Format inputs for early reflections and a
  339. Mono input for reverb tail (and, of course, B-Format outputs).
  340. < reverb-routing.png
  341. The Spatializer Module has two sets auxiliary outputs for reverb
  342. send. One, consisting of a single mono signal, is intended to be
  343. connected to the input of a reverb tail, otherwise known as a
  344. diffuse field. Another set of outputs in B-Format is indended to be
  345. connected to the B-Format inputs of an early reflection reverb
  346. engine. The output of the reverb engine should be 100% 'wet'.
  347. I have crafted several jconvolver config files that meet these
  348. specifications. They can be found in #(url,http:\/\/non.tuxfamily.org\/ambiverb.tar.bz2,ambiverb.tar.bz2)
  349. The main outputs of the strip should go to a master bus, into which
  350. the output of the reverb engine is also fed.
  351. :::::: LADSPA Plugins
  352. There are several Ambisonics panners\/encoders released as LADSPA
  353. plugins. When one of these plugins is added to a strip, Non Mixer
  354. will detect its parameter signature and create a Spatialization
  355. Control for it just as with the Spatializer Module.
  356. / Spatialization Control on a Strip
  357. < spatialization-on-strip.png
  358. Whenever a module is added to a strip whose set of parameters
  359. include parameters named Azimuth and Elevation (and perhaps Radius),
  360. Non-Mixer will detect this and automatically attach a Spatializer
  361. control to these parameters. The Spatializer will be displayed at
  362. the bottom of the mixer strip. A larger version of the control may
  363. also be found in the Module Parameter Editor.
  364. / Spatialization Control in the Module Parameter Editor
  365. < spatialization-in-mpe.png
  366. The spatialization control may be visualized as moving the sound
  367. source across the surface of a hemispherical dome enclosing the
  368. listener.
  369. The output of the spatializing plugin may be routed into a decoding
  370. plugin following it the same strip or, more usefully, the output of
  371. a number of Ambisonic panning plugins on different strips may be
  372. routed (through JACK) into a single master decoder instance on a
  373. final strip.
  374. :: Spatialization Console
  375. < spatialization-console.png
  376. The Spatialization Console allows the user to view and control all
  377. of the source positions in an Ambisonics mix at once.
  378. The visibility of the Spatialization Console may be toggled with the `F8` key.
  379. The console will display a point for each Spatializer Module or
  380. other Ambisonics panner plugin contained in the mix.
  381. There are two projections available, Planar and Spherical. The range
  382. of the view can be adjusted with the range dropdown in the lower
  383. lefthand corner.
  384. :: Projects
  385. A Non-Mixer project is a directory where Non-Mixer keeps the strip
  386. settings, project specific settings, and some meta-data. A project
  387. is completely self-contained. You can rename a project as simply as:
  388. > $ mv Project-A Project-B
  389. ::: JACK I/O
  390. Each mixer strip is presented as a separate JACK "client". This
  391. helps to avoid the necessity of internally duplicating JACK's
  392. routing logic and, with JACK2, permits the possibility of parallel
  393. execution of mixer strip signal chains.
  394. The JACK client name of each strip will correspond to the name of the strip.
  395. { NOTE:
  396. { The JACK API makes implementing this far more difficult and kludgey than it should have to be.
  397. { Please petition your local JACK developer to accept jack_client_set_name() into the API.
  398. / Patchage
  399. < non-mixer-and-non-daw-in-patchage.png