HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. Christoph Hart
    3. Posts
    • Profile
    • Following 0
    • Followers 77
    • Topics 103
    • Posts 8,439
    • Groups 2

    Posts

    Recent Best Controversial
    • RE: Matrix modulator for filter cutoff modulation
      1. Put it in the normal frequency chain
      2. Use either the FilterFreq or FilterFreq Logarithmic preset (Click on edit range, then preset)
      3. Make sure the frequency parameter of the filter is set to 20kHz.
      4. Connect you UI knob to the value parameter (or use the matrix target id). I'm always using the connection wizard, this way it also automatically sets the knob range & suffixes correctly.
      HiseSnippet 1555.3oc2Y07aaTDEe1jrsMAnhTJsEjPZOfDsnBJ14i1.Gxl57kUaZbxllh3.US1cb7nt6LKyNavtHjPbhSbqG3D+G.hibh9m.Rb.NVtvEjPbFIT4M6t1dVaWGW2zzO7gncdyal2u488Lohf6Rhh3BjwDa2HjfLdYSmFLYsR0vTFp7RHiSZtNNRRDVojtRiPbTDwCYXL5pJBFiOFJ42+rvUv9XlKoMIDZGN0kbMZ.U1lZE6qR88WA6Q1lFnw8L1kc4rRbedLfmQMmBEhcuMdOx0wJ1FwDsFNpFx3cMms3zty3cIuhEmc94bwyQluJtZ0BS6MyLyc44KL873Yt7bjolEYbrk8nRtvQhkjHXSuB2qgSM9mwREvNzH5t9D0fBHGPxojQkpQ88pzT4DgfMpRaU0noppSatN0i1hdaU1qlLgU6UnqzLFoePpvi.jLzfzXoPZRSGWAMT1dFEddIyxLvBVEC1FcnjxKx3dlk3.CL46GfuMYEALn0BN+bSM0Esf+bgOrZLyUR4LKN65bIYC14uvDe9DiOwWLgUmSUsZOmSIFA22mH54zJ2AQ+V34YwA6RDWzZereLoEivwOuN8XClN0M8TqwHmUlQkaDRxFuB22SoqTe2sE.ko1T1hLDBrJSrDmLyR33S8HBDE1jiadUFe2BnDv2zs+2dmPazMJuDVhatMvNBRIjHjT0gwXIx9PPTpAdbykHQ2VxCS3MHjyTx2XhCTn0QFlF+.HvFpOtC7Q.0yymTgGQUJYEdFUAH6uyNPOrdF6.b8VC+5e0VRpKU9TqHHeZLg41.E1TmT1Sk.YCmRVqP8AGHH.V.wtvWkSfxNImbT29sPDC2K1GKyGFoRvjMgBh59tJGTF.8F5IfdDhslpuwVCJDmzrBU5Vq2XbjdfQvF+j.iYYjdEykqVk3JaCvwLW4iF1zOCt3OQp3eSyU846h8aqn.uY.IjzzPuU1zVsl2pECE5SgkeYPKrDNvEV5LgwvmDdrmB0ENb7cestLGQGgQX4pdMYJLgbJ9j5Kt1RNakfvyjL1Jgf0xr8I9PVw7dJqyY7vZbF0U24XKhTP2aOvuSu6DZH2GKdnGsEkRnciLJeI5aisWCx9qusKQbwMWx8+6GbWam3HYNWUkn8I3n1Ne2SXC5WR2B5ZD37zM4Rwh80399KjHzbT+ff6uPlX5h6CstKNTx.N5K1Y.2hGKor8VGCdap5qWONvARw3R.oyXD+HUo1QT8IjNdJ0XkFvgv7RF7.3W1jETiMxlrPyIQoatV6ALhaZ85iuMVrGQ1UM2T2sr8JANkYdj5MkcNSR8S+8q9G+6uuvhw0yXpk+3OmPqGluxPfnPlpK0s.msYP7Mw6SRtDQh9+0SFWkKBrVk.Y5UtOGwY62vUBPXaAlEExifLHZ6rCIftMzEUTNpcrhh8bEEymaPFyxu0ojxwkRUrBnJz36D1MIVTmXELK2lAiysSqSqqG2uLCC9rND3j6sQjKnXT5Y8zKUh8iH2j5IqUPegsIWTm7ZXgGXCykU0Xz7ANiMX4Vx2DmF+OibKqCmpoOEaVMWozwahQGZPnOoYUyDLdJ3xCUww9xG6ZoGbAT32os6rXH5ssuFzsGVzYIwmnWJtm1qyYlBWKUxCqmeujwK1kX6kq8oLqv8aj5nlUxSAhwMSGzuZKHT6Kspci1M0Mu4cMOm8lwXeMs6e9de0hYcR93p4eDtYQ+bONS6aha8LS9mIMSaboEdSfZt9TNLS8TBZDmGnZEZDSzNc99JNAbtrFzoV9FEJa2YEsgua4DYtElsGQ4BTlEFKSGYbr9+ZJ5cSEIIgNz6jqymsI0kPWeILIx+rKO7GvAsQr7gg.DRGAIJz9ifaDQfBsMEyhQeLQvU71s3+q69i+227I+zBCdhMU34ikS6XClS6A7NdCHdeCyrHeKkQ34GbeRyMe9Arp15p+rcA4yZBsXWzJopr0SmxxGEW87nPFAXWA+VtoOdtpVxIRn.maVx+zmwg5HvXqNd0bT56WSukqa9spqEVbXW3zC6BmYXW3rC6BmaXW3kF1Ed4CdgpKmsXLTUNM1.twZkkSdFCCizKql9.B+OJbVgZC
      
      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: Spectral Analyser / Ever made one?

      @Chazrox start from here:

      Link Preview Image
      HISE | Scripting | Buffer

      A buffer of floating point data

      favicon

      (docs.hise.audio)

      posted in Scripting
      Christoph HartC
      Christoph Hart
    • RE: Spectral Analyser / Ever made one?

      @Chazrox no need for a audio player for a simple playback you can just use Engine.playBuffer()

      posted in Scripting
      Christoph HartC
      Christoph Hart
    • RE: Active CPU profiling not working

      @Straticah You need to set

      HISE_INCLUDE_PROFILING_TOOLKIT=1
      

      in the projucer when compiling HISE. Have you done that? I'll probably change the default to be enabled soon, but for now I'll leave it disabled by default.

      posted in Bug Reports
      Christoph HartC
      Christoph Hart
    • RE: g.dropShadowFromPath got funky on macOS between May 30 and July 02

      Yeah it might be caused by the change to melatonin shadow rendering I did around that time.

      I might have introduced a silly mistake though:

      If you change this line:

      Link Preview Image
      HISE/hi_scripting/scripting/api/ScriptDrawActions.cpp at cdb23d4c24e93ef487127f125742a6443d4e76a2 · christophhart/HISE

      The open source framework for sample based instruments - HISE/hi_scripting/scripting/api/ScriptDrawActions.cpp at cdb23d4c24e93ef487127f125742a6443d4e76a2 · christophhart/HISE

      favicon

      GitHub (github.com)

      to

      p.scaleToFit(a.getX(), a.getY(), a.getWidth(), a.getHeight(), false);
      

      Does that fix the problem?

      posted in Bug Reports
      Christoph HartC
      Christoph Hart
    • RE: Spectral Analyser / Ever made one?

      @ustk yup offline spectrum generation can be done with the inbuilt HISE tools:

      Content.makeFrontInterface(600, 600);
      
      // Create a buffer with a second length
      const var b = Buffer.create(44100.0);
      
      // fill it up with some random signal - two sine sweeps and some noise
      reg uptime = 0.0;
      reg delta = 0.01;
      
      for(s in b)
      {
      	s = Math.sin(uptime);
      	s += 0.5 * Math.sin(uptime * 2.0);
      	s += 0.3 * Math.random();
      	
      	uptime += delta;
      	delta += 0.00003;
      }
      
      // Create the FFT object that is used to create the spectrum
      const var fft = Engine.createFFT();
      
      // Enable the spectrum generation
      fft.setEnableSpectrum2D(true);
      
      // Setup the FFT processing (FFT size & channel count)
      fft.prepare(1024, 1);
      
      // Fetch the spectrum options
      const var options = fft.getSpectrum2DParameters();
      
      // Dump that
      Console.print(trace(options));
      
      // change whatever property you want.
      options.ColourScheme = 2;
      options.Oversampling = 8;
      options.Gamma = 30;
      options.ResamplingQuality = "High";
      
      // Send it back
      fft.setSpectrum2DParameters(options);
      
      // process the buffer. This creates the spectrum
      // that can then be painted
      fft.process(b);
      
      // create a panel
      const var p = Content.addPanel("P1", 0, 0);
      
      p.set("width", 600);
      p.set("height", 600);
      
      p.setPaintRoutine(function(g)
      {
      	// This function paints the FFT spectrum on the panel
      	g.drawFFTSpectrum(fft, this.getLocalBounds(0));
      });
      
      posted in Scripting
      Christoph HartC
      Christoph Hart
    • RE: Crash on MacOS in compiled plugin when working with HardcodedEnvelopeModulator

      @Orvillain yeah, that's really a weird issue - I can reproduce it but also just with the release configuration + LTO - any change to the build flags stop the crash.

      I slightly rewrote the code and now it stopped crashing. I don't know why it fixes anything, but let me know if that helps.

      posted in Bug Reports
      Christoph HartC
      Christoph Hart
    • RE: Crash on MacOS in compiled plugin when working with HardcodedEnvelopeModulator

      @Orvillain yes, modulators are monophonic signal generators so they need to compiled with NumChannels==1. -1 indicates that something else went wrong, but it's hard to guess from here.

      Oh and I would recommend to check out a better host for testing than a full DAW (unless you specifically need to debug a certain bug that only occurs there), as this vastly accelerates the debug cycle. Check out the JUCE plugin host - you might have to build it with the VST3 SDK from source, but this is a really minimal host that you can directly launch from Xcode and if you save the plugin setup within the host, it will automatically restore it whenever you launch Xcode.

      I suppose it isn't terribly useful, but pasting here anyway.

      Looks like a release build without symbols, so yeah not much to gain from this.

      posted in Bug Reports
      Christoph HartC
      Christoph Hart
    • RE: ScriptEditor: better CSS styling

      @d-healey but you can do that now. Buttons are distinct elements and will pick up the css while you can style the preset browser with laf functions.

      posted in Feature Requests
      Christoph HartC
      Christoph Hart
    • RE: ScriptEditor: better CSS styling

      @d-healey yes you can combine CSS & laf, but just in the sense that a single LAF object can have a style sheet as well as LAF functions defined and it will pick whatever is there to render the target component. You cannot render CSS & script functions (paint routines or LAF functions) at the same time for a single component.

      Note that you can use the ::before and ::after pseudo elements to add some text so if you just want to make a background panel with a header that contains the panel name, this should be doable completely within CSS.

      posted in Feature Requests
      Christoph HartC
      Christoph Hart
    • RE: Flex Envelope - No UI control for Hold

      @Straticah Yes I think the main issue is that weird distinction between horizontal and vertical adjustment (which is hinted by the mouse cursor change). If I change that to allow changing both dimensions at once, then you just need to slap a rectangle at the corner points and voila you have your UX, right?

      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: The Sample Map of The Future: Escaping the 20th Century Sample Mapping Paradigm

      @d-healey alright nice, so my main takeaways from the video are:

      • unassigned vs. ignored is not self explanatory, so more labels / help popups to the rescue! Basically Unassigned means "BAD, CHANGE THAT" and "Ignored" is a valid state that you can assign to any sample that should not be affected by this layer (eg. if you have a single set of release trails that should not be affected by the XFade layer, you would enable the ignorable flag for this layer and ASSIGN all release layers to the ignore state for the Xfade layer.

      • the icon to show the tools that you use to assign samples (the second from the left on the top bar) makes no sense at all, so I'll probably replace it with a text button. I'm a bit irritated though why you struggled so much with the pen icon - that's an established HISE trope, smash the pen button, then the grid appears and you can edit stuff (interface designer, module tree, etc).

      • batch processor needs more guidance - basically you can use the "return key" of the batch processor to assign all layers at once and the text field (which is supposed to be read only) will print out a report on what has been assigned to which layer.

      In the next iteration I've fixed the purge butttons not working and added the functionality for the release trigger logic - it does also detect & match the gain between the sustain & release trigger group just like when you use the release start feature. I need to test this in combination with some other layers though before pushing it though.

      posted in Feature Requests
      Christoph HartC
      Christoph Hart
    • RE: ScriptEditor: better CSS styling

      @d-healey which one?

      I've moved the CSS debugger to sit below the component property list, but you might need to reset your workspace to see this layout.

      f93e8f90-c2fa-49e6-b379-3f899767d17a-image.png

      Bonus tip: if you click on the pen button after hovering over an CSS element, you can inplace-change the CSS and update it with F5 (just like in the element inspector in any web browser). This will just recompile the CSS for this element so if you have a large project this might be faster for trying out different things in CSS.
      But be aware that this is not persistent, so you need to backport the changes you made there to your CSS file later.

      posted in Feature Requests
      Christoph HartC
      Christoph Hart
    • RE: Noise grain player?

      @paper_lung this module has a super exotic use case (and I'll probably remove it again with the next cleanup round) - it will decompose the audio file you load into noise & sinusoidal parts and then use granular synthesis to play the noise part.

      The sole purpose of this module is to complement the wavetable synthesiser - when you load an audio file into the wavetable synthesiser, you loose all non-harmonic content at the resynthesing stage. In order to "migitage" this, you can:

      1. Add this as FX to the wavetable synthesiser
      2. Load the same audio file as the wavetable synthesiser (link the audio file slots for this)
      3. Adjust the parameters to get the best sound. depends on the source
      4. Sync the Position to the table index of the wavetable synthesiser (this is why you have the two modulation slots).

      I toyed around with some samples from a flute and other wind instruments and it managed to recreate the noise part (breath noises, etc) quite Okish, but

      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: Modulation Mode automatically set to “Scale”

      @Oli-Ullmann that's a "hardwired" property of the gain modulation - the matrix modulator recognizes this and uses the scale mode as default.

      You can override this behaviour (as well as change the default intensity when adding a new connection) with this call:

      Link Preview Image
      HISE | Scripting | ScriptModulationMatrix

      A class that encapsulates the management of complex modulation systems

      favicon

      (docs.hise.dev)

      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: The Sample Map of The Future: Escaping the 20th Century Sample Mapping Paradigm

      Alright, let's continue the discussion here. I'll address a few points that David mentioned here

      No apparent way to revert to the simple group editor after enabling the complex one.

      yes, you somehow have to delete & recreate the sampler module, but this is just an intermediate state, ideally this will be stored with the samplemap at some point, but I haven't completely figured out the data model yet - there are up and downsides to storing the complex group information within the samplemap vs. as separate entity and this affects how to reset it obviously.

      Workflow felt odd compared to the old system, as all samples appear in one big pool rather than in pre-defined groups.

      Hmm, not sure how to "address" this, as this is the very core of the new system - have it all in one big fat list and add layers of organisation on top of it. You can click on any group button in a layer to only show the samples that match this group value (just like you can do with the old RR display in the top right), but maybe we need more fine-grained tools to control which samples to show / hide as I can imagine this gets tedious with large sample sets - maybe some kind of bookmark feature that allows you to quickly recall sample selections to show.

      Exact purpose and use of the batch processor.

      If you have multiple layers you can assign multiple tokens at once (this mimics the UX of the old file import dialog), also it gives you a console log of what happened. It's definitely a power user tool though and might not make it in the final version...

      How to control crossfade via the GUI without scripting.

      The inbuilt sources already offer quite some options for non-scriptable control:

      • MIDI CC

      • global modulators

      • event data (ok for this one you need at least one line of code that sends the value).

      • How multiple layers interact with each other in practice.

      • When or why to disable the cacheable or purgeable flags.

      • Purpose of the ignore flag beyond possibly scripting control.

      These are covered in the doc section (after the nerdy bit stuff):

      Link Preview Image
      HISE | Glossary | Complex Group management

      A indepth explanation of the new group management system for the HISE sampler module

      favicon

      (docs.hise.dev)

      But it might not be explained in the Best Way Possible (tm). One thing I was working on was a example project that created artificial samples (sines, triangles, saws) that covered / showcased all features / combinations which might offer a more hands-on experience, but that's not finished yet.

      Why crossfade layers affected articulations that weren’t meant to be crossfaded.

      That's precisely what the ignore flag is for - if you have samples that shouldn't be affected by this, you enable the ignore flag for the xfade layer and then assign all samples that shouldn't be faded to the ignore group. I'll check that this works real quick, might be possible that there's a regression already.

      posted in Feature Requests
      Christoph HartC
      Christoph Hart
    • RE: HISE Bootcamp - Full Course for Beginners

      Nice, yeah feel free to send it to me, these are good points, but I think I can get a few more hints from just seeing you use it that you might even not realize (as I don't too when implementing it).

      Let's continue this discussion to the old topic so that we don't spam your bootcamp thread any further.

      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: Anyone successfully building plugins in GitHub actions?

      @aaronventure which preference in the app data folder files mess with your build pipeline? There‘s a special export_ci mode which tries to sandbox most settings like IPP or current project and I had never any issues with this, but then I didn‘t have to use varying settings across projects too much

      1. pull the latest HISE build (or the one you want to use for your release)
      2. compile the CI build - you can just run the scripts in the tools folder that are executed on every commit as they will spit out a semi-optimized HISE binary that you can use for exporting your plugins.
      3. pull your project and run your build file.

      If you are using hardcoded networks, just make sure that anything in the AdditionalSourceCode folder is under version control, then you shouldn‘t need to compile the dll before loading your project in HISE.

      posted in General Questions
      Christoph HartC
      Christoph Hart
    • RE: External C++ Node file management

      @HISEnberg wow, thanks for the heads up, this looks awesome. I was toying around a bit with the underlying klang framework and wrote some lightweight wrappers to load them as scriptnode nodes.

      It's basically the same idea that I had with SNEX, but I chose to write a complete JIT compiler from scratch instead of using the clang toolchain. Now if I would do it again I would definitely go this route too.

      posted in C++ Development
      Christoph HartC
      Christoph Hart
    • RE: Search & Replace...

      @VirtualVirgin ah yes I might have to remove that, I even forgot that this is in there. You can use the find tool inside the code editor for quick replacement:

      find.gif

      1. Press Cmd+F to show the search bar
      2. Enter the search term
      3. Click on the "Select all" tool. This will create a multiselection and select all occurrences
      4. Press delete to remove the word, then type in the new one.
      5. Press Escape to clear the multi selection.
      posted in Bug Reports
      Christoph HartC
      Christoph Hart