Forum
    • Categories
    • Register
    • Login

    7-Band EQ - FilterDisplay not updating visually from script (SVF EQ + scriptnode)

    Scheduled Pinned Locked Moved AI discussion
    3 Posts 2 Posters 39 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      the red_1
      last edited by

      Hi everyone,
      I'm building a 7-band EQ plugin in HISE 4.1.0 and I can't figure out how to get the FilterDisplay to update visually when controlling it from script.
      My setup:

      7 SVF EQ nodes inside a Script FX1 (DSP Network/scriptnode)
      7 Parametric EQ effects in the FX chain (ParamEQ_LC, ParamEQ_L, ParamEQ_LM, ParamEQ_M, ParamEQ_HM, ParamEQ_H, ParamEQ_HC)
      7 FloatingTiles with ContentType = FilterDisplay, each pointing to one ParamEQ effect
      Knobs connected to Script FX1 parameters via property editor (processorId = Script FX1, parameterId = LCF/LF/LG etc.)

      The problem:
      When I call eq_LC.setAttribute(1, 500) from script, the value changes correctly (confirmed with getAttribute), but the FilterDisplay FloatingTile does NOT update visually at all.
      What I tried:

      Synth.getEffect("ParamEQ_LC").setAttribute(1, freq) → value changes but display doesn't refresh
      Connecting FloatingTile directly to svf_eq_1 via ProcessorId → curve disappears completely
      Engine.repaintFront() → no effect

      My questions:

      Is there a way to force FilterDisplay to repaint from script?
      Can FilterDisplay work directly with scriptnode (svf_eq)?
      Should I use ScriptPanel with setDraggableFilterData()? If yes, how to connect it to scriptnode parameters?
      Would it be better to replace SVF EQ nodes with regular Parametric EQ effects and control everything directly from the property editor?

      Thank you so much! 🙏

      HiseSnippet :

      HiseSnippet 3987.3oc6cs7ababFmqkor053l3D2lbpfUnGVEqnrjbelTUsVOVMBwTZWux1Imbn3NqDg3RtljqrTRMp5Kfbn.8XQ.ZQys1SoW5g1aA8TN1hfBDihBTjh1fhdn8+.2YFRt7wRRw8gT7icMf7xY99l427886a144t0z0jfFFZ5ToRu8QcfTodN5FGoZt2J6IJqRswpnzoWVQSa06V+PpkOpingArIUpTSsNN+TybdJxq+2RKKpHpJAcShh51ZxRvaH2V1zM0ZUdKYEkphMgaK21iz4prgjl5JZJZcQXYJ5rTcDk1WbW3lhXwNGMEPzXOpTuJsTybR4jJrSNVQwVEY2o.bmRrEYgkjx2rrjjnT9cjX44EoRM8ZMkM0zaXJZBMnRc9k0ZdTi8ztupUEbaYC4cTf3GXoZfpYqjqpozD2DwoRsxdxJMq4XjLnnRQWy0jMkkI6pzBxMk6ktqo6EHYv3pgWCXpy4GdS4CdrdgWVOvKDHkxCjNuEjtBcCIc4Nlt4fwykn2P0Dp2RD4m7BEKYoN2u5pzqngjP0bg1h6CqpidnmFYJjM67Ln+L2ad4zWNMxaYXxbfnNSqCYVjgPZVXWn4ZsZAkLyLqUYxT8sYmEqfq3v6c2arRXZTSTWr8Z0Q4hzHcZDRLzTfKzQWVEk6hKtHiqDLhll5x6zEY4XP4fUnkldFYT4l8MYjY9NLr3++ZWatzueZFzq.k1FpMgGxLKy0PxdMz+uH48Dnggz0cJ8LxygJ5GjN8q+5Ln5x7MX97eym+ae3Ol4g+HzejIkxC+fO+28vO3g+.llxFcTDOJsUwX3sXPVN14dSDNPkyZphH+5RgIF67L4wFXrXU0g2KTg3Pk0B1BUOTI3Q9IGIvwoKEz9yDq8ODGlPrJHzuFBwVEgn.H1p.DlFwVEfPTHVZGXkYsX1xsxfozKxzE4daIqBaNWP5yW7K+oHlMylasMS0st0lqRzDpX.6SvewOAK3VukcYGHahu6MHbuL1wEdpVlkXv0zrLHIPEzrygKi9KAfmR.jfR.0BUUP4xzpqpjorlJSawNX1VlClmosrJ5OhGN2kS+9WlD4nCM6pqhyf4UYDDQFuNZ2OCRjWmH6A3h7AgVlXpWlC5qjxb.pfxUZNlWigKWjJWODMytPNb6Dqe1EJYWwWFGatH9EyM15NLqbqssdxqy+VabiUphb9N8tgb+qn0tilJDaCI4RbPAwglJIuLRy6ALJZRhJLsPFLTI5wzwgCxs5dDKVqC8GThdFUTySTzQlv6BvQBTiiT8XAvHWWSYEQEkcPevXFajY4O8Y.Z.V6FUC0DDqEnZf3ETRqGm7q2u70iS95yFN2izPRnElGag4h0BGhANN6annY8vPytHxrEZro0w.h0mmHdzff2Ufn.Q8v.gs8nd7Ue84Yhw.vYmqE6JZxEgagsFQJw51RTORIpGB+TXiUCkcJDK8THD9oPrDTgPXnBwRQEhkiJjPRJKtefbw2OfPHzTgAlmJLxDUgPXpBCLUUXD3pBAIqBwwVEhltJ3vWEhlvJ3vXEhlxJDjyFAeMV5ZHr0XIqgvUikpFKSMoD0b3wyykMVlZHD0AlmNxzzPXoCLIcD3nAonwwPilf5vOild5vNilb1G2Drw5fnHnfXYnfPnnfX4nfPHofXYofXoo.gDOtJ6IdFGQEDBSELvTUvHyUAgPVACLaELBzUPP9JHNBKHZFKvgxBhlyBbHsfnYsfvosQNNUPr71PnswxZCgzFKmMVJaBYrEHLV1SnuUPHL1AlvNx70PnqCLacDHqA4pwQUilo5PTilm5PSilkFJIMhYSBhc1jfXlMIXkjOLRmOeNVRTHSoDbBSoDD8TJA3oT5AvapYB2RMCdUzlI8CRyDLqVsBMO6hVApGZ13k9UONEyn1s8NP84QlaktvdBRk579WyT5nWyTuKoqjkixifZpanJatUGnZTKzKks2khJ0UrQERTSxpq90rWc0FJxMg5TxMoRMMMdBQTD7Zup1G+ep+2WhJo5V0mtLe75+6jqace5RVN9jn6EnIqgP.kO93JIVYA+0bEd9+QxqYA+07wW8i+xAP40C1lStsNftGuX5uL455Gzu668Y+0jqa.+z67oeQhav.g9bx1bzDob.T+stzCGfZNfo9WW7uk3lLXDbSf.f9SW9ekbcqObtIRCtuPBb7zs1XUQSQ7tsX2w.pyhNPcSYb+PoVEdfrDzZuWlgdUnw9lZcnR8J89bATsYZuYQVUZUEMQSY0c2VF0eEtpeNZ2s2f5P259aW4ndO7tOnx8kaZtWuD9jeXk8fx6tm6NrcrXkc10YezlYZdddRxxlv1to9nG8n.oxiSt.84CjLmszDwqpgaGOOcCYy8EY.PwlH76zOoUa+4oqJqXB0W0ZqPnH1rTaRi2DlY6085FMm8MX7teOyiylrmLnLdMVxiUQe9g18uil99FcDkfnLZIpX.S+.JS3gl82Vn7Xqu7IXqujqsFapoSg0+H7apgdyfaheTnl3GEtI9QgahOdjLwBwahGPK7fXK8vaEdJwXdB7UgSQqoKyTvam.DCpyCaW4oOFpvYBCE7zlQMdlJ3rgoBdlhoBNaXprOawTWYDrpW7jlUlGK463YzTehd.K4w2Nnkj56VoiKhImNpdmqEpNXvCQsTbNmmFUQC.ppFEpN9fwKppNHnpdTn5iLGunpdXwEwLG0nBFFFX4Yb19f0zz3Eegps2C1VtJsEcq6O3ypXXB6zP987M4.itsZIiG5CMC38P52roBrllgLdQMvxMEVrN+7JIyQ3LyZOMY4SKOAMMtlFDbUMJbMV4sXbUcfv05QgqwZTNFWCRXtOXgPxoVmOCFppFEpFyc9HLHc93ix6CUi4NeFHFOvej3QmdQhfADWUiBWi4HQv.EIB7GIdzoWjHXf37.uvpx2+zKRDLPnpZTnZLGIBFjHQP8nP0XNRDLPLdeCCnhlWW32a7xrP0DU+Gp5WfVPqYWEQS+mwa7drYmA9y68dvpwGdZUz3.Nx6nEFaG76jBwqPWS1TZuvw34BAiTTmJXz93xeYZqidqK.OOc029T5rwew9sQocl80aSpbeDgPNU7o9.Z2cnpiNDwUfaqUCMylLFhs6n.uIBiyyrihlz93AF1+1ZYy6VFKQFo8DUUgJFCyteMchsJrw6TtoVW77NEDM0IiacytsaflomDbEazgW8tygWSUqmy5rrdMfpMIOfm8nclr3mSYmIqSlt6eF0lPy6imBGdwyseOxwXY6MHF4615PD7g5FjALeA5rKf9G00wS9C28frMskzvHoVSS4nN6ooJKg8TVx3.9q2VqKt2DqVfKqeYGOjSiAHZrsnrBNHnQWiNHzukZCT4PtFKXR3lZMQu6BUEkPV8ipIh6f4Jz3cSDwbg5KH0iA6qg3RhvleqKvhOAv9rZNc4XX0rv0kyjysfGpU0lzs34nQhfy2xBR.0z3Z8BzVH3D.XX3wQ0jVsWvS0NCswAstK7dk7Wwu.cKx79MVvJ6Pq2z15dW+s3Ylli6+9n9qdrmUAdnyVuXsvBFtuE8FxRFf6C40XQ813ZUQfs2SnJPPV81VapyzzbX1kf3g1ILCMYW1Qo0Xe38sZS3EoI6BbbkKmMW9Bbb74JUrTd6aQCdZhcQzjin1Fdn41ZjxAw2O.pSpLuRrJrkXWES6p5hzrV0z06Zp0FEFaeQiZz2rJon1vp7H8EQ4ooLsaS4kPXjOK4EKaYtrk4J6oc8RzkWnTY7qBrkxymkqHe+svB4JxVrDaQ9rExyVp.oENEccJ6x.KSIthkxkuX97r4Kjku.ef1DMMKpAEABu.xsTxm0dZZRB35YZxmcFgQDuMZRx6.Un5UOXCWv5Naz0sUlt0rEPCZA3yxlEaCKWtTtxEyxZ6iazVSybO7haYq82.WZYKa8pXwB4JwkuDW.7DgPIFf4v.rGWvBvVVJAb7muFxnaIBohlg155I0L95xxi6tCnTTd5e3h1w3CQ2Czzv6wchcJM15U3BOd2qvYeTeX94jApwQfdfZxGXdFLHm6w4fbmAATXTFD.+jP8Ig5SB0sj6w9P87iRndtIg5SB0mDp+DRndtQITO+jP8Ig5SB0eBITmeTB0KLITeRn9jPcZZ9mDB04FkP8hSB0+JKT2yhwWLOa97kKjOKOaVtr4KchKFO83Mt+Y8.8rO1En6MLxWNjuX3vOcDJ.0ZWJ2v313bkD6sqJoNm+3vq3MNzZy4uw5TmTCBYi79c22ZGhzWUTwyQN.0QxpxFVMP+sITeG216c052+M+mKQtkUpPxFiaXeoqrejxZeYwmTidazPM+GiSBQlJjFR8yxFByGu9edjZH3H+vZEUOKaEezG9g+gQpU3s+0H5WJ7FAt0RSiO7u9nG+r+3eYovB.SFFc265wJHEV2aOD4oFc.V3DI0IFa08Y.IWR2wN9BxUSL376cIWB3wN3FIuK4r0d6f2W3QGi4GONXxwY0y3CxWpP47ngGfF5RwrkxxRM1Q5P4pImEXOvLGethnOgtbtb433KTrv3GliXHMv0rF8G5OX.L2XIjA3RGeQrgD4r4XKlqbtxExUX7ixguiGfeONeYV9rH2NeY9Rk3Jle7C0QLLGT+TlfxOVhi.i8Opgeb0SDnmCGOWHR+PbnowTpX17EOE.5nFg6NxhnOPMCF.4hCfCwHyWVSa+1hjiN4P8EPf2SeaZmLWoq9Av0tm84Vzykgx6gecytscl+t8o6bYQxQ+z87ogSf06WaH3D3bGkwmsDNAd+eIgq1Lm2DpVcamY8fOwkS8jzAb0iskNLaq2ujAh1zRtTkOEaE780CvytlAu2q+IjAxMweBY.e04mPFv296mMLCurkY3Rz2Q7.H4Khdhg3qSdtkldal0gpPc7s2gMperMN9nW5OkzerM5j3erM1RxDAgs0EUM5nY.Y8VxMfsk2VSEZ3K0.ZvEpF9RcUnYWU+EsUR9jBaJphLEdj6hUbRjyah0DU8UXnm8URBxG58qcJKBTCHpk2bKCIjgQjrRztCFoVWEC3cv2iLVuJ5lLm2jAh5MQ9PIeWapoh6mbD1g7mbjoer6mbjm.tbb99UQYFGL1PFuEUqod.TAM3YBFeQZ6w86jp+POAMUMmaZjqi9lPTOF6tKzG+IzFz0MMEk12MkqV4lPEnnAz62vW2PVEJpS1nggyVvNv+BwDp+5UnsfKCt+BlmbuTiS8T8kZL4Qent.e71K9xznth4XHtRluZ7kmEiA3rnNZKJoqcWIqqPJ4puRRA0tUIaj+LzB3mYX6+6Qx1nOx3tRR9Kp9TjaXUjeXUL2vpX9gUwBCqhEGVEKcxJh+Dc6if.N1.MxlZqY8kpTJOiJl5+yofhkZ
      

      Script :

      Content.makeFrontInterface(600, 600);
      
      const var fx = Synth.getEffect("Script FX1");
      const var eq_LC = Synth.getEffect("ParamEQ_LC");
      
      Console.print("=== ParamEQ_LC attributes ===");
      for(i = 0; i < 10; i++)
      {
          Console.print("Index " + i + " = " + eq_LC.getAttribute(i));
      }
      
      // test
      eq_LC.setAttribute(0, 1);   // Enable?
      eq_LC.setAttribute(1, 500); // Freq?
      eq_LC.setAttribute(2, 1.0); // Q?
      eq_LC.setAttribute(3, 6.0); // Gain?
      const var eq_L  = Synth.getEffect("ParamEQ_L");
      const var eq_LM = Synth.getEffect("ParamEQ_LM");
      const var eq_M  = Synth.getEffect("ParamEQ_M");
      const var eq_HM = Synth.getEffect("ParamEQ_HM");
      const var eq_H  = Synth.getEffect("ParamEQ_H");
      const var eq_HC = Synth.getEffect("ParamEQ_HC");
      
      if(fx == undefined) Console.print("❌ FX NOT FOUND");
      else Console.print("✅ FX OK");
      
      Console.print("eq_LC: " + (eq_LC == undefined ? "❌" : "✅"));
      Console.print("eq_HC: " + (eq_HC == undefined ? "❌" : "✅"));
      
      inline function mapFreq(v, min, max)
      {
          return min * Math.pow(max/min, v);
      }
      inline function mapGain(v)
      {
          return (v * 48) - 24;
      }
      inline function mapQ(v)
      {
          return 0.4 + (v * 0.8);
      }
      
      // ===== LOW CUT =====
      const var UILCF = Content.getComponent("UILCF");
      inline function onUILCF(c,v)
      {
          local freq = mapFreq(v, 20, 100);
          fx.setAttribute(fx.LCF, freq);
          eq_LC.setAttribute(1, freq);
      }
      UILCF.setControlCallback(onUILCF);
      
      // ===== LOW SHELF =====
      const var UILF = Content.getComponent("UILF");
      const var UILG = Content.getComponent("UILG");
      const var UILQ = Content.getComponent("UILQ");
      
      inline function onUILF(c,v)
      {
          local freq = mapFreq(v, 30, 120);
          fx.setAttribute(fx.LF, freq);
          eq_L.setAttribute(1, freq);
      }
      inline function onUILG(c,v)
      {
          local gain = mapGain(v);
          fx.setAttribute(fx.LG, gain);
          eq_L.setAttribute(3, gain);
      }
      inline function onUILQ(c,v)
      {
          local q = mapQ(v);
          fx.setAttribute(fx.LQ, q);
          eq_L.setAttribute(2, q);
      }
      UILF.setControlCallback(onUILF);
      UILG.setControlCallback(onUILG);
      UILQ.setControlCallback(onUILQ);
      
      // ===== LOW MID =====
      const var UILMF = Content.getComponent("UILMF");
      const var UILMG = Content.getComponent("UILMG");
      const var UILMQ = Content.getComponent("UILMQ");
      
      inline function onUILMF(c,v)
      {
          local freq = mapFreq(v, 120, 400);
          fx.setAttribute(fx.LMF, freq);
          eq_LM.setAttribute(1, freq);
      }
      inline function onUILMG(c,v)
      {
          local gain = mapGain(v);
          fx.setAttribute(fx.LMG, gain);
          eq_LM.setAttribute(3, gain);
      }
      inline function onUILMQ(c,v)
      {
          local q = mapQ(v);
          fx.setAttribute(fx.LMQ, q);
          eq_LM.setAttribute(2, q);
      }
      UILMF.setControlCallback(onUILMF);
      UILMG.setControlCallback(onUILMG);
      UILMQ.setControlCallback(onUILMQ);
      
      // ===== MID =====
      const var UIMF = Content.getComponent("UIMF");
      const var UIMG = Content.getComponent("UIMG");
      const var UIMQ = Content.getComponent("UIMQ");
      
      inline function onUIMF(c,v)
      {
          local freq = mapFreq(v, 400, 2000);
          fx.setAttribute(fx.MF, freq);
          eq_M.setAttribute(1, freq);
      }
      inline function onUIMG(c,v)
      {
          local gain = mapGain(v);
          fx.setAttribute(fx.MG, gain);
          eq_M.setAttribute(3, gain);
      }
      inline function onUIMQ(c,v)
      {
          local q = mapQ(v);
          fx.setAttribute(fx.MQ, q);
          eq_M.setAttribute(2, q);
      }
      UIMF.setControlCallback(onUIMF);
      UIMG.setControlCallback(onUIMG);
      UIMQ.setControlCallback(onUIMQ);
      
      // ===== HIGH MID =====
      const var UIHMF = Content.getComponent("UIHMF");
      const var UIHMG = Content.getComponent("UIHMG");
      const var UIHMQ = Content.getComponent("UIHMQ");
      
      inline function onUIHMF(c,v)
      {
          local freq = mapFreq(v, 2000, 6000);
          fx.setAttribute(fx.HMF, freq);
          eq_HM.setAttribute(1, freq);
      }
      inline function onUIHMG(c,v)
      {
          local gain = mapGain(v);
          fx.setAttribute(fx.HMG, gain);
          eq_HM.setAttribute(3, gain);
      }
      inline function onUIHMQ(c,v)
      {
          local q = mapQ(v);
          fx.setAttribute(fx.HMQ, q);
          eq_HM.setAttribute(2, q);
      }
      UIHMF.setControlCallback(onUIHMF);
      UIHMG.setControlCallback(onUIHMG);
      UIHMQ.setControlCallback(onUIHMQ);
      
      // ===== HIGH SHELF =====
      const var UIHF = Content.getComponent("UIHF");
      const var UIHG = Content.getComponent("UIHG");
      const var UIHQ = Content.getComponent("UIHQ");
      
      inline function onUIHF(c,v)
      {
          local freq = mapFreq(v, 6000, 12000);
          fx.setAttribute(fx.HF, freq);
          eq_H.setAttribute(1, freq);
      }
      inline function onUIHG(c,v)
      {
          local gain = mapGain(v);
          fx.setAttribute(fx.HG, gain);
          eq_H.setAttribute(3, gain);
      }
      inline function onUIHQ(c,v)
      {
          local q = mapQ(v);
          fx.setAttribute(fx.HQ, q);
          eq_H.setAttribute(2, q);
      }
      UIHF.setControlCallback(onUIHF);
      UIHG.setControlCallback(onUIHG);
      UIHQ.setControlCallback(onUIHQ);
      
      // ===== HIGH CUT =====
      const var UIHCF = Content.getComponent("UIHCF");
      inline function onUIHCF(c,v)
      {
          local freq = mapFreq(v, 12000, 20000);
          fx.setAttribute(fx.HCF, freq);
          eq_HC.setAttribute(1, freq);
      }
      UIHCF.setControlCallback(onUIHCF);
      

      Photo
      "
      1fbff4c1-8664-4f16-9dba-3adf7880f214-image.png 25f0f610-c427-42a8-9456-7ccaf5f79064-image.png b9fa9924-c0aa-4276-a23f-8f6d9430480f-image.png 117e1b75-4bdf-40ae-88a2-8164102f0893-image.png
      Thank you so much!

      ustkU 1 Reply Last reply Reply Quote 0
      • ustkU
        ustk @the red_1
        last edited by ustk

        @the-red_1 You actually need to use the ScriptFX as filter display source

        • Add new external filter display by clicking the bottom right icon
        • Set all the filters in your graph to the same external filter in order to get an additive curve
        • Connect the floating tile to it and set the Index to the first external filter (#1 => 0)

        Screenshot 2026-04-03 at 16.59.27.png

        Screenshot 2026-04-03 at 17.00.03.png

        Hise made me an F5 dude, any other app just suffers...

        T 1 Reply Last reply Reply Quote 0
        • T
          the red_1 @ustk
          last edited by

          @ustk Hey, thank you so much for your help 🙏 , I was stuck on this problem for a whole day and your solution worked perfectly , Really appreciate your help,

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          30

          Online

          2.2k

          Users

          13.6k

          Topics

          117.9k

          Posts