Creating an Audio Mixing Desk in MAX/MSP????????


    Feb 15 2006 | 2:22 pm
    To be honest i'm fairly new to max and i think im trying to create something thats beyond me. As part of a project im tryin to create a patch which simulates a mixing desk. The desk should have volume controls, panning controls and EQ controls, as well as effects such as reverb. Ive started to construct a patch which enables you to load a sample and vary volume......and thats it.
    I'd be very grateful if someone out there knows of a tutorial knocking about that may assist me.
    Has anyone done this before?
    cheers
    birdy

    • Feb 15 2006 | 3:12 pm
      That is pretty easy to do, I have done several in the past.
      Question for you - what hardware (# ins and outs) are you planning to use with this - or are you going to be mixing samples?
      I am unable to find any examples right now, but I will try to remember and look later tonight. I know I have small premade mixer components from a project I worked on.
      The simplest way to start is to construct a 1 channel mixer with some components you want to have. Use a volume slider, put in your IO and go from there adding pieces slowly, testing each alogn the way.
      Nick
    • Feb 15 2006 | 3:16 pm
      On 15 Feb 2006, at 14:22, Steve Birds wrote:
      > Has anyone done this before?
      Oh, I've made a few Max/MSP multi-in, multi-out mixers in my time - about two a year, on average, of various flavours, not counting numerous specialised submixing components. I'm sure lots of other folks here have done them as well.
      Have a look at matrix~, have a play with send~/receive~ in combination with signal faders, and the basic idea should emerge from there.
      -- N.
      nick rothwell -- composition, systems, performance -- http:// www.cassiel.com
    • Feb 15 2006 | 3:27 pm
      Hello
      I have started a project of building a mixer in Max. It's not that dificult.
      Just create a signal path as follows:
      Audio in -> plugin's (vst or created by you) -> aux sends -> pan and volume -> group select -> audio out
      I put this in a patch and then a just crate a bpatcher and duplicate it the number of times necessary (number of tracks i want). Then i have some master faders and a aux master faders.
      The most dificult part is the plug-ins. My aproach was through scripting. I created a script for each plug-in selection that creates the plug-in object (that i made or else a vst) and then makes all the appropriate connections. For the rest just use a ready-me fader from max and build a panner or download one from somewhere.
      After this you can create some midi routing and use a external midi controler to control all the faders and knobs.
      good luck
      Miguel
    • Feb 15 2006 | 6:21 pm
      Check Matthew Aidekman's Matsui interface objects - lot's of mixer based goodness.
    • Feb 15 2006 | 6:56 pm
      that url does not seem to work.
    • Feb 15 2006 | 8:04 pm
      > that url does not seem to work.
      You'll have to copy and paste it into your browser.
      cheers
      w
    • Feb 15 2006 | 9:09 pm
      On Feb 15, 2006, at 10:16 AM, Nick Rothwell wrote: > Oh, I've made a few Max/MSP multi-in, multi-out mixers in my time
      Same here. Although I have never successfully developed a proper "solo" function. Anyone out there figured this one out and have some tips?
      ----- Nathan Wolek nw@nathanwolek.com http://www.nathanwolek.com
    • Feb 15 2006 | 9:36 pm
      How about this solo statement:
      if someone else is soloing (1) and I am soloing (1) then play (1) if someone else is not soloing (0) and I am not soloing (0) then play (1) If someone else is not soloing (0) and I am soloing (1) then play (1) If someone else is soloing (1) and If I am not soloing (0) then (0)
      If $i1 == 1 && $i2 == 1 then 0 else 1
      One fader patch:
      Put in bpatchers with a series of arguments
      (might want to use the mute~ object instead or in addition to the gate to free up some DSP.)
    • Feb 15 2006 | 9:43 pm
    • Feb 15 2006 | 10:04 pm
      Quote: lists@lowkeydigitalst wrote on Wed, 15 February 2006 15:09 ---------------------------------------------------- > On Feb 15, 2006, at 10:16 AM, Nick Rothwell wrote: > > Oh, I've made a few Max/MSP multi-in, multi-out mixers in my time > > Same here. Although I have never successfully developed a proper > "solo" function. Anyone out there figured this one out and have some > tips? > > ----- > Nathan Wolek > nw@nathanwolek.com > http://www.nathanwolek.com > > ----------------------------------------------------
      Check out MatSui. Nice little Solo/mute patcher included.
      Tom
    • Feb 15 2006 | 11:50 pm
      Do everything using matrix~. Solo is basically a matter of multiplying the list by 0 0 0 0 1 0 0 0, etc. where 1 is on the channel you want to solo.
      I have an object that converts lists into matrix~ coeffs in a very efficient manner if you're interested.
      Peter McCulloch
      P.S. I also have a very handy abstraction that does volume and panning from two multisliders. Contact me off-list if you'd like them.
    • Feb 16 2006 | 12:24 am
      Alright, had some time to kill. Here's a solution to the soloing problem. Please note that you'll need the two objects in addition to the example patch. Everything's easier with vexpr + scalarmode.
      best,
      Peter McCulloch
      ________________ Example patch ________________
      -------------------------------- PM.MatrixSetInlet ---------------------------------
      _________________ PM.MatrixSetOutlet _________________
    • Feb 16 2006 | 3:24 am
      I built an 8x2 mixer for my thesis. You can download the documentation and a runtime at http://homepages.nyu.edu/~jsa226
      It boasts the following features:
      �PPM meters with marked scale and continuous, 3s, or infinite peak hold �VU meters with adjustable 0VU point, adjustable ballistics, numeric readout with continuous, 3s, or infinite peak hold �PPM & VU meters can be pre or post-fader �Meter options set in preferences dialog (Apple+,) �Transport controller (Apple+1) with start/pause (spacebar), RTZ (return), loop on/off (Shift+Apple+L) �panpot with shortcut buttons for L, C, R �Autopan - specify the destination value, and the duration, and clicking start will start an automated pan. Automated pans can also be paused and resumed. �Autofade - specify the destination value, and the duration, and clicking start will start an automated fade. Automated fades can also be paused and resumed. �Group panning - pairs of channels can have their pans follow each other �Inverse group panning - pan one channel in a pair to the left, and the other channel in the pair moves proportionately to the right �Group automation - Autopan and Autofade work in group and inverse group modes �Group faders - pairs of channels can have their faders follow each other �Inverse group faders - fade one channel in a pair up, and the other channel in the pair fades down (linear relationship) �Fader shortcuts - buttons to quickly move a fader to 0 or unity �EQ - 4-band EQ on each channel and master fader with on/off �Mute/Solo - each fader can be muted or soloed *Note that while this can be used with paired channels, it is a bit problematic. My plan is to recode this to use Java, which will make it more efficient and less prone to bugs. �Dim - master fader has a dim button for reducing volume by 10dB �sfplay~ - each channel has a sfplay~ object (note that transport looping will only work effectively if all audio files are of the same duration)
      Take a look at it and give me your feedback if you are so inclined.
      -Jonathan
    • Feb 16 2006 | 6:57 pm
      [QUOTE]> that url does not seem to work.
      You'll have to copy and paste it into your browser.
      cheers[/QUOTE]
      I did that originally, i meant that the page could not be found type of url does not work.
      EDIT: It seems to be working as of 2/16/2006 @ 1400 EST
    • Mar 01 2006 | 3:20 pm
      hi,
      just looking at this example patch you sent for a solo function a little more...
      i tried putting this patch without modifying it into two bpatchers, with my sound sources running into them, but then the solo function doesn't work anymore. i'm assuming i need to change the formula If $i1 == 1 && $i2 == 1 then 0 else 1
      could you point me in the right direction on how to use this in multiple instances?
      thank you very much!
      alexandra
    • Mar 06 2006 | 10:36 pm
      looking at this channel strip soloing patch a little more... it seems to work great except for when two or more channels are soloing and you then un-solo one of them. all of the channels then start playing back again, instead of just the one that still has solo engaged...
      > if someone else is soloing (1) and I am soloing (1) then play (1) if > someone else is not soloing (0) and I am not soloing (0) then play (1) > If someone else is not soloing (0) and I am soloing (1) then play (1) > If someone else is soloing (1) and If I am not soloing (0) then (0) > > If $i1 == 1 && $i2 == 1 then 0 else 1
      has anyone else experimented with this solo function, and found a way around this problem?
      and thanks for the hint, veaseyc!
      alex
      included is my stereo version...
    • Mar 08 2006 | 8:48 pm
      looking at this channel strip soloing patch a little more... it seems to work great except for when two or more channels are soloing and you then un-solo one of them. all of the channels then start playing back again, instead of just the one that still has solo engaged...
      > if someone else is soloing (1) and I am soloing (1) then play (1) if > someone else is not soloing (0) and I am not soloing (0) then play (1) > If someone else is not soloing (0) and I am soloing (1) then play (1) > If someone else is soloing (1) and If I am not soloing (0) then (0) > > If $i1 == 1 && $i2 == 1 then 0 else 1 >
      has anyone else experimented with this solo function, and found a way around this problem?
      and thanks for the hint, veaseyc!
      alex
      included is my stereo version...
      On Feb 15, 2006, at 10:36 PM, veaseyc@bgnet.bgsu.edu wrote:
      > How about this solo statement: > > if someone else is soloing (1) and I am soloing (1) then play (1) if > someone else is not soloing (0) and I am not soloing (0) then play (1) > If someone else is not soloing (0) and I am soloing (1) then play (1) > If someone else is soloing (1) and If I am not soloing (0) then (0) > > If $i1 == 1 && $i2 == 1 then 0 else 1 > > > One fader patch: > > Put in bpatchers with a series of arguments > > (might want to use the mute~ object instead or in addition to the gate > to free up some DSP.) > > > max v2; > #N vpatcher 26 168 1040 840; > #P window setfont "Sans Serif" 9.; > #P window linecount 1; > #P hidden newex 358 522 64 196617 r masterfad; > #P hidden newex 265 547 44 196617 *~ 1.; > #P window setfont "Sans Serif" 12.; > #P flonum 246 452 41 12 0 0 96 3 255 255 255 0 0 0 222 222 222 0 0 0; > #P window setfont "Sans Serif" 9.; > #P hidden newex 169 423 34 196617 atodb; > #P window setfont "Sans Serif" 10.; > #P flonum 246 436 41 10 0 0 160 3 255 255 255 0 0 0 222 222 222 0 0 0; > #P window setfont "Sans Serif" 9.; > #P newex 13 215 60 196617 loadmess 0; > #P newex 523 400 60 196617 loadmess 0; > #P newex 445 435 50 196617 pak $1 0; > #P newex 552 130 51 196617 zl slice 1; > #P newex 513 103 50 196617 route $1; > #P toggle 445 393 15 0; > #P toggle 115 416 15 0; > #P hidden toggle 399 231 15 0; > #P newex 315 196 29 196617 gate; > #P newex 552 160 27 196617 t b i; > #P newex 399 189 180 196617 if $i1 == 0 && $f2 == 1 then 0 else 1; > #P newex 41 89 72 196617 loadmess 128; > #P newex 178 133 57 196617 r muteALL; > #P hidden outlet 265 581 15 0; > #P newex 513 72 36 196617 r solo; > #P newex 115 329 27 196617 !- 1; > #N comlet signal; > #P inlet 272 130 15 0; > #P newex 247 218 35 196617 gate~; > #P newex 115 299 62 196617 route toggle; > #P window setfont Arial 12.; > #P user ubumenu 246 278 41 131137548 1 0 1 1; > #X setrgb 255 255 255 140 140 140 234 234 234 4 4 4 254 10 10 112 > 112 112; > #X add mute; > #X prefix_set 0 0 0; > #P user ubumenu 246 296 41 131137548 1 0 1 1; > #X setrgb 255 255 255 140 140 140 234 234 234 4 4 4 254 10 10 112 > 112 112; > #X add solo; > #X prefix_set 0 0 0; > #P user gain~ 263 314 24 100 158 0 1.071519 7.94321 10.; > #P user meter~ 246 314 264 436 50 0 168 0 103 103 103 255 153 0 255 > 0 0 > 217 217 0 153 186 0 12 3 3 3 3; > #P window setfont "Arial Black" 12.; > #P comment 243 256 58 791478284 CH $1; > #P window setfont "Sans Serif" 9.; > #P newex 445 469 36 196617 s solo; > #P user panel 237 251 59 231; > #X brgb 154 165 176; > #X frgb 0 0 0; > #X border 1; > #X rounded 0; > #X shadow 0; > #X done; > #P newex 445 331 62 196617 route toggle; > #P window linecount 7; > #P comment 712 102 218 196617 if someone else is soloing (1) and I am > soloing (1) then play (1) if someone else is not soloing (0) and I am > not soloing (0) then play (1) If someone else is not soloing (0) and I > am soloing (1) then play(1) If someone else is soloing (1) and If I am > not soloing (0) then (0) If $i1 == 1 && $i2 == 1 then 0 else 1; > #P hidden connect 8 2 9 0; > #P connect 27 0 12 0; > #P connect 9 0 12 0; > #P connect 12 0 21 0; > #P hidden connect 5 0 29 0; > #P hidden connect 6 0 5 0; > #P hidden connect 29 0 28 0; > #P fasten 12 0 10 0 194 346 194 192 252 192; > #P hidden connect 15 0 10 0; > #P fasten 19 0 10 0 320 215 252 215; > #P hidden connect 16 0 6 0; > #P hidden connect 10 0 6 0; > #P hidden connect 6 0 31 0; > #P hidden connect 31 0 14 0; > #P connect 11 0 10 1; > #P hidden fasten 32 0 31 1 297 539; > #P fasten 12 0 19 0 84 346 84 184 320 184; > #P hidden fasten 20 0 19 1 339 188; > #P fasten 18 0 17 0 404 177; > #P fasten 23 0 17 0 413 120; > #P connect 17 0 20 0; > #P hidden connect 7 2 1 0; > #P connect 1 0 22 0; > #P connect 25 0 3 0; > #P connect 26 0 25 1; > #P connect 22 0 25 1; > #P connect 13 0 23 0; > #P connect 23 1 24 0; > #P connect 24 1 18 0; > #P connect 18 1 17 1; > #P pop; > > >
    • Mar 08 2006 | 9:25 pm
      Allow me to once again request the setrow and setcolumn messages for matrix~. This object is perhaps one of the most useful (and efficient!) in Max, but the addition of these features would greatly improve users' interactions with the object. (having to specify every inlet, outlet, etc.)
      I sent an implementation about a month ago to the list using vexpr + matrix~. Vexpr is definitely the easiest, and cleanest way of implementing this because it doesn't require any talkback between channels. It's just a matter of setting up the right multiplication between volume lists.
      Basically, how it works... (there's some additional logic required for deriving the soloing bits, but that's included in the code I sent earlier)
      Volumes 1. 0.5 0.2 0.4 (channels 1-4)
      solo channel 2 = 0 1 0 0
      1. 0.5 0.2 0.4 x 0. 1. 0. 0. ____________________ 0. 0.5 0. 0.
      mute channel 3 = 1 1 0 1
      It doesn't do mute right now, (but that is trivial to add once you see the solo code), but it is way faster than any implementation using individual abstractions for channels. Through a cascade~ before each inlet, and now you have your eq.
      Peter McCulloch