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 StoreAudiobus is the app that makes the rest of your setup better.
Comments
Am intrigued to know what type of things we’ll be able to make with this!
@brambos have you seen this VST? Might give you some added ideas? https://www.osar.fr/protoplug/
Having fun with LFOs...
Currently there are 10 simultaneous LFOs available.. how many would make sense (keeping in mind that each LFO requires a bit of resources, even when not in use)?
I can't imagine a scenario where I would need 10 LFOs. I'd rather have less but a low-resource, low-latency app.
BTW, what max. LFO frequency and resolution (CC? Pitch bend? NRPN?) do you have in mind?
Maybe both high-res and low-res LFOs would make sense. MIDI is a weird guy.
The resolution of the LFO is sample-accuracy, but they're only updated when you need them. The practical resolution is: as accurate as you need them to be at any moment in time
Also, frequencies are up to you - it's all parametric anyway. If you want an LFO to take a day to go up and down you can do that... just set the frequency to 0.000000001 Hz or something
I guess the first 'thing' I would build with this is 'step value table' that sends the values at preset intervals.
Like a 'Custom LFO Wave'. Or maybe there's a built-in 'value table module' in there already
Too many synths focus on 'LFOs' when they could in practice be replaced with value-tables/step-sequencers with optional step interpolation and value quantisation. (Think running an LFO waveform thru sample-rate & bit reduction).
@brambos can you LFO the LFOs?
A few hundred should be plenty
Yeah.. I suppose that wouldn't be too hard to put together using an array with values. Interpolation makes it a bit trickier, but still not overly tricky.
I suppose so. You can multiply the outputs of a chain of LFOs to create some kind of monster amplitude modulation effect. Or you can use the output of an LFO to set the phase of the next LFO for slow frequency modulation
Aaah, timers
But what resources do unused LFOs use up then?
I suppose the LFO output value is floating point and I can scale it to any range I want, be it 0..127 for CC or 0..16383 for pitch bend?
Before any event call I update the phase of all LFOs, which is a handful of divisions and multiplications and a bit of memory. Nothing you'll notice on any device capable of running MIDI AU, unless you have thousands of LFOs. But I know it's there and I'm really anal about my optimizations.
Correct!
When you set up an LFO, you specify the minimum and maximum values you want to get out, so its output is already scaled for you:
StartLFO <lfo>, <minimum value>, <maximum value>, <sync to tempo?>, <frequency>
Looks convenient. Very nice. That's how a coding language should look like!
Tempo sync answers my first question already.
Dumb question: What about LFO waveforms? (Triangle, rising SAW, falling SAW, SQR etc)
Right now I have Sine, Cosine, Ramp Up, Ramp Down, Triangle, Square and S&H
You are a genius. Most innovative ios developer for sure.
@brambos
What programmable visual feedback features will there be? (latch state indicators, etc...).
It's a genius move to publicly get @Samu's input before shipping the App. It saves a lot of storage on the Forum.
Oh wait... we're using that storage now: Zero Sum Game. But more App's will be sold since he won't highlight the things it can't do "day one". Just kidding... he'll find something.
@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?
This looks intruiging as hell. Good job @brambos. I do hope you remember me when you go into testing phase have quite a few ideas I'd like to test out....
@brambos
In terms of benchmarking the range of modulation control that folk may be looking for within their LFO's, Envelopes etc, I think U-He Zebra2 is a very good place to look. Much as U-He's virtual analogues get all the limelight, Zebra is their crowning glory. What I'm talking about here is the manner in which U-He goes beyond the usual expectations regarding the types of options that should be included within its modulation tools. And Zebra2 was built to be super CPU efficient, so those extra bells and whistles they provide in their modulation tools don't end up as costly luxuries. They're simply options that move beyond analogue emulation and celebrate the digital nature of the tools.
Definitely worth a trawl through the modulation section of the Zebra2 manual.
Zebra2-user-guide.pdf
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)
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.
Dope!
I would be very interested in beta testing this @brambos. I write code to do this kind of thing quite a lot (generative stuff in SuperCollider and LISP - midi filtering using some custom software I wrote), and I feel I could probably find some edge cases for you.
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
Or
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.
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?
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.
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.}
Yep. Out of scope for now - and for the near future
Boy am I glad to see compound conditions. Multi-Layer If / Then / Else statements get bewildering fast without them.
I know. That's why I put special focus on them. There's full
if ... elseif ... elseif ... else ... endif
support, and you can nest as many as you can handle.