Loopy Pro: Create music, your way.

What is Loopy Pro?Loopy Pro is a powerful, flexible, and intuitive live looper, sampler, clip launcher and DAW for iPhone and iPad. At its core, it allows you to record and layer sounds in real-time to create complex musical arrangements. But it doesn’t stop there—Loopy Pro offers advanced tools to customize your workflow, build dynamic performance setups, and create a seamless connection between instruments, effects, and external gear.

Use it for live looping, sequencing, arranging, mixing, and much more. Whether you're a live performer, a producer, or just experimenting with sound, Loopy Pro helps you take control of your creative process.

Download on the App Store

Loopy Pro is your all-in-one musical toolkit. Try it for free today.

Assign midi controller knob to LFO depth?

I'm wondering if the collective expertise here can tell me if this is possible: What I want to do is assign LFOs to various effects parameters, such as reverb wet mix, saturation amount,etc, so that they modulate rhymically. Then, I'd like to assign a knob to increase/decrease the LFO depth for a given parameter.

So this would allow me to go from a constant value on a given effect parameter, to a modulated value of that parameter, and the degree of modulation would increase as I turned the assigned knob on a midi controller.

This would mostly be used on drones and pads - what I want is to be able to start with a static drone and gradually add/remove the modulation.

I use AUM extensively and mostly use Rozeta LFOs, but as far as I can tell there isn't a way to assign CC control to min/max CC in the LFO AUv3, or to the Range parameter in the AUM midi control section.

Any advice would be appreciated!

