Audiobus: Use your music apps together.

What is Audiobus?Audiobus is an award-winning music app for iPhone and iPad which lets you use your other music apps together. Chain effects on your favourite synth, run the output of apps or Audio Units into an app like GarageBand or Loopy, or select a different audio interface output for each app. Route MIDI between apps — drive a synth from a MIDI sequencer, or add an arpeggiator to your MIDI keyboard — or sync with your external MIDI gear. And control your entire setup from a MIDI controller.

Download on the App Store

Audiobus is the app that makes the rest of your setup better.

MIDI Designer Pro 2 hacks

Hello,

I'm deep into MIDI Designer ("MD") working to build a master control setup for all my iOS apps (hosted in AUM). It's a powerful, high-level programming language and I'm excited for the fine control I can achieve over my complex setup. Highly recommended!

I've read the manual, watched all the videos, and mastered the basics. But there are features that aren't well documented--some of those menu choices in 'Options as Super', for example--and ways the features interact that can be puzzling. If you're working with MD, you know what I mean. I need help with some advanced hacks. But I'm also hoping others working with MD will share their questions and solutions too in this thread.

Hack request: creating a fade for Enso looper.

Enso is an amazing and unique looper. But it doesn’t have a fade function. I've tried to create one in MD; I get pieces working but when I try to automate the whole sequence, I just get a mess.

Here's the first hack I need help with:

I want to create a button that will 1) Trigger the track level to travel gradually from current on-value to zero (utilizing the supercontrols option for a timed "snap sub to value"), then 2) send Stop to Enso, then 3) reset the track level to default (approximately 0 db on the AUM slider). In other words, emulating the fade of almost all other loopers I know.

Any suggestions appreciated. I know some of you guys are MD power users. Let's talk.

Steve
ThinAirX

