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!

17172737577

Comments

  • Question for people with a Magic Keyboard: is it working for you? I have a report of someone for whom the Magic Keyboard isn't working in Mozaic in AUM (it's working in standalone).

    Any confirmation either way would help!

  • Can Mozaic filter active sensing and midi clock? Looking for an AUv3 solution. I looked around and I think my two best two options are Mozaic or StreamByter .

  • Hi @hypnopad - Answered here: https://forum.audiob.us/discussion/comment/821200/#Comment_821200 👍🏼

    Streambyter can do it too.

  • @brambos said:
    Question for people with a Magic Keyboard: is it working for you? I have a report of someone for whom the Magic Keyboard isn't working in Mozaic in AUM (it's working in standalone).

    Any confirmation either way would help!

    Quick test worked fine with a new Pro 10.5 with the new magic keyboard. Trackpad, arrows, typing all ok.

  • @xor said:

    @brambos said:
    Question for people with a Magic Keyboard: is it working for you? I have a report of someone for whom the Magic Keyboard isn't working in Mozaic in AUM (it's working in standalone).

    Any confirmation either way would help!

    Quick test worked fine with a new Pro 10.5 with the new magic keyboard. Trackpad, arrows, typing all ok.

    Thanks for checking!

  • @brambos
    Just reading through the Mozaic manual. The Div description says the number being divided is the denominator and the number you’re dividing by is the numerator. It should be the other way around. In 3/4 the numerator is 3 and the denominator is 4.

  • @TheOriginalPaulB made a nice new transposition and scaling script - KEYSTER

    I had a peek at the source and noticed that he has found an undocumented Mozaic feature :)

    .

    In his code, he used Inc variable, max as function in an expression, but int the manual and in-app syntax description Inc is clearly described as ‚command‘ not returning a value. I immediately tested Inc and the related Dec and found them both working:

       a = 7
       B = 3 * (inc a)
       Log {a=}, a,{   B=},b 
    

    Results in a being incremented to 8 and b equals 24

    .

    @TheOriginalPaulB used this (up to now unknown) feature for a nice wrapping index

       index = (Inc index) % 330
    

    which is shorter that what i used to do

      Inc index
      If index>=330
        index = 0
      Endif
    

    Nice find 👍🏻

  • @_ki said:
    @TheOriginalPaulB made a nice new transposition and scaling script - KEYSTER

    I had a peek at the source and noticed that he has found an undocumented Mozaic feature :)

    .

    In his code, he used Inc variable, max as function in an expression, but int the manual and in-app syntax description Inc is clearly described as ‚command‘ not returning a value. I immediately tested Inc and the related Dec and found them both working:

       a = 7
       B = 3 * (inc a)
       Log {a=}, a,{   B=},b 
    

    Results in a being incremented to 8 and b equals 24

    .

    @TheOriginalPaulB used this (up to now unknown) feature for a nice wrapping index

       index = (Inc index) % 330
    

    which is shorter that what i used to do

      Inc index
      If index>=330
        index = 0
      Endif
    

    Nice find 👍🏻

    Old C programming habit. I didn’t even think about it as it didn’t occur to me that it might not work...

  • I have updated the ‚Mozaic Language Support‘ for Code Text Editors to v1.9 that now supports Inc/Dec as functions and added these to expression code completion :)

    As simple as the change first seemed, it proved to be quite complicated. In the code-path for commands, the parser flags the usage of Mozaic function-names (amongst other things) as errors and in the code-path for expressions Mozaic command-names are allowed. Inc and Dec are now both functions and commands and therefore require special treatment - so i had to change several regular expressions and add new cases. With the help of the already extensive and now updated UnitTest, i managed to catch all the Inc/Dec cases without adding new errors

  • _ki_ki
    edited July 12

    @TheOriginalPaulB Your find is a ‚pre-increment‘ operation like ++var in C, as the function returns the already incremented value.
    It‘s not the more common var++ post increment of C - which matters for pointer/index operations:

      idx = -1
      for i = 10 to 19
        array[Inc idx] = 2*i
      endfor
    

    In this case i compensated the pre-increment by starting at -1. The example fills array[0] to array[9] with the values 20 to 38.

    .

    But one can also construct a post-increment operation, by using the inc in the expression itself, but discarding it by multiplying with 0:

      idx = 0
      for i = 10 to 19
        array[idx] = 2*i  + 0*(Inc idx)
      endfor
    
  • @_ki said:
    @TheOriginalPaulB Your find is a ‚pre-increment‘ operation like ++var in C, as the function returns the already incremented value.
    It‘s not the more common var++ post increment of C - which matters for pointer/index operations:

      idx = -1
      for i = 10 to 19
        array[Inc idx] = 2*i
      endfor
    

    In this case i compensated the pre-increment by starting at -1. The example fills array[0] to array[9] with the values 20 to 38.

    .

    But one can also construct a post-increment operation, by using the inc in the expression itself, but discarding it by multiplying with 0:

      idx = 0
      for i = 10 to 19
        array[idx] = 2*i  + 0*(Inc idx)
      endfor
    

    In my case, I needed the pre-increment behaviour to make sure that if it hit 330, it would be reset to 0 ready for the next use, giving me a repeating sequence of 0 to 329. I just figured the parentheses were causing it.

  • I added two more sub-chapters to the Mozaic Tips and Tricks wiki page

    • Using Logic Operators in Expressions instead of IF cases
    • Using Inc and Dec in Expressions
  • @_ki said:
    I added two more sub-chapters to the Mozaic Tips and Tricks wiki page

    • Using Logic Operators in Expressions instead of IF cases
    • Using Inc and Dec in Expressions

    There's some great content on that Wiki Page for anyone that appreciates computer science. I love the "folding" concept for packing a lot of structure into a 1024 element variable.

  • @wim I've been playing with the excellent HynoSequence script and it does a lot of handy things that I can use. However, the timed reset can be a bit tricky in practice. Any chance you built in a "reset if any note outside the specified range is played"?

  • wimwim
    edited July 13

    @lukesleepwalker said:
    @wim I've been playing with the excellent HynoSequence script and it does a lot of handy things that I can use. However, the timed reset can be a bit tricky in practice. Any chance you built in a "reset if any note outside the specified range is played"?

    I'm not sure I understand what you're asking. What range?

    There is a specific note you can set to be the reset note. Hit that note and the sequence resets. I guess maybe what you're asking is to have any note not in the "preset select" range of notes reset the sequence? If so, then I'd say, no I don't want to do that. I don't see what it accomplishes. But, probably I'm misunderstanding you.

  • @wim said:

    @lukesleepwalker said:
    @wim I've been playing with the excellent HynoSequence script and it does a lot of handy things that I can use. However, the timed reset can be a bit tricky in practice. Any chance you built in a "reset if any note outside the specified range is played"?

    I'm not sure I understand what you're asking. What range?

    There is a specific note you can set to be the reset note. Hit that note and the sequence resets. I guess maybe what you're asking is to have any note not in the "preset select" range of notes reset the sequence? If so, then I'd say, no I don't want to do that. I don't see what it accomplishes. But, probably I'm misunderstanding you.

    Yep, you got my drift. It does the same thing it accomplishes in the rounder robin script. But you are correct that the spirit of this script is to do something different.

  • wimwim
    edited July 13

    @lukesleepwalker said:

    @wim said:

    @lukesleepwalker said:
    @wim I've been playing with the excellent HynoSequence script and it does a lot of handy things that I can use. However, the timed reset can be a bit tricky in practice. Any chance you built in a "reset if any note outside the specified range is played"?

    I'm not sure I understand what you're asking. What range?

    There is a specific note you can set to be the reset note. Hit that note and the sequence resets. I guess maybe what you're asking is to have any note not in the "preset select" range of notes reset the sequence? If so, then I'd say, no I don't want to do that. I don't see what it accomplishes. But, probably I'm misunderstanding you.

    Yep, you got my drift. It does the same thing it accomplishes in the rounder robin script. But you are correct that the spirit of this script is to do something different.

    Sorry, I don't get it. What does having every note (except the preset select notes) reset the sequence, rather than just one note accomplish ... other than multiplying the potential for accidental resets?

  • wimwim
    edited July 13

    If you would like to make that change in your own version, it's easy: Just alter this section:

      // Notes on the control channel either trigger a reset, recall a preset,
      // or are ignored. 
      elseif MIDICommand = 0x90 and MIDIChannel = controlChannel
    
        if MIDINote = resetNote
          Call @DoReset
    
        elseif (MIDINote >= presetNote_0) and (MIDINote <= (presetNote_0 + 15))
          preset = MIDINote - presetNote_0
          Call @RecallPreset
    
        endif   
    
      endif
    

    Like this:

      // Notes on the control channel either trigger a reset or recall a preset.
      elseif MIDICommand = 0x90 and MIDIChannel = controlChannel
    
        if (MIDINote >= presetNote_0) and (MIDINote <= (presetNote_0 + 15))
          preset = MIDINote - presetNote_0
          Call @RecallPreset
    
        else
          Call @DoReset
    
        endif   
    
      endif
    
    
  • edited July 13

    @wim said:
    If you would like to make that change in your own version, it's easy: Just alter this section:

      // Notes on the control channel either trigger a reset, recall a preset,
      // or are ignored. 
      elseif MIDICommand = 0x90 and MIDIChannel = controlChannel
      
        if MIDINote = resetNote
          Call @DoReset
          
        elseif (MIDINote >= presetNote_0) and (MIDINote <= (presetNote_0 + 15))
          preset = MIDINote - presetNote_0
          Call @RecallPreset
          
        endif   
    
      endif
    

    Like this:

      // Notes on the control channel either trigger a reset or recall a preset.
      elseif MIDICommand = 0x90 and MIDIChannel = controlChannel
      
        if (MIDINote >= presetNote_0) and (MIDINote <= (presetNote_0 + 15))
          preset = MIDINote - presetNote_0
          Call @RecallPreset
    
        else
          Call @DoReset
    
        endif   
    
      endif
    
    

    That doesn't actually work, as it just plays the first note again and again. What I want is if note does not equal preset note then do reset. Thanks for the quick reply; I think given my edge case that I should go in and tinker with it myself. I can see most of the logic due to the good commenting.

  • @lukesleepwalker I’m a little confused but I think I see.It only makes sense to me if you are talking about notes outside of the note or note range for triggering the sequence on the trigger channel.Not notes on the CONTROL channel that change presets. Is this what you mean? Maybe we are getting confused by the meaning of “preset select ”?
    Maybe a more detailed user case is in order. I take it a dedicated reset button will not work in your setup.

  • @hypnopad said:
    @lukesleepwalker I’m a little confused but I think I see.It only makes sense to me if you are talking about notes outside of the note or note range for triggering the sequence on the trigger channel.Not notes on the CONTROL channel that change presets. Is this what you mean? Maybe we are getting confused by the meaning of “preset select ”?
    Maybe a more detailed user case is in order. I take it a dedicated reset button will not work in your setup.

    Oh crap. Yes, exactly. Sorry I missed giving that very important detail! I'm in the middle of my work day and so I have about half my brain cells on work and half of them on fiddling w/ Mozaic on my lunch break. What I meant with the reference to the Rounder Robin script is that it resets the sequence with a different note playing (no dedicated reset button or mechanism).

    You are correct that I'm suggesting that playing any note outside of the "trigger note/range" would act as a reset. So, C2 plays a sequence and gets 6 of 8 notes through the sequence. Play D2 (or any other note other than C2) and when coming back to C2 it starts the sequence from the start rather than "mid-stream".

  • edited July 13

    If @wim feels this complicates the script too much ( I’d also have to think about it to see if it could possibly impact my setup negatively) you could probably find a midi utility app that would change ranges of notes into the one note (and possibly channel) that matches the reset button in the script. Put that just before the hypnoseqence script. What that app would be I don’t know. Hopefully it would be an AUv3. Even if you found that, it might be too many moving parts for your comfort.

  • @hypnopad said:
    If @wim feels this complicates the script too much ( I’d also have to think about it to see if it could possibly impact my setup negatively) you could probably find a midi utility app that would change ranges of notes into the one note (and possibly channel) that matches the reset button in the script. Put that just before the hypnoseqence script. What that app would be I don’t know. Hopefully it would be an AUv3. Even if you found that, it might be too many moving parts for your comfort.

    Yeah, there are several ways around this challenge. Will get to it eventually (and totally understand that it's a departure from Wim's original work).

  • wimwim
    edited July 14

    @lukesleepwalker said:

    @hypnopad said:
    If @wim feels this complicates the script too much ( I’d also have to think about it to see if it could possibly impact my setup negatively) you could probably find a midi utility app that would change ranges of notes into the one note (and possibly channel) that matches the reset button in the script. Put that just before the hypnoseqence script. What that app would be I don’t know. Hopefully it would be an AUv3. Even if you found that, it might be too many moving parts for your comfort.

    Yeah, there are several ways around this challenge. Will get to it eventually (and totally understand that it's a departure from Wim's original work).

    So, what you've actually been looking for is: "Say I have notes C,C#,D,E defined on the steps. If I play an F it will reset the sequence"? Is that correct?

    If so, then no, I don't want to do that with this script. It's not so much about added complexity in the code as about it making how reset works ambiguous. Right now the whole idea is you can play any note not on the control channel and no matter what you play it cycles through the pattern. What the above describes would be confusing, and would require someone to remember what notes they had programmed into the sequence (and all presets). It seems like it would be way too easy to get unexpected results.

    This seems like such an odd idea that I feel at this point that there's a good chance I'm still not understanding what you mean. 😬

    You're welcome to make that change in a custom version though of course. It would involve iterating through the sequence array every time a note is received to check whether the note is in the sequence or not. You'd then set a Boolean variable and then use that as part of the if condition to decide whether or not to advance the sequence or to reset it.

    I could whip up a few lines of code by way of example, but since I'm still not sure I understand, I'll hold off.

  • Just did a thing and uploaded it here:

    https://patchstorage.com/dixtructa-dixie-dx7-patch-destroyer/

    I mentioned it in a Dixie thread yesterday and managed to get some sort of result going today - not as mental as I hoped yet but getting somewhere...

    copied the notes from the page here:

    Very experimental, using knobs to send sysex to several various parameters at once, this is a first iteration.

    The first knob changes the algorithm.
    The second changes all of the fine tuning for each op, some up, some down.
    The third controls a curve bias of the two tuning knobs
    The fourth controls the coarse tuning for each op, again, some up some down.
    The fifth is not yet doing anything, but I intend to incorporate a degree of randomness to all changes that will be controlled by this knob…

    The bottom row controls envelope parameters as labelled – this is where I think some degree of randomness can be really useful so I will investigate both using the random parameter above and some x/y pad possibilities…

    Any thoughts or guidance on how I might push this most welcome :)

  • Just updated that patch with a good thing, you can really get stuff going with it now but still plenty of FM sound space to explore with this I think

    “I’ve updated this 1.01 version to cumulatively use the bias control to affect each op differently on each of the controls. It definitely widens the possibilities and feeling pretty pleased with it (and myself) right now 😁

    I think a small refactor using for loops will make it all a bit more sensible to keep working so a wee refactor will be in order for next steps and that will allow a lot more possibilities to be explored I think”

    Link as above, really want to try some envelopes or lfos on the controls I’ve built...

  • Couple of wee tests with the above... Dixie plus mosaic patch with a bit of nembrini soundmaster and some blackhole doing the necessaries post synth...

  • Are there any (good) examples of creating non-trivial button labels? For example, chord names? I’m really hoping there’s something better than a 500 line if statement to label a button based on a root and chord type (major, minor, 7th, maj7th, 6th, ...).
    Thanks

  • McDMcD
    edited July 29

    @xor said:
    Are there any (good) examples of creating non-trivial button labels?

    Are you asking about Pad labels? Anything involving Text data seems to require a command for every possible text combination to be written out.
    I would look at @_Ki's or @wim's code to see if they have any special
    tricks for elegant labeling.

  • @xor Nope, no other way than if-cascades.

    For the root note of the chords, you can use the construct
    LabelKnob 0, (GetNoteName note, NO), { Minor}
    so you only need the cascade for the different chords, reducing the labor by a factor of 12 :)

Sign In or Register to comment.