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: a sneak-peek at my new project

12346

Comments

  • It's unbelievable what's happening in the last year in regards to Apps.
    We live in a wonderful world.

    @recccp said:
    I volunteer as well for beta testing... in the lame duck test group. I don't write code, which I believe makes me a perfect candidate. Just to see how us mortals cope with the challenge.
    :smiley: :smiley:

    I was laughing so hard.
    Great comment!

  • @brambos said:

    @Jocphone said:

    @brambos said:

    if  MIDISustainPedalDown or ShiftPressed
      Log {Nope!}
    else 
      MidiThru
    endif
    

    :)

    Curious about the choices for strings, any particular reason you didn't go with quotes and is there a method to allow variables in strings? Templating, concatenation?

    That has been a very conscious choice:

    Strings have very limited application in Mozaic: just for labels and log messages. In typical languages you'd need to use ugly escape characters if you want to put quotes in your actual text (to avoid the parser barfing up its breakfast).

    However, you're actually quite likely to want to put quotes in your labels and messages, and I didn't want to force people to learn how to use escape characters. Accolades are nice, because they have a distinct "open" and "close" version, allowing the parser to decide where a string starts and ends without the need for weird workarounds.

    In this case I figured the typical needs of users weighed heavier than convention.

    If you want to log variables in your messages the Log function has you covered:

    Log {Some string}, VAR0, {Another string "WITH QUOTES!"}, Var1[0], Var2[3], {etc.}

    Also, having functions called with this syntax makes it difficult later to be able reference those functions for functional style programming i.e. working with function references.

    I do understand that you may not want this complexity in your language so feel free to ignore if that is the case.

    Yep. Out of scope for now - and for the near future :D

    I figured you would have had it all worked out :wink:

  • @brambos said:
    Ok.. my complex parser now correctly calculates

    2 + ( ( 5 % 2 ) * HostTempo ) - 3 / ( HostBar - LastKnob ) + ( VAR0 * VAR1[64] )

    I also have compound logical statements working, so you can do

    if ( HostTempo < 100 ) or ( ( MidiNote > 10 ) and ( MidiNote < 117 ) )
       MidiThru
    else 
      Log {Note was too high or too low!}
    

    endif


    Or

    if  MIDISustainPedalDown or ShiftPressed
      Log {Nope!}
    else 
      MidiThru
    endif
    

    :)

    That looks reasonable :) :+1:

  • edited April 2019

    @brambos
    Will there be a mechanism for programmatically showing simple visual information on the template?

  • @TheOriginalPaulB said:
    @brambos
    Will there be a mechanism for programmatically showing simple visual information on the template?

    Limited: you can flash pads, flash the user-LED, change knob labels, set knob values.

    You can also send any message or value you like to the LOG screen.

  • That sounds good enough. Thanks.

  • Great, being able to change text/labels on the gui makes a big difference. :)

  • @wim said:
    Boy am I glad to see compound conditions. Multi-Layer If / Then / Else statements get bewildering fast without them. ;)

    Yes, this!

  • edited April 2019

    @brambos any reason you're not going the graphical route with this (like max4Live or ue4 say)? Not everyone is a coder.

  • @midiSequencer said:
    @brambos any reason you're not going the graphical route with this (like max4Live or ue4 say)? Not everyone is a coder.

    Yes, many reasons! :)

  • Language looks real flexible and easy to understand.!

  • This app is going to make me dust off my Apple Bluetooth (typing) Keyboard. For the other major programming IOS MIDI Program App I use the Mac version for developing/testing/debugging code. I hate iPad touch-screen typing.

  • @brambos said:

    @TheOriginalPaulB said:
    @brambos
    Will there be a mechanism for programmatically showing simple visual information on the template?

    Limited: you can flash pads, flash the user-LED, change knob labels, set knob values.

    You can also send any message or value you like to the LOG screen.

    By "flash" I'm hoping that means "turn on with one condition (e.g. note on; CC above value) and turn off with another (e.g. note off; CC below value)"?

    By "set knob values" I'm hoping that means you can assign labels to values (e.g. instead of showing 1, you show "Sine"; 2 = "Square"; 3 = "Triangle"; etc.)?

  • edited April 2019
    The user and all related content has been deleted.
  • edited May 2019

    Almost ready for beta!

    Made a significant last-minute change to the language: you can now name your own variables. So no more Var0, Var1, Var99... just use any name you like for any variable... 'x' or 'reallyLongNameWhichYouWillHateWhenUsingIt".

    That should make scripts even more readable!

    Got my mobile plugin dev studio set up for writing the presets and tutorial scripts... No longer tethered to my MacBook. So I'm really writing plugins on my iPad Air 2 now! :)

  • Ooouuuuuuuhhhhhh.
    Would like to try it - like right now :blush:

  • I really like the keyboard. Does anyone know which make it is?

  • I have a similar one at my office and it is from Logitech - guessing this is from Logitech because the key forms are identical.

  • @Philandering_Bastard said:
    I really like the keyboard. Does anyone know which make it is?

    Looks like Logitech brand

  • Excellent work on the variables @brambos glad you reconsidered and think it will make a huge boost for productivity.

  • Yes, the keyboard is a Logitech K480. Really nice and solid little gadget.

    @Jocphone said:
    Excellent work on the variables @brambos glad you reconsidered and think it will make a huge boost for productivity.

    I had to sleep on the idea for a night or two, but in the end it was quite easy to integrate in my existing architecture. Happy that you and a few others gave me the push! B)

  • @brambos said:
    Yes, the keyboard is a Logitech K480. Really nice and solid little gadget.

    Thanks, all.

  • How easy is it to write code that will filter out every other 16th step?
    Or say 25% probability that incoming Midi will be passed thru?
    I'm playing around with Rozeta Collider driving both a synth and 2x Ruismaker Noirs set to a kick and snare. Have Cality @25% probability between Collider and both Noirs. Slow LFO ramping up the number of Hadrons. Very Autechre-esque. Thanks.

  • edited May 2019

    @ocelot said:
    How easy is it to write code that will filter out every other 16th step?
    Or say 25% probability that incoming Midi will be passed thru?
    I'm playing around with Rozeta Collider driving both a synth and 2x Ruismaker Noirs set to a kick and snare. Have Cality @25% probability between Collider and both Noirs. Slow LFO ramping up the number of Hadrons. Very Autechre-esque. Thanks.

    @OnLoad
      SetMetroPPQN 4 // set metronome pulse rate to 16th steps
    @End
    
    @OnMidiInput
      if MidiCommand = 0x90 // is this a Note On?
        if CurrentMetroPulse % 2 = 0 
          SendMidiThru
        endif
      else
         SendMidiThru
      endif
    @End
    

    That should work (not at my dev system now, so I haven't tested). So not very difficult :)

  • @brambos aggggg it’s like you’re forcing me to understand else if statements ;P

  • @audiblevideo said:
    @brambos aggggg it’s like you’re forcing me to understand else if statements ;P

    If the milk smells off, don't drink it, etc.

    Life is full of conditional decisions :)

  • @brambos said:

    @audiblevideo said:
    @brambos aggggg it’s like you’re forcing me to understand else if statements ;P

    If the milk smells off, don't drink it, etc.

    Life is full of conditional decisions :)

    Rumor has it if you cut Bram he’d actually bleed code.

    Disclaimer: you are not being advised to cut Bram. Just take our word for it. thx.

  • How easy is it to write code that will filter out every other 16th step?
    Or say 25% probability that incoming Midi will be passed thru?
    I'm playing around with Rozeta Collider driving both a synth and 2x Ruismaker Noirs set to a kick and snare. Have Cality @25% probability between Collider and both Noirs. Slow LFO ramping up the number of Hadrons. Very Autechre-esque. Thanks.

    @OnLoad
      SetMetroPPQN 4 // set metronome pulse rate to 16th steps
    @End
    
    @OnMidiInput
      if MidiCommand = 0x90 // is this a Note On?
        if CurrentMetroPulse % 2 = 0 
          SendMidiThru
        endif
      else
         SendMidiThru
      endif
    @End
    

    That should work (not at my dev system now, so I haven't tested). So not very difficult :)

    Thanks. Looks do-able, with cheat sheets. Hoping for loads of presets. :mrgreen:

  • And a really easy way to share banks of presets would be cool.

  • @brambos said:

    @aplourde said:
    @brambos Just curious if you have a sense of when this might be coming? Not going to hold you to it, but do you think end-of-Spring? End-of-Summer? End-of-the-year?

    Probably a month or two, beta can probably start a fair bit earlier. But making examples, fixing the mass of unexpected bugs and writing a solid programming guide will take up a lot of time I think.

    This is by far the most complex app I've ever made, and because it can do so many things testing is going to be very important.

    Today I'm beginning with the most challenging part: teaching my interpreter recursion and the dreaded rules of mathematical precedence.

    So it will be able to correctly interpret monstrosities like...

    var0 = 2 + HostBeat * HostBar / HostTempo - (Random var1, var2)

    :s

    I'm not taking shortcuts or taking the easy way out with my interpreter. I want the code to be flexible and easy to read, so this kind of stuff is crucial for the usability of the language.

    Make the bastards use parentheses like they should. IMO, etc. ;)

Sign In or Register to comment.