In my BASS.pas, I had:
{$IFDEF MSWINDOWS}
bassdll = 'bass.dll';
{$ENDIF}
{$IFDEF LINUX}
bassdll = 'libbass.so';
{$ENDIF}
{$IFDEF ANDROID}
bassdll = 'libbass.so';
{$ENDIF}
{$IFDEF MACOS}
{$IFDEF IOS}
bassdll = 'libbass.a';
{$ELSE}
bassdll = 'libbass.dylib';
{$ENDIF}
{$ENDIF}
Because I was using the static library for iOS. bass_fx has only a dynamic library (framework), so I should have realised it depends on the dynamic library for bass (I confirmed this using the otool command). Now I am using the defines in bass.pas that you posted, and modified bass_fx similarly:
{$IF Defined(MSWINDOWS)}
bass_fxdll = 'bass_fx.dll';
{$ELSEIF Defined(OSX)}
bass_fxdll = 'libbass_fx.dylib';
{$ELSEIF Defined(IOS)}
bass_fxdll = 'bass_fx.framework/bass_fx';
{$ELSE}
bass_fxdll = 'libbass_fx.so';
{$ENDIF}
The next problem was that usually, frameworks are deployed with a remote path of (for example with bass_fx) Frameworks\bass_fx.framework. Having finally found where the crash reports are, I discovered:
"type": "EXC_CRASH",
"signal": "SIGABRT"
},
"termination": {
"code": 1,
"flags": 518,
"namespace": "DYLD",
"indicator": "Library missing",
"details": [
"(terminated at launch; ignore backtrace)"
],
"reasons": [
"Library not loaded: @rpath/bass_fx.framework/bass_fx",
"Referenced from: <6DA6D33F-949E-3D2D-9FC5-7626BF6D85E3> /Volumes/VOLUME/*/CDGFMX.app/CDGFMX",
"Reason: tried: '/private/var/containers/Bundle/Application/B4AAC5E1-E9E4-4FE8-8C1E-D532674CC973/CDGFMX.app/bass_fx.framework/bass_fx' (no such file), '/private/var/containers/Bundle/Application/B4AAC5E1-E9E4-4FE8-8C1E-D532674CC973/CDGFMX.app/bass_fx.framework/bass_fx' (no such file)"
...so it was trying to load without the Frameworks part of the path. I updated the remote path values in the deployment, and now it works! Thanks for your reply, because it sent me down the right track.