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!

16869717374102

Comments

  • Thanks guys :)

  • edited April 2020

    I'm trying to write one of these scripts, it's my first time working with code, perhaps someone can tell me if this is possible or perhaps it's already been done. Just don't want to learn everything to find out I can't do this! Seems like a very simple concept to me though.

    I bought a Polyend Poly that works wonderfully for polyphonic MIDI to CV conversion which I hook my iPad up to. What I didn't know when I got it was that the company didn't program it to play mono on the individual channels correctly. Every MIDI "note off" triggers a CV "gate off" which immediately mutes whatever is being played, leading to lots of stuttered notes and making proper legato playing impossible.

    Here's what I need to program:
    MIDI channels 1-8 have all MIDI off notes muted/filtered, as long as any key is pressed for its channel. It only sends a MIDI "note off" message once the last key being held down is released. When the final note is released and only then it sends a MIDI "note off" for that channel. Seems like very simple logic to me, but I'm also not much of a programmer. I'm not sure how to say this in robot, haha. Maybe just a few lines of code (?) but what the heck do I know?

    Any help or tips is beyond appreciated, this would be a real game changer for me!

  • Save me some time please: If I create an AUM project with a Mozaic and Drambo do either of those applications export the internal configuration in the AUM project?

    Does the Mozaic script in use become saved data in the AUM project?
    How about installed Drambo Presets?

    If not I'd assume you have to disclose all the required elements to share AUM projects with complex uses of Mozaic + Drambo.

    Any advice to save some testing time?

  • heshes
    edited April 2020

    @djdiscord : Here's code for a Mozaic project that will save midi note offs (if received when another key is held down) until last note off is sent. Seems to work for me on virtual keyboard with Mozaic in AUM.
    https://gist.github.com/hsitz/0bf046d646a6e38ba69212315eac7e29

    (It doesn't differentiate by channel right now, so will probably only work for last key in all channels. That is, if you're sending notes from multiple channels, the note off commands in all channels will be saved and not issued until all keys in all channels are unplayed. This could be changed, of course.)

    Maybe there's a midi command to silence an entire channel, don't know offhand and haven't checked. So what the linked script does is keeps a list of all notes played since the last point at which no notes were being played. Once the last note is released, it sends separate midi note off commands for the list it built up during the phrase, and resets to start building up list for next phrase.

    EDIT: Looks like there is a command to send "All notes off" for a given channel, and the code is quite simple. This seems to work for me with keyboard in AUM. I don't know if there are potential performance/speed issues when issuing the 'All Notes Off' cc for just regular playing. . . .

    whoops, just realized this needs a little work to differentiate between channels, but give it try to see if it works as desired for single channel. If so, I'll show you changes needed to make the 8 channels independent.

    @OnLoad
      counter = 0
    @END
    
    @OnMidiNoteOn
      inc counter
      sendmidithru
    @END
    
    @OnMidiNoteOff
      dec counter
      if counter = 0
        sendmidicc midibyte1, 123, 0
      endif
    @END   :
    
  • @McD said:
    Save me some time please: If I create an AUM project with a Mozaic and Drambo do either of those applications export the internal configuration in the AUM project?

    Does the Mozaic script in use become saved data in the AUM project?
    How about installed Drambo Presets?

    If not I'd assume you have to disclose all the required elements to share AUM projects with complex uses of Mozaic + Drambo.

    Any advice to save some testing time?

    I don’t conceptualize it in the way you do, but if I understand the question, the answer is yes.

    If you load a Mozaic script and a Drambo instance in AUM, then save the AUM session, the next time you load that session, everything should be exactly as you left it.

    If you load a Mozaic script and save a preset in AUM, the next time you load that preset in Mozaic, the script and the state of all knobs and variables should be loaded. Same for if you save a preset for Drambo.

  • @wim Thanks. My real question is if I share the AUM.project will another person get the benefits or will the missing Mozaic Script and potential PatchStorage Drambo Preset make the rig incomplete to just hit play in AUM and hear the results without downloads?

    I'm trying to save the extra steps to share Mozaic+Drambo projects if at all possible.
    The more steps you add to a process the more people won't join along or help share.

    The confusion in Drambo with the multiple Preset file types will cause a lot of problems
    and I hope it gets sorted out in Drambo and not with the need to have classes for all the users. Its really an impressive application and with every penny. A lot less frustrating as the early issues with AudioLayer that DID get sorted out eventually.

  • @McD said:
    @wim Thanks. My real question is if I share the AUM.project will another person get the benefits or will the missing Mozaic Script and potential PatchStorage Drambo Preset make the rig incomplete to just hit play in AUM and hear the results without downloads?

    I'm trying to save the extra steps to share Mozaic+Drambo projects if at all possible.
    The more steps you add to a process the more people won't join along or help share.

    The confusion in Drambo with the multiple Preset file types will cause a lot of problems
    and I hope it gets sorted out in Drambo and not with the need to have classes for all the users. Its really an impressive application and with every penny. A lot less frustrating as the early issues with AudioLayer that DID get sorted out eventually.

    I just tested by saving a Drambo + Mozaic session in AUM and then airdropping it to my phone. It loaded perfectly, including samples that I didn't have on my iPhone and had not saved in the Drambo project(!).

    So, YMMV, but it looks like a resounding "Yes" is the answer to your question.

  • @wim said:

    @McD said:
    @wim Thanks. My real question is if I share the AUM.project will another person get the benefits or will the missing Mozaic Script and potential PatchStorage Drambo Preset make the rig incomplete to just hit play in AUM and hear the results without downloads?

    I'm trying to save the extra steps to share Mozaic+Drambo projects if at all possible.
    The more steps you add to a process the more people won't join along or help share.

    The confusion in Drambo with the multiple Preset file types will cause a lot of problems
    and I hope it gets sorted out in Drambo and not with the need to have classes for all the users. Its really an impressive application and with every penny. A lot less frustrating as the early issues with AudioLayer that DID get sorted out eventually.

    I just tested by saving a Drambo + Mozaic session in AUM and then airdropping it to my phone. It loaded perfectly, including samples that I didn't have on my iPhone and had not saved in the Drambo project(!).

    So, YMMV, but it looks like a resounding "Yes" is the answer to your question.

    Thanks for the outstanding support. You're a treasure of information and willingness to be of assistance.

    I think going to start marketing/sharing my Mozaic scripts with AUM projects with a few must have sound targets or at least with free synth apps. I need to look for those lists of Free Apps. I like the idea of a setup where you load the AUM project and hit Start.
    Nothing reduces a learning curve than a working example. @_ki showed me the way with his Streambyter and early Mozaic scripting efforts. It's a huge amount of effort but can
    add more "players" to the game.

  • @McD said:

    @wim said:

    @McD said:
    @wim Thanks. My real question is if I share the AUM.project will another person get the benefits or will the missing Mozaic Script and potential PatchStorage Drambo Preset make the rig incomplete to just hit play in AUM and hear the results without downloads?

    I'm trying to save the extra steps to share Mozaic+Drambo projects if at all possible.
    The more steps you add to a process the more people won't join along or help share.

    The confusion in Drambo with the multiple Preset file types will cause a lot of problems
    and I hope it gets sorted out in Drambo and not with the need to have classes for all the users. Its really an impressive application and with every penny. A lot less frustrating as the early issues with AudioLayer that DID get sorted out eventually.

    I just tested by saving a Drambo + Mozaic session in AUM and then airdropping it to my phone. It loaded perfectly, including samples that I didn't have on my iPhone and had not saved in the Drambo project(!).

    So, YMMV, but it looks like a resounding "Yes" is the answer to your question.

    Thanks for the outstanding support. You're a treasure of information and willingness to be of assistance.

    I think going to start marketing/sharing my Mozaic scripts with AUM projects with a few must have sound targets or at least with free synth apps. I need to look for those lists of Free Apps. I like the idea of a setup where you load the AUM project and hit Start.
    Nothing reduces a learning curve than a working example. @_ki showed me the way with his Streambyter and early Mozaic scripting efforts. It's a huge amount of effort but can
    add more "players" to the game.

    FWIW, Audiobus sessions are even easier to share than AUM sessions. More people own and are comfortable with AUM though, I reckon.

  • @hes said:
    @djdiscord : Here's code for a Mozaic project that will save midi note offs (if received when another key is held down) until last note off is sent. Seems to work for me on virtual keyboard with Mozaic in AUM.
    https://gist.github.com/hsitz/0bf046d646a6e38ba69212315eac7e29

    (It doesn't differentiate by channel right now, so will probably only work for last key in all channels. That is, if you're sending notes from multiple channels, the note off commands in all channels will be saved and not issued until all keys in all channels are unplayed. This could be changed, of course.)

    Maybe there's a midi command to silence an entire channel, don't know offhand and haven't checked. So what the linked script does is keeps a list of all notes played since the last point at which no notes were being played. Once the last note is released, it sends separate midi note off commands for the list it built up during the phrase, and resets to start building up list for next phrase.

    EDIT: Looks like there is a command to send "All notes off" for a given channel, and the code is quite simple. This seems to work for me with keyboard in AUM. I don't know if there are potential performance/speed issues when issuing the 'All Notes Off' cc for just regular playing. . . .

    whoops, just realized this needs a little work to differentiate between channels, but give it try to see if it works as desired for single channel. If so, I'll show you changes needed to make the 8 channels independent.

    You are my hero! It works great. I was up so late last night trying to devise the best way to pull this off, this coding stuff is wild! Anyway works wonderfully for my needs. If you can show me how to make the 8 channels independent that would be icing on the cake, I'm happy to do some legwork. I owe you one big time!

  • heshes
    edited April 2020

    @djdiscord said:
    If you can show me how to make the 8 channels independent that would be icing on the cake, I'm happy to do some legwork. I owe you one big time!

    Great. See if this makes each channel work right. Small change, just changes the counter to an array that increments and decrements each channel separately:

    @OnLoad
      fillarray counter, 0, 20
    @END
    
    @OnMidiNoteOn
      inc counter[midichannel]
      sendmidithru
    @END
    
    @OnMidiNoteOff
      dec counter[midichannel]
      if counter[midichannel] = 0
        sendmidicc midichannel, 123, 0
      endif   
    @END     
    
    
  • @hes said:

    @djdiscord said:
    If you can show me how to make the 8 channels independent that would be icing on the cake, I'm happy to do some legwork. I owe you one big time!

    Great. See if this makes each channel work right. Small change, just changes the counter to an array that increments and decrements each channel separately:

    @OnLoad
      fillarray counter, 0, 20
    @END
    
    @OnMidiNoteOn
      inc counter[midichannel]
      sendmidithru
    @END
    
    @OnMidiNoteOff
      dec counter[midichannel]
      if counter[midichannel] = 0
        sendmidicc midichannel, 123, 0
      endif   
    @END     
    
    

    I apologize, I misunderstood that you had written a new script and I had only tried it the original code you had linked. The one you had written in your original response as an edit seems to leave notes hanging, as does this one, since I gave you faulty info the first time! Thank you so much for your help, the original code you linked already helps me a ton, if you are able to help me get the multichannel going it would be fantastic. I'm still relatively lost, though I get the concept here. This plugin in really a gem and you sir are a gentleman and a scholar.

  • heshes
    edited April 2020

    @djdiscord said:
    I apologize, I misunderstood that you had written a new script and I had only tried it the original code you had linked. The one you had written in your original response as an edit seems to leave notes hanging, as does this one, since I gave you faulty info the first time! Thank you so much for your help, the original code you linked already helps me a ton, if you are able to help me get the multichannel going it would be fantastic. I'm still relatively lost, though I get the concept here. This plugin in really a gem and you sir are a gentleman and a scholar.

    Ha. Hmm, well, it doesn't hang any notes for me using built-in keyboard in AUM. But that's on single channel. Does this hang notes for you if they're all on same channel?

    We could still go back to original version if we need to, but there should be way to get this one going, and it's simpler.

    It could be part of the problem is the Polyend Poly. I confess I don't even know what it is. Seems it's something that converts midi to CV, but I don't know what CV is. Part of the problem could be (1) that CV doesn't have the equivalent of 'All Notes Off' for a channel, or (2) that the Polyend Poly isn't converting the midicc command properly. Looking at the Polyend Poly manual, it appears some configuration may be required for processing midicc commands, see page 3: https://polyend.com/wp-content/uploads/2020/01/Polyend_Poly2_Manual_web2.pdf So one step would be ensuring that the Polyend Poly is sending correct 'AllNotesOff' message to devices it controls when it receives a midicc 123 message.

    If it looks like the issue is related to 'AllNotesOff' conversion in the Poly, and it's not easy to diagnose and fix, we can just go back to the original version that kept list of notes and sent midi off for each and change it to work with channels independently.

    For now, in any case, I think problem may be specific to your setup, so would be helpful if you could log some output. Here's the code with some logging added. If you still get problem and log looks good, then it must be somethign with the Polyend Poly and this specific midicc command.:

    @OnLoad
      fillarray counter, 0, 20
    @END
    
    @OnMidiNoteOn
      log {NOTE ON ---- Channel: }, midichannel, { Note: }, midinote, {   Counter: }, counter[midichannel]
      inc counter[midichannel]
      sendmidithru
    @END
    
    @OnMidiNoteOff
      log {------------- NOTE OFF ---- Channel: }, midichannel, { Note: }, midinote, {  Counter: }, counter[midichannel]
      dec counter[midichannel]
      if counter[midichannel] = 0
        log {  SENDING ALL NOTES OFF FOR CHANNEL: }, midichannel
        sendmidicc midichannel, 123, 0
      endif   
    @END    
    
  • edited April 2020

    Cool, I just played a couple c chord sequences on channel one and two. The one thing I'm seeing is the gates on my midi to cv converter aren’t turning off at all so they aren’t receiving the all notes off as midi note off for some reason, not sure if that’s a limitation of the module. I don’t have anything else that exhibits this behavior to test it on.

    SENDING ALL NOTES OFF FOR CHANNEL: 1
    ------------- NOTE OFF ---- Channel: 1 Note: 67 Counter: 1
    ------------- NOTE OFF ---- Channel: 1 Note: 67 Counter: 2
    ------------- NOTE OFF ---- Channel: 1 Note: 64 Counter: 3
    ------------- NOTE OFF ---- Channel: 1 Note: 64 Counter: 4
    ------------- NOTE OFF ---- Channel: 1 Note: 60 Counter: 5
    ------------- NOTE OFF ---- Channel: 1 Note: 60 Counter: 6
    NOTE IN ---- Channel: 1 Note: 67 Counter: 5
    NOTE IN ---- Channel: 1 Note: 67 Counter: 4
    NOTE IN ---- Channel: 1 Note: 64 Counter: 3
    NOTE IN ---- Channel: 1 Note: 64 Counter: 2
    NOTE IN ---- Channel: 1 Note: 60 Counter: 1
    NOTE IN ---- Channel: 1 Note: 60 Counter: 0
    SENDING ALL NOTES OFF FOR CHANNEL: 0
    ------------- NOTE OFF ---- Channel: 0 Note: 67 Counter: 1
    ------------- NOTE OFF ---- Channel: 0 Note: 67 Counter: 2
    ------------- NOTE OFF ---- Channel: 0 Note: 64 Counter: 3
    ------------- NOTE OFF ---- Channel: 0 Note: 64 Counter: 4
    ------------- NOTE OFF ---- Channel: 0 Note: 60 Counter: 5
    ------------- NOTE OFF ---- Channel: 0 Note: 60 Counter: 6
    NOTE IN ---- Channel: 0 Note: 67 Counter: 5
    NOTE IN ---- Channel: 0 Note: 67 Counter: 4
    NOTE IN ---- Channel: 0 Note: 64 Counter: 3
    NOTE IN ---- Channel: 0 Note: 64 Counter: 2
    NOTE IN ---- Channel: 0 Note: 60 Counter: 1
    NOTE IN ---- Channel: 0 Note: 60 Counter: 0
    [MOZAIC] Script loaded.

    Edit: I just tried hooking the midi out that was going to the converter into another synth and it played normal. It didn’t have the problem in question to begin with, but just so you know, whatever that’s worth. I'm kinda thinking this module doesn't understand MIDI cc123, it's a bit primitive in some respects and there's nothing about any cc stuff in the manual.

  • heshes
    edited April 2020

    @djdiscord said:
    Cool, I just played a couple c chord sequences on channel one and two. The one thing I'm seeing is the gates on my midi to cv converter aren’t turning off at all so they aren’t receiving the all notes off as midi note off for some reason, not sure if that’s a limitation of the module. I don’t have anything else that exhibits this behavior to test it on.

    That log info is strange in that there are two note ons and two note offs for each note. Is your controller in fact sending two 'Note Ons' for each press? Don't know if that's related to the problem, guessing no.

    Try changing the midicc line to this and see if it's any different. I think cc 120 is "all sound off' instead of 123's "all notes off". Also, maybe you could try taking that ', 0' off at the end of this cc command. Doesn't appear to be required for 'all notes off', but maybe Mozaic will give syntax error if a value isn't there.:

       sendmidicc midichannel, 120, 0
    
  • edited April 2020

    I agree that is strange about the two notes, I hooked up another synth with midi instead of the controller I was using and same thing. Never noticed anthing like that before. I tried both of the things you said and neither worked, also no syntax errors on any of the variations. I'm quite sure that this Eurorack converter is very limited on what MIDI information it accepts. What would be involved to make the original code from the link work for multichannel?

    Edit: I was able to find the source of the double notes but it wasn't causing issues, script still isn't sending anything that the Polyend is seeing as a MIDI note off.

  • @djdiscord , okay, I say we scrap the idea of 'AllNotesOff' and go back to original method of keeping list of notes and sending separate note off commands for each. I modified code to treat channels independently. It still works for me in AUM, but that's testing only with channel 0. Give it a try, keep you fingers crossed, and see how it works with other channels:
    https://gist.github.com/hsitz/43311bc0d0759e10745b43f9de892199

    The things we do in virus lockdown. . . .

  • edited April 2020

    @hes said:
    @djdiscord , okay, I say we scrap the idea of 'AllNotesOff' and go back to original method of keeping list of notes and sending separate note off commands for each. I modified code to treat channels independently. It still works for me in AUM, but that's testing only with channel 0. Give it a try, keep you fingers crossed, and see how it works with other channels:
    https://gist.github.com/hsitz/43311bc0d0759e10745b43f9de892199

    The things we do in virus lockdown. . . .

    It works! This is so awesome. Occasionally the channels will get stuck and I have to reload the program, but if I'm careful and going slow with things, not changing channels, it works splendidly. I wish there was a way to let other users of this module know, maybe I'll post something on muffwiggler.

    Can I buy you a beer? Send you some flowers? Pay off your mortgage? This gave a massive upgrade to my set up. I can't tell you how much I appreciate this. Best apocalypse ever.

    Edit: Only seems to be working on 1-3, not a big deal just wanted to let you know in case you do anything else with it! Will be a good project for me to get in there and try to figure it out, you already did all the heavy lifting :) Stay safe, thanks again!

  • heshes
    edited April 2020

    Yes! Sounds like it still needs some tweaking, though. I designed it thinking that you'd be sending notes from different channels at same time, intermixing notes of different channels. Seems like it should work that way. Also, it seems like you shouldn't have to play especially slowly and/or carefully. There are different approaches and things to try that can improve it. Feel free to message me and/or start a new thread for that.

    One very obvious limitation of the script as written is the limit of 40 saved notes per channel. If you have an extended legato phrase maybe you're hitting that limit (especially if you still have the note-duplication), beyond which havoc might ensue. I'm curious how many notes are getting saved when you're playing. You can try adding a log statement right after the line beginning 'number_saved .. ..' a few lines from bottom of the script:

       number_saved = save_cnt[midichannel]
       log { notes saved for channel }, midichannel, {: }, number_saved
    

    Try diferent ways of playing and see how high those saved numbers get. If you're not getting high numbers in regular playing, it's possible speed is an issue. There are at least a few different ways we could speed things up, I'm sure.

  • edited April 2020

    Did some more testing, the careful slow thing and stuck notes isn't an issue, I think some notes just got weird offset from switching channels before a note off was sent or switching to poly modes on the hardware, just need to make sure no keys are pressed down when switching channels.

    The channel thing is odd though. The script doesn't work, even right after I load the plug and go right to that channel, and consistently with channels 4-8. I'm not seeing anything in the script that indicates anything specific to those channels, though there's plenty in there I don't understand, haha. Channels 1-3 play splendidly and I can go back and forth and it's consistent with the channels that work and the ones that don't.

  • Some strategically placed log statements printing midichannel and note data might help. Also, maybe there is a much easier way of doing this; I wonder what will happen with this script:
    https://gist.github.com/hsitz/87e817c2260da8a29377f0c60c04af7e

  • edited April 2020

    HOT DIGITTY DOG!!! That is amazing. Works like a charm. Pretty sure the channel issue was something on my end anyway but damn, you really nailed it with elegance and simplicity there! Hats off, great work and thank you. Thanks a ton to Bram Bos too!

    If you don't mind I'm gonna post this a place or two with your permission, this could be hugely useful to other people who have this module. I'd love to give you credit or post your venmo or something, haha, maybe people will donate. If you like. This is really great! Bottom of my heart thank you for putting the time and patience in on this.

  • Cool, yeah, get it out there. Glad to be of help, much more fun than watching Netflix.

  • Awesome, guys! This is exactly the sort of stuff I had in mind when making Mozaic. Very elegantly solved. :)

  • edited April 2020

    Your apps are great brambos, sequencer suite has been used heavily over here and Moziac has already made massive improvements to my studio's workflow since I bought it just a week ago. I only use iOS for midi stuff, I don't use iOS synths in my projects, but Ripplemaker and Ruismaker Noir are hands down my favorite synths on iOS, like by far. If you could ever do a hardware version of either of those (the thought of an analog Ruismaker Noir makes me tremble!), I feel like it would be an insane success. Either way, keep up the lovely work, can't wait to see what's next!

  • wimwim
    edited April 2020

    @djdiscord said:

    If you could ever do a hardware version of either of those (the thought of an analog Ruismaker Noir makes me tremble!), I feel like it would be an insane success.

    B)

  • Oh wow, very interesting. Thanks for the heads up, my radar is big time set on brambos projects! Love the drum synthesis stuff.

  • Hi again! I've just realized that this great script is filtering out my cc messages! I've done some research and can't figure it out. Here is the script again, what do I need to add to have it pass CC info?

    @OnLoad
    fillarray counter, 0, 20
    @END

    @OnMidiNoteOn
    inc counter[midichannel]
    sendmidithru
    @END

    @OnMidiNoteOff
    dec counter[midichannel]
    if counter[midichannel] = 0
    sendmidithru
    endif
    @END

  • wimwim
    edited April 2020

    @djdiscord said:
    Hi again! I've just realized that this great script is filtering out my cc messages! I've done some research and can't figure it out. Here is the script again, what do I need to add to have it pass CC info?

    @OnLoad
    fillarray counter, 0, 20
    @END

    @OnMidiNoteOn
    inc counter[midichannel]
    sendmidithru
    @END

    @OnMidiNoteOff
    dec counter[midichannel]
    if counter[midichannel] = 0
    sendmidithru
    endif
    @END

    @OnMidiCC
      SendMIDIThru
    @End
    

    Mozaic doesn't send anything through unless you tell it to. For completeness sake you may also want to add:

    @OnSysex
      SendSysexThru
    @End
    

    btw, if you put three ` characters on a line by themselves before and after your code when posting on the forum, it'll be rendered in a code block.

    ```
    Your code here.
    ```

    renders as

    Your code here.
    
  • Thank you kindly. Amateur hour over here, haha. I'm trying, thanks for your patience and understanding.

Sign In or Register to comment.