Forum
    • Categories
    • Register
    • Login

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

    Scheduled Pinned Locked Moved AI discussion
    1 Posts 1 Posters 23 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!

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

      23

      Online

      2.2k

      Users

      13.6k

      Topics

      117.9k

      Posts