Round Robin Crashes Hise Plugin-Solved with the Multimic method
-
Hallo guys!
I run in a crash when i use Hise plugin [Stereo or Multichannel in both builds (Hise 2.1 build version 650 or Scriptnode)]...checked in Logic and Cubase, while when i use the standalone version i have no problem...I am working on a non repeat Round Robin and used a piece of code that @Christoph-Hart posted in another topic, altered that to my needs and it works great! (Created a test project using 1 kick sample for every different round robin...i used 4 round robins).
The tricky part is that i use 5 samplers for the different mics (kick direct, kick oh, kick room, kick bleed, kick comp) each one with 4 round robins and the random values for every different sampler based on the script have to be the same...
In order to achieve this i used a slider with (min value=1, max value=4, step size=1).
In onNoteOn callback i set the value of the slider based on the KickRR inline function (see below)
and i activate the samplers based on the slider value.(In this way i have all the samplers synced perfectly)on init callback
Engine.setKeyColour(35, 0x643058A4); Engine.setKeyColour(36, 0x643058A4); const var KickRRSlider = Content.getComponent("KickRRSlider"); const var KickDirect = Synth.getChildSynth("KickDirect"); const var KickOh = Synth.getChildSynth("KickOh"); const var KickRoom = Synth.getChildSynth("KickRoom"); const var KickBleed = Synth.getChildSynth("KickBleed"); const var KickComp = Synth.getChildSynth("KickComp"); const var KickSamplers = [KickDirect, KickOh, KickRoom, KickBleed, KickComp]; for (i = 0; i < 5; i++) { KickSamplers[i].asSampler().enableRoundRobin(false); } reg lastIndex = -1; reg numKickGroups = 4; inline function KickRR() { // We have to catch this case, otherwise we'll // be stuck in an endless loop later if(numKickGroups == 1) return 1; local newIndex = Math.randInt(1, numKickGroups+1); while(newIndex == lastIndex) newIndex = Math.randInt(1, numKickGroups+1); lastIndex = newIndex; return newIndex; }
onNoteOn callback
function onNoteOn() { KickRRSlider.setValue(KickRR()); for (i = 0; i < 5; i++) { KickSamplers[i].asSampler().setActiveGroup(KickRRSlider.getValue()); } }
When i am on the standalone version of Hise everything works great...but when i load the plugin version on Logic or Cubase when i go to press any note it instandly crashes...
If i comment out this section of code
function onNoteOn() { KickRRSlider.setValue(KickRR()); /*for (i = 0; i < 5; i++) { KickSamplers[i].asSampler().setActiveGroup(KickRRSlider.getValue()); }*/ }
there is no problem, no crashes but i have no round robins (of course)...
Here is a video showing the problemThe Crash report is:
Thread 10 Crashed:: ProcessThread1/1024 0 libsystem_kernel.dylib 0x00007fff93294d42 __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff93382457 pthread_kill + 90 2 libsystem_c.dylib 0x00007fff931fa420 abort + 129 3 libc++abi.dylib 0x00007fff91d5294a abort_message + 266 4 libc++abi.dylib 0x00007fff91d77c2f default_terminate_handler() + 267 5 libobjc.A.dylib 0x00007fff92887353 _objc_terminate() + 124 6 libc++abi.dylib 0x00007fff91d74d49 std::__terminate(void (*)()) + 8 7 libc++abi.dylib 0x00007fff91d74dc3 std::terminate() + 51 8 com.hartinstruments.HISE 0x0000000132f7b0a5 hise::ApiClass::ApiClass(int) + 53 9 com.hartinstruments.HISE 0x0000000133090df7 hise::ScriptingApi::Sampler::Sampler(hise::ProcessorWithScriptingContent*, hise::ModulatorSampler*) + 103 10 com.hartinstruments.HISE 0x00000001330e2db2 hise::ScriptingObjects::ScriptingSynth::Wrapper::asSampler(hise::ApiClass*) + 114 11 com.hartinstruments.HISE 0x0000000132fa73e8 hise::ApiClass::callFunction(int, juce::var*, int) + 104 12 com.hartinstruments.HISE 0x0000000132fa64e7 hise::HiseJavascriptEngine::RootObject::FunctionCall::getResult(hise::HiseJavascriptEngine::RootObject::Scope const&) const + 4279 13 com.hartinstruments.HISE 0x0000000132fa5a78 hise::HiseJavascriptEngine::RootObject::FunctionCall::getResult(hise::HiseJavascriptEngine::RootObject::Scope const&) const + 1608 14 com.hartinstruments.HISE 0x0000000132f9eccb hise::HiseJavascriptEngine::RootObject::Expression::perform(hise::HiseJavascriptEngine::RootObject::Scope const&, juce::var*) const + 27 15 com.hartinstruments.HISE 0x0000000132fb76d4 hise::HiseJavascriptEngine::RootObject::BlockStatement::perform(hise::HiseJavascriptEngine::RootObject::Scope const&, juce::var*) const + 676 16 com.hartinstruments.HISE 0x0000000132fb316d hise::HiseJavascriptEngine::RootObject::LoopStatement::perform(hise::HiseJavascriptEngine::RootObject::Scope const&, juce::var*) const + 781 17 com.hartinstruments.HISE 0x0000000132fb76d4 hise::HiseJavascriptEngine::RootObject::BlockStatement::perform(hise::HiseJavascriptEngine::RootObject::Scope const&, juce::var*) const + 676 18 com.hartinstruments.HISE 0x0000000132fcbcbe hise::HiseJavascriptEngine::executeCallback(int, juce::Result*) + 398 19 com.hartinstruments.HISE 0x0000000132feee15 hise::JavascriptMidiProcessor::runScriptCallbacks() + 789 20 com.hartinstruments.HISE 0x0000000132fecbb9 hise::JavascriptMidiProcessor::processHiseEvent(hise::HiseEvent&) + 313 21 com.hartinstruments.HISE 0x0000000132d27e13 hise::MidiProcessorChain::processHiseEvent(hise::HiseEvent&) + 131 22 com.hartinstruments.HISE 0x0000000132d31741 hise::ModulatorSynth::processHiseEventBuffer(hise::HiseEventBuffer const&, int) + 1473 23 com.hartinstruments.HISE 0x0000000132d34686 hise::ModulatorSynthChain::renderNextBlockWithModulators(juce::AudioBuffer<float>&, hise::HiseEventBuffer const&) + 214 24 com.hartinstruments.HISE 0x0000000132cafcf7 hise::MainController::processBlockCommon(juce::AudioBuffer<float>&, juce::MidiBuffer&) + 10919 25 com.hartinstruments.HISE 0x0000000132a2a9ab JuceAU::Render(unsigned int&, AudioTimeStamp const&, unsigned int) + 3883 26 com.hartinstruments.HISE 0x0000000132a3b0f1 AUBase::DoRender(unsigned int&, AudioTimeStamp const&, unsigned int, unsigned int, AudioBufferList&) + 1137 27 com.hartinstruments.HISE 0x0000000132a3201e AUMethodRender(void*, unsigned int*, AudioTimeStamp const*, unsigned int, unsigned int, AudioBufferList*) + 46 28 com.apple.music.apps.MAAudioEngine 0x00000001119da197 CMDAudioUnit::Process(MDPlugInputBusList const*, MDPlugOutputBusList const*, long, long, long, float const*, eProcessLevel) + 7447 29 com.apple.music.apps.MAAudioEngine 0x000000011193a0f0 MDPlug::_Process(MDPlugInputBusList const*, MDPlugOutputBusList const*, long, long, long, float const*, eProcessLevel) + 1424 30 com.apple.music.apps.MAAudioEngine 0x000000011190f41f MD::PluginProcess(MDProcInfo*, MDPlug*, long, long, long, eProcessLevel) + 5247 31 com.apple.music.apps.MAAudioEngine 0x000000011190d2cd MD::StreamProcessing(eProcessLevel, long, long, long, int) + 14189 32 com.apple.music.apps.MAAudioEngine 0x000000011190522b MD::Process(eProcessLevel) + 3403 33 com.apple.music.apps.MAAudioEngine 0x000000011191a516 MD::CallProcessThread(long) + 342 34 libsystem_pthread.dylib 0x00007fff9337f93b _pthread_body + 180 35 libsystem_pthread.dylib 0x00007fff9337f887 _pthread_start + 286 36 libsystem_pthread.dylib 0x00007fff9337f08d thread_start + 13
Has anyone faced this kind of problem? Maybe its a code problem?
Here is the snippet of the project:
HiseSnippet 1712.3oc6a01aSbDD9tjbPrAWAH9P+RkVgpTcDlfM4EPJEUmWQQPHV1.EIDBs4t01qx4cOs257RQH0eR8mP+I0+Asyt2c91y03ZhJzWx5Oj3c1Y14Ymc1YdNm3VBtOINlKbbK8hyiHNtW2qy4LY+s6ioLm82wwshWa9PVPa9QTVryVmGgiiIANtty+DkJtkVvQ+529gsvgXlOIWjiyq3TexynCnxbosZ9TZX3d3.xKnCLzd0l66yYayC4CA3LuWcmHr+w3djmiUpMmmi6U1MfJ4hNRrjD63tvV7fy6zmeJKQ+WQioGERTCZ3zAVnDw6wCCTHVI0Y69zvfVYa6XGv+sxCBymDDts2Az.5H44Aianm.kagY7vctoAuFlvq9rCOWC3sPB7toWGeAMRlOiBaWyaeljH5hgi.SXknqybC771lCZvjKO.eLYOALXjEUWud8Zn0pWeoMpTtR4cY8nLxxwD4SImmbjTck0pgpe15qtR80dzlqpzahZs93ZUoLbrFKQmfEnmR8Otc6Ngz.h.8XTFd5QjayGDwYvfp2wTo6LoUXGpf3KA60opZqUgM8nDySzPabQSOr+zL6v9Svj1b9foYjZ9IX1VgDRvzrSqvDLTEIllcp4mXXoCdPTHQDCF+l7fPsz8csQalZ43q1HO9V8B1kKPUovBTeCDE88n0fec26tTkxuuR4B93Mz2tLNNcT0kVlvvPpcdkhpcwgwjk1.Uo7GTKbkxBROTHNFR4BHmAd3dM1HQHa3.0J+DAeXjB6qpQBkEB4VntCY9RJmkl4TMEJvq6eezORP8wmPPRNxGK86ij8owvaiI0PbYeh3TZLAcJ46BCGYyQDTrbn+wHJCgYHBKHDtBgB47H.dvsgDMocqNFtdLpwRIyodIHxgBFpgFqJAgbebHhQNMa+c.FN9DXV.bGqZiZE2l2sg5.TYWxOOENiIUys9w4gJCm9os5o3xHjmYepqS2Cijl.G8w0nvNm8btjbHSG3KUobIyKmpa9uBGNjTM6zQ42Rezjnr8w6yeKZpYUv5uIfiSH58U0B9tWluWRmkksb.7Ko2Dnw2Cc6VcoxuuboxenvbpZPBdn1gSXZUOJwzLTkmbDQTCtFBnYjhPw5hcC793cCLaV4mTRzPQNaeFUdXDg8w5Q3jVGU0sHEUfpRcuhuJsWQRTygFnDYFHcz3NuM7MZ57x82AKwYqFrvfyhHBIUsOb2gbBzTOoSTIucHwGK4QZcSqf63VdV88Yi7ayW277QC941MGTjaw.7YlPLVRh5P+IRAUnAvc4V7Xp5.JelEaFP5hGFljtXZgjyCkT.6W0ShOlBQx+buVniOOXHTYnHM.E2mzITNyreqpmJC.w4lt5yB2fYEt2zqEEJONY7N2DvKbz+4FuoLsp3sa2tPWpbvtf2du9yOsJSn7MIP4VdcjBBFR75kVARimq6k2K8uC5uQyL82VBRHGGTLO+Wat0PHhIJJ8WZpc0lCfFvE7U5NoMIhfkPB.w7dQ6155pia0MZpSWdg.neCACyMzgLBD4kla6sE733tv1Io2io1sFJ5ohU4RZSNAJyWT1yGN.N8YLRnpJoqKH5kwD0oM0GZyInmYps1K0eAVehCOSfdbiwF+fwFuxXiWcrwqM130Ga7CyGmDPO.GoxMVzKHIuX7h8Wc1J1CKSKLrwMzbKZuQtHQhYh7nfsFPFO5yDdvgq7u5mq4KWo14mM39W7nWkxvXGp5zYW1IvkSPhBi2B5Bp6vjIsQATd.mwi5yYT+hWEfT6d8HBSrOwMzlRIbSLWxsa1lDR.Vt4h91lOCXKiEEug+IEKZL6whocd80dIvEoptg9+QKx4uz2hbZgNfkmtfEB7tP9u7y4q6oKniT8e+mBpvSIKg9pY817fFfcfl99Dy1fyon0mLttZrBPcfmVUO32gWoS1HqmoZxFYS53msTvdK88ZN8tym7j5ZlegP23PyT5XfZgBRPetYmfzhdIe.CVxQVxQljiVvi22RLxRLxjXzCrDirDirDirDitLPLprW1ewEK0HK0HSpQWwSnxJrjirjiLHGshkbjkbjkbjkbzkAxQWyaz+DJV1QV1Qlritp2Q5zBK8HK8HC5QqZoGYoGYoGYoGc44yNR8uTmkcjkcTwO6HeUVgkbjkbjA4n0rjirjirjirji9OL4nuDnb.1WvemexWRBEVWTKAPIS+sLrj2ApwnFYesH77pubcmAPup246qtHbOHBOYadvEvlUt.1r5Evl0t.1r9EvlGdAr4QS0FEMgMGJ4CRJRBBZsaRhk6tiRrl24OjTQ6UB
And the project can be downloaded here: Round Robins
If it is possible please download the project just for testing and maybe reproducing the situation.
In this way maybe we can see if it's a problem on my system or if it is a Hise bug (or maybe a code problem)I have to mention that if i will not press any note and coplile to a finished plugin it compiles without problems loads fine and plays fine...
Thanks in advance
-
@DimitrisSP said in Round Robin Crashes Hise Plugin:
The tricky part is that i use 5 samplers for the different mics (kick direct, kick oh, kick room, kick bleed, kick comp) each one with 4 round robins and the random values for every different sampler based on the script have to be the same...
Nononono
Use multimic samplemaps for mic positions, then you don't need to sync the RR groups with the script.
-
@Christoph-Hart said in Round Robin Crashes Hise Plugin:
Nononono
Use multimic samplemaps for mic positions, then you don't need to sync the RR groups with the script.To be fair i never worked with multimic samples...but the question is...can i have total control over my different mic positions using multimic samples?...I mean to create a secondary full featured mixer with volume faders, panners, solo, mutes, level meters etch...even outputs to route every mic position everywhere i want in the instrument or direct out to Daw?...This can be done with multiple instanses of samplers in a container each one for every different mic position...(let's say Kick Container, Snare Container, Hihat Container, Tom1 Container...etch).
I know that this is probably overkill (I will need about 50 samplers for that) but i think it's the only way to achieve this...and it is not my imagination...i have done this already in Kontakt (there were a lot of difficulties in that senario but finally i managed to have that working)...and working some months with Hise i know that it will be accomplished even better unless Hise will not let me go so far (I mean performance, crashes, etc)
Here is a small animation to show exactly what i mean and how far i have to go
Mixer-Matrix
The rest of the instrument
Maybe all these features are too much but i wanted to give it a try because for some reasons i don like Kontakt (Most users/customers prefer independent plugins and not Kontakt...and lately Kontakt became extremely Heavy so using so big instruments like Balkan Drummer(about 40 GB of samples plus a ton of features) is not an easy situation.
Till now i am about at the half of the process of creating Balkan Drummer with Hise, it compiles very well without problems as a AU and VST plugin with 16 stereo outs and the mixer functionality and i can confirm that in Logic and Cubase if i load the same elements in my Hise instance and in my Kontakt instance Hise wins in performance comparison by far
-
The entire multimic concept is done for this exact use case so I suggest you get familiar with how it works.
-
Yes you can have all standard mic mixer stuff, I made a couple of videos about this
-
Thanks a lot @Christoph-Hart and @d-healey for the suggestion!
I will definitely check the multimic solution! -
Finally problem solved with the Multimic method (A really great way to control different mic positions)...
Thumbs up @Christoph-Hart and @d-healey for the suggestion