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 Script providing “Intervalic Chord Pad Pages” (YouTube demo and Patchstorage AUM project)

Hopefully this YouTube demo will encourage users to download the AUM Project or Mozaic script and give this a spin. There’s a description on the YouTube page.

Patchstorage links:

AUM Project download page includes pre-loaded Mozaic script:
https://patchstorage.com/intervalic-chord-pad-pages-v1/

Mozaic script download page:
https://patchstorage.com/intervalic-chord-pad-pages/

Comments

  • Noice @McD

    And thank you

  • _ki_ki
    edited December 2022

    Thanks a lot. That‘s a nice performance script offering a new way to play complex chord progressions.

  • Definitely going to try this soon. Looks great!

  • McDMcD
    edited December 2022

    @audiblevideo said:
    Noice @McD

    I hope you try and suggest any changes you’d appreciate.

    @Stochastically said:
    Thanks!

    I hope you get something nice out of it for your workflow.

    @_ki said:
    Thanks a lot. That‘s a nice performance script offering a new way to play complex chord progressions.

    Thanks. It presented a series of problems to solve and usually when I keep adding features either I create more problems than solutions or I discover a Mozaic issue. At one point the script would just reports errors. I think I hit some resource limit in Moziac or having a single script edited hundreds of times created side effects. I had to roll back top a prior version and re-code the lost feature.

    This Intervalic approach to a “midi controller” can help produce complicated “piano playing” by just pressing a single pad fast.
    This idea came from the “SamChillian” midi controller which is used for scale but I thought it might be useful for chord playing.
    A piano player would call the results “Planing” where a similar chord shape is moved either up or down a scale or in similar intervals.

    The original Samchillian product demo.

    I also made a SamChillian script for the Artiphon Orbas (1 and 2) and put it on patchstorage.

    I think there’s a lot of app ideas that can result from watching composer videos:

    @Skyblazer said:
    Definitely going to try this soon. Looks great!

    I hope it resonates for you. I must admit I get totally lost… I hit a pad expecting a specific sound and get totally different chord.
    To really predict the results I have to go really slow. The solution is to treat the interface like a memory game:

    Hit two pads until you find a sequence you like…
    Add a third and keep repeating and adding until you get a 4 or 8 bar sequence.

    In the AUM project I included Atom2 so these sequences can be recorded and exported for use in other apps, sequencers or DAWs.

  • Interesting concept and sounds good... How are you playing the Venus theory presets?

  • @tsferro said:
    Interesting concept and sounds good... How are you playing the Venus theory presets?

    It’s an amazing free version available in the “Decent Sampler” (free) app. Just hit the BROWSE button. There are a lot of free
    Intruments on that internal store page. I’m tempted to check out the $28 commercial option too. All the apps in the AUM project and this demo are free except for Mozaic… the script of course is free on patchstorage.

  • heshes
    edited December 2022

    @McD said:
    Hopefully this YouTube demo will encourage users to download the AUM Project or Mozaic script and give this a spin. There’s a description on the YouTube page.

    Very cool McD, thanks, I'll give this one a try. I especially like how you've taken the SamChillian/Misha idea and extended it.

    I don't know whether I've heard anyone taking about chord "rotators" here on abf. I wonder whether it might fit in with some of the themes in your script. Here's an explanation:
    https://patchstorage.com/coltranius-chord-rotator/

    [EDIT: Not suprised, I see there is already a chord rotator in Mozaic on Patchstorage: https://patchstorage.com/coltranius-rotator/ And it's written by the same guy I originally referenced. One more thing for me to check out. Here's youtube of the mozaic plugin working, he uses it with breath controller, but it should work almost as well keyboard and mod wheel for the breath/pressure control. And fine with no mod wheel at all, I expect:


    ]

  • Thank you for sharing this McD. Pointing this at arpeggiators like Aphelian or Rozeta and then into AudioLayer’s Virtual Playing Orchestra is turning a rough day into a better night.

  • McDMcD
    edited December 2022

    @MadeofWax said:
    Thank you for sharing this McD. Pointing this at arpeggiators like Aphelian or Rozeta and then into AudioLayer’s Virtual Playing Orchestra is turning a rough day into a better night.

    Cool. That free Audiolayer “download” is a pretty reasonable soundfont for orchestra stuff. The SF2 orchestra files out there loaded into something like KQ Sampei is another good target.

    But everyone should consider getting Decent Sampler and that free Venus Theory download. It really works great with the big wide-voiced chords. Check the YouTube video starting at 3:12. The only FX added is one copy of the free “Zero Reverb”. It’s pretty epic.

  • Holy crap. Really cool.

  • Hi McD,
    Sounds good.
    Might want to fork this over.
    Btw the download counter is broken. It should be around 300 by now!

  • @McD Thanks for sharing great script. Can you use AUM keys to play the chords rather than the pads in Mozaic are the pads midi mappable ?

  • McDMcD
    edited December 2022

    @Jumpercollins said:
    @McD Thanks for sharing great script. Can you use AUM keys to play the chords rather than the pads in Mozaic are the pads midi mappable ?

    I wrote a script with that idea… it started in StreamByter and @_Ki asked if he could make it more solid and add a few features. I should post details since StreamByter is free.

    I then started conning when Mozaic arrived (praise @Brambos) and put that chord generator on patchstorage. @Wim took the idea and made a killer note to chord called “The Chordulator”.

    It would be interesting to me to map the pads to notes so Mozaic with the script could take input from other generators.

    Please propose 16 notes you’d like to see added using the C4, D4 or C3, C#3 style labeling… hopefully adding the extra lines doesn’t break the script. I had a scary stage where perfectly valid (in my opinion) started generating pages of errors and an infinite loop warning… a Def-Con IOS condition.

    2 ranges of 8 white keys makes the most sense. The mental work of jumping between major (upper) and (minor) pads might drive people crazy.

    This might be the easiest to create a mental map:

    C-4 to C-5 major
    C-3 to B-3 minor and drop the 16th pad

    I’ll test that. Any midi controller will work… AUM keyboard, LK, Fugue Machine, etc.

    It might be an interesting exercise to hack MIDI learn for touching PADs virtually. I wonder what happens if you set LastPad and Call @OnPadDown. Worth checking out.

    I’m currently brain deep in a step sequencer script with a Master Controller to operate 4 of the step sequencers. It has the 22 knob interface. Not sure anyone will care but the inter-script communication using CC’s is a cool idea. You turn the Transpose knob and all sequences move in parallel.

  • @McD - thank you for posting this very interesting script.

  • McDMcD
    edited December 2022

    Eureka… setting “Lastpad” in code and Calling “OnPadDown” and “OnPadUp” works for converting incoming signals to PadEvents.

    @OnMidiNoteOn
    
      PadTable = [8,8,9,9,10,11,11,12,12,13,14,14,0,0,1,1,2,3,3,4,4,5,6,6,7,7]
    
      Index = MIDIByte2 - 43
      LastPad = PadTable[Index]
      Log {MIDIByte2=},MIDIByte2,{ Index=},Index,{ NoteNumber=},LastPad
      Call @OnPadDown
    
    @End
    
    @OnMidiNoteOff
    
      Index = MIDIByte2 - 43
      LastPad = PadTable[Index]
      Log {MIDIByte2=},MIDIByte2,{ Index=},Index,{ NoteNumber=},LastPad
      Call @OnPadUp
    
    @End
    

    Playing with the AUM keyboard I decide to have the “Root Minor Reset” and “Root Major Reset” be C3 and C4 since the default Root is C. Any Black key is mapped to the lower natural key.

    There seem to be some side effects that create hung notes in the synth so I need to test and figure out what’s wrong but if you want to play along: paste the above code segment into the script after any @End statement and press upload. I’m sure many will think… I’ll wait but it’s not rocket science or being the owner of Twitter to open a script and add more lines and upload. I’d paste the whole script but it’s too long. Hopefully the testing doesn’t take days to repair the behavior.

  • @McD said:
    Eureka… setting “Lastpad” in code and Calling “OnPadDown” and “OnPadUp” works for converting incoming signals to PadEvents.

    @OnMidiNoteOn
    
      PadTable = [8,8,9,9,10,11,11,12,12,13,14,14,0,0,1,1,2,3,3,4,4,5,6,6,7,7]
    
      Index = MIDIByte2 - 43
      LastPad = PadTable[Index]
      Log {MIDIByte2=},MIDIByte2,{ Index=},Index,{ NoteNumber=},LastPad
      Call @OnPadDown
    
    @End
    
    @OnMidiNoteOff
    
      Index = MIDIByte2 - 43
      LastPad = PadTable[Index]
      Log {MIDIByte2=},MIDIByte2,{ Index=},Index,{ NoteNumber=},LastPad
      Call @OnPadUp
    
    @End
    

    Playing with the AUM keyboard I decide to have the “Root Minor Reset” and “Root Major Reset” be C3 and C4 since the default Root is C. Any Black key is mapped to the lower natural key.

    There seem to be some side effects that create hung notes in the synth so I need to test and figure out what’s wrong but if you want to play along: paste the above code segment into the script after any @End statement and press upload. I’m sure many will think… I’ll wait but it’s not rocket science or being the owner of Twitter to open a script and add more lines and upload. I’d paste the whole script but it’s too long. Hopefully the testing doesn’t take days to repair the behavior.

    @McD Sweet thanks for looking into it.

  • @McD Oh, i didn‘t know that assignments to LastPad works. In my Mozaic Syntax-Highlighter i flagged this as error.

    I’m going to test, which of the Mozaic build-ins really read the assigned value and will return them in a called function…

    But did you really check that the original Mizaic name (ie in your case LastPad) still works ? Quite some time ago i noticed that using the variable name div or inc ‚overrules‘ the function names.

    @OnLoad
      div = 4        // Creating a variable named like a buildin function overwrites the function
      a = div 7, 2  //  Using the div function like normal produces a syntax error
    @End
    
  • @Mcd Sorry to tell you, but i was right to worry.

    @OnShiftDown
      Log {Creating a variable named LastPad by assignment}
      LastPad = 15
    @End 
    
    @OnPadDown
      Log {PadDown  LastPad=}, LastPad
    @End
    

    How to reproduce:

    • First press any of the 4 pads a see that LastPad reports the pad number
    • Press the Shift button
    • Now pressing a pad always reports 15

    The interpreter seems to first look through its list of variables for any token and only if the token is not found searches the list of buildin function names.

  • @_ki said:
    @Mcd Sorry to tell you, but i was right to worry.

    Try this approach:
    Set a new LastPad status variable AND then Call “OnPadDown” or “OnPadUp”.
    Of course, physically pressing a Pad will overwrite to the actual Pad pressed.

    Calling OnPadDown doesn’t actually use Mozaic to determine the value of LastPad but just uses the value you
    Set prior to the Call.

    See the extra line of code I added.

    ```
    @OnShiftDown
    Log {Creating a variable named LastPad by assignment}
    LastPad = 15

    Call @OnPadDown

    @End

    @OnPadDown
    Log {PadDown LastPad=}, LastPad
    @End
    ```

    How to reproduce:

    • First press any of the 4 pads a see that LastPad reports the pad number
    • Press the Shift button
    • Now pressing a pad always reports 15

    The interpreter seems to first look through its list of variables for any token and only if the token is not found searches the list of buildin function names.

  • McDMcD
    edited December 2022

    FYI: I have uploaded versions of the Mozaic script and AUM Project that implement the MIDI Note inputs as optional “Pad” selectors.

    Playing the the Pad Mapping tables I decided the minor 3rd and major 3rd intervals should select the best PAD’s logically.
    I ended up creating three mapping tables for each of the SHIFT’ed optional layouts:

           if Shift = 0
              PadTable = [8,9,10,10,10,11,12,13,13,14,14,14,0,1,2,2,2,3,4,5,5,6,6,6,7,7]
           elseif Shift = 1
              PadTable = [8,8,9,10,10,11,12,13,13,14,14,14,0,0,1,1,2,3,4,5,6,7,7,7,7,7]
           elseif Shift = 2
              PadTable = [8,8,9,9,10,11,12,13,13,14,14,14,0,0,1,1,2,3,3,4,4,5,6,6,7,7]
           endif
    
  • _ki_ki
    edited December 2022

    But i can offer you a work-around:

    Simply rename you @OnPadDown and @OnPadUp into user functions like @MyPadDown and @MyPadUp. In these functions no longer use the function LastPad but a variable like pLastPad. Since they no longer depend on the buildin, They can be called from within other functions.

    Here a simple example:

    @OnPadDown
       pLastPad = LastPad
       Call @MyPadDown 
    @End 
    
    @OnPadUp
       pLastPad = LastPad
       Call @MyPadUp 
    @End 
    
    @MyPadDown // param pLastPad    
       // The code that has originally been in OnPadDown
       // … but using the variable pLastPad instead of the buidlin LastPad function
    @End 
    
    
    @MyPadUp // param pLastPad    
       // The code that has originally been in OnPadUp
       // … but using the variable pLastPad instead of the buidlin LastPad function
    @End 
    

    This allows to call your pad functionality from the OnMidiNoteOn / OnMidiNote up by setting the pLastPad parameter before calling.

    And the Pad functionality still works in paralell.

    .

    With your approach, the Pads no longer work as soon as a note command arrives that assigns to LastPad.

  • _ki_ki
    edited December 2022

    @McD

    Try this approach:
    Set a new LastPad status variable AND then Call “OnPadDown” or “OnPadUp”.

    Yes, i understood what you want to do - and it even works for incoming midi notes translated into pad presses - but

    Of course, physically pressing a Pad will overwrite to the actual Pad pressed.

    as soon as the variable is created, LastPad will allways return the last value set to the variable. The buildin function LastPad is no longer called. And therefore real pad presses (on any of the pads) play the interval that was set via the last midi note. The pad-interaction no longer works.

    .

    That‘s what my demo was showcasing with the shift press.

    You can also see it with you added Call @MyPadDown in the OnShiftDown. Yes it logs pad 15 - but also does so afterwards when pressing any of pad 0 to 3. Pad interaction is killed

  • @McD said:
    FYI: I have uploaded versions of the Mozaic script and AUM Project that implement the MIDI Note inputs as optional “Pad” selectors.

    Playing the the Pad Mapping tables I decided the minor 3rd and major 3rd intervals should select the best PAD’s logically.
    I ended up creating three mapping tables for each of the SHIFT’ed optional layouts:

    if Shift = 0 PadTable = [8,9,10,10,10,11,12,13,13,14,14,14,0,1,2,2,2,3,4,5,5,6,6,6,7,7] elseif Shift = 1 PadTable = [8,8,9,10,10,11,12,13,13,14,14,14,0,0,1,1,2,3,4,5,6,7,7,7,7,7] elseif Shift = 2 PadTable = [8,8,9,9,10,11,12,13,13,14,14,14,0,0,1,1,2,3,3,4,4,5,6,6,7,7] endif

    @_ki said:

    Try this approach:
    Set a new LastPad status variable AND then Call “OnPadDown” or “OnPadUp”.

    Yes, i understood what you want to do - and it even works for incoming midi notes translated into pad presses - but

    Of course, physically pressing a Pad will overwrite to the actual Pad pressed.

    as soon as the variable is created, LastPad will allways return the last value set to the variable. The buildin function LastPad is no longer called. And therefore real pad presses (on any of the pads) play the interval that was set via the last midi note. The pad-interaction no longer works.

    .

    That‘s what my demo was showcasing with the shift press.

    You can also see it with you added Call @MyPadDown in the OnShiftDown. Yes it logs pad 15 - but also does so afterwards when pressing any of pad 0 to 3. Pad interaction is killed

    I see what you are saying. If you use a MIDI controller as input then the behavior of the Pads is disabled. I’ll pass variables into the the OnPad code sections that re-set the LastPad value conditionally so the Pads still work. I NEED TO PROTECT “LastPad” and only set it inside the OnPad* code blocks if some “MIDI_Input” variable is True.

    As currently coded only one input method will work and any incoming Note events will disable the Pads.

  • _ki_ki
    edited December 2022

    Here a full example showcasing the above work-around on how pad-interaction still work after midi-interactions:

    // The new OnPadDown/Pad up call user-functions and set the pLastPad parameter.
    
    @OnPadDown
       pLastPad = LastPad
       Call @MyPadDown 
    @End 
    
    @OnPadUp
       pLastPad = LastPad
       Call @MyPadUp 
    @End 
    
    
    // The orginal PadDown/PadUp code, simply renamed and using pLastPad instead 
    // of the buildin function LastPad wherever LastPad was used.
    
    @MyPadDown // param pLastPad
       Log {processing code for pad-down pad=}, pLastPad
    @End 
    
    @MyPadUp // param pLastPad 
       Log {processing code for pad-up   pad=}, pLastPad
    @End
    
    
    // Midi commands to play the pads with note 0..15
    
    @OnMidiNoteOn
       if MidiNote < 16
          pLastPad = MidiNote
          Call @MyPadDown
       endif
    @End
    
    @OnMidiNoteOn
       if MidiNote < 16
          pLastPad = MidiNote
          Call @MyPadUp
       endif
    @End
    

    Pads and Midi-Notes work in parallel - so there is the possibility of manually pressing pad 1 and also sending note-on 1 both interactions calling OnMyPadDown with pLastPad=1. This will produce double note-ons / offs for the generated chords.

    But additional code in MyPadDown/Up and an additional parameter specifying if called from pad or midi interaction would allow to ‚lock‘ each of the 16 interactions, so that it can only be activated once and will only be deactivated by the same interaction type. That enhancement only requires 11 code lines in total (just tried).

  • McDMcD
    edited December 2022

    @_ki said:
    Here a full example showcasing the above work-around on how pad-interaction still work after midi-interactions:

    // The new OnPadDown/Pad up call user-functions and set the pLastPad parameter.
    
    @OnPadDown
       pLastPad = LastPad
       Call @MyPadDown 
    @End 
    
    @OnPadUp
       pLastPad = LastPad
       Call @MyPadUp 
    @End 
    
    
    // The orginal PadDown/PadUp code, simply renamed and using pLastPad instead 
    // of the buildin function LastPad wherever LastPad was used.
    
    @MyPadDown // param pLastPad
       Log {processing code for pad-down pad=}, pLastPad
    @End 
    
    @MyPadUp // param pLastPad 
       Log {processing code for pad-up   pad=}, pLastPad
    @End
    
    
    // Midi commands to play the pads with note 0..15
    
    @OnMidiNoteOn
       if MidiNote < 16
          pLastPad = MidiNote
          Call @MyPadDown
       endif
    @End
    
    @OnMidiNoteOn
       if MidiNote < 16
          pLastPad = MidiNote
          Call @MyPadUp
       endif
    @End
    

    Pads and Midi-Notes work in parallel - so there is the possibility of manually pressing pad 1 and also sending note-on 1 both interactions calling OnMyPadDown with pLastPad=1. This will produce double note-ons / offs for the generated chords.

    But additional code in MyPadDown/Up and an additional parameter specifying if called from pad or midi interaction would allow to ‚lock‘ each of the 16 interactions, so that it can only be activated once and will only be deactivated by the same interaction type. That enhancement only requires 11 code lines in total (just tried).

    Thanks. I created a Version 3 that implements a similar scheme to avoid overwriting LastPad. Now both Pad events and MIDI incoming Note events activate the same code without side effects.

    Version 3 of the Mozaic script and AUM project patches are downloaded at PatchStorage.

  • 👍🏼

  • @_ki said:
    👍🏼

    Thanks for pointing out my oversight in my design… your interest in my projects always seems to be a benefit for me.
    I also appreciate your encouragement for my efforts.

    Welll… the script is so large I did a “Select All” and dropped it into a Vim editor in the A-Shell app.
    My fix was to change everything occurrence of LastPad to be the local variable “ThisPad”. But for 2 instances
    I had typed “Lastpad” (note the lowercase “P”) so it created a bug where Major and Minor pad detection failed.

    So, there’s a version 4 on Ptachstorage of the script and the AUM project… users of other DAW’s would have the extra work of making the Mozaic plumbing work in their DAW of choice. I’ll bet I could send a whole day trying to make it work in Drambo and it might not work at all in some DAW’s with bad MIDI FX implementations.

  • @McD said:
    So, there’s a version 4 on Ptachstorage of the script and the AUM project… users of other DAW’s would have the extra work of making the Mozaic plumbing work in their DAW of choice. I’ll bet I could send a whole day trying to make it work in Drambo and it might not work at all in some DAW’s with bad MIDI FX implementations.

    I hope your day job isn't in sales. 😂😇

Sign In or Register to comment.