Comments

  • wimwim
    edited July 20

    Just to be clear, are talking about Midi Designer Pro 2?

    I've done some pretty deep things with MDP2, but never dived into linked control sequences like what you need above. Before I'm tempted to look into it, wanna make sure we're talking about the same thing.

  • edited July 21

    Yes. Midi Designer Pro 2, the latest version (plus whatever the IAP was) on a recent iPad. [edit: I changed the title just now to add "... Pro 2"]

    I've been successful using button groups and sequencing subcontrols, but this one stumps me because I'm trying to include a fader and a button along with default and snap back to value all in one group.

    MD is rich with customization possibilities but, as I said, the more advanced functions are thinly documented, if at all. I've studied some of the fancy downloadable layouts and they're doing things that I can't figure out, even after diving in to the coding in design mode. So maybe as a community we can explore and share.

    Steve

  • wimwim
    edited July 20

    @ThinAirX said:
    Yes. Midi Designer Pro 2, the latest version (plus whatever the IAP was) on a recent iPad.

    I've been successful using button groups and sequencing subcontrols, but this one stumps me because I'm trying to include a fader and a button along with default and snap back to value all in one group.

    MD is rich with customization possibilities but, as I said, the more advanced functions are thinly documented, if at all. I've studied some of the fancy downloadable layouts and they're doing things that I can't figure out, even after diving in to the coding in design mode. So maybe as a community we can explore and share.

    Steve

    Yeh, it's a little bit tricky since a sub-control can't be a super-control of anything involved in controlling it. I think I'm getting there though...

  • wimwim
    edited July 20

    Ugh. This is hard. It would be so much easier to make a Mozaic plugin to do this in response to a button press coming from MD.

    I need to do some other stuff right now. Maybe how to do it in MD will gel with me later.

    [edit - nope. I don't think you can do this with MD. No combination of super controls, etc. I can come up with work out. There may be others over on the MD forum who could figure it out, but it would be pretty convoluted I expect.

    I'm pretty sure scripting is needed for this. Streambyter on the "Output Rules" side of things might be able to do it, but I'm too rusty with Streambyter to try to take it on. Mozaic, placed between MD and Enso, could manage it, I'm sure. MD would send a message to Mozaic, and Mozaic would trigger the needed cc's to manage the fader and Enso.]

  • wimwim
    edited July 21

    @ThinAirX - I went ahead and did a quick Mozaic script that does what I think I understand you would like to do with MD. It responds to a button press from MD, triggering a fade. When set up right, Enso will stop when the fader hits zero. Then about a quarter second later the fader will return to the starting point. It has to be set up according to the directions at the top of the script.

    It would be great if this could be done only in MD, but if it can, then I'm just not seeing it.

    No obligation whatsoever to use it. I just did it to clear the thoughts on the subject out of my head.

    @Description
    This is a utility script to trigger some actions for Enso Looper / AUM in response to a cc message from Midi Designer Pro 2. 
    ▫️ Set TRIG CC. to the cc being sent by the MDP2 button.
    ▫️ Set the speed of the fade out.
    ▫️ Set the maximum AUM fader level (90 is 0db).
    ▫️ Set the output cc and channel.
    ▫️ Set up AUM Midi control for the AUM channel fader to the output cc and channel.
    ▫️ In ENSO tap a MIDI CC slot and tap the button in MDP2. It should midi learn the output CC set in Mozaic
    ▫️ Leave ON PRESS unassigned. Set ON RELEASE to STOP & RTZ
    When configured correctly, tapping the button in MDP2 should ramp the AUM fader to zero. When it hits zero it should trigger stop and return to zero in Enso. One quarter second later it should reset the AUM fader.
    @End
    
    @OnLoad
      k_trigger = 0
      k_fadertime = 1
      k_fadermax = 2
      k_fadercc = 3
      k_outchannel = 4
    
      if Unassigned init
        init = YES
        trigger = 12
        fadertime = 1000
        max_fadertime = 5000
        fadermax = 90
        fadercc = 20
        outchannel = 15
        layout = 0
        ti = 10
        SetTimerInterval ti
        inProgress = NO
    
        Call @SetKnobs
        for knob = 0 to 21
          Call @SetKnobLabel
        endfor
    
      endif
    
      ShowLayout layout
    @End
    
    @OnMidiInput
      if MIDICommand = 0xB0 and MIDIByte2 = trigger and MIDIByte3 = 127 and inProgress = NO
        inProgress = YES
        fader = fadermax
        change = fadermax / 1000 * ti
        timer = 0
        StartTimer
      else
        SendMIDIThru
      endif
    @End
    
    @OnTimer
      if fader > 0
        SendMIDICC outchannel,fadercc,fader
        fader = fader - change
      else
        SendMIDICC outchannel,fadercc,0
        SendMIDICC outchannel,fadercc,fadermax,250
        inProgress = NO 
        StopTimer
      endif
    @End
    
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue knob
    
      if knob = k_trigger
        trigger = Round value
      elseif knob = k_fadertime
        fadertime = Round (TranslateScale value,0,127,0,max_fadertime)
      elseif knob = k_fadermax
        fadermax = Round value
      elseif knob = k_fadercc
        fadercc = Round value
      elseif knob = k_outchannel
        outchannel = Round (TranslateScale value,0,127,0,15)
      endif
    
      Call @SetKnobLabel
    @End
    
    @SetKnobLabel
      if knob = k_trigger
        LabelKnob k_trigger,{Trig cc.},trigger
      elseif knob = k_fadertime
        LabelKnob k_fadertime,{Fade },(fadertime / 1000),{s}
      elseif knob = k_fadermax
        LabelKnob k_fadermax,{Max. },fadermax
      elseif knob = k_fadercc
        LabelKnob k_fadercc,{Fade cc.},fadercc
      elseif knob = k_outchannel
        LabelKnob k_outchannel,{Chan. },(outchannel+1)
      else
        LabelKnob knob,{ }
      endif
    @End
    
    @SetKnobs
      SetKnobValue k_trigger,trigger
      SetKnobValue k_fadertime,(TranslateScale fadertime,0,max_fadertime,0,127)
      SetKnobValue k_fadermax,fadermax
      SetKnobValue k_fadercc,fadercc
      SetKnobValue k_outchannel,(TranslateScale outchannel,0,15,0,127)
    @End
    
  • @wim said:
    @ThinAirX - I went ahead and did a quick Mozaic script that does what I think I understand you would like to do with MD. It responds to a button press from MD, triggering a fade. When set up right, Enso will stop when the fader hits zero. Then about a quarter second later the fader will return to the starting point. It has to be set up according to the directions at the top of the script.

    It would be great if this could be done only in MD, but if it can, then I'm just not seeing it.

    No obligation whatsoever to use it. I just did it to clear the thoughts on the subject out of my head.

    @Description
    This is a utility script to trigger some actions for Enso Looper / AUM in response to a cc message from Midi Designer Pro 2. 
    ▫️ Set TRIG CC. to the cc being sent by the MDP2 button.
    ▫️ Set the speed of the fade out.
    ▫️ Set the maximum AUM fader level (90 is 0db).
    ▫️ Set the output cc and channel.
    ▫️ Set up AUM Midi control for the AUM channel fader to the output cc and channel.
    ▫️ In ENSO tap a MIDI CC slot and tap the button in MDP2. It should midi learn the output CC set in Mozaic
    ▫️ Leave ON PRESS unassigned. Set ON RELEASE to STOP & RTZ
    When configured correctly, tapping the button in MDP2 should ramp the AUM fader to zero. When it hits zero it should trigger stop and return to zero in Enso. One quarter second later it should reset the AUM fader.
    @End
    
    @OnLoad
      k_trigger = 0
      k_fadertime = 1
      k_fadermax = 2
      k_fadercc = 3
      k_outchannel = 4
    
      if Unassigned init
        init = YES
        trigger = 12
        fadertime = 1000
        max_fadertime = 5000
        fadermax = 90
        fadercc = 20
        outchannel = 15
        layout = 0
        ti = 10
        SetTimerInterval ti
        inProgress = NO
        
        Call @SetKnobs
        for knob = 0 to 21
          Call @SetKnobLabel
        endfor
        
      endif
      
      ShowLayout layout
    @End
    
    @OnMidiInput
      if MIDICommand = 0xB0 and MIDIByte2 = trigger and MIDIByte3 = 127 and inProgress = NO
        inProgress = YES
        fader = fadermax
        change = fadermax / 1000 * ti
        timer = 0
        StartTimer
      else
        SendMIDIThru
      endif
    @End
    
    @OnTimer
      if fader > 0
        SendMIDICC outchannel,fadercc,fader
        fader = fader - change
      else
        SendMIDICC outchannel,fadercc,0
        SendMIDICC outchannel,fadercc,fadermax,250
        inProgress = NO 
        StopTimer
      endif
    @End
    
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue knob
      
      if knob = k_trigger
        trigger = Round value
      elseif knob = k_fadertime
        fadertime = Round (TranslateScale value,0,127,0,max_fadertime)
      elseif knob = k_fadermax
        fadermax = Round value
      elseif knob = k_fadercc
        fadercc = Round value
      elseif knob = k_outchannel
        outchannel = Round (TranslateScale value,0,127,0,15)
      endif
      
      Call @SetKnobLabel
    @End
    
    @SetKnobLabel
      if knob = k_trigger
        LabelKnob k_trigger,{Trig cc.},trigger
      elseif knob = k_fadertime
        LabelKnob k_fadertime,{Fade },(fadertime / 1000),{s}
      elseif knob = k_fadermax
        LabelKnob k_fadermax,{Max. },fadermax
      elseif knob = k_fadercc
        LabelKnob k_fadercc,{Fade cc.},fadercc
      elseif knob = k_outchannel
        LabelKnob k_outchannel,{Chan. },(outchannel+1)
      else
        LabelKnob knob,{ }
      endif
    @End
    
    @SetKnobs
      SetKnobValue k_trigger,trigger
      SetKnobValue k_fadertime,(TranslateScale fadertime,0,max_fadertime,0,127)
      SetKnobValue k_fadermax,fadermax
      SetKnobValue k_fadercc,fadercc
      SetKnobValue k_outchannel,(TranslateScale outchannel,0,15,0,127)
    @End
    

    MD has StreamByter available to it as an IAP.

  • wimwim
    edited July 21

    @espiegel123 said:
    MD has StreamByter available to it as an IAP.

    I know, but I'm rusty with Streambyter, as I said. I’ve also never tried to do anything with timers, as this would require.

  • @wim Thanks for the script. I'm using a Mozaic script to create an "as played" arp. I'll see if I can figure out how to load your script. If it works with Enso, that's all I really want for now.

    I'm going to post my MD question on the MD forum. That's where the MD power users hand out. I'll paste the answer back here when I get it. I'm still interested in solving this problem in MD because I could use a fade button in a few other places as well.

    For lurkers: don't be scared away from Midi Designer by this thread. What I'm asking for is truly a hack, pushing the limits on advanced features. At a basic level, MD is an incredible tool for getting full control of a complex setup or integrating all controls (inducing foot pedals and external gear) in one place. It's already changing the way I perform music. It doesn't have an initial steep learning curve, but it's so well designed that once you learn your way around, you can move fast and build what you need.

    Steve
    ThinAirX

  • @ThinAirX Good luck on your quest. I agree that MDP2 is an awesomely powerful tool to use. Awhile back I designed a layout using super controls to convert incoming cc info into sysex in order to control a hardware instrument.
    We certainly are lucky to have such great apps as MDP2/Mozaic/StreamByter at our disposal as well as a community of users that are willing to share and create devices for us.

  • Hey @ThinAirX - One bit of info that might help in your discussions on the MD forum. I discovered late in the game that the midi bindings in Enso can be set to "On Release". With this it's possible to get the looper to stop when a parameter hits zero. This is great because it's easy to get a cc to ramp to zero in MD, then point that cc at both the AUM fader and Enso's stop. When the cc/fader reaches zero, Enso stops.

    So, that just leaves having the fader reset to its original position some short time after Enso stops. I don't know of any way to do that in MD, but it should be pretty easy in Streambyter. I'm probably not going to be able to stop myself from trying now that I have that idea.

    Do you own the Streambyter plugin for MD? I didn't know myself, so I tried whatever option it was that said I already own it, and it worked.

  • wimwim
    edited July 21

    And +1 for MD being a great product. This is the first thing I've come across that has been a little tricky to do.

  • wimwim
    edited July 21

    I think I figured it out. No scripting needed. B)

    ControlNameDetails
    Button 1Fade Out
    • Subtype: Toggle
    • Message Type: Midi CC (dummy, won't be sent)
    • Range: 90 > 0
    • Default Value: Off
    • Supercontrol for AUM Fader
    • Options as Super: Snap Sub to Value = 1s
    • Button Off Sets to Default: Reset Fader
    SliderAUM Fader
    • Message Type: MIDI CC (will map to AUM Fader and Enso Stop
    • Range: 0-127
    • Default Value: 90
    Button 2Reset Fader
    • Subtype: Toggle
    • Message Type: MIDI CC (dummy, won't be sent)
    • Range: 0 > 90
    • Supercontrol for AUM Fader
    • Options as Super: Snap Sub to Value = 250ms
    • Button Off Sets to Default: Fade Out
  • @wim Wow, this is great! I owe you one. I'll install and test this tonight. I'll try to Mozaic script too, since you spent so much time on it.

    Great tip about On Release in Enso. I knew that was in there, but didn't really see how I could use it. I thought it was for precise timing of a momentary (as the manual suggests), but now you're telling me it can be used with timed commands. I'll rethink some of my other Enso bindings. Enso is an amazing looper, but the MIDI control is a little weird.

    Steve

  • wimwim
    edited July 21

    No need to try the Mozaic script. The fewer moving parts the better. I just wrote it for fun and because if I don't sometimes the ideas just keep bouncing around in my brain until I deal with 'em.

    The On Release triggers when a CC at zero is received. So, when the fader CC hits zero it fires. That's a happy coincidence. It would have required scripting, I'm pretty sure, without that.

  • I'm still working on this. @wim the trick you suggested using the On Release in Enso to stop really works! When I get it integrated into my master layout I'll post screen shots and comments.

    In the meantime, I asked the same question at the MIDI Designer Forum and received a detailed answer and sample layouts. The guy who responded wasn't aware of the Enso On Release feature, so his is a solution that achieves and fade/stop/reset that would work with any app that needed a fade/stop. For anybody interested in advanced MD hacks, it's full of ideas. Here's the thread:

    https://mididesigner.com/qa/8239/how-to-create-a-fade-routine-for-an-ios-looper?show=8245#c8245

    In general, I'm discovering that MIDI Designer is not hard to learn, considering how powerful it is. It comes with a good manual and lots of videos. It's not hard to master the basics and some of the intermediate and power features. But when getting into the advanced stuff, all the deep-menu commands and how they interact, it gets very mysterious and takes a lot of trial and error to mine the coolest tricks.

    Steve

Sign In or Register to comment.