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.

438 lines
17KB

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