@d-healey I really like that UI. Very simple, accessible, and smooth looking - for lack of a better word!

Best posts made by Orvillain
-
RE: Need filmstrip animations
-
RE: Can We PLEASE Just Get This Feature DONE
Free mankini with every commercial license???
-
RE: Orv's ScriptNode+SNEX Journey
Lesson 5 - SNEX code in a bit more detail.
So I'm by no means an expert in C or C++ - in fact I only just recently started learning it. But here's what I've sussed out in regards to the HISE template.... and template is exactly the right word, because the first line is:
template <int NV> struct audio_loader
Somewhere under the hood, HISE must be setup to send in an integer into any SNEX node, that integer corresponding to a voice. NV = new voice perhaps, or number of voices ????
The line above declares a template that takes this NV integer in, and creates a struct called audio_loader for each instance of NV. Indeed we can prove this by running the following code:
template <int NV> struct audio_loader { SNEX_NODE(audio_loader); ExternalData data; double note = 0.0; // Initialise the processing specs here void prepare(PrepareSpecs ps) { } // Reset the processing pipeline here void reset() { } // Process the signal here template <typename ProcessDataType> void process(ProcessDataType& data) { } // Process the signal as frame here template <int C> void processFrame(span<float, C>& data) { } // Process the MIDI events here void handleHiseEvent(HiseEvent& e) { double note = e.getNoteNumber(); Console.print(note); } // Use this function to setup the external data void setExternalData(const ExternalData& d, int index) { data = d; } // Set the parameters here template <int P> void setParameter(double v) { } };
There are only three things happening here:
- We set the ExternalData as in a previous post.
- We establish a variable with the datatype of double called 'note' and we initialise it as 0.0. But this value will never hold because....
- In the handleHiseEvent() method, we use e.getNoteNumber() and we assign this to the note variable. We then print the note variable out inside of the handleHiseEvent() method.
Now when we run this script, any time we play a midi note, the console will show us the note number that we pressed. This is even true if you play chords, or in a scenario where no note off events occur.
That's a long winded way of saying that a SNEX node is run for each active voice; at least when it is within a ScriptNode Synthesiser dsp network.
The next line in the script after the template is established is:
SNEX_NODE(audio_loader);
This is pretty straight forward. The text you pass here has to match the name of the script loaded inside your SNEX node - not the name of the SNEX node itself.
Here you can see my SNEX node is just called: snex_node.
But the script loaded into it is called audio_loader, and so the reference to SNEX_NODE inside the script has to also reference audio_loader.
-
RE: scriptAudioWaveForm and updating contents
@d-healey said in scriptAudioWaveForm and updating contents:
@Orvillain Did you try,
AudioWaveform.set("processorId", value);
?Yeah I did, and it does update it based on a follow up AudioWaveform.get('processorId') call - but the UI component doesn't seem to update, and still shows data from the previous processorId. When I compile the script, then the UI updates one time... but not on subsequent calls to the set method.
I figured I needed to call some kind of update() function after setting the processorId, but no such luck so far.
-
RE: c++ function optimization using vectorization or SIMD???
@griffinboy said in c++ function optimization using vectorization or SIMD???:
It's more popular nowadays to store waveforms in frequency domain using FFT, and to silence bins above Nyquist before inverse FFT. Either that or use filters to make mipmaps (multiple copies of your waveform at different pitches, with antialiasing filters applied, baked into the copies, play back the appropriate pre-antialiased file for the pitch) optionally doing so at 2x oversampling and using additional interpolation to remove aliasing that happens from extra processes that happen in Realtime.
Cheers dude! I was aware of this, but I wanted to see how far I could get with sinc. Turns out, quite far! I've got 22% CPU usage for about 30 voices now. Which isn't really super optimal, but it was a fun project.
That paper you linked me a while back - https://www.mp3-tech.org/programmer/docs/resampler.pdf - was what got me interested.
I think I understand the process you mean though, for the mipmapping approach. Something like:
- Oversample original audio x2 (juce::dsp::oversampling can handle this)
- Set up a root note
- For mip-maps below the root note - lowpass and downsample (dsp::FilterDesign::designFIRLowpassWindowMethod then keep every 2nd sample)
- For mip-maps above the root note - upsample and then lowpass (use the same oversampling approach here for the upsampling and then the same kind of FIR filter???)
- Store each level, and then move on to the playback engine
I think that'd be the approach??
Playback engine-wise, I'd still need to have an interpolation method to playback notes in between the mipmap levels I would guess. Can Hermite cover this, or do I need to go polyphase still?
-
RE: Getting debug output to the compiler console..
Hey apologies for the bump. But I got this to work by putting:
JUCE_LOG_ASSERTIONS=1into the preprocessor definitions and then rebuilding. I get data from my custom c++ node printing to the visual studio log:
It wasn't working until I did that.
-
RE: Orv's ScriptNode+SNEX Journey
Lesson 4 - SNEX Node layout.
I'm still wrapping my head around how the SNEX node works.
The first thing to note is, SNEX code does not support strings. The documentation for HISE does make this clear, but if you haven't seen it yet... then I've told you again! Here's the docs link:
https://docs.hise.audio/scriptnode/manual/snex.html#getting-startedAs the docs say:
The Scriptnode Expression Language (SNEX ) is a simplified subset of the C language family and is used throughout scriptnode for customization behaviour.Which means that most of the syntax you're used to when writing interface scripts, is just not going to be the same. There are some overlaps however - Console.print() is still used in SNEX scripts. However, print messages only get logged to the console when you put the SNEX node into debug mode. Which you can do by clicking this button:
From what I can tell, by default we have the following methods:
- prepare
- reset
- process
- processFrame
- handleHiseEvent
- setExternalData
- setParameter
Each one of these methods has a purpose. I'm still experimenting to figure out what those are, but here's what I've come up with so far:
- prepare
This is called when you compile or initialise your SNEX node, and it seems to run for each audio channel. I would guess this is meant to setup global parameters like sample rate and block size. Things that do not change from voice to voice. - reset
This is called when you trigger a voice, in my case from midi. When using a ScriptNode Synthesiser, the midi passes into the node automatically. This is where you would initialise variables that can hold different values from voice to voice, but that must start out with the same default value each time. - process
Haven't quite figured this one out yet. - processFrame
Haven't quite figured this one out yet. - handleHiseEvent
This is called when you trigger a HiseEvent - typically a midi event. This is where you would parse out your midi notes, velocities, controllers, and program changes; any midi data really. - setExternalData
This is called whenever there is a change to the external data. In our case, that would be the AudioFile we added in previous steps. So for example if you went to the complex data editor for the External AudioFile Slot (in the node editor) and loaded a new file, this method would get called. This is where you would resize any arrays that you're using to store the sample data, for example. - setParameter
This is called whenever a parameter inside the SNEX node is adjusted. You can parse the parameters out by using if statements and checking P against 0, 1, 2, 3, etc, depending on how many parameters you actually have.
SNEX has some hard-coded variable names, most of which I don't know yet. But a valuable one is "ExternalData". Consider this code:
template <int NV> struct audio_loader { SNEX_NODE(audio_loader); ExternalData data; // Initialise the processing specs here void prepare(PrepareSpecs ps) { } // Reset the processing pipeline here void reset() { } // Process the signal here template <typename ProcessDataType> void process(ProcessDataType& data) { } // Process the signal as frame here template <int C> void processFrame(span<float, C>& data) { } // Process the MIDI events here void handleHiseEvent(HiseEvent& e) { } // Use this function to setup the external data void setExternalData(const ExternalData& d, int index) { data = d; } // Set the parameters here template <int P> void setParameter(double v) { } };
Most of it doesn't do anything. But we have established that ExternalData is linked to a variable called data. We can also see this in the data table view:
Notice how ExternalData is a Data Type, and it is named data. Also notice how it has a variety of sub attributes - dataType, numSamples, numChannels, etc.
Let's swap out the file loaded in the AudioFile editor:
Notice how numSamples has updated, and also numChannels.
Back to the code:
// Use this function to setup the external data void setExternalData(const ExternalData& d, int index) { data = d; } // Set the parameters here template <int P> void setParameter(double v) { }
The data variable we established as ExternalData at the top of the script, is now actually having the data pushed into it by the setExternalData method - which has two inputs; "d" and "index".
This shows the very very basics of getting sample data into a SNEX script. But we're still not doing anything with it yet.
-
RE: Orv's ScriptNode+SNEX Journey
@d-healey I don't mean to be rude, but please don't distract from the purpose of this thread. Beautiful code and efficient code isn't the point here.
The point is to demonstrate how the API works, and for there to be a resource for people who come along in the future looking to do sample loading from their scripts, and looking to do advanced things in ScriptNode or SNEX.
I know full well that in a real world scenario, you wouldn't specify a bunch of files each as an individual const, and you'd put them in a key value pair inside of an array, or perhaps a function acting as a meta-object.
-
RE: Orv's ScriptNode+SNEX Journey
Lesson 3 - using the SNEX node with sample content.
This one is something I'm still getting my head around. @Christoph-Hart kindly provided a one shot SNEX node demo, which you can find by going to the example snippet browser in the Help menu:
This will open a whole new window where you can experiment with snippets. Maybe I'll go over the specific snippet in another post, but for this one... we're starting fresh, and we're going to just do the basics.
So.... here we have a basic interface script that gives us some file const references, an AudioSampleProcessor retreiving the AudioSampleProcessor from a Scriptnode Synthesiser in our module tree. That synthesiser has a DspNetwork assigned to it:
Right now, if we run the code... it will fail to find the AudioSampleProcessor as explained above. Let's add a SNEX node:
When you do this, it will be blank. You will need to click the three dot menu icon and choose "create new file" - strangely enough, you have to do this even when creating an embedded network. But fine. Let's do it:
We need to give it a name:
At this point, the node becomes active, indicated by the green highlight text:
Now if you open the same menu, you get more options:
We're going to select 'Add AudioFile':
You can see that now there is an extra icon in the SNEX node, which opens the AudioFile "Complex Data Editor" panel.
We can add an External AudioFile Slot using the icon on the right hand side:
And now you can see that the data editor will display whatever sample you assign to that AudioSampleProcessor from your script:
So here we see that file_r has been loaded into the buffer, and if we wanted to do file_f instead we could change the code to do that:
Note - you will not be able to playback the audio at this stage, as your SNEX code will be completely empty. If you click the icon on the right side, it will open the code editor for this SNEX node:
So whilst the data is loaded, our code isn't doing anything with it.
Latest posts made by Orvillain
-
RE: Crash on MacOS in compiled plugin when working with HardcodedEnvelopeModulator
Is anyone else able to reproduce this on MacOS? Just curious if it is a me thing or not. I can't think why it would be mind you.
-
Crash on MacOS in compiled plugin when working with HardcodedEnvelopeModulator
I'm getting this on MacOS Sequoia 15.5 and all DAWs.
This is the most basic example I can come up with.
Here is the project snippet.HiseSnippet 1352.3oc2XstaaaCElJNLKwYEXsqCcX.aPHX+vcnKvxw4FFFpy8ZrlDiXuzh8mBZIZahHQJHQklrg8rs8HrGg8Hz2fsCEssnRbbSMlaSW9QP3gmC4QmKeeGlFQBWZbrHBYUr0kgTj0mhadIW1amdDFGUeWj08vs8I7yB8S5BR19xPRbL0CYYU3.kJVKLKJ8m27zsIfhtzLQHzoBlK84r.lLSZiZ+Dy2eehGsEKvP6p0p6J36H7EIf6T.WFERbOizkdDQo1LXzyHw8PVeGd8Moq2d8UqtQkUHa533VYSO2pUJux5q5Uo5Zq0tryJqTci1qirlaOOlTD0TRjzXj0raK7trYOwq45K3TVLqsOUsvA0DtYs38E9dpOQkTzN8X9dMFDmhQvg1HKpUPG0dH9PlGan7rn2mktgclElAPqYx6dEx4dNltWYC2aDtjkgKMq1ktOtoaDKTlsixeVDWmKoQcHPdxzUz5hlokEdGAnAWtb.4L59QvhgVTZsxkehM7qG+CEKB4pXo84jH6mQh7bEPDaO94TeQH8PgWhOA9vbr+Q6zxok6RkM8Ex8eYokFi5KAG7X1d4XpbuNcntxRKocXPminxWKhNCLsSB2UxDbaA+HgjdLuziK9aEWn3uWz9pa0oyH2S8oGI78oQibaU8Zz3LrDOInMM5IPXwOgNTQHmjOQiu4DsYcnqNSXnnfWmyjGGR42T0Ipe5C9qet9tDIQUczWFnWHMRxTtf0tzygdScsxB3cowmIEgP240JjfR3AY.y5ZU2e+MfXPthIUACOlIuzDc3+rh8aqKdebClzs2n8wYFgOBQpogO1Gh3dXcoalCNKd+WNcvCLu940W+WgOvWzl3mEnfZBvSnZbgut+11C22dnBNiA0+utsn9g2ZT+q1rL6sqY4s.ZO6cNP6aac7mesTS76wtsbTK8qk9F7PPZ6AnzYdW+5owfimy8OTvEg8DblqYIzITYDqaWn5zb.CVnvmDciez8oBPVO.eU5g2kVamoO7Sg+eC+bhHQx3cOj.IwK.5tiRBZB82tT314bpuhBzZFEYkdcY0ZUDnIk6kt3efe5uoiZsU+McFrIRe3FLbbZJaLx5SZQhf4Mp6o5czpYaT7A+4vzrxmpy8nWn+TLxJKhKu7pqrYUXnRzVIWzWo4veuyxk0BFpJFTUY64.2pFApbtLvizYfEwufbNMcbnz3+WjttiHJv9.J.yd8VioNT6wtRvEZEQ3wghXpi4I2jFvZI3z3bRuhEUFoE4jtKUlvyezZQ4zREJ1GBEF5MesABqXJrAgm6vf04NoCUUbCV92OcONApYaRgubuiicg.SJFkApQiD+X5KXdxdNlFlIthoXErFjCyAVYUXZvXM2GsLVe.GNLGc0BC7wlrfPe5.hnTe7AvHucHI9xARmXVoQ9AskTBOdMSxCqcB0mRhMZG+1ZOGlthDowilnXgy67qBGY95KwZ20VgWX+w6P8SYV0bwyhCdkslfI+zOih1YJMyyNIwRQfhqaFL5T0yNyAIGHDxd.Ubdlf50tJj0jONT5cdBg2kpB004gIR8JKbfI8Uo+LfXfLWpVFgoUgXIMrI6Wy0GzhdgDn0SUJRQep3WjJ9EfFJQdS2ya9ib2ip+bb2C7L4XJ.d1P.QVndZq3egFITuP7Nza3FOX6gYEZ2MaZeDFXdqXm14Z+gYf32GSj993NBHtQhW4p+2MovjlOUB7cyS+ujt.f7.qscPmeUrf.XBgW45l+ntlgUlTCWYRMr5jZ3pSpgqMoFt9jZ3FucCUCvsUBfkq6MfAYarW5qarrzyvl1lf9W75mYoO
Make sure to compile DSP networks. Then re-load HISE and compile the project to create a VST3.
The script does this:
const var HardcodedEnvelopeModulator1 = Synth.getSlotFX("HardcodedEnvelopeModulator1"); HardcodedEnvelopeModulator1.setEffect("ScriptEnvNetwork");
Essentially what we have is:
- Global modulator container
- Hardcoded envelope modulator - with a ScriptEnvNetwork loaded into it (consisting of an oscillator, sig2mod, and peak node) compiled to 1 channel (mod sources need 1 channel from what I can tell)
- Waveform generator
- Matrix Modulator assigned to pitch of the waveform generator.
The interface script sets the HardcodedEnvelopeModulator to the correct network by using the setEffect() method.
The HISE project works fine on Windows and MacOS. The plugin will compile on Windows and MacOS.
But on MacOS, the plugin will crash the host on plugin instantiation. Seems to be a null pointer or dangling pointer issue. The crash does not occur on Windows, from what I can tell.
-
RE: Crash when creating global mod sources using the Builder
@Christoph-Hart Yep, this is fixed now. Thanks Christoph!
-
Crash when creating global mod sources using the Builder
Content.makeFrontInterface(600, 600); reg builder = Synth.createBuilder(); inline function createGlobalModulationSources() { local modmatrix_idx = builder.create(builder.SoundGenerators.GlobalModulatorContainer, "Global Mod Container", 0, builder.ChainIndexes.Direct); local globalModulatorsChainIndex = 1; builder.create(builder.Modulators.Velocity, "Velocity", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.KeyNumber, "Key Number", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.FlexAHDSR, "Env 1", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.FlexAHDSR, "Env 2", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.FlexAHDSR, "Env 3", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MacroModulator, "Macro 1", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MacroModulator, "Macro 2", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MacroModulator, "Macro 3", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MacroModulator, "Macro 4", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.Random, "Random", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.PitchWheel, "Pitch Wheel", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MidiController, "Mod Wheel", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MidiController, "Midi CC 1", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MidiController, "Midi CC 2", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.MidiController, "Midi CC 3", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.HardcodedEnvelopeModulator, "Custom LFO 1", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.HardcodedEnvelopeModulator, "Custom LFO 2", modmatrix_idx, globalModulatorsChainIndex); builder.create(builder.Modulators.HardcodedEnvelopeModulator, "Custom LFO 3", modmatrix_idx, globalModulatorsChainIndex); }; builder.clear(); createGlobalModulationSources(); builder.flush();
If I do the above, then HISE will crash every single time.
If I remove the last two custom LFO's (or just comment them out) then it does not crash.
My extra definitions are:
HISE_NUM_SCRIPTNODE_FX_MODS=24 HISE_NUM_POLYPHONIC_SCRIPTNODE_FX_MODS=24 NUM_HARDCODED_FX_MODS=24 NUM_HARDCODED_POLY_FX_MODS=24
If I run a debug build I get the following pop-up in VS2022:
And I basically get locked in this cycle:
Given it is saying that an array subscript is out of range, I can only assume that either I'm reading out of the range of an array, or that the definitions aren't being honoured in some way. A hardcoded limit on the number of modulators perhaps??
If I comment out everything except the 3 'Custom LFO' creation steps, then it still crashes... this implies that the crash is something to do with creating multiple HardcodedEnvelopeModulator objects.
-
RE: Matrix Modulation Feedback
@DanH said in Matrix Modulation Feedback:
So what exactly is the MatrixTargetID for?
One use is for linking a UI parameter to multiple matrix modulator targets. In such a situation, you don't need to assign the processorId nor the parameterId - you can just name your UI control whatever you want, and then make sure that any matrix modulator you want it to connect to, is also named the same. You can edit the name by checking out the edit ranges section in the matrix modulator.
-
RE: Flex Envelope - No UI control for Hold
It is right there. Hover over the lower highlighted section and you'll see a horizontal arrow dragger mouse cursor.
-
RE: Crash when loading files into Wavetable Creator (Resample Mode)
Confirmed here on MacOS too. Crash log:
------------------------------------- Translated Report (Full Report Below) ------------------------------------- Process: HISE [88903] Path: /Users/USER/*/HISE.app/Contents/MacOS/HISE Identifier: com.hartinstruments.HISEStandalone Version: 4.1.0 (4.1.0) Code Type: ARM-64 (Native) Parent Process: launchd [1] User ID: 501 Date/Time: 2025-07-25 19:24:55.1964 +0100 OS Version: macOS 15.5 (24F74) Report Version: 12 Anonymous UUID: CCB1FD68-DBB1-BA98-C0F7-4D9C638A5DAA Sleep/Wake UUID: DF6D33B0-69EB-4F03-953C-4FD81CFEA42C Time Awake Since Boot: 660000 seconds Time Since Wake: 1429 seconds System Integrity Protection: enabled Crashed Thread: 16 Convert Samplemaps to Wavetable Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000008 Exception Codes: 0x0000000000000001, 0x0000000000000008 Termination Reason: Namespace SIGNAL, Code 11 Segmentation fault: 11 Terminating Process: exc handler [88903] VM Region Info: 0x8 is not in any region. Bytes before following region: 4298080248 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START ---> __TEXT 1002f8000-102164000 [ 30.4M] r-x/r-x SM=COW /Users/USER/*/HISE.app/Contents/MacOS/HISE Thread 0:: JUCE Message Thread Dispatch queue: com.apple.main-thread 0 HISE 0x101b04c94 juce::blurSingleChannelImage(juce::Image&, int) + 416 1 HISE 0x101b049c8 juce::DropShadow::drawForImage(juce::Graphics&, juce::Image const&) const + 212 2 HISE 0x101b0485c juce::DropShadowEffect::applyEffect(juce::Image&, juce::Graphics&, float, float) + 164 3 HISE 0x101b4e8cc juce::Component::paintEntireComponent(juce::Graphics&, bool) + 580 4 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 5 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 6 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 7 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 8 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 9 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 10 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 11 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 12 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 13 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 14 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 15 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 16 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 17 HISE 0x101b39bf8 juce::Component::paintComponentAndChildren(juce::Graphics&) + 1172 18 HISE 0x101b4e62c juce::ComponentPeer::handlePaint(juce::LowLevelGraphicsContext&) + 308 19 HISE 0x101b46d20 juce::JuceNSViewClass::drawRect(objc_object*, objc_selector*, CGRect) + 340 20 AppKit 0x196ed6d18 _NSViewDrawRect + 160 21 AppKit 0x1978ecc74 -[NSView _recursive:displayRectIgnoringOpacity:inContext:stopAtLayerBackedViews:] + 1084 22 AppKit 0x196ed670c -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 536 23 AppKit 0x197593a64 -[NSViewBackingLayer drawInContext:] + 56 24 AppKit 0x197209ab8 0x196d89000 + 4721336 25 AppKit 0x1971f1fdc 0x196d89000 + 4624348 26 AppKit 0x1971ed150 0x196d89000 + 4604240 27 AppKit 0x1971f1cac 0x196d89000 + 4623532 28 AppKit 0x1971ef6b0 0x196d89000 + 4613808 29 AppKit 0x19727a574 0x196d89000 + 5182836 30 AppKit 0x19727abdc 0x196d89000 + 5184476 31 AppKit 0x197593690 -[NSViewBackingLayer display] + 1268 32 QuartzCore 0x19bf0e0b4 CA::Layer::display_if_needed(CA::Transaction*) + 748 33 QuartzCore 0x19c0a2464 CA::Context::commit_transaction(CA::Transaction*, double, double*) + 492 34 QuartzCore 0x19beef3a8 CA::Transaction::commit() + 644 35 AppKit 0x196ee6024 __62+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayLink]_block_invoke + 272 36 AppKit 0x19792f4d4 ___NSRunLoopObserverCreateWithHandler_block_invoke + 64 37 CoreFoundation 0x192e9d098 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 36 38 CoreFoundation 0x192e9cf80 __CFRunLoopDoObservers + 536 39 CoreFoundation 0x192e9c5f0 __CFRunLoopRun + 784 40 CoreFoundation 0x192e9bc58 CFRunLoopRunSpecific + 572 41 HIToolbox 0x19e93027c RunCurrentEventLoopInMode + 324 42 HIToolbox 0x19e9334e8 ReceiveNextEventCommon + 676 43 HIToolbox 0x19eabe484 _BlockUntilNextEventMatchingListInModeWithFilter + 76 44 AppKit 0x196dc3ab4 _DPSNextEvent + 684 45 AppKit 0x1977625b0 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 688 46 AppKit 0x196db6c64 -[NSApplication run] + 480 47 HISE 0x100312de0 main + 296 48 dyld 0x192a12b98 start + 6076 Thread 1: 0 libsystem_pthread.dylib 0x192dadb6c start_wqthread + 0 Thread 2:: Sample Loading Thread 0 libsystem_kernel.dylib 0x192d743cc __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x192db30e0 _pthread_cond_wait + 984 2 libc++.1.dylib 0x192ce3330 std::__1::condition_variable::__do_timed_wait(std::__1::unique_lock<std::__1::mutex>&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) + 104 3 HISE 0x101a2ef30 juce::WaitableEvent::wait(int) const + 152 4 HISE 0x10162748c hise::SampleThreadPool::run() + 60 5 HISE 0x101a411a4 juce::threadEntryProc(void*) + 284 6 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 7 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 3:: Javascript Thread 0 libsystem_kernel.dylib 0x192d743cc __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x192db30e0 _pthread_cond_wait + 984 2 libc++.1.dylib 0x192ce3330 std::__1::condition_variable::__do_timed_wait(std::__1::unique_lock<std::__1::mutex>&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) + 104 3 HISE 0x101a2ef30 juce::WaitableEvent::wait(int) const + 152 4 HISE 0x100d6626c hise::JavascriptThreadPool::run() + 92 5 HISE 0x101a411a4 juce::threadEntryProc(void*) + 284 6 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 7 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 4:: caulk.messenger.shared:17 0 libsystem_kernel.dylib 0x192d70bb0 semaphore_wait_trap + 8 1 caulk 0x19e417cc8 caulk::semaphore::timed_wait(double) + 224 2 caulk 0x19e417b70 caulk::concurrent::details::worker_thread::run() + 32 3 caulk 0x19e417844 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96 4 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 5 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 5:: caulk.messenger.shared:high 0 libsystem_kernel.dylib 0x192d70bb0 semaphore_wait_trap + 8 1 caulk 0x19e417cc8 caulk::semaphore::timed_wait(double) + 224 2 caulk 0x19e417b70 caulk::concurrent::details::worker_thread::run() + 32 3 caulk 0x19e417844 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96 4 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 5 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 6:: com.apple.audio.IOThread.client 0 libsystem_kernel.dylib 0x192d70bbc semaphore_wait_signal_trap + 8 1 caulk 0x19e4342f8 caulk::mach::semaphore::wait_signal_or_error(caulk::mach::semaphore&) + 36 2 CoreAudio 0x195ca2f58 HALC_ProxyIOContext::IOWorkLoop() + 5276 3 CoreAudio 0x195ca13a8 invocation function for block in HALC_ProxyIOContext::HALC_ProxyIOContext(unsigned int, unsigned int) + 172 4 CoreAudio 0x195e4b37c HALC_IOThread::Entry(void*) + 88 5 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 6 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 7: 0 libsystem_kernel.dylib 0x192d70c34 mach_msg2_trap + 8 1 libsystem_kernel.dylib 0x192d833a0 mach_msg2_internal + 76 2 libsystem_kernel.dylib 0x192d79764 mach_msg_overwrite + 484 3 libsystem_kernel.dylib 0x192d70fa8 mach_msg + 24 4 CoreMIDI 0x1af42deac XServerMachPort::ReceiveMessage(int&, void*, int&) + 104 5 CoreMIDI 0x1af44f740 MIDIProcess::MIDIInPortThread::Run() + 148 6 CoreMIDI 0x1af44476c CADeprecated::XThread::RunHelper(void*) + 48 7 CoreMIDI 0x1af44ee44 CADeprecated::CAPThread::Entry(CADeprecated::CAPThread*) + 96 8 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 9 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 8:: Directory Scanner 0 libsystem_kernel.dylib 0x192d743cc __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x192db30e0 _pthread_cond_wait + 984 2 libc++.1.dylib 0x192ce3330 std::__1::condition_variable::__do_timed_wait(std::__1::unique_lock<std::__1::mutex>&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) + 104 3 HISE 0x101a2ef30 juce::WaitableEvent::wait(int) const + 152 4 HISE 0x101a2eb90 juce::TimeSliceThread::run() + 128 5 HISE 0x101a411a4 juce::threadEntryProc(void*) + 284 6 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 7 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 9: 0 libsystem_pthread.dylib 0x192dadb6c start_wqthread + 0 Thread 10: 0 libsystem_pthread.dylib 0x192dadb6c start_wqthread + 0 Thread 11: 0 libsystem_pthread.dylib 0x192dadb6c start_wqthread + 0 Thread 12: 0 libsystem_pthread.dylib 0x192dadb6c start_wqthread + 0 Thread 13:: com.apple.NSEventThread 0 libsystem_kernel.dylib 0x192d70c34 mach_msg2_trap + 8 1 libsystem_kernel.dylib 0x192d833a0 mach_msg2_internal + 76 2 libsystem_kernel.dylib 0x192d79764 mach_msg_overwrite + 484 3 libsystem_kernel.dylib 0x192d70fa8 mach_msg + 24 4 CoreFoundation 0x192e9de7c __CFRunLoopServiceMachPort + 160 5 CoreFoundation 0x192e9c798 __CFRunLoopRun + 1208 6 CoreFoundation 0x192e9bc58 CFRunLoopRunSpecific + 572 7 AppKit 0x196ee77fc _NSEventThread + 140 8 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 9 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 14:: JUCE Timer 0 libsystem_kernel.dylib 0x192d743cc __psynch_cvwait + 8 1 libsystem_pthread.dylib 0x192db30e0 _pthread_cond_wait + 984 2 libc++.1.dylib 0x192ce3330 std::__1::condition_variable::__do_timed_wait(std::__1::unique_lock<std::__1::mutex>&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) + 104 3 HISE 0x101a2ef30 juce::WaitableEvent::wait(int) const + 152 4 HISE 0x101abb2d4 juce::Timer::TimerThread::run() + 188 5 HISE 0x101a411a4 juce::threadEntryProc(void*) + 284 6 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 7 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 15:: caulk::deferred_logger 0 libsystem_kernel.dylib 0x192d70bb0 semaphore_wait_trap + 8 1 caulk 0x19e417cc8 caulk::semaphore::timed_wait(double) + 224 2 caulk 0x19e417b70 caulk::concurrent::details::worker_thread::run() + 32 3 caulk 0x19e417844 void* caulk::thread_proxy<std::__1::tuple<caulk::thread::attributes, void (caulk::concurrent::details::worker_thread::*)(), std::__1::tuple<caulk::concurrent::details::worker_thread*>>>(void*) + 96 4 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 5 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 16 Crashed:: Convert Samplemaps to Wavetable 0 HISE 0x10099c410 hise::getMemoryBlockFromWavetableData(juce::ValueTree const&, int) + 200 1 HISE 0x10099b380 hise::WavetableSound::WavetableSound(juce::ValueTree const&, hise::Processor*) + 512 2 HISE 0x1009faf30 hise::SampleMapToWavetableConverter::rebuildPreviewBuffersInternal() + 1904 3 HISE 0x100440588 std::__1::__function::__func<hise::WavetableConverterDialog::loadSampleMap(juce::ValueTree const&)::'lambda'(), std::__1::allocator<hise::WavetableConverterDialog::loadSampleMap(juce::ValueTree const&)::'lambda'()>, void ()>::operator()() + 1292 4 HISE 0x10044a2d4 std::__1::__function::__func<hise::WavetableConverterDialog::run()::'lambda'(std::__1::function<void ()>&), std::__1::allocator<hise::WavetableConverterDialog::run()::'lambda'(std::__1::function<void ()>&)>, bool (std::__1::function<void ()>&)>::operator()(std::__1::function<void ()>&) + 152 5 HISE 0x100447994 hise::WavetableConverterDialog::run() + 684 6 HISE 0x100533018 hise::DialogWindowWithBackgroundThread::LoadingThread::run() + 32 7 HISE 0x101a411a4 juce::threadEntryProc(void*) + 284 8 libsystem_pthread.dylib 0x192db2c0c _pthread_start + 136 9 libsystem_pthread.dylib 0x192dadb80 thread_start + 8 Thread 16 crashed with ARM Thread State (64-bit): x0: 0x0000000000000000 x1: 0x0000000171c72768 x2: 0x00000000000120a9 x3: 0x0000000000000001 x4: 0x0000000000000001 x5: 0x00000000c42499f4 x6: 0x00006000021bfe60 x7: 0x0000000000000000 x8: 0x0000000101a2f58c x9: 0x0000000171c72740 x10: 0x00000b0000000b02 x11: 0x0000010000000000 x12: 0x00000000fffffffd x13: 0x00000b0000000000 x14: 0x0000000000000b00 x15: 0x0000000000000000 x16: 0x00000b0000000b00 x17: 0x00000b0000000b02 x18: 0x0000000000000000 x19: 0x0000000171c72c30 x20: 0x0000000171c727f0 x21: 0x0000000171c72c30 x22: 0x0000000171c727e8 x23: 0x0000000171c72748 x24: 0x0000000000000000 x25: 0x000000010881eea0 x26: 0x0000000108315c10 x27: 0x0000600003a460c8 x28: 0x0000000108315d80 fp: 0x0000000171c727b0 lr: 0x000000010099c40c sp: 0x0000000171c72740 pc: 0x000000010099c410 cpsr: 0x60001000 far: 0x0000000000000008 esr: 0x92000006 (Data Abort) byte read Translation fault Binary Images: 0x1002f8000 - 0x102163fff com.hartinstruments.HISEStandalone (4.1.0) <4b76ad00-b33f-3e12-95d5-2feb382eb5ed> /Users/USER/*/HISE.app/Contents/MacOS/HISE 0x106d54000 - 0x106d5ffff libobjc-trampolines.dylib (*) <d02a05cb-6440-3e7e-a02f-931734cab666> /usr/lib/libobjc-trampolines.dylib 0x1080f4000 - 0x10822ffff com.apple.audio.units.Components (1.14) <674f87bc-21a4-309b-9e43-c7ba1cd95d7b> /System/Library/Components/CoreAudio.component/Contents/MacOS/CoreAudio 0x107e00000 - 0x107f8ffff offlinetransient.dylib (*) <2baf6788-5ef3-32ec-a76d-d5b6836f5b05> /Users/USER/*/offlinetransient.dylib 0x141b90000 - 0x142227fff com.apple.AGXMetalG13X (327.5) <a459e0d8-5ddb-360f-817e-bc708b1711b0> /System/Library/Extensions/AGXMetalG13X.bundle/Contents/MacOS/AGXMetalG13X 0x15e388000 - 0x15ec6bfff com.apple.audio.codecs.Components (7.0) <42d57795-e86d-36e5-9fae-f2ba92271fba> /System/Library/Components/AudioCodecs.component/Contents/MacOS/AudioCodecs 0x196d89000 - 0x19821ac7f com.apple.AppKit (6.9) <5d0da1bd-412c-3ed8-84e9-40ca62fe7b42> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x19beed000 - 0x19c2c0c7f com.apple.QuartzCore (1.11) <e0d9f378-dc87-33f8-93a5-3c62ad30ea19> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore 0x192e21000 - 0x19335ffff com.apple.CoreFoundation (6.9) <df489a59-b4f6-32b8-9bb4-9b832960aa52> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation 0x19e86d000 - 0x19eb73fdf com.apple.HIToolbox (2.1.1) <9286e29f-fcee-31d0-acea-2842ea23bedf> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox 0x192a0c000 - 0x192aa74cf dyld (*) <9cf0401a-a938-389e-a77d-9e9608076ccf> /usr/lib/dyld 0x0 - 0xffffffffffffffff ??? (*) <00000000-0000-0000-0000-000000000000> ??? 0x192dac000 - 0x192db8a47 libsystem_pthread.dylib (*) <647b91fc-96d3-3bbb-af08-970df45257c8> /usr/lib/system/libsystem_pthread.dylib 0x192d70000 - 0x192dab653 libsystem_kernel.dylib (*) <60485b6f-67e5-38c1-aec9-efd6031ff166> /usr/lib/system/libsystem_kernel.dylib 0x192cc5000 - 0x192d51ff7 libc++.1.dylib (*) <875203a1-087b-33a6-93a5-928bb7e9114c> /usr/lib/libc++.1.dylib 0x19e416000 - 0x19e43dddf com.apple.audio.caulk (1.0) <5ce1b98f-c512-379d-9a42-5cce5923bf9d> /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk 0x195aae000 - 0x1961e225f com.apple.audio.CoreAudio (5.0) <b2b97b04-6275-3031-8a89-be6105f1e8f3> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio 0x1af3ef000 - 0x1af4a9d1f com.apple.audio.midi.CoreMIDI (2.0) <cf441ec3-9851-3874-8fe1-17d470031ea5> /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI External Modification Summary: Calls made by other processes targeting this process: task_for_pid: 0 thread_create: 0 thread_set_state: 0 Calls made by this process: task_for_pid: 0 thread_create: 0 thread_set_state: 0 Calls made by all processes on this machine: task_for_pid: 2 thread_create: 0 thread_set_state: 0
-
RE: The Sample Map of The Future: Escaping the 20th Century Sample Mapping Paradigm
@d-healey Sorry, do you mean the feature isn't ready yet? I'll go and dig out the meet up video. I can join those in the future now I'm no longer at inMusic !!
-
RE: The Sample Map of The Future: Escaping the 20th Century Sample Mapping Paradigm
Hey - are there any good tutorials that can get a beginner into this complex group editing stuff???
-
RE: Global Modulator / LFO always retriggered ?
@griffinboy said in Global Modulator / LFO always retriggered ?:
I thought the difference was significant enough for me to want to model it.
Then again, I am a perfectionist when it comes to audio things like this.
It might not be significant to others.But in some cases I do prefer the free running over random phase. The phasing in the highs has a clear pattern which your brain can follow in free running, and I find that pleasing. Wheras random phase gives a chaotic and hard to follow pattern.
IMHO, it is extremely noticeable and having a way to support that behaviour would be excellent.