Comments

  • Unfortunately that's a tough one. Neither Rozeta LFO nor MidiLFOs exposes a scaling parameter. You can set the range/scaling in AUM's parameter settings, but you can't change that setting via midi control. I don't think you can do it with anything AU LFO plugin I can think of.

    A Mozaic LFO script could be written for something like this. I might think about doing that.

    I assume the apps you're trying to do this for apps that don't have their own assignable and scalable LFO's for the things that you want to modulate. That's the most direct route if those are available.

  • I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Otherwise one of the scripting apps could do this with any MIDI data from any sources (use one controller to re-scale the values of another - really shouldn't be that difficult)

  • wimwim
    edited February 2020

    @aplourde said:
    I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Nope.

    Otherwise one of the scripting apps could do this with any MIDI data from any sources (use one controller to re-scale the values of another - really shouldn't be that difficult)

    Yep. I might do something like that later today.

  • @wim said:

    @aplourde said:
    I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Nope.

    Really? The manual makes it sound like that should work - pg 12, MIDI In: "CC is used to control the rate, offset and modulation sliders of each LFO using the MIDI MAP settings tab."

    Maybe it's a standalone thing, not in the AU?

    Otherwise one of the scripting apps could do this with any MIDI data from any sources (use one controller to re-scale the values of another - really shouldn't be that difficult)

    Yep. I might do something like that later today.

    Core functionality is multiplying one by the other and dividing by 127 - of course it's all the other housekeeping work to make a stable product that keeps me from scripting :#

  • wimwim
    edited February 2020

    Doh! I totally forgot about MIDI Curve from the MIDI Tools Suite.

    [edit] ergh. Nope. Doesn’t expose any AU parameters.

  • wimwim
    edited February 2020

    @aplourde said:

    @wim said:

    @aplourde said:
    I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Nope.

    Really? The manual makes it sound like that should work - pg 12, MIDI In: "CC is used to control the rate, offset and modulation sliders of each LFO using the MIDI MAP settings tab."

    All those, yes, but scaling, no. There’s no scaling control in the app and no parameter for it.

  • @wim said:

    @aplourde said:

    @wim said:

    @aplourde said:
    I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Nope.

    Really? The manual makes it sound like that should work - pg 12, MIDI In: "CC is used to control the rate, offset and modulation sliders of each LFO using the MIDI MAP settings tab."

    All those, yes, but scaling, no. There’s no scaling control in the app and no parameter for it.

    Hmmm, I thought that's what Mod-A was, modulating the Amplitude by either another LFO or external MIDI. But I guess I'm not understanding how it actually works.

    Perhaps MIDI Mod?

    Still, I think a script would be the way to go....

  • @aplourde said:

    @wim said:

    @aplourde said:

    @wim said:

    @aplourde said:
    I don't have it, but I believe Art Kern's midiLFOs can do this (map external MIDI control to the LFO's amount).

    Nope.

    Really? The manual makes it sound like that should work - pg 12, MIDI In: "CC is used to control the rate, offset and modulation sliders of each LFO using the MIDI MAP settings tab."

    All those, yes, but scaling, no. There’s no scaling control in the app and no parameter for it.

    Hmmm, I thought that's what Mod-A was, modulating the Amplitude by either another LFO or external MIDI. But I guess I'm not understanding how it actually works.

    Perhaps MIDI Mod?

    Mod-A is the amount one of the other LFO’s modifies the shape of the LFO. So, you can make a plain sin LFO have a different shape by altering it with a sawtooth running at a different rate, for instance.

    Still, I think a script would be the way to go....

    Seems to be. I can’t think of any existing plugin that would do the job.

  • Hey thanks for your input and thoughts on this, guys. This forum is the best.

  • wimwim
    edited February 2020

    I’ve uploaded MIDI Scaler v1.0 to patchstorage.com. This is a simple utility to scale either a single CC value or Note velocities. It can be placed between Rozeta LFO or similar and the target app to reduce the range. The maximum and minimum values can be changed from outside the app by mapping to the Knob0 and Knob1 AU parameters.

    @Scarred_Archimedes, don’t feel any obligation to get Mozaic if you don’t already have it or to use the script. I just wrote it for fun. It will probably be useful to someone else or to me in any case.

    Cheers. B)


    MIDI SCALER v1.0 - Squish CC values or note velocity

    ▫️Set the minimum and maximum values for CC's and/or Notes passing through the plugin. The values will be scaled to fit. If Max. is less than Min. scaling will be reversed.
    ▫️Curve adjusts the bias toward lower values when turned left and higher values when turned right. The center position is linear scaling.
    ▫️The Target knob determines the CC to scale. Fully left turns OFF. Fully right scales note velocity rather than CC values


  • This is amazing! Thanks so much, @wim. I do have Mozaic and will absolutely be working with this later today. So appreciative and impressed that you would/could whip that up for some random guy.

  • @Scarred_Archimedes said:
    This is amazing! Thanks so much, @wim. I do have Mozaic and will absolutely be working with this later today. So appreciative and impressed that you would/could whip that up for some random guy.

    Cool. Please let me know if it should work differently than it does.

  • @wim said:

    @Scarred_Archimedes said:
    This is amazing! Thanks so much, @wim. I do have Mozaic and will absolutely be working with this later today. So appreciative and impressed that you would/could whip that up for some random guy.

    Cool. Please let me know if it should work differently than it does.

    It's great, thanks again. I'm still somewhat in disbelief that I got this coded up for me so quick and effectively. Big time kudos.

  • no problem. It was fun. B)

  • @wim So I'm not getting the results I would expect to see.

    Instead of scaling the LFO within the range of min - max, what I'm seeing is it passing the same values, but starting at min and clipping at max. I.e. no scaling, just shifting and clipping the values.

    E.g. input is a saw LFO that goes from 0 to 127 over 1 measure of 4/4 time.
    Set min to 32 and max to 64. One would expect to see a saw that starts at 32 and reaches 64 after 1 measure.
    However, what I'm seeing is the output starting at 32 and reaching 64 after 1 beat, then staying at 64 for the remaining 3 beats.

    The heart of this script is: byte3 = TranslateCurve MIDIByte3,curve,min,max

    If I change that to byte3 = TranslateScale MIDIByte3,0,127,min,max I see the behavior I would expect (but, obviously, without the curve bias).

    Should TranslateCurve provide scaling, or is it only bias? Or is this a bug?

  • wimwim
    edited February 2020

    @aplourde said:
    @wim So I'm not getting the results I would expect to see.

    Instead of scaling the LFO within the range of min - max, what I'm seeing is it passing the same values, but starting at min and clipping at max. I.e. no scaling, just shifting and clipping the values.

    E.g. input is a saw LFO that goes from 0 to 127 over 1 measure of 4/4 time.
    Set min to 32 and max to 64. One would expect to see a saw that starts at 32 and reaches 64 after 1 measure.
    However, what I'm seeing is the output starting at 32 and reaching 64 after 1 beat, then staying at 64 for the remaining 3 beats.

    The heart of this script is: byte3 = TranslateCurve MIDIByte3,curve,min,max

    If I change that to byte3 = TranslateScale MIDIByte3,0,127,min,max I see the behavior I would expect (but, obviously, without the curve bias).

    Should TranslateCurve provide scaling, or is it only bias? Or is this a bug?

    That is a bug. I’ve evidently misunderstood TranslateCurve. I’ll get back to you on that one shortly.

  • I can’t seem to figure out how to make TranslateCurve to work properly. I’ve uploaded version 1.01, in which Curve doesn’t do anything until I can work this out. Sorry for the inconvenience.

  • @wim said:
    I can’t seem to figure out how to make TranslateCurve to work properly. I’ve uploaded version 1.01, in which Curve doesn’t do anything until I can work this out. Sorry for the inconvenience.

    Absolutely no apologies needed, you're generously providing a script - that is greatly appreciated!

    I also thought that TranslateCurve would scale, but looking at the manual, it seems like it just provides the non-linear power curve. The clue being that and apply to both the input and the output range. I guess if you want to apply this to scaling you would need to employ both functions: TranslateScale to scale and TranslateCurve to skew the values.


    However, in thinking about this further I have some alternative ideas of how I, personally, would want this to work.

    I would guess that in a lot of situations you would want to have the LFO scale out from a central point, oscillating around that point. Think of increasing an LFO modulating the cutoff of a filter or applying vibrato. Without the LFO you have your static cutoff level or fixed pitch. When the LFO modulations come in, typically you want the LFO oscillating around that start point rather than moving only in one direction away from that point.

    Like this:

    Using TranslateScale directly, you would have to set the Min and Max levels to your default, off state and then move both knobs equally away from that start point to get this effect.

    Of course there are other situations where you might want to have the LFO grow in a unipolar way. If, for example, you have your sound starting silent and then you want to bring in the level, with tremolo.

    Like this:

    So, I've mucked around with the script and made an alternate version. I took out the Curve feature and instead have 3 controls for scaling:
    Start - this sets the starting point from where the modulation will grow. E.g. if you're controlling a filter that's set to 85 (out of 0-127), you would set the Start to 85 so the modulation will grow out from that point.
    Amount - this sets the scaling of the incoming modulation from 0 to 100%. This is the control you would mostly be playing with.
    Bias - this sets how the modulation grows from the Start point. At 0 the modulation is bipolar, oscillating around the Start. At -1 it moves down from the Start. At 1 it moves up.

    So to get something like the first image you would set Start to 64, Bias to 0 and Amount to 0 and increase that Amount to 100% over 5 seconds.

    For the second image you would set Start to 0, Bias to 1 and Amount to 0 and increase that to 100% over 5 seconds.

    I'm not a programmer, so I don't know if I'm doing this the "best" way, but it works!

    Thank you for making the script! As I mentioned before, I can figure out the basic algorithms to do the core work, but all the other stuff to make an actual working script with a UI is completely foreign to me!

    @Description
    MIDI PARAMETER SCALER v1.0 - Scale CC values or note velocity around a Start point.
    Based on MIDI SCALER v1.01 by Wim
    
    ▫️Set the Start as the point from which the modulation or note velocity will grow from.
    ▫️Amount is how much of the control passes through. This is the control you will "play"
    ▫️Bias sets how the modulation grows from the Start point. -1 = modulation moves down from the Start. 0 = the modulation oscillates around the Start.  +1 = modulation moves up.
    ▫️The last knob determines the CC to scale. Fully left turns OFF. Fully right scales note velocity instead of CC values.
    @End
    
    @OnLoad
      //knob assignments
      k_start = 0
      k_amount = 1
      k_bias = 2
      k_target = 3
    
      if Unassigned init
        init = TRUE
        start = 64
        SetKnobValue k_start,start
        amount = 127
        SetKnobValue k_amount,amount
        bias = 0
        SetKnobValue k_bias, (TranslateScale bias,-1,1,0,127)
        log bias
        target = 20 //default = cc 20
        SetKnobValue k_target, (TranslateScale target,-1,128,0,127)
        for knob = 0 to 21
          Call @KnobLabel
        endfor
      endif
    
      SetShortName {P-SCAL}
      LabelKnobs { }
      ShowLayout 4
    @End
    
    @OnMidiInput
      byte3 = MIDIByte3
    
      if MIDICommand = 0xB0 //CC
        if target > 0 and target < 128 and MIDIByte2 = target
          min = Clip (start + (round ((bias / 2) - 0.5) * amount)),0,127
          max = Clip (start + (round ((bias / 2) + 0.5) * amount)),0,127
          byte3 = TranslateScale MIDIByte3,0,127,min,max
        endif
    
      elseif MIDICommand = 0x90 //Note-ON
        if target > 127
          min = Clip (start + (round ((bias / 2) - 0.5) * amount)),0,127
          max = Clip (start + (round ((bias / 2) + 0.5) * amount)),0,127
          byte3 = TranslateScale MIDIByte3,0,127,min,max
        endif
      endif
    
      SendMIDIOut MIDIByte1,MIDIByte2,byte3
    @End
    
    @OnSysex
      SendSysexThru
    @End
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue knob
    
      if knob = k_start
        start = Round value
      elseif knob = k_amount
        amount = Round value
      elseif knob = k_bias
        bias = TranslateScale value,0,127,-1,1
      elseif knob = k_target
        target = Round (TranslateScale value,0,127,-1,128)
      endif
    
      Call @KnobLabel
    
    @End
    
    @KnobLabel
      if knob = k_start
        LabelKnob knob, {Start },start
      elseif knob = k_amount
        LabelKnob knob, {Amt },(round (TranslateScale amount,0,127,0,100)), {%}
      elseif knob = k_bias
        LabelKnob knob,{Bias },bias
      elseif knob = k_target
        if target = -1
          LabelKnob k_target,{OFF}
        elseif target > 0 and target < 127  
          LabelKnob k_target, {cc }, target
        elseif target = 128
          LabelKnob k_target, {Note Vel}
        endif
      else
        LabelKnob knob, { }
      endif
    @End
    
  • Hats off to you both again for your v impressive skills with this stuff. I mostly envision using this tool for the second, unipolar implementation of LFO swells shown by @aplourde above (gradually bringing in “waves” of distortion, etc.) But I can totally see the utility of the bipolar use, and obviously don’t know what I or others might want to use this tool for in the future.

    I will hopefully have time today to give @aplourde’s script a try later today. But it looks great - thanks again!

  • @Scarred_Archimedes said:
    Hats off to you both again for your v impressive skills with this stuff. I mostly envision using this tool for the second, unipolar implementation of LFO swells shown by @aplourde above (gradually bringing in “waves” of distortion, etc.) But I can totally see the utility of the bipolar use, and obviously don’t know what I or others might want to use this tool for in the future.

    I will hopefully have time today to give @aplourde’s script a try later today. But it looks great - thanks again!

    Just to be really clear, this is @wim ‘s script, I just tweaked it a tiny bit for my use! Credit and thanks go to them!

    Also, if you just need the unipolar growth pattern, the original script will do that: set min and max to 0 and increase max over time. You can do bipolar with the original script too, you just have to coordinate the moves of both min and max simultaneously.

    The tweaks I made just make bipolar usage a single knob affair. It also makes easier adding in a certain amount of modulation and then shifting that exact level of modulation up or down.

  • @aplourde said:

    @Scarred_Archimedes said:
    Hats off to you both again for your v impressive skills with this stuff. I mostly envision using this tool for the second, unipolar implementation of LFO swells shown by @aplourde above (gradually bringing in “waves” of distortion, etc.) But I can totally see the utility of the bipolar use, and obviously don’t know what I or others might want to use this tool for in the future.

    I will hopefully have time today to give @aplourde’s script a try later today. But it looks great - thanks again!

    Just to be really clear, this is @wim ‘s script, I just tweaked it a tiny bit for my use! Credit and thanks go to them!

    Also, if you just need the unipolar growth pattern, the original script will do that: set min and max to 0 and increase max over time. You can do bipolar with the original script too, you just have to coordinate the moves of both min and max simultaneously.

    The tweaks I made just make bipolar usage a single knob affair. It also makes easier adding in a certain amount of modulation and then shifting that exact level of modulation up or down.

    That’s really cool ... and no need for the shoutout. That’s what Mozaic is all about - open-source scripts and the ability to modify to suit.

    Some people helped me find a way to get that curve function working. At some point I may look at what you’ve done and see if there’s an opportunity for a version that includes that, the curve, and maybe some other goodies. I’ll let the ideas percolate for a bit. I seem to work better that way.

    In the meantime, if you want to post your modified version up to patchstorage, please feel free! I won’t have my legal team come after you. :D

  • @wim said:
    That’s really cool ... and no need for the shoutout. That’s what Mozaic is all about - open-source scripts and the ability to modify to suit.

    Some people helped me find a way to get that curve function working. At some point I may look at what you’ve done and see if there’s an opportunity for a version that includes that, the curve, and maybe some other goodies. I’ll let the ideas percolate for a bit. I seem to work better that way.

    No doubt there's a slew of additional features that could be added... including a slew limiter!
    This type of CC manipulation (and related generation) is what I'm really wanted to see more of.

    In the meantime, if you want to post your modified version up to patchstorage, please feel free! I won’t have my legal team come after you. :D

    My people will contact your people to create some synergy going forward. B)

  • Sure. Let’s do lunch. B)

Sign In or Register to comment.