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.

1 Like

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

hi semiquaver,
does SuperCollider support Blackhole devices?

@simmania blackhole presents itself as a regular soundcard and yes, supercollider can use it like most other programs.
The are some considerations about clocking etc that are specific to blackhole (not supercollider) that should be observed when using blackhole with other devices (in short, when using blackhole as just input or output, and another soundcard as the other device, you should create and aggregate device in Audio MIDI setup, set one of those devices as clock master and the other for ā€œdrift correctā€, then use that aggregate device in SC)

Hello all,
tried to compile and run SC3 plugins on a M1 and got this known error (for every plugin) when booting the server:

*** ERROR: dlopen ā€˜/Users/jan/Library/Application Support/SuperCollider/Extensions/SC3plugins/HOAUGens/HOABeamDirac2HOA4_supernova.scxā€™ err ā€˜dlopen(/Users/jan/Library/Application Support/SuperCollider/Extensions/SC3plugins/HOAUGens/HOABeamDirac2HOA4_supernova.scx, 0x0002): tried: ā€˜/Users/jan/Library/Application Support/SuperCollider/Extensions/SC3plugins/HOAUGens/HOABeamDirac2HOA4_supernova.scxā€™ (mach-o file, but is an incompatible architecture (have ā€˜arm64ā€™, need ā€˜x86_64ā€™)), ā€˜/usr/lib/HOABeamDirac2HOA4_supernova.scxā€™ (no such file)ā€™

Is there a way to get SC3 working in the meanwhile and an instruction how to do so?
Thanks,
Jan

Is SuperCollider itself build for M1? Looks like itā€™s an Intel version.

Itā€™s most probably not, i had downloaded the last release. So one would have to compile SC specifically for M1 then? Is there something specific that would work differently in that case?

The architecture of Server and plugins has to match.

Why are you compiling sc3 plugins for ARM in the first place? If you plan to run the Intel version of SuperCollider, you can simply use the Intel binaries of sc3 plugins: Releases | sc3-plugins

I was not aware the architectures didnā€™t match. Iā€™d actually like to compile SC for arm but so far iā€™m not even sure how to do so and if it has other caveats? Is there an instruction on how to do so?
(So far any compiling with M1 has proven to be quite a challenge, presupposing quite a bit of knowledge or understanding in these matters)

If you compile SC on an M1, you should get an ARM binary by default. Just follow the usual instructions and give it a try. @MarcinP has mentioned above that he successfully compiled SC for ARM, but I donā€™t know how smoothly it went.

1 Like