Forum
    • Categories
    • Register
    • Login
    1. Home
    2. iamlamprey
    • Profile
    • Following 0
    • Followers 1
    • Topics 27
    • Posts 134
    • Groups 0

    iamlamprey

    @iamlamprey

    65
    Reputation
    51
    Profile views
    134
    Posts
    1
    Followers
    0
    Following
    Joined
    Last Online

    iamlamprey Unfollow Follow

    Best posts made by iamlamprey

    • Introducing Altar (and looking for Windows testers)

      Hello friends.

      For the past few months I have been quietly working on a new guitar amp VST plugin, "Altar". The goal was to create something state-of-the-art, with a feature-set you'd only find in a $200 product.

      ...and make it completely free and open source:

      b1ba8de7-228e-4489-9ec8-11487fb865c7-{A8BFC142-DFC7-4939-9629-3C92829A3D6B}.png

      I am currently in need of testers and feedback for the Windows version (MacOS and hopefully standalone later). Please try to break the plugin, drag the modules around, create and load presets, make use of the Cab Designer and NAM models if you have them, and report any and all issues back here.

      DSP feedback is also appreciated, I'm not necessarily 100% happy with the sound of each module yet and will be tweaking them more over the next few weeks.

      (There's currently 3 cab IR's and no presets, the full release will have all of that included.)

      Download (Windows): https://iamlamprey.com/altar

      Features:

      • Full suite of high quality DSP modules, which can be re-ordered by dragging.
      • NAM support (writeup on this soon).
      • Cab-Designer to create your own impulse responses.
      • Realtime transpose and sub-octave layer with Rubberband.
      • Multiple modes per modules, like Reverse Delay, Glitch and Circuit-Bending.
      • In built utilities like Tuner and Click, Pre and Postprocess and output Limiter.

      I look forward to hearing back from everyone, thanks! 🥳

      posted in General Questions
      iamlampreyI
      iamlamprey
    • [Tutorial] Real-Time Pitch Shifting with Rubberband

      Hello my old friends.

      Here's how to get realtime Pitch-Shifting working with the Rubberband Library.

      First, your project either needs to be GPL (open-source), or you need to pay the developers of Rubberband for a license (and Christoph!). Also this is just for Windows, I don't use or own a Mac so YMMV.

      First, there's some dependancy conflicts between JUCE and Rubberband. To fix, we have to open the file:

      HISE/hi_tools/simple_css/Renderer.h

      And replace EVERY instance of the Rectangle class with juce::Rectangle instead. I've tried the preprocessor flags and it didn't fix the problem, so I just ended up replacing everything manually. Don't use Find & Replace, there's some other "Rectangle" variables that you don't want to override, just go through manually and replace every Rectangle with the strictly type juce variant.

      I also replaced the copy variable in the Positioner class to rectangleCopy because I think this will also cause problems on Windows. Lines 333 and 336.

      Next, in your Projucer, add the preprocessor flag HI_ENABLE_CUSTOM_NODES=1.

      Okay, now we can build HISE. When it's done, open a project and hit Tools -> Create C++ Third Party Node Template. Name it anything.

      We'll also need to tell HISE where our Custom Nodes are stored, open HISE Settings -> Development -> Custom Node Path and point it to {*YourProjectName*}\DspNetworks\ThirdParty. Click "Save".

      We just created our Third Party node, but it won't do much good without the Rubberband Library.

      Navigate to that same folder in a File Browser, there should be a src folder, if there isn't, create it. Clone the Rubberband Repository into that folder.

      Open your custom node in any editor. Let's start with the includes, which go AFTER the JUCE one:

      // Original Code:
      #pragma once
      #include <JuceHeader.h>
      
      // What we're adding:
      #include "src/rubberband/single/RubberBandSingle.cpp"
      #include "src/rubberband/rubberband/RubberBandStretcher.h"
      

      Inside the primary node struct, declare a unique pointer to hold our RubberBandStretcher:

      // Original Code:
      static constexpr int NumTables = 0;
      static constexpr int NumSliderPacks = 0;
      static constexpr int NumAudioFiles = 0;
      static constexpr int NumFilters = 0;
      static constexpr int NumDisplayBuffers = 0;
      
      // What we're adding:
      std::unique_ptr<RubberBand::RubberBandStretcher> rb;
      

      In the Prepare method, assign the RubberBandStretcher with the OptionProcessRealTime Option:

      void prepare(PrepareSpecs specs)
      {   
        rb = std::make_unique<RubberBand::RubberBandStretcher> (specs.sampleRate, specs.numChannels, RubberBand::RubberBandStretcher::Option::OptionProcessRealTime);
        rb->reset(); // not sure if this is necessary, but I don't think it hurts   
      }
      

      RubberBand uses Block-Based processing, not per-sample. So we'll use the process method, not the processFrame one:

      template <typename T> void process(T& data)
      {
        if (!rb) return; // safety check in case the rb object isn't constructed yet
      
        // "data" is given to us by HISE, it has multiple channels of audio values as Floats, as well as some utility functions:
        
        int numSamples = data.getNumSamples(); // the number of audio samples in the block
        auto ptrs = data.getRawDataPointers(); // RB expects Pointers, not just values
      
        rb->process(ptrs, numSamples, false); // This is the Pitch-Shifting Part
      
        // the "false" is just telling RB if we're using the last audio buffer, which we're not if it's realtime
      
        int available = rb->available(); // Checks to see if there is repitched audio available to return
      
        if (available >= numSamples)
        {
          // We have enough output, retrieve the repitched audio
          rb->retrieve(ptrs, numSamples);
        }     
      }
      

      Okay, we're almost there. We just need to tell the Pitch Shifter how much we want to shift the signal by. It uses a Frequency Ratio, so:

      1.0 = None
      0.5 = - Octave
      2.0 = + Octave
      

      If you'd prefer to have a Semitones-based control, I recommend using the conversion function in the ControlCallback of your UI element instead. It looks like this:

      // In the GUI Slider Control Callback
      // This assumes the Slider goes from -12 to +12, with a stepSize of 1.0
      
      inline function onknbPitchControl(component, value)
      {
        // bypass if semitones = 0 (save CPU & reduce latency)
        if (value == 0)
          pitchShifterFixed.setBypassed(true);
        else
          pitchShifterFixed.setBypassed(false);   
        
        // Calculate the FreqRatio from Semitone Values 
        local newPitch = Math.pow(2.0, value / 12.0);       
        pitchShifterFixed.setAttribute(pitchShifterFixed.FreqRatio, newPitch);
      };
      
      

      Either way, we need to connect our Custom Node's only Parameter to our RubberBand Object.

      In the createParameters method:

      void createParameters(ParameterDataList& data)
      {
        {
          // Create a parameter like this
          parameter::data p("FreqRatio", { 0.5, 2.0 }); // Between -1 Octave and +1 Octave
          // The template parameter (<0>) will be forwarded to setParameter<P>()
          registerCallback<0>(p);
          p.setDefaultValue(1.0);
          data.add(std::move(p));
        }
      }
      

      And finally, we connect the Parameter in the setParameters method:

      template <int P> void setParameter(double v)
      {
        if (P == 0) // This is our first paramater, if you add more, increment the index.
        {
          rb->setPitchScale(v); // passes the parameter value "v" to our pitch-shifter
        }
      }
      

      Okay, that's all the code we need.

      Now hit Export -> Compile DSP networks as dll.

      Assuming everything worked, you can now add a HardcodedMasterFX and load your pitch-shifter.

      Notes / Thoughts:

      1. I haven't tested this extensively, there might be other Includes that cause problems depending on your HISE installation.
      2. There's about 30-50ms Latency which is effectively unavoidable, the Pitch Shifter needs a window of a certain size in order to perform calculations.
      3. There might be other RubberBand::RubberBandStretcher::Option values that make it sound better for transients etc, I haven't tested them yet.
      4. Make sure your Parameter doesn't go to 0, as the Library uses it for dividing somewhere.

      Here's the full node, if you copy-paste it, make sure you rename it to whatever your node was or HISE won't find it:

      // ==================================| Third Party Node Template |==================================
      
      /*
      
      Don't forget, you have to replace every instance of Rectangle in HISE/hi_tools/simple_css/Renderer.h to juce::Rectangle
      
      And replace both "copy" variables in that same file with copyRectangle
      
      Then build HISE with HI_ENABLE_CUSTOM_NODES=1 preprocessor
      
      */
      
      #pragma once
      #include <JuceHeader.h>
      
      #include "src/rubberband/single/RubberBandSingle.cpp"
      #include "src/rubberband/rubberband/RubberBandStretcher.h"
      
      namespace project
      {
      using namespace juce;
      using namespace hise;
      using namespace scriptnode;
      
      // ==========================| The node class with all required callbacks |==========================
      
      template <int NV> struct rubberband: public data::base
      {
        // Metadata Definitions ------------------------------------------------------------------------
        
        SNEX_NODE(rubberband);
        
        struct MetadataClass
        {
          SN_NODE_ID("rubberband");
        };
        
        // set to true if you want this node to have a modulation dragger
        static constexpr bool isModNode() { return false; };
        static constexpr bool isPolyphonic() { return NV > 1; };
        // set to true if your node produces a tail
        static constexpr bool hasTail() { return false; };
        // set to true if your doesn't generate sound from silence and can be suspended when the input signal is silent
        static constexpr bool isSuspendedOnSilence() { return false; };
        // Undefine this method if you want a dynamic channel count
        static constexpr int getFixChannelAmount() { return 2; };
        
        // Define the amount and types of external data slots you want to use
        static constexpr int NumTables = 0;
        static constexpr int NumSliderPacks = 0;
        static constexpr int NumAudioFiles = 0;
        static constexpr int NumFilters = 0;
        static constexpr int NumDisplayBuffers = 0;
      
        // declare a unique_ptr to store our shifter
        std::unique_ptr<RubberBand::RubberBandStretcher> rb;
        
        // Scriptnode Callbacks ------------------------------------------------------------------------
        
        void prepare(PrepareSpecs specs)
        {   
          // assign the shifter to our pointer
          rb = std::make_unique<RubberBand::RubberBandStretcher> (specs.sampleRate, specs.numChannels, RubberBand::RubberBandStretcher::Option::OptionProcessRealTime);
          rb->reset(); // not sure if this is necessary, but I don't think it hurts   
        }
        
        void reset(){}    
        void handleHiseEvent(HiseEvent& e){}  
        
        template <typename T> void process(T& data)
        {
          if (!rb) return; // safety check in case the rb object isn't constructed yet
          
          int numSamples = data.getNumSamples();
          auto ptrs = data.getRawDataPointers(); // RB needs pointers
      
          rb->process(ptrs, numSamples, false); // 
      
          int available = rb->available();
      
          if (available >= numSamples)
          {
            // We have enough output, retrieve it directly
            rb->retrieve(ptrs, numSamples);
          }     
        }
        
        template <typename T> void processFrame(T& data){}
        
        int handleModulation(double& value)
        { 
          return 0;   
        }
        
        void setExternalData(const ExternalData& data, int index)
        {
          
        }
        // Parameter Functions -------------------------------------------------------------------------
        
        template <int P> void setParameter(double v)
        {
          if (P == 0)
          {
            if (!rb) return; // Safety check in case the Parameter is triggered before the rb object is constructed
            rb->setPitchScale(v); 
          }
          
        }
        
        void createParameters(ParameterDataList& data)
        {
          {
            // Create a parameter like this
            parameter::data p("FreqRatio", { 0.5, 2.0 });
            // The template parameter (<0>) will be forwarded to setParameter<P>()
            registerCallback<0>(p);
            p.setDefaultValue(1.0);
            data.add(std::move(p));
          }
        }
      };
      }
      
      posted in Blog Entries
      iamlampreyI
      iamlamprey
    • RE: So close to Rubberband-ing

      https://www.youtube.com/watch?v=ekapsMx8vR8

      (laughs in thall)

      Writeup soon 🙂

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: My setup for building HISE plugins with AI (YMMV)

      @dannytaurus great writeup :)

      I can't share the source for the harness because it contains a web-exploitation module & toolkit I use for bug-bounties and could very easily be used inappropriately / illegally if a bad actor got hold of it.

      In general it's a simple harness written in Python using the textual package for the UI. It contains all of the standard tools like read_file, write_file, run_command etc, plus some extra goodies:

      Git Tools

      Includes things like diff and status to verify the code it wrote, as well as reset in case it breaks something. It can't commit or push or otherwise modify the repo directly.

      Browser

      It includes the camofox browser, which uses various techniques to bypass turnstiles / captchas and bot-detection. It's not 100% successful but it's able to consistently browse sites like reddit, run web-searches etc.

      ComfyUI

      The harness contains additional custom tools for controlling a local ComfyUI instance directly, so I can have the harness create images, videos, edit things etc. Probably one of my favourite features as I get access to a variety of local models for product images, videos etc. I've been using it to make ad creatives for meta.

      Ponytail

      It leverages the popular ponytail skill in the system prompt, basically a checklist to help improve the quality and consistency of the code:

      Before adding code, walk this ladder and stop at the first solution that fully holds:
      
      1. Does this need to exist? Do not build speculative work.
      2. Does the standard library already solve it? Use that.
      3. Does the platform or framework solve it natively? Use that.
      4. Does an already-installed dependency solve it cleanly? Reuse it before adding machinery.
      5. What is the smallest readable implementation that fits the codebase?
      

      And later:

      ## Editing Files
      
      Make file changes with `write_file` — it creates or overwrites in a single call, so there is no separate "create" step, and parent directories are created automatically. Prefer `write_file` over shell redirection for anything that creates or replaces a file.
      
      For surgical edits to an existing file, use a Python script via `run_command`: read the file, transform the text, write it back — preserving the file's existing line endings (e.g. CRLF). Read the file before editing it; never write blind.
      

      This combination of Ponytail and surgical Python edits noticeably improved the quality and consistency of the code.

      Verification

      The system prompt includes things like:

      Verify your changes work, but scale the verification to the size of the change — verification should never become the bottleneck of a session.
      
      - Small, localized fixes: run the smallest check that exercises the changed behaviour — compile the affected target, run a single filtered test, or do a quick manual check. Do not run the full test suite or a full rebuild for a small fix.
      - Major fixes, rewrites, and new features: run the full build and relevant test suite. This is the only case that justifies building a broader verification harness.
      - Prefer the project's existing test/lint/build commands. Do not build verification harnesses (new tools, pipelines, or persistent test files) unless the change is major, a rewrite, or a new feature.
      

      This sort of pessimistic critic-gating is a combination of GAN-style adversarial gating, and some of the stuff in hermes-agent.

      Deepseek Harness

      I (the agent) also ripped some of the guts out of DSH: https://github.com/deepseek-ai/deepseek-harness to improve the cache hit rate and context compression (doesn't work 100% but I haven't bothered to go in and fix it yet).

      Models

      It's hardcoded to run Deepseek Flash via API, which costs cents on the dollar at 80-90% of the quality of the "western" models. For my personal uses it has outperformed basically everything else, including Gemini.

      It can also use Ollama, either locally or one of their cloud models. As well as strata: https://github.com/niko1221/strata

      Unfortunately my PC is not amazing for local models, 12gb VRAM and 32gb system RAM can only just run strata with nothing else open, the instant I open a web-browser or anything it OOMs.

      Security / Safety

      The harness is initialized by cd'ing to a directory and launching it. Only the read tools work on files outside of that directory (and sub-directories), if the agent tries to write files or do anything sketchy to anything outside the workspace - it gets blocked.

      Example Project

      I'm noodling at a harmonic + stochastic model trying to recreate my sample libraries without any actual samples. I put some of the original samples in the workspace and asked it to do some web-research, write up a plan for whichever method it thinks is the best and start working on the model.

      It researched things like DDSP and Loris, wrote up a plan and used Python to continuously analyze the generated synthetic output against the original samples until it was happy. It took 1-2 extra rounds but it was able to accurately recreate my guitar harmonics instrument as a synth with infinite round-robins and an extended keyrange, all for just 100kb of data (no torch / DDSP used, it just researched it to understand the harmonic + stochastic decomposition).

      I think the main takeaways are:

      • Secure the harness to prevent external writes
      • Be intentional with tooling, too few restricts the agent, too many tools confuses it.
      • Iterate on the system prompt so the agent understands the available tools and how to use them
      • Test it on real work and incrementally improve it to fit your specific use-cases
      posted in AI discussion
      iamlampreyI
      iamlamprey
    • RE: Introducing Altar (and looking for Windows testers)

      Now with a fancy landing page & video:

      https://iamlamprey.com/altar

      https://www.youtube.com/watch?v=xOqfnTtuwT8

      (use this link for the latest version, the drive link is outdated)

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: drawAnalyserPath but only some of it

      @d-healey No there's a duplicate of the chain purely for the FFT display (otherwise the output would be playing the dirac-delta sample)

      posted in Scripting
      iamlampreyI
      iamlamprey
    • RE: Payment providers compared

      Just throwing my 2c in - I've just moved from Payhip to a more dedicated stack (Github Pages + Cloudflare for frontend, Polar as MoR / processor).

      I've had a positive experience so far, very easy to setup and the API lets me run sales by just pushing an update to a config.json file - the Github actions & Cloudflare workers take it from there. They use Stripe for payment processing so it's pretty straightforward.

      Payhip was a great alternative to Gumroad, but over time I found their load speeds were getting slower and slower. I'm not sure what the reason is, but I had page loads of up to 20 seconds (simple home pages, it wasn't a content issue). This included checkout and was likely inflating bounce rates like crazy. They also have limited metrics / analytics, and my entire site was basically HTML injected so I didn't need the page editor / designer tools.

      Now everything is hosted on Cloudflare and I get sub 1s page loads, the Polar checkout is just an iframe.

      When it comes to Trustpilot reviews - be aware that a lot of people try and use Polar, Payhip etc to sell lazy, low-effort products like e-books, .pdfs etc. They then promptly get banned from the platforms and then leavy a crybaby negative review saying they got scammed.

      This was a very recent move, so I haven't completed a payout yet through Polar, but I've been in contact with their support (had to verify my ID and the Stripe ID checker wasn't working on my old ass Australian ID card) - they replied within 48 hours both times and the communication was crystal clear.

      @dannytaurus said in Payment providers compared:

      • Whether Polar charge their 50¢ on a free ($0) download. None of them says. If you give away a lot of free products, ask first.

      I've had a few hundred free product downloads over the last week or so - no fees from what I can tell. There's not even a payment form for free products or 100% discount codes: free is free.

      The one sort of "downside" I guess is there's only checkout embeds, no cart / add-to-cart (you'd have to roll your own). And no Paypal from what I can tell, I'm not sure how big of a deal that is - Amazon doesn't use Paypal.

      If I do come across any negative experience I'll update this post, but so far Polar has been great all around. I've just requested my first payout (only $50) and their docs say they can take up to 2 weeks which isn't a big deal really. Larger payouts might take longer.

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: Checking the HISE Source with AI?

      HISE is a big codebase with a variety of dependencies, I think the risk of hallucination & context-rot is a lot bigger than your average JUCE plugin.

      There's also a lot of templated functions, specific versions of things like JUCE and the C++ version HISE uses which LLMs usually don't "keep in mind".

      Also GLM4.7 has noticeably outperformed Claude & GPT 5.2, at least in my own tests 🙂

      I'm sure Christoph uses some of these tools occasionally, but I think if he started depending on them for the short-term benefit we'd probably end up with a lot more bugs in the long term

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: So close to Rubberband-ing

      @d-healey The actual DSP in the third-party node is pretty simple, the main stuff was getting all of the includes to work together (and using the right class in RB that doesn't need 2 separate buffers)

      The RB time-stretching stuff might also be possible using this third-party node and just swapping a few things out, I don't want to give out false hope just yet but

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: So close to Rubberband-ing

      Progress! I have it compiling and "working" in Ableton, as long as I stick to ASIO and not MME (which means I can't record any clips just yet).

      MME / Windows Audio crashes instantly.

      posted in General Questions
      iamlampreyI
      iamlamprey

    Latest posts made by iamlamprey

    • RE: My setup for building HISE plugins with AI (YMMV)

      @Christoph-Hart Nah, I did look at it among some other ones and settled on hermes before rolling my own. embedding use-cases like that sound very useful though

      posted in AI discussion
      iamlampreyI
      iamlamprey
    • RE: My setup for building HISE plugins with AI (YMMV)

      @dannytaurus great writeup :)

      I can't share the source for the harness because it contains a web-exploitation module & toolkit I use for bug-bounties and could very easily be used inappropriately / illegally if a bad actor got hold of it.

      In general it's a simple harness written in Python using the textual package for the UI. It contains all of the standard tools like read_file, write_file, run_command etc, plus some extra goodies:

      Git Tools

      Includes things like diff and status to verify the code it wrote, as well as reset in case it breaks something. It can't commit or push or otherwise modify the repo directly.

      Browser

      It includes the camofox browser, which uses various techniques to bypass turnstiles / captchas and bot-detection. It's not 100% successful but it's able to consistently browse sites like reddit, run web-searches etc.

      ComfyUI

      The harness contains additional custom tools for controlling a local ComfyUI instance directly, so I can have the harness create images, videos, edit things etc. Probably one of my favourite features as I get access to a variety of local models for product images, videos etc. I've been using it to make ad creatives for meta.

      Ponytail

      It leverages the popular ponytail skill in the system prompt, basically a checklist to help improve the quality and consistency of the code:

      Before adding code, walk this ladder and stop at the first solution that fully holds:
      
      1. Does this need to exist? Do not build speculative work.
      2. Does the standard library already solve it? Use that.
      3. Does the platform or framework solve it natively? Use that.
      4. Does an already-installed dependency solve it cleanly? Reuse it before adding machinery.
      5. What is the smallest readable implementation that fits the codebase?
      

      And later:

      ## Editing Files
      
      Make file changes with `write_file` — it creates or overwrites in a single call, so there is no separate "create" step, and parent directories are created automatically. Prefer `write_file` over shell redirection for anything that creates or replaces a file.
      
      For surgical edits to an existing file, use a Python script via `run_command`: read the file, transform the text, write it back — preserving the file's existing line endings (e.g. CRLF). Read the file before editing it; never write blind.
      

      This combination of Ponytail and surgical Python edits noticeably improved the quality and consistency of the code.

      Verification

      The system prompt includes things like:

      Verify your changes work, but scale the verification to the size of the change — verification should never become the bottleneck of a session.
      
      - Small, localized fixes: run the smallest check that exercises the changed behaviour — compile the affected target, run a single filtered test, or do a quick manual check. Do not run the full test suite or a full rebuild for a small fix.
      - Major fixes, rewrites, and new features: run the full build and relevant test suite. This is the only case that justifies building a broader verification harness.
      - Prefer the project's existing test/lint/build commands. Do not build verification harnesses (new tools, pipelines, or persistent test files) unless the change is major, a rewrite, or a new feature.
      

      This sort of pessimistic critic-gating is a combination of GAN-style adversarial gating, and some of the stuff in hermes-agent.

      Deepseek Harness

      I (the agent) also ripped some of the guts out of DSH: https://github.com/deepseek-ai/deepseek-harness to improve the cache hit rate and context compression (doesn't work 100% but I haven't bothered to go in and fix it yet).

      Models

      It's hardcoded to run Deepseek Flash via API, which costs cents on the dollar at 80-90% of the quality of the "western" models. For my personal uses it has outperformed basically everything else, including Gemini.

      It can also use Ollama, either locally or one of their cloud models. As well as strata: https://github.com/niko1221/strata

      Unfortunately my PC is not amazing for local models, 12gb VRAM and 32gb system RAM can only just run strata with nothing else open, the instant I open a web-browser or anything it OOMs.

      Security / Safety

      The harness is initialized by cd'ing to a directory and launching it. Only the read tools work on files outside of that directory (and sub-directories), if the agent tries to write files or do anything sketchy to anything outside the workspace - it gets blocked.

      Example Project

      I'm noodling at a harmonic + stochastic model trying to recreate my sample libraries without any actual samples. I put some of the original samples in the workspace and asked it to do some web-research, write up a plan for whichever method it thinks is the best and start working on the model.

      It researched things like DDSP and Loris, wrote up a plan and used Python to continuously analyze the generated synthetic output against the original samples until it was happy. It took 1-2 extra rounds but it was able to accurately recreate my guitar harmonics instrument as a synth with infinite round-robins and an extended keyrange, all for just 100kb of data (no torch / DDSP used, it just researched it to understand the harmonic + stochastic decomposition).

      I think the main takeaways are:

      • Secure the harness to prevent external writes
      • Be intentional with tooling, too few restricts the agent, too many tools confuses it.
      • Iterate on the system prompt so the agent understands the available tools and how to use them
      • Test it on real work and incrementally improve it to fit your specific use-cases
      posted in AI discussion
      iamlampreyI
      iamlamprey
    • RE: W̶h̶e̶r̶e̶'̶s̶ ̶C̶h̶r̶i̶s̶t̶o̶p̶h̶?̶ We found him and now we talk about AI

      @dannytaurus said in Where's Christoph? We found him and now we talk about AI:

      Have you tried headroom with your setup? Might make it even cheaper. Or have you got that kind of functionality built in?

      I haven't seen headroom before but some of it is already in the harness. Output tokens are really the ones to watch out for, overly verbose replies or doom-spiraling can bump up the price. That being said I do need to sort out the context compaction, it fails sometimes which means the full chat history gets sent to the model and that can cost a bit more.

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: W̶h̶e̶r̶e̶'̶s̶ ̶C̶h̶r̶i̶s̶t̶o̶p̶h̶?̶ We found him and now we talk about AI

      @dannytaurus said in Where's Christoph? We found him and now we talk about AI:

      Is that a subscription or API calls?

      API, I also have strata running the Qwen flash 110b locally but my system is the "bare minimum" so it's not super reliable.

      The Chinese models are all distilled from Claude / GPT anyway, they just focus more on optimization via KV cache tweaks or attention trickery, hence why they're so cheap. Deepseek recently published their entire inference engine for running models at scale, and I think the Kimi team posted the full training run of their latest model, including the costs which is pretty cool.

      I've also been training a tiny (<10m param) dual-mamba model designed to fetch information at runtime instead of storing it in the weights, getting it to form coherent sentences for the first time was cool to see :D

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: W̶h̶e̶r̶e̶'̶s̶ ̶C̶h̶r̶i̶s̶t̶o̶p̶h̶?̶ We found him and now we talk about AI

      It's very bittersweet: on the one hand I love the current technological renaissance we're in, on the other I feel bad about ditching HISE since it's where I first cut my teeth learning to code, and Christoph has obviously put years of his life into it (as well as answering my dumb as shit questions on the forum).

      As for the LLM part of the discussion - the harness is 80-90% of the output quality, I "vibe-coded" my own harness (I'm sick of that term at this point) that has my C++ syntax force-loaded as a skill, as well as a working (bot-detection avoiding) web browser and other goodies. I use Deepseek Flash and the combination works as well or better than any standard Claude / Codex setups at 1/100th the price. It also uses grill-with-docs and ponytail liberally, two of the most popular coding skills - in fact my harness doesn't even have "editing" tools, it just writes python files and executes them to modify code, which works WAY better (at least for my setup).

      Last thing I'll touch on is the idea of breaking things into reasonable chunks, the more tasks you give the model, the less effort it spends on each (I guess that's where subagents come in but I haven't needed to use them at all yet). A small list or one large feature per prompt / run, and make sure the agent cleans up after itself (diff checks, delete temp scripts etc).

      413db4ef-2c05-45ae-a507-c4f85cc3ec64-{AD28AB7D-F0FE-40F7-98A7-31A8F7459C55}.png

      Caveat in case someone thinks I'm stealing their .ch1 files with my "ch1 extractor" - I'm building out an MVP to see if I can convert my existing sample libraries into a synth and I can't be bothered downloading the original sample files lol

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: Payment providers compared

      Just throwing my 2c in - I've just moved from Payhip to a more dedicated stack (Github Pages + Cloudflare for frontend, Polar as MoR / processor).

      I've had a positive experience so far, very easy to setup and the API lets me run sales by just pushing an update to a config.json file - the Github actions & Cloudflare workers take it from there. They use Stripe for payment processing so it's pretty straightforward.

      Payhip was a great alternative to Gumroad, but over time I found their load speeds were getting slower and slower. I'm not sure what the reason is, but I had page loads of up to 20 seconds (simple home pages, it wasn't a content issue). This included checkout and was likely inflating bounce rates like crazy. They also have limited metrics / analytics, and my entire site was basically HTML injected so I didn't need the page editor / designer tools.

      Now everything is hosted on Cloudflare and I get sub 1s page loads, the Polar checkout is just an iframe.

      When it comes to Trustpilot reviews - be aware that a lot of people try and use Polar, Payhip etc to sell lazy, low-effort products like e-books, .pdfs etc. They then promptly get banned from the platforms and then leavy a crybaby negative review saying they got scammed.

      This was a very recent move, so I haven't completed a payout yet through Polar, but I've been in contact with their support (had to verify my ID and the Stripe ID checker wasn't working on my old ass Australian ID card) - they replied within 48 hours both times and the communication was crystal clear.

      @dannytaurus said in Payment providers compared:

      • Whether Polar charge their 50¢ on a free ($0) download. None of them says. If you give away a lot of free products, ask first.

      I've had a few hundred free product downloads over the last week or so - no fees from what I can tell. There's not even a payment form for free products or 100% discount codes: free is free.

      The one sort of "downside" I guess is there's only checkout embeds, no cart / add-to-cart (you'd have to roll your own). And no Paypal from what I can tell, I'm not sure how big of a deal that is - Amazon doesn't use Paypal.

      If I do come across any negative experience I'll update this post, but so far Polar has been great all around. I've just requested my first payout (only $50) and their docs say they can take up to 2 weeks which isn't a big deal really. Larger payouts might take longer.

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: NeuralNetwork.loadNAMModel() functional?

      @resonant iirc NAM files are just large JSON objects which can be embedded in the final plugin easily

      test it yourself, rename a NAM file to .json and open it in something like Sublime Text

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: NeuralNetwork.loadNAMModel() functional?

      @resonant Nope, I vibe coded a manual NAM wrapper for Altar:

      https://github.com/nytemairqt/altar/blob/main/DspNetworks/ThirdParty/amp.h

      posted in General Questions
      iamlampreyI
      iamlamprey
    • RE: Agentic coding workflows

      This was all a big surprise to wake up to.

      Altar had quite a bit of vibe-coding involved, specifically on the modular drag-n-drop FX panels, and some of the third-party DSP nodes. I used various models available on Github Copilot (mostly Claude) because it seems to handle multiple files / larger context window better than the standalone models.

      That being said, it still required quite a bit of manual fixing up. A common one mentioned above was using var instead of local with inline functions etc, and it would default to using JUCE buffers instead of the templated SNEX methods which I assume comes with a performance hit.

      I think a good idea would be to establish some sort of global guiding prompt which includes some of the most important best practices for HISE and appending that to individual case-specific prompts eg:

      "Use this bestPractices.md to familiarize yourself with the HISE codebase, remember to make use of the existing templated functions in the auto-generated files and only use JUCE methods as a fallback" etc etc

      posted in AI discussion
      iamlampreyI
      iamlamprey
    • RE: (ScriptNode) Smeary Reverb / Washy Cymbals?

      @Christoph-Hart said in (ScriptNode) Smeary Reverb / Washy Cymbals?:

      @iamlamprey haha everybody always rips out the dither stuff from air windows :)

      i assume he has it there for a reason but most DAWs apply dithering now anyway and I can't hear a difference lol

      posted in ScriptNode
      iamlampreyI
      iamlamprey