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!

18687899192102

Comments

  • @pejman said:
    So, how is it that the arpeggiators accurately recognize the notes and the counting of the notes under any condition of playing the chords? Of course, I mean the arpeggiator program section, which allows us to determine the order of playing the notes ourselves.

    Because arpeggiators are just playing around with the notes you are playing on the keyboard not figuring out which chord you are playing. You can hold any notes down (even if they don’t form a real chord) and the arp will do its thing based on the settings like up, down etc.

  • wimwim
    edited April 2023

    @pejman said:
    @wim , Your explanation is completely logical and correct . Yes, I completely agree with what you said about the note delay in the human effect
    So, how is it that the arpeggiators accurately recognize the notes and the counting of the notes under any condition of playing the chords? Of course, I mean the arpeggiator program section, which allows us to determine the order of playing the notes ourselves.
    Of course, my need is only about chords, not playing notes along with chords.

    As I mentioned, in the following post, it is possible to track the lowest, highest, and the order of the notes that are held down at any time. My original response was to your mention of chords, and inversions, etc., which is way more challenging and involves the timing problems mentioned above.

    I put together a little bit of sample code that you may be able to adapt to your purposes.

    @Description
    Example routines to find the lowest and highest of simultaneously played notes (chords).
    Each time a note is pressed or released, the lowest note, highest note, and the order that
    the notes arrived is logged.
    @End
    
    @OnLoad
      noteCount = 0
      FillArray heldNotes,-1
      highest = -1
      lowest = -1
    @End
    
    @OnMidiNoteOn
      // Append new note to the heldNotes array
      heldNotes[noteCount] = MIDINote  
      Inc noteCount
      
      Log {Note-ON}
      Call @GetLowest
      Call @GetHighest
      Call @GetNoteOrder
    @End
    
    @OnMidiNoteOff
    
      // Pull the released note out of the heldNotes array 
      found = NO
      n = 0
      repeat
        if heldNotes[n] = MIDINote
          found = YES
        endif
        if found
          heldNotes[n] = heldNotes[n+1]
        endif
        Inc n
      until heldNotes[n] = -1 or n = 1024
      Dec NoteCount
      
      Log {Note-OFF}
      Call @GetLowest
      Call @GetHighest
      Call @GetNoteOrder
    @End
    
    @GetLowest
      lowest = heldNotes[0]
      if lowest <> - 1
        for l = 0 to (noteCount -1)
          if heldNotes[l] < lowest
            lowest = heldNotes[l]
          endif
        endfor
      endif
      
      if lowest = -1
        Log {Lowest: No notes are being held.}
      else
        Log {Lowest: }, (NoteName lowest,YES), { (}, lowest, {)}
      endif
    @End
    
    @GetHighest
      highest = heldNotes[0]
      if highest <> -1
        for h = 0 to (noteCount - 1)
          if heldNotes[h] > highest
            highest = heldNotes[h]
          endif
        endfor
      endif
      
      if highest = -1
        Log {Highest: No notes are being held.}
      else
        Log {Highest: }, (NoteName highest,YES), { (}, highest, {)}
      endif
    @End
    
    @GetNoteOrder
      if noteCount <> 0
        for o = 0 to noteCount - 1
          Log {Note }, o, {: }, (NoteName heldNotes[o],YES), { (}, heldNotes[o], {)}
        endfor
      else
        Log {Note Order: No notes are being held.}
      endif
    @End
    
  • Interesting, I was testing Mosaic this weekend, it is not really what I need for my music and as I was a dev I don’t want anymore do any coding I want to do music…. and forget Audiokit dev as it is not the most efficient way to do clean coding with stability issues.

    FAC do very good apps so why they release Mozaic very limited and borderline with Apple apps dev rules ? I can’t see any future for this app including to generate sales to cover dev cost.

    I love the work of FAC dev and some of their great iOS apps even if Mozaic doesn’t fit what I need. Hope some of you will have great fun with it.

  • wimwim
    edited April 2023

    @BerlinFx said:
    Interesting, I was testing Mosaic this weekend, it is not really what I need for my music and as I was a dev I don’t want anymore do any coding I want to do music…. and forget Audiokit dev as it is not the most efficient way to do clean coding with stability issues.

    FAC do very good apps so why they release Mozaic very limited and borderline with Apple apps dev rules ? I can’t see any future for this app including to generate sales to cover dev cost.

    I love the work of FAC dev and some of their great iOS apps even if Mozaic doesn’t fit what I need. Hope some of you will have great fun with it.

    FAC isn't the publisher of Mozaic. Bram Bos is the developer of Mozaic. FAC does mainly audio FX plugins and instruments. Mozaic deals with MIDI only, not sound. It's meant for enabling people to do things with MIDI that may not be available with existing apps.

  • McDMcD
    edited April 2023

    @pejman said:
    AudioKit Swift???

    Apple released the iPad “Swift Playgrounds” app that allows you to build apps without requiring a Mac to compile the app from source code. The AudioKit Pro folks then created a swift package of some of their code that can be imported into the Swift Playground. There are many videos teaching the required steps to install the environment and make simple apps. For example, the AudioKit folks made this one:

  • edited April 2023

    @wim . Yes thats great. With this method, based on the number of notes from the lowest number to the highest number of notes, we can determine the notes based on the first, second and third notes of the chord for the mosaic, of course, after this step,(note tracking ).
    Can't this be added using your patch?
    Of course, I agree that there is a time delay, but this time delay can be not too much and it is very useful for my case.

  • Sorry @wim I need to sleep more , love also what do Bram Bos but that doesn’t change why Mozaic is not my cup of tea. I need to understand more about MIDI.

  • @McD said:

    Apple released the iPad “Swift Playgrounds” app that allows you to build apps without requiring a Mac to compile the app from source code. The AudioKit Pro folks then created a swift package of some of their code that can be imported into the Swift Playground. There are many videos teaching the required steps to install the environment and make simple apps. For example, the AudioKit folks made this one:

    Very Thanks for explanation . Oh my god, I already knew and worked with Swift. I thought Audio Kit Swift was a separate and different app😂.
    I need to research it more.

  • As Wim said, Mozaic is all about processing and transforming MIDI, and this has many uses.

    If you want to understand why this thread is 89 pages long, go take a look at what folks create with Mozaic at:
    https://patchstorage.com/platform/mozaic/

    I used to be a programmer too and definitely have been sucked into programming projects with Mozaic but making music on iOS is a multi disciplinary affair. There's always the option of picking up a guitar or playing a piano (don't try to pick up a piano) for those that want to just craft a song.

  • @wim said:
    I put together a little bit of sample code that you may be able to adapt to your purposes.

    @Description
    Example routines to find the lowest and highest of simultaneously played notes (chords).
    Each time a note is pressed or released, the lowest note, highest note, and the order that
    the notes arrived is logged.
    @End
    
    @OnLoad
      noteCount = 0
      FillArray heldNotes,-1
      highest = -1
      lowest = -1
    @End
    
    @OnMidiNoteOn
      // Append new note to the heldNotes array
      heldNotes[noteCount] = MIDINote  
      Inc noteCount
      
      Log {Note-ON}
      Call @GetLowest
      Call @GetHighest
      Call @GetNoteOrder
    @End
    
    @OnMidiNoteOff
    
      // Pull the released note out of the heldNotes array 
      found = NO
      n = 0
      repeat
        if heldNotes[n] = MIDINote
          found = YES
        endif
        if found
          heldNotes[n] = heldNotes[n+1]
        endif
        Inc n
      until heldNotes[n] = -1 or n = 1024
      Dec NoteCount
      
      Log {Note-ON}
      Call @GetLowest
      Call @GetHighest
      Call @GetNoteOrder
    @End
    
    @GetLowest
      lowest = heldNotes[0]
      if lowest <> - 1
        for l = 0 to (noteCount -1)
          if heldNotes[l] < lowest
            lowest = heldNotes[l]
          endif
        endfor
      endif
      
      if lowest = -1
        Log {Lowest: No notes are being held.}
      else
        Log {Lowest: }, (NoteName lowest,YES), { (}, lowest, {)}
      endif
    @End
    
    @GetHighest
      highest = heldNotes[0]
      if highest <> -1
        for h = 0 to (noteCount - 1)
          if heldNotes[h] > highest
            highest = heldNotes[h]
          endif
        endfor
      endif
      
      if highest = -1
        Log {Highest: No notes are being held.}
      else
        Log {Highest: }, (NoteName highest,YES), { (}, highest, {)}
      endif
    @End
    
    @GetNoteOrder
      if noteCount <> 0
        for o = 0 to noteCount - 1
          Log {Note }, o, {: }, (NoteName heldNotes[o],YES), { (}, heldNotes[o], {)}
        endfor
      else
        Log {Note Order: No notes are being held.}
      endif
    @End
    

    !

    Nice solution @Wim. It’s truly mind boggling to contemplate how many C statements can be executed between 2 MIDI events a couple Milliseconds apart. The @Brambos Mozaic interpreter is such a robust, stable solution. Scripts can get really large before things start to get a bit wonky. Firing off more that ~256 MIDI output events at once will pop up one of the internal limits Bram implemented to insure users don’t over tax the interpreter. Of course, most synths cannot handle 250+ batches of MIDI events without falling over dead or crashing into the weeds. Mozaic is still a great tool for generating Death by MIDI tracks.

  • People that write a ton of Mozaic scripts typically ask for “Character” data types and some extra output formatting for text. Currently, you can only output a hard coded string of characters for labels and logging uses. So, for a lot of labels like all the possible Chord types you get huge if then else structures to cover all the possible output cases: C major, C# major, … G minor… A minor 7th, etc.

    Responding to what seems like a simple request would probably involve a massive about of new code in the interpreter to cover all the cases… but we can hope for some crumbs while Bram is between projects. I don’t think Apple would reject this new data type as infringing on their control of the app space.

  • @pejman said:
    @wim . Yes thats great. With this method, based on the number of notes from the lowest number to the highest number of notes, we can determine the notes based on the first, second and third notes of the chord for the mosaic, of course, after this step,(note tracking ).
    Can't this be added using your patch?
    Of course, I agree that there is a time delay, but this time delay can be not too much and it is very useful for my case.

    Hi @pejman - yes I suppose you could add some time-checking to determine when to consider something a "chord". I've already looked at that particular programming challenge and have decided it's not the type of problem I want to try to solve with Mozaic. There are plenty of chord detection apps already available.

    You may want to take a look at some of the chord scripts listed on the Mozaic scripts list page for ideas how to approach this if you do want to try to identify chords with Mozaic. If I remember correctly, Smart Chord Bass by the amazing @_ki got heavily into this challenge.

  • @BerlinFx said:
    Sorry @wim I need to sleep more , love also what do Bram Bos but that doesn’t change why Mozaic is not my cup of tea. I need to understand more about MIDI.

    No need to apologize! 😎
    I was just trying to clarify. For sure, writing Mozaic scripts is not for everyone.

    On the other hand, with the dozens and dozens of already written useful scripts available, one doesn't have to write a single line of code to make use of Mozaic if a script meets their need.

  • edited April 2023

    2 question.
    We can return the status of KNOB position to value 64 with double tab on each KNOB, If the KNOB status is somewhere other than the value 64.
    Can we consider another value to reset the KNOB instead of the number 64 with double TAP ?

    And the other question is whether we can execute the command we want by double tap on knob?

    I know there is a lot of work to be done by shift button , but I will ask this question for a specific case.

  • @pejman said:
    2 question.
    We can return the status of KNOB position to value 64 with double tab on each KNOB, If the KNOB status is somewhere other than the value 64.
    Can we consider another value to reset the KNOB instead of the number 64 with double TAP ?

    No. But you could use math to rescale the knob so that the knob’s 64 is interpreted as a different value. You can catch the knob’s value changing and rescale it’s values.

    And the other question is whether we can execute the command we want by double tap on knob?

    No.

    I know there is a lot of work to be done by shift button , but I will ask this question for a specific case.

  • McDMcD
    edited April 2023

    When you double tap it creates an “OnKnobChange” event. “LastKnob” is set to the number of the tapped knob and “GetKnobValue” for that knob will return “64”. So with those results you can then set a value you would prefer over 64 for some variable of interest and reset the knob position accordingly. So you can change effectively the default behavior for any knob with some “if” testing of LastKnob and its current value.

    Have fun.

    What’s really crazy cool for me is the fact that double taps can be used to trigger other events similar to PAD taps since I use the 22 knob UI page a lot and always wish for a PAD toggle option and have to switch screens to get one. I can just code for double taps and also put the knob back on its prior value. Sweet discovery from your question.

    Double Taps can also be used to reset to a default I might prefer over 64.

  • edited April 2023

    But i need to all of 127 value of knob .
    Unfortunately I can't write it

  • @McD said:

    What’s really crazy cool for me is the fact that double taps can be used to trigger other events similar to PAD taps since I use the 22 knob UI page a lot and always wish for a PAD toggle option and have to switch screens to get one. I can just code for double taps and also put the knob back on its prior value. Sweet discovery from your question.

    Double Taps can also be used to reset to a default I might prefer over 64.

    Yes i use double tap on pads and on Shift for use to trigger other events .by use of patch : Single Tap, Double Tap, and Tap-and-Hold, by ( Bryan Appel ) .

  • @pejman said:
    But i need to all of 127 value of knob .
    Unfortunately I can't write it

    Unfortunately I can’t understand the first sentence.

    What do you are meaning with words as arranged by order this? (I speak a little Yoda).

  • For example i want to use knob 1 for sending cc value 0 to 127 , So I need all 127 values.
    But i need to reset knob to value 40 with double tap on knob, After the changes I made in knob.

  • @pejman said:
    For example i want to use knob 1 for sending cc value 0 to 127 , So I need all 127 values.
    But i need to reset knob to value 40 with double tap on knob, After the changes I made in knob.

    I think you will have to use something other than double-tapping the knob. There isn’t a way to disambiguate someone dialing the knob or double-tapping it. I sometimes check to see if shift is down while changes knob to set to some default value.

  • @espiegel . In maparoni patch knob 0 reset to specific value.

    In mutator patch v3,6 some of knobs in different layers or layouts reset to one or 2 or 3 different states , knob 2 cans set to 2 different state, or if knob 2 set to Config mode , knob 1 can have 3 different status with double tap on knob .or in layout 1 in channel mode knobs set to value 127 with double tap.

    But I can't figure out how it's done.

    I know that i use shift or pad for reset knobs to specific values, but i need this option with double tap on knobs for specific cases.

  • @pejman said:
    @espiegel . In maparoni patch knob 0 reset to specific value.

    In mutator patch v3,6 some of knobs in different layers or layouts reset to one or 2 or 3 different states , knob 2 cans set to 2 different state, or if knob 2 set to Config mode , knob 1 can have 3 different status with double tap on knob .or in layout 1 in channel mode knobs set to value 127 with double tap.

    But I can't figure out how it's done.

    I know that i use shift or pad for reset knobs to specific values, but i need this option with double tap on knobs for specific cases.

    I am having trouble understanding what you mean.

    Are you saying you found a script that uses double-tap to set a value other than 64?

  • Yes in maparoni and mutator , Or even more patches.

  • @pejman said:
    Yes in maparoni and mutator , Or even more patches.

    In mutator, he isn't detecting double-tap. It simply detects the value being set to 64 and then reassigns the value. Dial the knob to 64 and you will see that it behaves as if you double-tapped.

    That method works fine as long as your script doesn't ever need to use a value of 64.

  • Look at the lines that are like "if _val = 64..." to see what he is doing.

  • edited April 2023

    Thank you very much for your help, i try it ,and I will look into this matter and talk again tomorrow if you have time.

    What you found for me means a lot to me, very thanks.🙏

  • wimwim
    edited April 2023

    I don't see any knobs that reset to different values while they still have the full range on double-tap in maparoni.

    • Knob 0 has range 1 - 16, and resets to 9, the middle of that range.
    • Knob 1 has range 0-127, and resets to 64, the middle of the range.
    • Knob 2 has three values and resets to the middle one.
    • Knob 3 has two values and has logic to set to either the lowest or highest setting.

    That's not the same as having a full range knob and having it set to something else other than the center value on double-tap.

    If you haven't already, you should gain understanding of TranslateScale and how it can be used to translate full scale knobs to fewer or more values than 127. But that won't help with your double-tap requirement.

  • edited April 2023

    @wim said:

    If you haven't already, you should gain understanding of TranslateScale and how it can be used to translate full scale knobs to fewer or more values than 127. But that won't help with your double-tap requirement.

    Yes your right. Yes, I already tried this issue with Translatescale and it didn’t work.

  • wimwim
    edited April 2023

    The only way you could get a double-tap to go to something other than the middle of the range would be to fake some kind of detection of larger jumps in value. For instance:

    @Description
    (Maybe) detect double-tap reset and change the value to something else.
    Not tested or recommended. Lots could go wrong.
    @End
    
    @OnLoad
      lastValue = 0
      defaultValue = 40
    @End
    
    @OnKnobChange
      knob = LastKnob
      value = GetKnobValue LastKnob
      if (knob = 0) and (value = 64) and (Abs (64-lastValue) > 1)
        SetKnobValue knob, defaultValue
      endif
      lastValue = value
    @End
    
Sign In or Register to comment.