AU - MIDI effect [solved]

Hi
I’m working on a MIDI effect plug-in, everything works fine with VST. But there is no MIDI available in AU version (Reaper: No midi in/out. Abletone: crashes on load).

Plugin is a synth = true;
Plugin wants midi in = true;
Plugin produces midi out = true;
Plugin is a midi effect = true;
Channel config: Tried different modes.

What should i do?
(Sorry for creating a new topic about this. Similar topics were old and i suppose things have changed since then.)

1 Like

AudioUnit midi effect plug-ins are not supported in many hosts: I think it’s only Logic Pro, Studio One, Bidule and maybe a few more. They have a unique plugin type ‘aumi’ to distinguish them from AudioUnit effects ‘aufx’ and synths 'aumu/‘aumf’. Therefore, a host which does not support AudioUnit midi effects should not even find them - this is what happens on my computer. You should use vsts instead for those hosts.

I just tried Logic Pro X, and it didn’t validate the plug-in. The failed part of the check:

Some test…
Pass

RENDER TESTS:
ERROR: -10877 IN CALL Get OUtput Formats
**FAIL

Whats this about?
I did change the type to ‘aumi’ too, makes no difference.

Hmmm not sure. Must be something in your plug-in. Have a look at this sample midi effect plugin in the examples folder in JUCE. It works in Logic out of the box.

Arpeggiator AU works here too (ligic pro), but its vst build is useless, since it needs to be a synth to load on the instrument track. At least i couldn’t find a way to use it as effect.
VSTs are working for me but I don’t know what needs to be changed to make the AU work as a midi effect (in logic pro) like the Arpeggiator example.

Well you’ll need to compare your code with the Arpeggiator example and see what you are doing differently.

I notice that logic lists 2 instance of the Arpeggiator, one label as effect which fails the validation, and the other one labeld as MIDI Processor which is the one that works in logic. But my plugin only shows up once as an effect type (Why?).
I copied the project setting from arpeggiator, and my PluginProcessor.cpp basically have the same classes. I even disabled all my custom codes. What am i missing here?

Hmmm the usual check-list would be:

  1. Check the deployment target matches your os version:
  2. Make sure that the architecture matches Logic’s architecture: i.e. both are 64-bit or both are 32-bit
  3. Let Logic’s Plugin-Manager re-scan your plugins
1 Like

Okay i tried different settings. But the thing is if the settings were wrong the arpeggiator wouldn’t have worked either (I have resaved and rebuild that project and still works).
Here are my striped down files:
PluginProcessor.cpp

#include “PluginProcessor.h”
#include “PluginEditor.h”
PluginName::PluginName(){}
PluginName::~PluginName(){}
void PluginName::prepareToPlay (double sampleRate, int samplesPerBlock){}
bool PluginName::setPreferredBusArrangement (bool isInput, int bus, const AudioChannelSet& preferredSet)
{return false;}
void PluginName::releaseResources(){}
void PluginName::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages){}
AudioProcessorEditor* PluginName::createEditor(){ return new PluginNameEditor (this);}
bool PluginName::hasEditor() const{return True;}
const String PluginName::getName() const{return JucePlugin_Name;}
bool PluginName::acceptsMidi() const{return false;}
bool PluginName::producesMidi() const{return false;}
double PluginName::getTailLengthSeconds() const{return 0.0;}
int PluginName::getNumPrograms(){return 1;}
int PluginName::getCurrentProgram(){return 0;}
void PluginName::setCurrentProgram (int){}
const String PluginName::getProgramName (int){return String();}
void PluginName::changeProgramName (int, const String&){}
void PluginName::getStateInformation (MemoryBlock& destData){}
void PluginName::setStateInformation (const void
data, int sizeInBytes){}
AudioProcessor* JUCE_CALLTYPE createPluginFilter(){return new PluginName();}

PluginEditor.cpp

#include “PluginProcessor.h”
#include “PluginEditor.h”
PluginNameEditor::PluginNameEditor (PluginName& p): AudioProcessorEditor (&p), processor (p){}
PluginNameEditor::~PluginNameEditor(){}
void PluginNameEditor::paint (Graphics& g){ // g.fillAll (Colours::grey);}
void PluginNameEditor::resized(){}
void PluginNameEditor::timerCallback(){}

And my project settings are similar to Arpeggiator project. I’m unable to find anything logical why this is happening. Maybe someone could see what I’m doing wrong…

When i start a new Audio Plug-in project it works though…
I should try copying old codes to a new project to see what happens. Clearly something is wrong with the old one that i dont know about.

I got it to work. I think the problem was the all lower case plugin code i entered in my old project! Caused the AU to fail. Thanks to help tips on Projucer which i should’ve noticed before.
I can’t believe i wasted so much time on this.
You don’t have to uncheck the ‘Is a Synth’ for AU to work as MIDI processor. So without changing settings the project will work for VST and AU.

I wonder if maybe we should add an assertion to check the case, if that’s something that hosts are failing it for?

If you now rebuild the Projucer on the develop branch, then you will get a warning when you try to save a project that only uses lowercase plugin codes.

1 Like

Hey guys, our plugins have lower case plugin codes for years and have all been working fine. (our manufacturer code “Srdx” indeed has an upper case letter)

Now Projucer fails to save the projects which have been working fine before. We also have MIDI controls working fine in SurferEQ (whose identifier is lower-case “surf”). Are you all sure this check is necessary? I’m afraid of changing the plugin code because I have a strong feeling that something in some host or os version will break…

Cheers, Yair

My guess is that some caches of plugin attributes wouldn’t clear and when you changed the plugin identifiers it finally worked fine. I don’t believe this has anything to do with lower-case.

Like i said i’m not 100% sure what went wrong since i changed few things, but i suspect it was the plugin code or manufacturer code.
Anyways i thing a warning message could be enough to alert the user. (I admit there was already tips about that in Projucer. So its kinda my fault that didn’t expected something like that to cause fatal problems).

1 Like

The problem with the error message as it is implemented currently is that it breaks existing projects which worked perfectly fine before it.

Sorry. I’ll fix this…