Midi FX issue - Logic Pro and Mac M1

We’ll take a look at this when we’re able to (unfortunately we’re all remote and only one of us has an M1 machine so coordination is a bit difficult).

In the meantime, has anyone with an M1 Mac tried running non-JUCE MIDI FX plugins in Logic? As far as I can tell, the Kirnu Cream arp plugin is not written using JUCE. If this plugin fails to load on Logic/M1, that would suggest this isn’t a JUCE-specific issue.

So we’re having the same problem here, but with instruments that generate midi output, rather than specifically a MIDI FX.

@reuk I’ve just tried that arp plugin, and whilst it doesn’t crash, it also doesn’t appear to actually produce any output either. It only contains an x86 binary though, and does work fine when Logic is in Rosetta mode.

Again just to clarify. Logic in Rosetta Mode (or on Intel machines) don’t use any sandbox/ipc service. so it’s somewhere between Logic <> AUHostingServiceXPC (arrow or not).

I tried the Kirnu Cream Arp app that you linked on a M1 Mac Mini/Big Sur 11.2.1/Logic 10.6.1, it loads and runs, however I didn’t get events out of the plugin into the instrument on that track. But visually it seems fully functional and receives MIDI events.
Looking at ActivityMonitor it is running via AUHostingCompatibilityService which sounds like it is actually an intel binary.

I was building @eyalamirs plugin linked above, and it produces the spinner that you can see in PixelPackers post. If that is a crash, failed to start or indeed an endless loop I cannot tell from the outside. Didn’t find time to do the debug-SIP-sign dance…

1 Like

Thanks, it’s interesting that it loads successfully without causing a spinner. I’ll try to investigate this next week.

2 Likes

Findings so far:

  • Some MIDI messages were being sent without the proper alignment on ARM, which may have been causing issues for Logic when attempting to read them.
  • Adding a default audio bus (by supplying a BusesProperties instance to the base AudioProcessor's constructor) allows a MIDI FX plugin to load successfully in Logic. Without the audio bus, the plugin crashes when it is unloaded with what looks like a double-delete. It seems that the plugin may be quickly loaded + unloaded before it is ‘properly’ instantiated.
  • If I enable an audio bus in the MIDI Logger demo, I can load it as a MIDI FX plugin in Logic. If it’s the first plugin in the chain, it prints received MIDI messages, but subsequent plugins don’t receive any MIDI messages. If I add some basic logging, I see that the plugin is successfully calling the MIDI callback in the AU’s AUMIDIOutputCallbackStruct, so it looks like the messages go missing after they reach Logic.

A fix for the first issue has been merged:

Unfortunately this doesn’t fix the other two issues, so I’ll keep investigating.

8 Likes

I think I’ve found a fix for part of the issue I was seeing in the second bullet point above, where auval/logic were crashing (leaving a crash dump in Console.app) when loading a MIDI FX plugin. I was seeing this crash only when both the default bus layout was empty and isBusesLayoutSupported returned false. I have a fix for the crash, but unfortunately this doesn’t change the “spinner” behaviour in Logic, and MIDI FX plugins still need to use a non-empty default bus layout, or return true from isBusesLayoutSupported in order to load successfully. Fewer crashes definitely seems like an improvement though, so I’ll push that change once it’s been reviewed.

I’ve also managed to attach a debugger to the hosting process now, and I can say for certain that the plugin is calling the AU MIDI callback inside process block. This being the case, I’m reasonably sure that the lack of MIDI output is a Logic bug. The existence of an ARM AU with a functioning MIDI output would disprove this theory, but at the moment I’m not aware of any such plugin. (Please let me know if you are aware of any functioning ARM MIDI FX plugins!)

2 Likes

We tried few Midi FX plugins and they all seem to work fine under Rosetta. But when used with Arm they crash or fail to output anything. I looked it up in Logic Pro forum but didn’t really see anything about it, but I have submited a bug report, whatever good that does.

1 Like

Thx for the info. I’ve just changed my plugin to only build x64 and no arm - I no longer get the “unstable” dialog but it just sits there with the spinner on it. I’ve tried adding a default BusesProperties to the constructor to see if that makes any difference, and it doesn’t.

I’ve just received info from a client that Captain Plugins MIDI FX plugins work fine in Logic, as does Scaler. Not sure whether these are ARM or X64 though.

2 Likes

Thanks for making me aware of these plugins. I can’t test the Captain plugins (there doesn’t seem to be a free demo) but I tried ScalerControl 2 on our M1 Mac. The plugin itself is a universal binary. If I run it in Logic with “Run with Rosetta” enabled, I can hit the keys on the plugin’s onscreen keyboard and it correctly sends MIDI to the instrument slot on the channel strip. However, if I leave “Run with Rosetta” disabled, the plugin doesn’t seem to produce any MIDI when I click on the onscreen keyboard.

This behaviour is in line with what I saw when testing JUCE plugins: it’s possible to get the plugin to load by returning true from isBusesLayoutSupported and by requesting a non-empty default bus layout. However, MIDI output doesn’t work when running without Rosetta.

We’ve now contacted Apple about this issue. I’ll update this thread once we know more.

2 Likes

If I enable “Run with Rosetta”, my Juce plugins are no longer visible in Logic.

Are you definitely building universal binaries? “Run with Rosetta” requires an Intel build of the plugin to be available.

Anything else needed?

If you’re testing with debug builds, the default is to build for only the active architecture. In the Projucer settings for the Debug configuration of the Xcode exporter, it’s probably a good idea to set “macOS Architecture” to “Standard 64-bit” to force a universal binary build. You can also modify the Build Active Architecture Only field in the build settings of the generated Xcode project.

After building, you can run file /path/to/plugin.component/Contents/MacOS/pluginbinary to check whether the generated plugin is actually a universal binary.

1 Like

ah, ok - thought default was to build all.

so it now appears in Logic, but when I try to run it I get the usual “unstable” dialog, so behaviour between both is the same

Have you tried overriding isBusesLayoutSupported to return true for all layouts?

Other than that I’m not sure what to suggest. Enabling buses allowed me to load all of the JUCE demo projects that I tested.

1 Like

will check, but had done that - just the return from that one function, yes?

I think so, yeah.

no luck unfortunately. also can’t get the audioplugindemo to appear either…