Can this be done in Max?..... quick yes/no is appreciated! :)

    Sep 10 2013 | 9:48 am
    Hello everyone, I'm trying to make a special synthesizer in Max. Without talking too much about it, here's what I basically need:
    a max-patch should contain 88 looped recordings playing simultaneously, and each of the recordings should have a dedicated pitch-bend knob (so 88 pitchbendknobs in total).
    another "bigger" (more important) knob sends out midicent values. These values determine which of the 88 recordings are muted, and the values of the pitch bend knobs for the recordings that are still heard.
    example: if midicent value is -8145 mute all recordings except for recording 1, sent value 45 to pitchbend-knob 1.
    Is this possible with relative ease? I know there should be a programming line for each of the +16.000 values of the midicent-knob..
    all comments/ideas are very much appreciated! :)
    EDIT: the big knob should have a lot of steps, midicent has over 16.000 but if I could choose the amount of steps myself that would be great, 8000 is also more than enough...the idea is to make a virtual oscillator out of multiple recordings = a high resolution pitch bend over multiple octaves.

    • Sep 10 2013 | 11:11 am
      most of that is very simple stuff and can be realized with only a few objects.
      except making a control GUI with a resolution 16,000 steps, this is impossible.
      you dont even have so many pixels with 4 30" screens.
      you would have to do what motorola devs do on hardware synths since 25 years, and give the user 2 control knobs: one for note, and one for fine pitch.
    • Sep 10 2013 | 11:16 am
      thank you for your reply. Are you sure it's impossible? This knob would be controlled by a real hardware knob. I will not use any screen/interface. I heard of midicents, so I thought it would be possible..
    • Sep 10 2013 | 11:53 am
      you can have 16000 steps of control, what Roman says is that it won't be displayed clearly. If you need no ui, no problem. If you need ui, i suggest some other ways of displaying datas than a lot of on/off switches :) liek a color map or something... examples here
    • Sep 10 2013 | 11:58 am
      if your hardware knob supports that resolution, and if the connection to the computer does it, too, then it is possible. actually i just wonder if it really will make sense.
      and when it comes to midicents, while it is possible to think and work in midicents, it is not very straight forward to use midi type data within the program. you can use regular floating point numbers and get far better results. the idea of midi cents also doesnt seem to fit to the idea of using a hardware controller which supports such a high resolution. :)
    • Sep 10 2013 | 12:12 pm
      Hello, thank you very much for the comments! Actually I don't need it to be midi...haha :)
      2 question, if I may:
      1. is it possible to do all programming (few thousand lines) in some sort of text document, or would I need to make thousands of boxes with thousands of wires?...
      2. will an average computer be fast enough to follow the fast movements of the knob, 1 fast turn will give thousands of messages...
      thank you guys!
    • Sep 10 2013 | 12:49 pm
      1. programming always happens using objects and connections. the application you describe above will require maybe like 350 of them.
      2. the computer will always be faster then the data input from a controller can ever be, even if it is a 10gbit ethernet or usb3 controller. if you use this input to control 20 targets you might reach the border sooner or later. but this isnt a oproblem in practice, because where such a fast stream of state changes is wanted, you would just limit the input and convert it to an audio signal, where you interpolate it again. any 15 years old computer should be able to transport a few dozen messages from one object the other within one millisecond.
    • Sep 10 2013 | 12:57 pm
      1) Why do you think there'll be that many boxes and wires? 1) How do you know how many lines of code, and which text document are you talking about?
      2) Can't see why not, if programmed well. I can, however, tell you that it'll be nigh-on impossible to control. Pitch AND waveform selection in the same knob??
    • Sep 10 2013 | 1:01 pm
      thanks again, I understand I will need many objects an connections. I can picture myself how the patch would look like, except for the high resolution knob. Let's say it will contain 8000 steps, will I need to make 8000 boxes? (1 box for every value) or can this be done differently (like a large script in a single box)? I could of course make less steps but then the quality of the pitch bend will be less...
      If you could just answer this last question, I'm a happy man :)
    • Sep 10 2013 | 1:01 pm
      You can also use Javascript, Java, and/or C for building custom objects. You can (as a general principle) write code to have one box do the work of 50 or 500 or however-many-you-need standard boxes (depending on how you design your custom object).
      As to (2): message handling in Max can incur a relatively high overhead. The magic Max does with message passing and symbol look-up doesn't come for free. In most cases, however, you never notice it. If, however, a single manual gesture (i.e., twisting a physical knob) produces, say, 1,000 messages in a fraction of a second, Max/MSP may possibly get a bit overwhelmed. At that point, Max will start taking some shortcuts. For instance, a graphical object representing the physical knob won't actually get redrawn 1,000 times; Max will probably skip 999 of the redraw operations and only perform the last one (and, with any luck, nobody will notice the difference). You can possibly do some limitation of processing in a similar vein in your own patching and/or coding.
      But this discussion is now getting extremely hypothetical. The short answer to your original question is simple and "yes." The less simple question is "how" and the best way to answer that is to start work. When you hit a wall with your computer, then the question will be how to work around (or under, or over, or through) that wall. But first you need to have a concrete patch to talk about.
    • Sep 10 2013 | 1:19 pm
      thanks again for all comments : ) just to clarify, here's my idea as it may be of interest to some of you:
      I'm trying to build a digital "ondes martenot" (ring controller only), real ones are rather expensive. Some people already tried, but the digital oscillators never have the same quality from the real analog ones.
      Using a controller like the french-connection with an analog synth is not really an option. The ondes martenot used vacuum tubes and their warmth (which was also find on old theremins, trautoniums, novachords) is simply unparalleled. There is a reason why these instruments were used in compositions of great classical composers.
      There are good sample libraries, but the problem is that glissandi easily sound synthetic because a same sample ( a same recorded note) is stretched to make the effect. The single notes do sound very good.
      That's why I started to wonder if it would be possible to start from samples (chromatically recorded notes) but make some kind of script that uses MULTIPLE samples when making big glissandi, just like "morphing" from a sample into the one a semitone lower or higher when making the this case the largest (worst) stretch is only a quartone, resulting in a very realistic sounding glissando..
      example: after stretching note D# a quartertone up it will change to sampled note E stretched a quartertone down. To avoid sudden changes in tone, there should be a crossfade... ... ...
      : )
    • Sep 10 2013 | 2:20 pm
      you dont need boxes for the resolution of the 8000 steps, but you might want to
      1.) receive the incoming data 2.) thin it out 3.) delete repeating numbers 4.) make sure that really only values between 0 and 8000 are contained 4.) convert the linear ("midicents") to range to playspeed in order to pitch wave loops 5.) convert the pitch control data to audio and smooth the values
      and then, in maxmsp, this could like like this:
      [ourcompany.ourusbcontroller] | [speedlim 25.] | [change 0] | [clip 0 8000] | [expr exp(0.057762265*($f1-60.))] | [line~ 25.] | your cool waveplayer here.
      now you would copy that 10 times for you 10 channels you want to be played.
      or you´d save that to disk and then open the complete thing as new object.
      in my opinion still a lot less work than writing an application in C++, where defining the variables and constants alone would require to write these five words, ;)
    • Sep 11 2013 | 12:08 am