Piping audio between two Macs

Brian Kirkbride's icon

Apologies if I missed a post about this, but everything I've found in the forums and by searching the web was either too old to be useful (FX teleport, netsend~) or wasn't a workable solution (AuNetSend for example).

I'm looking to use an older Macbook Pro to do some effects processing in Max on audio coming from a more recent Macbook Pro running Mainstage. Currently, I run all of this on a single laptop using Rogue Amoeba's Loopback to send audio between Mainstage and Max.

I'd like to expand the processing power for live sets by separating the apps on to two laptops, but don't know how to best transfer the audio and keep things in sync. Obviously I could rig ADAT or MADI interfaces on each laptop and connect a bunch of cables between the two. I had hoped that I could find some software or MacOS support for audio over IP and use a thunderbolt cable or Ethernet cable to connect the two machines.

I'm aware of Dante Via, which I tried but couldn't get to work for this setup. Maybe there is a piece of Dante or AVB hardware that can join two (or more) Macs via Ethernet in this way? I'm not concerned right now with analog I/O being a part of this.

This seems like something Max tinkerers would be doing on the regular—so it surprises me to be finding so little that supports this scenario. Hopefully I'm, just not searching for the right terms?

Many thanks in advance for any help or advice!

Brian Kirkbride's icon

bump (was moderated over the weekend...)

Parmerud's icon

You can try this;
On Mac 1 send your audio from whatever app you are using (MainStage etc..) to Max via for example Sound Flower. Convert the audio to a Jitter matrix (there are example patches to show you how to do that). Use jit.net.send to send the stream to Mac 2 and receive it with jit.net.recv and convert back to audio. Send via Sound flower to whatever processing app you want.
This will mean delay between Mac 1 and Mac 2 so you will need to compensate by delaying the outgoing audio from Mac 1 (not the signal you send to Mac 2)

Brian Kirkbride's icon

Thanks Parmerud! I'll try out jit.catch~ with jit.net.send.

Is the Jitter matrix-over-network stuff resilient enough to use for a live set of music? Anyone have experience using it in such a scenario?

Cody's icon

I know JACK was a thing, but maybe it's not supported anymore? Can't remember and never used, but I know other people have:

http://jackaudio.org/faq/netjack.html

Parmerud's icon

Jack as well as sound flower are inter app protocols that only works inside one computer. Sending a stream of data between two (or more) computers requires wifi or hard wired net connections. Max have some different ways of doing that. Jit.net.send is the best for sending audio...

Parmerud's icon

@Brian, if it works it works and is very stable. Not sure what u mean by " resilient" but I have used it many times in complex setups with little or no problems

Brian Kirkbride's icon

That’s great. By resilient I meant whether it either stays in sync or at least recovers from glitches reliably. If a patch were to hang and require some sort of restart that would disqualify it for a live show...

Thanks for the advice!

Parmerud's icon

Use network cable for best performance/stability. Avoid wifi...

Brian Kirkbride's icon

Definitely no wifi. I'm thinking Thunderbolt bridge for the network.

Brian Kirkbride's icon

Is there a system-level (generic wrt software) solution for this sort of audio transport between Macs?

Would be great if Loopback/JACK/Soundflower could work over a network or FireWire/TB. I know NetJack but it’s abandoned. Dante isn’t too expensive but I couldn’t get a topology that worked for this simple use case...

Mark Choi's icon

Brian, better late than never (?) but you can use the built-in AUNetSend and AUNetRecieve to do what you want. You can use this with or without Soundflower. Using Soundflower:

