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.

MOZAIC - Create your own AU MIDI plugins - OUT NOW!

178101213102

Comments

  • @brambos said:

    @wim said:

    @brambos said:

    @wim said:

    @blakkaz said:

    @wim said:
    Let’s say I have four values: 80, 20, 18, 100.

    • If at 0/0 on the pad, the value is 80
    • If at 0/127 on the pad, the value is 20
    • If at 127/127 on the pad, the value is 18
    • If at 127/0 on the pad, the value is 100

    But ... how do I figure out the value if I’m at various positions like 10/82, 100/100, 100/80?

    I haven't picked up the app yet, but have been reading through the manual.
    Would TranslateScale work?

    // calculate value for 10/82
    
    x = TranslateScale 10, 0, 127, 80, 20
    y = TranslateScale 82, 0, 127, 100, 18
    
    z = (x + y) / 2
    

    Thanks for checking it out. I thought that was the way too, but I’m not getting the expected results.

    This is a slightly more complex mathematical problem than it appears on first sight, because each value is made up out of the weighted influence of all 4 corner-values. I've tried solving it using Pythagoras, but I'm not getting the exactly correct values either.

    I have just forwarded the question to the mathematical community on the interwebs. Let's see what the true boffins come up with ;)

    Oooohhh. In the big leagues now! Thanks for doing that! I asked around at the local beer joint and even the bartender was stumped. Didn’t know where else to turn.

    Can’t wait to hear back!

    Gotta love the internet. The trick is to approach it as a 3 dimensional calculation rather than a 2D plane, and use bilinear interpolation. Here’s the solution:

    @OnLoad
    // corner values
    v00 = 80
    v01 = 20
    v11 = 18
    v10 = 100
    @End

    @OnXYChange
    x = GetXValue / 127
    y = GetYValue / 127
    z1 = (1-x) * (1-y) * v00
    z2 = x * (1-y) * v10
    z3 = (1-x) * y * v01
    z4 = x * y * v11
    z = z1 + z2 + z3 + z4
    log z
    @End

    Nice! Thanks!! I got to thinking it had to be done as a series of transformations but just couldn’t get my head around it. This is great. I have the four knob snapshots part done, now I should be able to morph between them with the XY pad.

    After sleep tho...💤

  • This is brilliant.

    Never coded in my life and somehow I am making actual things that do actual stuff.

  • @BroCoast said:
    This is brilliant.

    Never coded in my life and somehow I am making actual things that do actual stuff.

    That means a lot to me, because that was exactly the goal I set out to achieve! :)

  • @brambos said:

    @BroCoast said:
    This is brilliant.

    Never coded in my life and somehow I am making actual things that do actual stuff.

    That means a lot to me, because that was exactly the goal I set out to achieve! :)

    Thank you for making this. I'm hoping with a bit of learning I can do something like:

    When MIDI input is detected: Start sequence
    Play once
    On sequence end play C2 on MIDI channel 5

    I'll get there. :)

  • is there a way to bring up the patch info again after loading it, and then closing? (other than reloading)

  • @Carnbot said:
    is there a way to bring up the patch info again after loading it, and then closing? (other than reloading)

    Dunno, but you can always open the Code window and look for the @Description section

  • @NoonienS said:

    @Carnbot said:
    is there a way to bring up the patch info again after loading it, and then closing? (other than reloading)

    Dunno, but you can always open the Code window and look for the @Description section

    Thanks :)
    Yeah that works, might be nice to have a shortcut for that on the gui.

  • @iamspoon , I did a small skeleton of what I understood you are seeking with script #1. Check it here:

    https://gist.githubusercontent.com/rrc2soft/72188e8b48b4cfee077e75ee54a20bae/raw/22fca32b0cbf5c4a7478eed88948e2d7ffe6c6f8/SuperPadCCBasic

    Hope I understood you correctly, and that this is similar to what you seek. I tried to add plenty of comments to explain the code, so you can expand on it. Godspeed!

  • @rrc2soft said:
    @iamspoon , I did a small skeleton of what I understood you are seeking with script #1. Check it here:

    https://gist.githubusercontent.com/rrc2soft/72188e8b48b4cfee077e75ee54a20bae/raw/22fca32b0cbf5c4a7478eed88948e2d7ffe6c6f8/SuperPadCCBasic

    Hope I understood you correctly, and that this is similar to what you seek. I tried to add plenty of comments to explain the code, so you can expand on it. Godspeed!

    Nice! Very clean!

  • @wim said:

    @brambos said:

    @wim said:

    @blakkaz said:

    @wim said:
    Let’s say I have four values: 80, 20, 18, 100.

    • If at 0/0 on the pad, the value is 80
    • If at 0/127 on the pad, the value is 20
    • If at 127/127 on the pad, the value is 18
    • If at 127/0 on the pad, the value is 100

    But ... how do I figure out the value if I’m at various positions like 10/82, 100/100, 100/80?

    I haven't picked up the app yet, but have been reading through the manual.
    Would TranslateScale work?

    // calculate value for 10/82
    
    x = TranslateScale 10, 0, 127, 80, 20
    y = TranslateScale 82, 0, 127, 100, 18
    
    z = (x + y) / 2
    

    Thanks for checking it out. I thought that was the way too, but I’m not getting the expected results.

    This is a slightly more complex mathematical problem than it appears on first sight, because each value is made up out of the weighted influence of all 4 corner-values. I've tried solving it using Pythagoras, but I'm not getting the exactly correct values either.

    I have just forwarded the question to the mathematical community on the interwebs. Let's see what the true boffins come up with ;)

    Oooohhh. In the big leagues now! Thanks for doing that! I asked around at the local beer joint and even the bartender was stumped. Didn’t know where else to turn.

    Can’t wait to hear back!

    I still blame Debbie Voltz.

  • I look up to you all here, and this looks like a step I can take in some time. I still need to wrap my mind around AuduluS. Its great to see these I don't want to say baby steps but something like that where you start from scratch and then can program modular synths and make their own midi stuff. Cheers!

  • @rrc2soft Super, thanks so much. I’m not fluent in Mosaic yet but that does look very clean!
    The comments might save me too, nice one. o:)

  • What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

  • @recccp said:
    What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

    Ok, got it...
    notes were sent from XOX with 808 timing on... so I guess it "fell out of grid"
    It works after turning off 808 timing :)

  • @recccp said:
    What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

    Try changing @OnMetroPulse into @OnMidiInput. That will trigger the check for all incoming MIDI events.

  • @brambos said:

    @recccp said:
    What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

    Try changing @OnMetroPulse into @OnMidiInput. That will trigger the check for all incoming MIDI events.

    My plan is to make some sort of midi stutter/repeater so sync will be necessary. (That is with my limited understanding :) )
    Btw huge thanks for the manual!
    My work hours from now on will be spent on planning and evenings on learning/testing.

  • @recccp said:

    @brambos said:

    @recccp said:
    What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

    Try changing @OnMetroPulse into @OnMidiInput. That will trigger the check for all incoming MIDI events.

    My plan is to make some sort of midi stutter/repeater so sync will be necessary. (That is with my limited understanding :) )
    Btw huge thanks for the manual!
    My work hours from now on will be spent on planning and evenings on learning/testing.

    You can check CurrentMetroPulse from any event. @OnMidiInput basically means “here’s the next incoming Midi event. What would you like to do with it?”. I expect you’ll need that (or OnMidiNote etc).

  • Hello @brambos , I found a small bug in Mosaic:
    when I use the code editor in maximized CODE view, change some code and UPLOAD, the LOG screen opens automatically (also maximized); then when I return to CODE view and press my finger to put the cursor anywhere to where I want it, the GUI pops up! And I have to press MAXIMIZE again to return to the maximized CODE view. I don't think this behaviour should 'by design'. Do you?

  • @brambos said:

    @recccp said:

    @brambos said:

    @recccp said:
    What am I missing here?

    @OnLoad
    SetMetroPPQN 4
    @End

    @OnMetroPulse
    c = CurrentMetroPulse % 2
    log c
    if c = 0
    SendMIDIThru
    endif
    @End

    Log shows
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0
    [OnMetroPulse] 1
    [OnMetroPulse] 0 etc.

    When sending 1/16th into mosaic I would expect every 2nd "silenced"
    Yet only the first note would pass through.

    Sorry for non-programmer barely English language :)
    Thanks in advance!

    Try changing @OnMetroPulse into @OnMidiInput. That will trigger the check for all incoming MIDI events.

    My plan is to make some sort of midi stutter/repeater so sync will be necessary. (That is with my limited understanding :) )
    Btw huge thanks for the manual!
    My work hours from now on will be spent on planning and evenings on learning/testing.

    You can check CurrentMetroPulse from any event. @OnMidiInput basically means “here’s the next incoming Midi event. What would you like to do with it?”. I expect you’ll need that (or OnMidiNote etc).

    Of course you are right :smiley:
    Thanks very much for pointing it out!

  • @Harro said:
    Hello @brambos , I found a small bug in Mosaic:
    when I use the code editor in maximized CODE view, change some code and UPLOAD, the LOG screen opens automatically (also maximized); then when I return to CODE view and press my finger to put the cursor anywhere to where I want it, the GUI pops up! And I have to press MAXIMIZE again to return to the maximized CODE view. I don't think this behaviour should 'by design'. Do you?

    I’m on it! Thanks!

  • edited May 2019

    @brambos , I also have a suggestion cq. feature request: my guess is that Mozaic will also very often be used for manipulating midi from external hardware midi controlers. Wouldn't it be nice to have some sort of midi learn function in Mozaic ('s CODE view) to catch CC numbers from these controlers, that can be used (via copy/paste) in all kinds of Mosaic presets?
    I have a Roland keyboard with 9 dials, 9 sliders and 8 drumpads, and a FCB1010 footcontroler with 99 banks for 10 pedals.... and I don't know the CC numbers that I once programmed (via my PC) from the top of my head for all these 'generators'.
    I know that I can use a midi monitor app, or Mosaic's logscreen (with '@OnMidiCC' and 'Log MIDIByte2'), but that's more work ( ;) . Hope you will think about this...

  • edited May 2019

    @harro does midi leaning the AU knobs in your host not get you to the same place?

  • @legsmechanical said:
    @harro does midi leaning the AU knobs in your host not get you to the same place?

    Yes, of course you can use midi learn for many AU knobs/sliders, but with Mozaic you can do all kinds of creative things with these CC numbers first: alter, refuse, combine with other midi-data, depending on the CC number, etc. I’m not exactly sure how to use that yet, but it was the first thing I thought about using Mozaic. Thanks for your reply.

  • @Carnbot said:
    is there a way to bring up the patch info again after loading it, and then closing? (other than reloading)

    The description is in shown in layout 4. In a script you can create a toggle (I use the shift button) to switch between views.

    @OnLoad
      layout = 0 //Default to the first layout
      ShowLayout layout 
    @End
    
    @OnShiftDown 
      // Toggle between layout 0 and 4
      if (layout = 0)
        layout = 4
      else
        layout = 0
      endif
      ShowLayout layout 
    @End
    
    @Description 
    Simple script to show toggling between two layouts by tapping the shift button.
    @End 
    
    
  • edited May 2019

    @Harro said:

    @legsmechanical said:
    @harro does midi leaning the AU knobs in your host not get you to the same place?

    Yes, of course you can use midi learn for many AU knobs/sliders, but with Mozaic you can do all kinds of creative things with these CC numbers first: alter, refuse, combine with other midi-data, depending on the CC number, etc. I’m not exactly sure how to use that yet, but it was the first thing I thought about using Mozaic. Thanks for your reply.

    I see what you mean, but it it should be possible to do this in the code. You could set up a situation where while holding shift the last cc received is registered along with the number of the last knob twiddled, and then have the value of that knob track the value of that cc (after manipulating that cc value in whatever way you’d like), right?

  • @wim said:

    @brambos said:

    @wim said:

    @brambos said:

    @wim said:

    @blakkaz said:

    @wim said:
    Let’s say I have four values: 80, 20, 18, 100.

    • If at 0/0 on the pad, the value is 80
    • If at 0/127 on the pad, the value is 20
    • If at 127/127 on the pad, the value is 18
    • If at 127/0 on the pad, the value is 100

    But ... how do I figure out the value if I’m at various positions like 10/82, 100/100, 100/80?

    I haven't picked up the app yet, but have been reading through the manual.
    Would TranslateScale work?

    // calculate value for 10/82
    
    x = TranslateScale 10, 0, 127, 80, 20
    y = TranslateScale 82, 0, 127, 100, 18
    
    z = (x + y) / 2
    

    Thanks for checking it out. I thought that was the way too, but I’m not getting the expected results.

    This is a slightly more complex mathematical problem than it appears on first sight, because each value is made up out of the weighted influence of all 4 corner-values. I've tried solving it using Pythagoras, but I'm not getting the exactly correct values either.

    I have just forwarded the question to the mathematical community on the interwebs. Let's see what the true boffins come up with ;)

    Oooohhh. In the big leagues now! Thanks for doing that! I asked around at the local beer joint and even the bartender was stumped. Didn’t know where else to turn.

    Can’t wait to hear back!

    Gotta love the internet. The trick is to approach it as a 3 dimensional calculation rather than a 2D plane, and use bilinear interpolation. Here’s the solution:

    @OnLoad
    // corner values
    v00 = 80
    v01 = 20
    v11 = 18
    v10 = 100
    @End

    @OnXYChange
    x = GetXValue / 127
    y = GetYValue / 127
    z1 = (1-x) * (1-y) * v00
    z2 = x * (1-y) * v10
    z3 = (1-x) * y * v01
    z4 = x * y * v11
    z = z1 + z2 + z3 + z4
    log z
    @End

    Nice! Thanks!! I got to thinking it had to be done as a series of transformations but just couldn’t get my head around it. This is great. I have the four knob snapshots part done, now I should be able to morph between them with the XY pad.

    After sleep tho...💤

    I'm adding this as a new function to the next update. It seems like something that could be convenient for a lot of use cases:

    z = GetMorphXYValue topleft, topright, bottomleft, bottomright

  • edited May 2019

    @wim said:

    @Carnbot said:
    is there a way to bring up the patch info again after loading it, and then closing? (other than reloading)

    The description is in shown in layout 4. In a script you can create a toggle (I use the shift button) to switch between views.

    @OnLoad
      layout = 0 //Default to the first layout
      ShowLayout layout 
    @End
    
    @OnShiftDown 
      // Toggle between layout 0 and 4
      if (layout = 0)
        layout = 4
      else
        layout = 0
      endif
      ShowLayout layout 
    @End
    
    @Description 
    Simple script to show toggling between two layouts by tapping the shift button.
    @End 
    
    

    Thanks, yes I saw that on layout 4, good idea to add a shortcut with the shift key :)

  • @brambos said:

    I'm adding this as a new function to the next update. It seems like something that could be convenient for a lot of use cases:

    z = GetMorphXYValue topleft, topright, bottomleft, bottomright

    What? Sweet!!

  • Updated my script (Chord Magic), link below. Some bugfixes, added possibility to set octave for chord and strum speed per pattern step plus some other improvements.

    https://www.dropbox.com/s/gspbj4u97342h0q/Chord Magic.mozaic?dl=0

  • @rrc2soft Having fun with Strummer tonight thanks again all for this great app.

Sign In or Register to comment.