Building SuperCollider (and plugins) on Mac M1

Hello everyone

I am trying to set up a Mac M1 for SuperCollider work and it is royally kicking my ass. I am opening this thread to help others (and myself) figure out some of the intricacies here.

Building plugins for Rosetta/X86

By default, when building plugins on an M1, the compiler will detect the ARM architecture. That sounds fine - but odds are, youve probably installed SuperCollider by downloading the prebuilt binary from supercollider.github.io. This will then run under Rosettas X86 compatibility layer and “think” it is running on a intel mac.

This works fine - but when you start compiling plugins, the compiler will detect ARM and create arm binaries for you, which will make SC say it cant open the plugin and it has wrong architecture.

Most plugins allow to pass -DCMAKE_OSX_ARCHITECTURES=x86_64 as a build flag to cmake to force the compiler to create the x86 version that works with your x86 version of SC.

As an example, heres how I built sc3 plugins like this:

git clone --recursive https://github.com/supercollider/sc3-plugins.git
cd sc3-plugins
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE='Release' -DSC_PATH=$HOME/supercollider -DCMAKE_OSX_ARCHITECTURES=x86_64 ..
cmake --build . --config Release
cmake --build . --config Release --target install
cp -av SC3plugins "$HOME/Library/Application Support/SuperCollider/Extensions"

Checking the architecture of a plugin binary

If you want to check whether or not a plugin has been compiled for arm or x86, you can use the file command. eg. file SomePlugin.scx - this will tell you whether it is arm or x86 architecture.

Compiling SuperCollider plugins using faust

If you are dependent on SuperCollider plugins written in Faust, you will run into some problems as well (eg by running SUPERCOLLIDER_HEADERS=$HOME/supercollider/include faust2supercollider some-faust-file.dsp.

Again, the faust compiler will detect the ARM architecture and compile arm binaries which will mismatch with your SC if it isnt compiled for arm.

(and forget about using the online IDE for faust - the resulting binaries will be detected as malware by MacOS)

If you are running SuperCollider under Rosetta/x86 there is a (not so elegant) way to force faust2supercollider to compile correctly to that architecture my adding -arch x86_64 to the compilation options and make a new version of the script that explicitly forces to x86.

I have made such a version here:

Running natively on ARM

To be able to run it all arm natively, the only way I see to do it now is to compile SC from source:


# If xcode license has not been agreed to, cmake will output errors about compilers not being found.
# run:
# sudo xcode-select --reset
# sudo xcodebuild -license


git clone --recursive https://github.com/supercollider/supercollider.git
cd SuperCollider
brew install git cmake libsndfile readline qt5
brew install portaudio fftw
mkdir -p build
cd build
cmake -G Xcode -DCMAKE_PREFIX_PATH=`brew --prefix qt5` -DSUPERNOVA=ON ..
cmake --build . --target install --config RelWithDebInfo

And then, if succesful, compile all plugins again without the aforementioned build flag.

But, I am running into problems here: If anyone knows how to get over this hurdle, please let me know as I am desperately trying to figure this out.

And also, has anyone gotten SuperNova to work properly on the M1?

Hey Mads,

once you’ve successfully build SC for M1 ARM, would you try building VSTPlugin for M1 ARM as well? Since VSTPlugin has a built-in plugin bridge, it should be possible to run existing 64-bit Intel VST plugins (via Rosetta) with the ARM version of Supercollider. Without the bridge, plugins would have to be recompiled for ARM - which often isn’t even possible (e.g. the company is out of business). Unfortunately, I can’t test it myself because I don’t have access to a Mac M1…

1 Like

I’ve compiled SC for M1. I’ll check what went into it and report on the GH issue.

I actually happened to also run VSTPlugin with it! (Thanks @Spacechild1 for amazing work!) I had to allow the binaries through the gatekeeper and then it worked. However, I’m actually not sure if the VST in question was Intel or Universal - I’ll check and report back.

I actually happened to also run VSTPlugin with it!

Cool! Great to know it also compiles and runs fine on ARM (I never tried it).

However, I’m actually not sure if the VST in question was Intel or Universal - I’ll check and report back.

Unless you did something special, I’m pretty sure it loaded the ARM binary. But you can do the following to also run Intel-only plugins:

  1. Compile VSTPlugin for x86_64, but don’t install it.
  2. Rename the resulting host binary to host_amd64 and copy it to the plugins folder of your installed ARM version of VSTPlugin

If you boot the Server and do VSTPlugin.search it should now also find all Intel-only plugins. In the case of universal plugins, the ARM binary should be automatically preferred. I’m just curious if the ARM/Intel plugin bridge actually works in practice (especially the IPC between VSTPlugin and the host_amd64 app.)

Actually… I was probably running Intel SC when I used VSTPlugin since I just downloaded the regular binary distribution. I’ll see if I can get to compiling VSTPlugin on M1.

I already feared so :slight_smile:

I’ll see if I can get to compiling VSTPlugin on M1.

That would be great! You can send me a PM with your results.

has anybody had any luck with building VSTPlugin on M1? I’m stuck on linking <intrinsics.h> referenced from vst/Sync.cpp

fatal error: 'intrinsics.h' file not found
  #include <intrinsics.h>
           ^~~~~~~~~~~~~~

With one minor fix, @arcanePsalms already managed to compile VSTPlugin for M1 together with a x86_64 host app. They also confirmed that they can run both native arm64 and bridged x86_64 VST plugins in a native (arm64) scsynth!

Here’s a testing branch for M1: https://git.iem.at/pd/vstplugin/-/tree/m1

If you build for arm64, you can automatically get a x86_64 host app simply by setting -DBUILD_HOST_AMD64=ON.

It would be great if some of you could test the build system! My MacBook is too old…

EDIT: seems to work :slight_smile: If anyone wants to try it nevertheless, I have merged the fixes into develop.

I’ll give it another test tonight @Spacechild1 - btw I don’t mean to derail the thread to be specific to VSTPlugin, so @madskjeldgaard if you’re still stuck with QTWebEngine there’s now a compiler flag
-DSC_USE_QTWEBENGINE=OFF
to remove it if you don’t mind not having the QT help browser available (as mentioned here https://github.com/supercollider/supercollider/issues/5603)

Hi all,
I’m concidering buying a mini Mac with M1 processor to be used mainly for SC. I have therefore some questions:
Does the M1 processor give me a huge performance increase?
Is it difficult to get SC to work natively on the M1?
Can I use multiple M1 cores for the sound processing of SC?
How can I stream multiple audio channels to an other application (to be written ourselves) on the Mac?

hi sinmania:

please see this thread:

streaming of audio: https://github.com/ExistentialAudio/BlackHole