On the sending Mac

  1. Set System Audio to the desired Soundflower instance (2 channel?) (System Preferences -> Audio -> Output). Alternately, you can use Audio MIDI Setup to create an "Multi-Output Device". This way you can output to (wait for it) multiple output devices, such as, say, the sending Mac's speakers and the receiving Mac's speakers, simultaneously.

  2. Install and run AU Lab (https://www.apple.com/itunes/mastered-for-itunes/docs/au_lab.zip).

  3. Under "FACTORY CONFIGURATIONS", select "Stereo In/Stereo Out", set the "Audio Input Device" to whichever Soundflower device you are using and the "Audio Output Device" to "Built-in Output" (or the Multi-Output Device you created in Audio MIDI Setup). Click "Create Document".

  4. In the resulting window, in the "Output 1" column, there should now be an "Effects" dropdown. Set that to "AUNetSend". At the top of the resulting window you can optionally give this Generator a name by clicking the dropdown menu, third from the left. You can also configure a port if you want and/or give your stream a password (if you want the connection to be protected) as well as set audio/quality.Even on WiFi (802.11N) 24 Bit Apple Lossless should steam with no problems.

On the receiving Mac

  1. Again run AU Lab

  2. Under "FACTORY CONFIGURATIONS", select "Stereo In/Stereo Out", set the input to None and the output to "Built-in Output" (or again, you can use Audio MIDI Setup on the receiving machine to create an "Multi-Output Device" if for some reason you want to send the audio to multiple devices, say, headphones, a Thunderbolt audio card, and a USB sound card). Click "Create Document".

  3. Go to the “Edit” menu (as in menu bar) and select Add Audio Unit Generator. Select "AUNetRecieve"

  4. In the Directory pane of the new window, the share name you created earlier should appear. Select it and press "Select Host" and then click the "Connect" button (top right). The "Sender" field should change to reflect the host you just selected, and the “Status” field should change to “Connected”. If all is good, you can close this window. (If you need to edit it later, you do so by selecting the Generator and using Edit -> Edit Selected Generator.)

  5. Back at the bottom of the original window, the Generator should say “Audio Engine Running". You can toggle this by clicking.

And there you have it.

Note:

AUNetSend accumulates a bit of lag over the course of several hours. You can fix this as needed by resetting the AUNet connection from either the send or receiving ends. (On the receiver machine, you can do this by selecting the streaming track you made above and then using Edit -> Edit Selected Generator. There you can click the "Disconnect" button which then changes to "Connect". Clicking that will immediately reset the AUNetSend effect plugin and fix the lag. On the sending machine, click the "Effects" drop down menu in the middle of the track you made above, and the AUNetSend window should come up. As with the receiving machine, click the "Disconnect" button and then "Connect".)
Which one you chose depends on how you have the stage set up and which is most convenient but it will sync you back up instantaneously. For a show of a less than a couple hours, though, you should not really experience too much of a sync/lag issue.

Brian Kirkbride's icon

Thanks Mark! I’ll definitely try this setup out. I wasn’t familiar with AU lab.

Colin Sutherland's icon

Hey Brian, Which have you found a successful setup? I am trying to do the same!

florian1947's icon

Why not use AUNetSend /~Receive directly from the audiounit~.mxo within Max?

Colin Sutherland's icon

Ill have to tinker around. I am a complete amateur when it comes to max! Do you know if either solution would work with a fire wire/thunderbolt instead of ethernet?

Colin Sutherland's icon

Wow looks much easier than I thought! Good to know. Things should work out well.

metropical's icon

I know it's been a few years, but can someone walk me thru this? I'm not getting a connect.
AUNetSend on MacPro3,1 on High Sierra. That seems to set OK.
On the receive side Mini '18 Monterey.
Available Outputs are BlackHole, NoMachine Audio Adapter, UA Apollo, Multi-Output device.
There are others, but those seem the most logical.
I can't get a connection. And there is an overload ! on the MacPro AuLab.

Parmerud's icon

Try using. Jir.net.send and receive instead. Encode audio to jit.matrix on sender and decode on receiving side. I did that (long time ago) and it worked just fine

florian1947's icon

Both AUNetSend~ and AUNetReceive~ are Audiounit plugins and need a host. Audio Output is set in the receiving host