HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. It_Used
    3. Posts
    • Profile
    • Following 1
    • Followers 0
    • Topics 3
    • Posts 10
    • Groups 0

    Posts

    Recent Best Controversial
    • RE: Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      19.08.25 Update. Wtat's new?

      • Fully rewritten to stock graphics pipeline. Do not use SVG anymore (More freedom for customize).
      • Fixed issue with scaling by Vertical and Horizontal (When keys and octave-marks incorrectly shows).
      • Some core optimisations.

      Many thanks to this wonderful people - @ustk for help! ❤️

      Script:

      /*
      
      	Author: It_Used, ustk
      	Date: 19.08.25 | 03:26
      	Copyright:(c)2025, Vienna Symphonic Library
      
      */
      
      Content.makeFrontInterface(1140, 500);
      
      // Change both-key spacing (white).
      reg KeySpacing = 2;
      
      // Change octave-mark visible.
      reg ShowOctaveMark = 1;
      
      // Octaves array.
      const var Octaves = ["-2", "-1", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"];
      
      // Key for octave center (add +-12 to change).
      const var OctCenter = 60;
      
      // Declare keyboard.
      const var fltKeyboard = Content.getComponent("fltKeyboard");
      
      // Create LookAndFeel.
      const keyboardLaf = Content.createLocalLookAndFeel();
      fltKeyboard.setLocalLookAndFeel(keyboardLaf);
      
      keyboardLaf.registerFunction("drawKeyboardBackground", function(g, obj)
      {
          // Draw background.
          g.fillAll(Colours.black);
      });
      
      // Draw white note via LAF.
      keyboardLaf.registerFunction("drawWhiteNote", function(g, obj)
      {	
          var mark_proportion = 0.75;
          var font_proportion = 12.0 / 15.0;
          var text_y_proportion = 1.5 / 15.0;
          
          var mark_width = obj.area[2] * mark_proportion;
          var mark_height = mark_width;
          var font_size = mark_width * font_proportion;
          var text_y_offset = mark_width * text_y_proportion;
      
          if (!obj.down)
          {
              // Up key.
              
              // Bottom bounds.
              g.setColour(Colours.withAlpha(0x9E9E9E, 100));
              g.fillRect([obj.area[0], obj.area[1] + 25, obj.area[2] - KeySpacing, obj.area[3] - 30]);
              
              // Key body.
              g.setColour(Colours.withAlpha(0xBABABA, 100));
              g.fillRoundedRectangle([obj.area[0], obj.area[1] + 3, obj.area[2] - KeySpacing, obj.area[3] - 15], 2.50);
              
              if (ShowOctaveMark && obj.noteNumber % 12 == 0)
              {
                  var is_center = (OctCenter == obj.noteNumber);
                  var bg_color = is_center ? Colours.withAlpha(0xB26776, 100) : Colours.withAlpha(0x6B6B6B, 100);
                  
                  var mark_x = obj.area[0] + (obj.area[2] - mark_width - KeySpacing) / 2;
                  var mark_y = obj.area[1] + obj.area[3] - 30;
                  
                  g.setColour(bg_color);
                  g.fillEllipse([mark_x, mark_y, mark_width, mark_height]);
                  
                  g.setFont("Inria Sans", font_size);
                  g.setColour(Colours.withAlpha(0xBABABA, 100));
                  g.drawAlignedText(Octaves[Math.floor(obj.noteNumber / 12) + 1], [mark_x, mark_y + text_y_offset, mark_width, mark_height], "centred");
              }
          }
          else
          {
              // Down key.
              
              // Top bounds.
              g.setColour(Colours.withAlpha(0x666666, 100));
              g.fillRoundedRectangle([obj.area[0], obj.area[1] + 3, obj.area[2] - KeySpacing, obj.area[3] - 15], 2.50);
          
              // Key body gradient.
              g.setGradientFill([Colours.withAlpha(0xD9D9D9, 100), obj.area[0], obj.area[1] + 5, Colours.withAlpha(0x737373, 100), obj.area[0], obj.area[1] + 90]);
              g.fillRoundedRectangle([obj.area[0], obj.area[1] + 5, obj.area[2] - KeySpacing, obj.area[3] - 7], 2.50);
              
              if (ShowOctaveMark && obj.noteNumber % 12 == 0)
              {
                  var is_center = (OctCenter == obj.noteNumber);
                  var bg_color = is_center ? Colours.withAlpha(0xB26776, 100) : Colours.withAlpha(0x575757, 100);
                  
                  var mark_x = obj.area[0] + (obj.area[2] - mark_width - KeySpacing) / 2;
                  var mark_y = obj.area[1] + obj.area[3] - 20;
                  
                  g.setColour(bg_color);
                  g.fillEllipse([mark_x, mark_y, mark_width, mark_height]);
                  
                  g.setFont("Inria Sans", font_size);
                  g.setColour(Colours.withAlpha(0xBABABA, 100));
                  g.drawAlignedText(Octaves[Math.floor(obj.noteNumber / 12) + 1], [mark_x, mark_y + text_y_offset, mark_width, mark_height], "centred");
              }
          }
      });
      
      // Draw black note via LAF.
      keyboardLaf.registerFunction("drawBlackNote", function(g, obj)
      {
          if (!obj.down)
          {
              // Up key.
              
              // Background.
              g.setColour(Colours.black);
              g.fillRoundedRectangle(obj.area, {CornerSize: 4, Rounded: [0, 0, 1, 1]});
              
              // Top gradient.
              g.setGradientFill([Colours.withAlpha(0x4C4C4C, 100), obj.area[0], obj.area[1] + 2, Colours.withAlpha(0x323232, 100), obj.area[0], obj.area[1] + 53]);
              g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 2, obj.area[2] - 4, obj.area[3] - 10], 2);
              
              // Bottom gradient.
              g.setGradientFill([Colours.withAlpha(0x252525, 100), obj.area[0], obj.area[3] - 6, Colours.withAlpha(0x0D0D0D, 100), obj.area[0], obj.area[3]]);
              g.fillRoundedRectangle([obj.area[0] + 2, obj.area[3] - 6, obj.area[2] - 4, 6], {CornerSize: 2, Rounded: [1, 1, 1, 1]});
          }
          else
          {
              // Down key.
              
              // Background.
              g.setColour(Colours.black);
              g.fillRoundedRectangle(obj.area, {CornerSize: 4, Rounded: [0, 0, 1, 1]});
              
              // Top gradient.
              g.setGradientFill([Colours.withAlpha(0x3E3E3E, 100), obj.area[0], obj.area[1] + 4, Colours.withAlpha(0x262626, 100), obj.area[0], obj.area[1] + 52]);
              g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 4, obj.area[2] - 4, obj.area[3] - 7], 2);
          }
      });
      
      

      Snippet:

      HiseSnippet 2126.3oc6YstaiiaEVNSzhMdm.rKP6+YCPWXOqiij7s3DDrIwNd2fIYlf0YlsEAAAzRz1rQVzPhNYbmlGh9l0Gk9FzdN5hMkhykw6rnKZqYfh44B4GO7vOQSdluvlEDH70xk+7oiYZ4dod2odxgsFR4dZG2VK2WpSct85QtZGNcLMHf4nkK2K9ATat0VUK7y+76Oj5R8rYyEoo8dA2lcBeDWNW5Y6+ZtqaGpC6b9HEqqt+w1BuVBWwD.IuP2PaL09Z5.1annYqnq8izfgZ4dkNyoeCCaSpikAqQCnRcyZ8Y8pVkY1neid8ZRsptMcaSsbewQNbovuqjJYAZ4V8PgyztCE25E0AumGv64xvJlZcgdNRbGgqCNDQoZsFxccNKIDEnAsxYyCXuHJf86zOk6vmIedf6qCUPl6gZ.L2Jog2KRAOSU3Yn.uE.obJPZ0HH8M5cs84iky0f34qzO1Sx76Sg4IUnDYq1Ju42qu0qVO+54W6fIxgB+cHGKu5cfQkHSBjWCxaCXcGhYyxFaW1pF4uQLpriUcPQKw3o97ACk6TvtnkgUsRj2yYddTR2oiFOT3wsImv64S8mhcvq1Be1R.vwSVdD8ZVGenxL3UvzrpQIRMCih6hVt0VDHr5MfQ5IjC27Z1TR.jfv8FPJb6PtjUr7548YCHulMsarh8HVY7UXKo2v1bD0+ZxMQg2X2v39aC0dJpbOhYhqQRCHTee5TvZHKMPRtg5OSydjK1XSqMJQ1XSS7oA9H7agBqfOphOpgOpiOZfO1FezLz3HWL23xjdEFFj9B+XDSrYXfgTf53P9tMMsHRAwNbLULKjZEY5dj5FIMValsK0mQfnVOA02IkK8ckuNVN3TxLx.lrkXzXgGTovFJ1rw74CeFjLPNQHt9.OmNLl6r1MoiNg1WoMsCc3DgM0UwoBXCpzAkCXx6YiRCF0+JBJCye7.XL2YhmsjK7JrgiO81j16PfFYfuXhmCDi6mXxfRDQu+Rw0y+w0ySfOXTBbhzal0kiTLnbefu5.W2BQbSAk64B1fn3tYghPWCSCIdB3wMbJ4jC5T94fyeFc6MfWKFdqEACblBSauZruXrvGMBhrFkaTa24FzGBzoMvzprAYKhYsxFJ1IYePd0zLVVtVZCyzu2xcjCA6.XUFxknWXcI4UYgztYbZHCYD.ul2DYga.+uxRY.zpYFG2G4h98grjrtcugU3zC5JuOove.QtCvtVLRV7De7j+6FiIskmKKk1CERoXDP8.4EAJFM.SVixKlkdbKWN7.2wCoEL9PyivRIhIPiUbWU+vjpehYKKbwr.pwkklGcMuj7cDjDUMduoB6lhlJnlJFWp1CofORlzCd4xm.xO7.r7fHGCDLGb..bPtrGcTT44OHLqAdaUtlwhGJ3zXFh5u8aCaBbU2alLpGP78GgjdxdvZihycTYtNIShGbkcBSYAEZy8xzdpHIw2dCtxFhYnqyalumrv3nU8FMpGEGI6rPSpeHVhLISmc+tNLg+CpqCMvXbgzQXkkEpg6hvJbqcefFcpZiFNwkMA6QAmZBUR7I6vIJ44HWW93.HmIZrTJt6Kof5RpzGWV7o63NB70TG64CDucodAHWZB6x8Qwxk5G4KRYefKefGy4bfuoP7l.t3TpbX49tBgegLIj.qpUQHbZB41YFyfzTLZObL.1d.lm4yhdAbBdtK5qw+i4FvVD4Vaf06wn2NWL9Smaqd3m+iyPrPhNx.epCG2yQlwyODKuC.wBWrngU6lXIZXUh7HfF3lWj+Mpfkmg+MSSXuDgsOg2Nz3+A4Uq0.K+lmW05+yq9aYd0LaxOby+e5ax+PzsGdS9el1kZ1e6xCMqL6Wv7DjOIIpkHerkv2i42El12gTsDI1zcHW.+Hc3OS3uKu6A2.J9BlkmRtZKr7LnTsVLkbEKr7bnzq7oRIG0o2CEoYMpduWhgcs0CFsh+0FKe.ypFVd7AbHPpu3.lQar7T9+KLVk.f6EqpeYl7MK07MynjsT4a+B29y+sttoxQX4Yj2WcwoAV0wxyYci0mi0MUex0MMTW1LmaNgPkH7PJ125UnX9Oles72kmjUU+9KTGdBU9BWWl+BUimTs+i4XAuvWIUBdqu6D1LC0xsZ5i38Kd3i3U8DnsiNvLECEdG6wkucLKt9ieF0Zwm3F7s2cbapjhmQbrLvtwLeIGgSt1ra31rnSLdM81rfqkhwg1FezeZ4doL9HtiNi3NtBpD1xy4b.1b.Aqqqb1cZeP83+mNuBe+v28NSv+3uueLdh5775yZhdCRtDfWpW0Z6pMp2rx1FZbIaThhuRuZMqlaWc6JlJxsh7nY0l0aX0rlFtC.06SHLPrxayo+QH+YCn+9YDRa.7KFkPIs4AicoSi13QzdL.k8o.qRn9SD3YJBhLsBq+i73pFaGVu0j.f1FVVNdH2NHkqsY8oSbkGLdLi5i2RRJsgaN.ZqeBhrBPiQ4Z0BUbtX.rv4TgSZ6w6T.OPaOlK18gxdW.68vJMguR+K8mvRT1wkJ6Jm5xTke5YGM6XcS0AmcDjw5Km2IVIxOxyQoqqm+NsnMRMep9Ouu18uNhuVGFES.Lj91Qv6PJVArdJ0URf2DfW.WNU8Nl9rckIOWH9M5mwk1CWLFWYAXDVo8qAFiuno00OpeeXZdN.WUuye5WmaURCHvwU5vFv84v5ZcXIQWXwjMKNA.Zb8bqfrMQ0Mv5XDnKyyIrx+B9DqzDqmKVoYhRsQTaewU1Qrn3UY8kgR.L4EdseqoeJVmXpExrpFmGAqBtx1NcScOGsVVGqrrNVcYcr1x5X8k0wFKqia+zNhjTGLAHDiV1noAjGgLv4xcjGEx.CyV092vq1OFJ
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: How i can create a blurred panel (with border settings support)?

      @ustk Thank you very much for your reply)
      I'll take that into consideration. ❤️

      posted in Scripting
      It_UsedI
      It_Used
    • How i can create a blurred panel (with border settings support)?

      I'm trying to create a transparent panel that blurs the background, I tried to write this in css using: "filter: blur();" as well as the "backdrop-filter: blur();"
      But there was no effect, I decided to write it on stock graphics. and here are the problems I have encountered:

      1. When zooming, the rounded rectangle scales too. (Half fixed)
      2. The panel borders are not defined correctly. I understand that if you use Paint Routine, then this is how it should be, but I also apply a mask, but the mask does not affect the blur effect.
      3. When zooming, the blur factor increases or decreases (it depends on the distance of the camera to the panel).
        I need some advice. Thanks all in advance))) ❤️

      Script:

      /*
      
      	Author: It_Used
      	Date: 18.05.25 | 1:47
      	
      */
      
      Content.makeFrontInterface(600, 600);
      
      // Declare the main panel.
      const var Panel1 = Content.getComponent("Panel1");
      
      // Declare corners settings var.
      reg CornerSize = 10;
      
      // Declare the path var.
      const var panelPath = Content.createPath();
      
      // Draw a blurred panel.
      Panel1.setPaintRoutine(function(g)
      {
      	
      	// Draw path. for mask.	
      	panelPath.addRoundedRectangle([0, 0, this.getWidth(), this.getHeight()], CornerSize);
      		
      	// Start 1st. layer for blur.
      	g.beginLayer(true);
      	
      	// Set blur.
      	g.gaussianBlur(5);
      	
      	// End 1st. blur layer.
      	g.endLayer();
      	
      	// Start 2nd. layer for border rectangle and apply a mask.
      	g.beginLayer(false);
      	
      	// Apply mask.
      	g.applyMask(panelPath, [0, 0, this.getWidth(), this.getHeight()], false);
      	
      	// End of 2nd. layer.
      	g.endLayer();
      	
      	// Set colour for border rect. 
      	g.setColour(Colours.withAlpha(Colours.black, 0.25));
      	
      	// Draw border rect.
      	g.fillRoundedRectangle([0, 0, this.getWidth(), this.getHeight()], CornerSize);	
      	
      });
      

      Snippet:

      HiseSnippet 1451.3ocyX1saaaCE.lJIZqVacncnWrKE5UNEIJx+kZ2gg437ypwZbsiS6FvvVAsDsEajIEnnZp2ZA5CvdH1E6QXO.8xcwdD1CQeC1NTx1RVMcqKncPNAIjm+3GOh5PS1WvcHggbARy3zYADj1GqObFS5suGlxPcO.ostdETmYA3vPhKRSa8uRoPqzFn3Ou5K6f8wLGRpHD5gbpC4dzoTYpz9s+Zpu+QXWxozoYrtd6tNb19bedjPMX1n.ryY3IjdXkYqoitKNzCocK8pUG6zz1tYsZMrw3ZtXb8JjZsHi2crSC6V1tiZXC+rKR6CNzkJ4hgRrjDhz1nC2c1PO94rjA3gzP5HeRxTaHLxIhOh66plhJon88n9t8WjcBQPT5mlqVOIWcC8iotzkxSyYWKVgYpGYSfZqsJdquBdUxhmcF7t.jzxfzFIHcc8gNBZfLUihmORuKSRDiwvyornjXKZsecC8ctkgQo8hjdbwcL6JezC.SLJc.f3cLqzzxtgU0FlOyrxcpeaiRF2ZGCi84PLYRqo3yHGIfNKGix6ZaukI7mM+bCic1w7.hiOVPLkdDyoPNxL.yH9VFvC9Po4SvBy9JAUL+ByEAcBQtOeZ.mAcJeyD02LW3b3BFQDZFRjRJaRnJRVFBxDHJJMCo+HABYE6Wmh.rzKw7TFhgpuRQJFNBBjATBKuXvE3yMwli7iDBh6hYRBfV.I8g4m7DdDPDo73HlijxYkmrowOAosRKBfZ7sLGyEP9H7LKPyxQ2B65B9yf0hmPbjX1DeR4uCxmvuROZnJ07MTWEQoBtKgNwSVdyueqLycf3RIiIrTSHMqDJsL8wyHh3QVMErLJMwZDYBkcOk7xRQTraIdQjoFMAGEFRwrNffxMVZygL2j3pLLI3wlSXtIQLMZwLTk4tBCbgKzTrXhZhg3gCB7mA433TSN.Gi8CSIbuXKWZWriGC8JuLatk4+gT2pAWM03iyP7aZhAoIm35W4mRVlJOBUKkUpKm7uPqyoRu87C7vKkLxGJ5AbBujs4x.GuRIa3TQaLTE8c0xCXXLdtZcsQ7RaXBaYYsXMqIm0iKI2mUNYs6yMLyqZ73KTm5kGA22Wkjt.0p5+h+IGKyhlNhH1BdqzGVNtvPnF2pEN0eyENyVW2I4c4LFxYcYT48CHr2T0dz7B.PqGzEJBhUUamKCrKfHjTEBZGPdBrWWRs2R5GPBOSxCPZe5xhWvtQxXsWcdk4tSgM2PTn96UziaWA8zkaG9hAsmkt23osOW8jbofW9r1dwOIWJocTaTlg5CWcntGdDwe9PE29eZnjjmBQnsdq5185zbfcq5M50ry11CZUqdil85r8.6Z0a0PIp0fZ06AsrGrcqjVC1Fz0qQmln4Dqq8GZHzBZ00tAJNo9VSZUEo5ZGAdMS0vEZTrHrVNBeZgiv54H7mKbD1HGg+YgivcyQ3uT3H714H72JbD1LGg+dgivV4H7YZEFBKMuxscNDaW7PrRNDOs3gX9sU7JdHleekWgJbHleikMJdYw76r7YEODyu0xV+ui3mrJhwGhcdYwjCzl4qK19wY+5hON22L8Eix+MSe4OzdzjrWqCURldw8qlHPM2yZPxIeNA6RiByd6RA7fnf6yNQMb66ScNKwbOtua2v7RSBh53NYCA50u3jqoeL2MxGKW8dbT210bEvYTV4xSTW2AKjJmk81vdmc4NusHdc89Toi2Ey3ZW.ivIYdev37qD6p5GNdLbtzT.2P+nu88y8egRtlkIGikBp5codQSGBKebHvnyf0upyHpslZMeReaUeUFXHbJ93N+E7YtxJp9ZyUVYgRzTrif+HmjSlptzsqDKAXhEeAkkzOV02rBJ9zpYyySotzG43rZndMGqdYcr1k0w5WVGabYcb2Kqi29x5Xy+cGUWQ6dQR9zjWaPni6eX7Q80zNjggUfwqVQ+MzhLpKJ
      
      posted in Scripting
      It_UsedI
      It_Used
    • RE: Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      @ustk thank you, my dear people, I did not know that you can use height in the y position. Thank you very much again. ❤️

      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      @ustk Now I really need help, in general, the problem is as follows, it turned out that when zooming vertically and horizontally, the keyboard breaks and is displayed incorrectly, to put it mildly. I decided to completely rewrite the rendering on stock components, without using svg, since I simply did not find a way to stretch it vertically and horizontally. Everything was rewritten successfully, except for the black key, in the up state, more specifically, the lower border of the key.
      If you can, could you check my code again and give me some advice, thank you. ❤️

      Script:

      /*
      
      	Author: It_Used
      	Date: 13.08.25 | 02:20
      	Modified: 14.08.25 | 21:32
      	Copyright:(c)2025, Vienna Symphonic Library
      	ModReason: Attempt to fix issue - The keyboard breaks when chenge scaling by vertically. SVG does not have stretches.
      
      */
      
      /////SVG's\\\\\
      // White key up reference: "350.nT6K8ClUATpB.XC0AQBHKx1.vO1dzj4s2UDoXRMAUr4pFSj8+qIjjSF7.vjS.RIgnmfM.fC.3.fkVMQgKgii68FH6du52RwZniaIsR6GCaVwQEFxv96pDvImabCa79uWVS4E2Qk9utTSN1ZyBEfBuv9CLl7DWnHxXgY3kH23.eTjvv9BG1OneJ95Jk85XBr+H24jTVMACSRXKbmjZPGhZqM6CBgwWz8SM4KUNojzL.5PjsRRIPzUd3OzjjzI1C3kNkxPD.lFjk96z3Nx.6l9ivs2eWCBEbb3Lb2gC6JA.DYsYeOEEs2+UZqppu9o.D8qUwpSI3r50BcHpk1FTDjSRYInIsP52dmzFVb6vD67Hb2386cbd.BLDChw1ujDpZAxV4ckPGfWJQ.3wwqWb4JLWWqf.GlvDRrK8YioquihhHuQjQEugrAng85KIcHiIefVsZPlJ.9iZvVlXgEuLkA".
      // Black key up reference: "454.nT6K8Cl0BTdC.XO1MMBHsUOhXDdaecZP62idX9gSldMStetkbPQhQxMgNoEfPo.lELD.DA.Q.7Tg3BMuXRZZIH1l692jtpTVfofgg0ZFXcuSszRUkHi6IUEUKqU5C9e1YukYUGfMoP39Ea4cRhNm39+VNcinXrDDKSvCdrwy3Ea3Q1e+cQ+UfNmmiA+f7Ctfidr.kBf763Q9UnkQ7.uagCmCO.ApWSzxo6ikBKZEhkXRZZ8q3sLxkB8XUoHBnzzSqCTKLgdrZ3ZZmnk1KkxAIXK+OyEgamqktLtaYDkuTSZzyUBLIM1GyHljFolaokYWb+PnKB2eKyZWOSJZ0geonOVA.zHAw1lW5DViOxtyunyYgwKxPG+h9uD4+c9Xi+Y3r2S2GFrnUHmkewu.cMB910x6z93QUqQvCnkWU0JHErU00xjD1.BXDoPjcbPDRBWK7aB.BFZ3ra8RExhTNsOv5xNTkS3xmlA3gKFTAiEKdHCPIzmrjaLTFRHHyxqHgS.dIIB.ebZ8BWdgcuFPldF+wGRbfzOjgzIWq8muQXjBofQJx0HQ+FbCHGQwfBaK7vQoJXkFPzAfHciyYqGTrBwgPQN.xakVF.".
      // White key down reference: "181.nT6K8CFU.zUA.HZhf3APq.K.jjKLgLQTSFTdlWXHv1Tbqko9gk.7aLubPcD.IrYDcfhw65y9jgABGBT.+CUw6C6KdWQOQvuOHcLKNvAXfY4kfjY8fDPxYyHhYNgXOPBEkfRoHjANRY6cr40Pc+pA1798bKrI0xK+tBUnK2bOSPwaYi4Vs8I06lTAGcYyHRvC..DPd.WDJtWk6qxPtvzUjCXX8pxC0hfFBlJL3OBGrkIdgEulkA".
      // Black key down reference: "389.nT6K8CVnAz8B.XlEGIBHuQeG7UyZN98YHo2fo.ykk+FrsyoenEIF4RS9TIDhPslZ6.fO.3C.cDhc4t+q3jjBCJEJJp0pf58F0NKcRQE2PpDscyo7A+O6r2tJICnfRHbyzZ2MJJgQb+e6htNjTbDh0I.jJmM7KU9pKsqZh6llFVuztHb+sqZMvyXzf0vCPf4TEsK59pKpxIDGcRdV8q3sKxUB8pRKl.5Mk3BAmbRdBf.i.Z2jzTBZAWktVmjmFZefx.D5UcXBZqnc1qj9Pj6u0t+qXQ3lwZGqh614PxWJT53MkfSxi8AzgSxSbM8B.7DgXWvqLhJBGhuwtyz3MBTXGrn.SiaXLSyel07WYow+ev2f3eEb1WnFceMTkSHmjmEy2r1cg1GOjVc.l.BLH.wNsGUR3agei.fPCcWQrUpKiBAVFvFVqCoG.0hA3sWdLRxPrM.urDANOte8hVNB33hNrJBIam9gmzhAf.i97uAAjbXi2S7WHXQtE4fEA.+PZvVjCPdq3x.".
      
      Content.makeFrontInterface(1498, 500);
      
      // Change both-key spacing (white).
      reg KeySpacing = 1;
      
      // Declare keyboard.
      const var fltKeyboard = Content.getComponent("fltKeyboard");
      
      // Create LookAndFeel.
      const keyboardLaf = Content.createLocalLookAndFeel();
      fltKeyboard.setLocalLookAndFeel(keyboardLaf);
      
      keyboardLaf.registerFunction("drawKeyboardBackground", function(g, obj)
      {
      	// Draw background.
      	g.fillAll(Colours.black);
      });
      
      // Draw white note via LAF.
      keyboardLaf.registerFunction("drawWhiteNote", function(g, obj)
      {	
      
      	if (!obj.down)
      	{
      		/////IS UP KEY\\\\\
      		
      		// Set bottom key bounds colour.
      		g.setColour(Colours.withAlpha(0x9E9E9E, 100));
      		
      		// Draw bottom key bounds.
      		g.fillRect([obj.area[0], obj.area[1] + 25, obj.area[2] - KeySpacing, obj.area[3] - 30]);
      		
      		// Set key colour.
      		g.setColour(Colours.withAlpha(0xBABABA, 100));
      		
      		// Draw key.
      		g.fillRoundedRectangle([obj.area[0], obj.area[1] + 3, obj.area[2] - KeySpacing, obj.area[3] - 15], 2.50); // x, y, w, h
      		
      	}
      	else
      	{
      		/////IS DOWN KEY\\\\\
      		
      		// Set top key colour.
      		g.setColour(Colours.withAlpha(0x666666, 100));
      		
      		// Draw key top bounds.
      		g.fillRoundedRectangle([obj.area[0], obj.area[1] + 3, obj.area[2] - KeySpacing, obj.area[3] - 15], 2.50);
      	
      		// Set colour for a key.
      		g.setGradientFill([Colours.withAlpha(0xD9D9D9, 100), obj.area[0], obj.area[1] + 5, Colours.withAlpha(0x737373, 100), obj.area[0], obj.area[1] + 90]);
      		
      		// Draw key.
      		g.fillRoundedRectangle([obj.area[0], obj.area[1] + 5, obj.area[2] - KeySpacing, obj.area[3] - 7], 2.50); // x, y, w, h
      		
      	}
      	
      });
      
      
      // Draw black note via LAF.
      keyboardLaf.registerFunction("drawBlackNote", function(g, obj)
      {
      	if (!obj.down)
      	{
      
      		/////IS UP KEY\\\\\
      						
      		// Set key background colour.
      		g.setColour(Colours.black);
      		
      		// Draw key backdround.
      		g.fillRoundedRectangle(obj.area, {CornerSize: 4, Rounded:[0, 0, 1, 1]}); // [x, y, w, h].
      		
      		// Set colour for key top.
      		g.setGradientFill([Colours.withAlpha(0x4C4C4C, 100), obj.area[0], obj.area[1] + 2, Colours.withAlpha(0x323232, 100), obj.area[0], obj.area[1] + 53]); // [Colour1, x, y, Colour2, x, y].
      		
      		// Draw key top.
      		g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 2, obj.area[2] - 4, obj.area[3] - 10], 2); // [x, y, w, h].*/
      		
      		
      		
      		// -- This is a problem zone, idk how render a bottom bounds of black key. Currently snapped to top, broken when stretch by vertical. :( -- \\
      		
      		// Set key bottom colour.
       		g.setGradientFill([Colours.withAlpha(0x252525, 100), obj.area[0], obj.area[1] + 55, Colours.withAlpha(0x0D0D0D, 100), obj.area[0], obj.area[1] + 61]); // [Colour1, x, y, Colour2, x, y].
       		
       		// Draw key bottom bounds.
       		g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 50, obj.area[2] - 4, obj.area[3] - 50.5], {CornerSize: 2, Rounded:[1, 1, 1, 1]}); // [x, y, w, h].
       		
      	}
      	else
      	{
      	
      		/////IS DOWN KEY\\\\\
      						
      		// Set key background colour.
      		g.setColour(Colours.black);
      		
      		// Draw key backdround.
      		g.fillRoundedRectangle(obj.area, {CornerSize: 4, Rounded:[0, 0, 1, 1]}); // [x, y, w, h].
      		
      		// Set colour for key top.
      		g.setGradientFill([Colours.withAlpha(0x3E3E3E, 100), obj.area[0], obj.area[1] + 4, Colours.withAlpha(0x262626, 100), obj.area[0], obj.area[1] + 52]); // [Colour1, x, y, Colour2, x, y].
      		
      		// Draw key top.
      		g.fillRoundedRectangle([obj.area[0] + 2, obj.area[1] + 4, obj.area[2] - 4, obj.area[3] - 7], 2); // [x, y, w, h].*/
      		
      	}
      
      });	
      
      

      Snippet:

      HiseSnippet 3553.3oc6Yk0jaijblTi3FaSuSD6FgC+v9DrdwsF1SM3fmxwFV3ff2jfD7VqhIvQgaBPhCdMV+N7+H+6w+CFWEOZRNcqQ8H6I7KFfsBUUlUVeYVYlUhpjBCzfQQAgoRmc3tkvTo+SYj24GawaoX6mpgPpz+wLJ5abW3kha2RknHndpzo+lZXpou60oN77e8uwo3o3qAuzUpTiCr0fssWXGeoWo22x1ySTQGNzdwUbm+8MzB74C7BRPH4axPlZohlqhIrqBlsWkIUckHqTo+tLzzFZkIIKyvTfTQgQWQIOEjoBznngVAxJj5pEHQuESk9OTU2NNHTNVIFFkJ8q4Bz2IaErw+3DL1NxV0ChaPkRFMyG6VLvSGqh3dSwaY6oKc1DEkBIEoKFru4nA6eLSGac6G6+hg6Oef.wkQbsAL8qtEdeyMvi5Z3QdE7dFHk9JH85iP5ujQVKzdY7EJX77OjogeLLzPAsNcMTNxapW8e9Ok4G9trea16XShsBBeGQi3ebDhmr2Ifv36HnX.jkAzEH92IHoeGMIhyNA51F1PcDw7ORjl5cLzHh7AK2EZaZE+t60dKMIcgGHFaC88UHj2sXoUfusFQaa0PkvcGjz.nRTf+6HXiigKVFSDGPXXukvNJJAR78DCsfDtvcpAJg5DpgPE2HhMVPeBMz+XBIhzT7r8MIT2QrFFFaiZ5sCPHOtFgd.LhvOHlvRYMhw3PXLZPQfuEose2OjM6OfePL9uD82wOn1DSrriOLeDIKIBgFvPHx+9cDuA42A7GVrUYduQrCWxAlxSx1mqdqsTf08nz26jOhdjPvzAcXGEleonrS4bqZ33HKVBr1QFLngo+BiN.Cd.Cvvcbm9lsLssKVVrdQ8jBzC1L22VoQzfh03UFuoeUwsqqTbov5FKTT4UJUIYxX47Uo66VIIdnbWp463pZvkrtBeauRBS7qucp4LF25zL.3Pm0qqvUipmOrYkBMcKWXJWXt5z4cFNtCKu7fosTW3LWpl07UcJxyYtYx9xxcx2ZT2.m8sAEjbhFLngz9Q5L8163ruAEOiaW2sRB.OQG2JE2yzcKnnWE60QzvI7bUUUYZqRaxWrIKPXVzLXupUinyMZ9pkKSpD.DJuZzlkxMXBKPxoUeoKk3PAG4AyZ32HRp.s9h8hiUKtVnXo5pzLkKpopC3ZKvasgJwQX4b1siyq4JUyXRy9.lMaVMQMey1Slrx.TyasvfvVkmYGrJw1xpdRem9USLCY8MKWnUCs51MfFiilK40DTwd95wdSMqlz1k8M.7pNmGJsyyspmuP9yq5jbC04AS6Q0oCW8nQ8rlJnq.0lKUj1VeZESYO8NxwvXWUo9V821wraPUCo.fW01B.AVPePoglLbcRlNX97F0o7JVg1Id4vwFAFlljyEmpkHGsevH251EaLp5nVqFUfuBjZVh6rQ0L5DHwTopRdsAVcWvTI23tZ19SCEDZIulWObyNlpJL8of4z5majQ2EKrYyYThO1vVOD3xYTpHS+Ji7c6WBjnXxufuGfc4D48aCJZ6x0ZdUKWLxJuhIp8VWtxSGETmye+d4U7Ca01TObNy74K7coZ4tkswzV45sqpoxhUtwsiUlI3lLTd99ci3Z2nCUsc08bPoTUBbmMQMmjeKNZXqcymzSt4bRSXfeuwrf80Y2P4MofvX6dai2k3ual4lVakpkypRhP9bZUlZmaFSHsLcMwP+Q0W3B2j.z5vUghbaw8UX5OZU+079tSFQ1rd0vQjjacDn.bSEBjbzTkDFvMoUIEN.m3blPkxCpt0ZX2ndqKrs6PWYlsK7XYLaINj0tZK857RM1uHzQo8PwA0qua6p5lx.8FM3.P04k4lnapkHJ4oKlaSsApF664XtuwjUkWjzepCWfQ+laIq2OmnJe8Z82Xvozpz59AMm5JJsm0ntl8tYqpMLjaioT+tfsJtiEAGc.uj1QGsUvMtfTkoN4BJNBreDKn9bKCFVoUfV.GGzJS69CkEGp6MYZ80TCUW4FTwzETRochpjl.nQ3LAMCqMEKrqhiIKWMtgfb7i1TjuXK8I860ecRu5Zsa0cM6TiY4cMblU1PPZ6rc0sl00bZOItptFCBp6v1cvrhZg4IkzxsjkpTkxpsBaPtsUtXtQ9snU6IKsQYlc9wQkaPVzaHaMMjTFrlG.DjzASDZFOws3psRwq2Oxge5zxK2xSZYHx40rMSOtZgtMzQwkdOMt7IlElxUNYVF6ytuLJerW0ZM3PQ9vZkFsad2JkmUOf1H.ry0MmXXzt.ne0Fh4GHWYXCAKoHu4EAF8.L7.MAKs7w4Vw33vw2rZylKIWZTnrHY2VZC5WkVZoPj1tfRr45ULjNtYCdeiA0U2seNcmlMM6qlCVzJtqyPUAKxF.mlK5Tp0nJKaEsZtUQTgOiS1GWWMGpYm06lt2fbMujQ9gUiZU.w0xsMDpoMPeLN1q01QbkWNnkGnPGWFN1EpCz4L.1f4zN6GxMmcha73ENKDmCM1BDJLRaJ27U9ZTqbpH4TLgDoGS6y3sYdsUVEoxKscRygEX53ZHu0tL6dS4sxpcP1qRBlSmrdUaqlb0rR1DuaOSGtgSqE5CjsUl1VdGzirzjYAaxAWSav.qpRMwWTC1AE4TGgfp6nCozLop0yYrFvCkqtNXS2nZiFvfpfyFXHwqMoe3nksr4XGKtVb7J9fZ.RKVlnI5sGrUJrCHITfsauXXYqwc4XXr5F1jqgxhJlK1awhT6JkRXYcTmZSKWZR8o8iql2nJKHmDJGtCuj9Jls3Pnr7AnZb7iAKTbghgnFOVyy8T4qT9AhBjju8eEukOApRMbcCpAwVeO10JBUyIt.h62fCBeKHaHzjnEbm7o9+aDTGGn.TySI7R0HfrnhWihIVqDRX3E25bQJ+MhynwDFyGrXYfOpw8u4JddyYrfpmAE32NHvk0WWDB8NKzySRaEiqDn1A9aGfJx4pwbORZWIbPDL9Irbk7vy8UMAH80NBYsDS70hsC7u+M5gJaNKMNTHnYXPhu9adfv3LKlOPDn571r+T16vVFD+DpOxHH6cl.CTE+rdd2er59HfJNVFM0e5jpeXLGL43RzfDqsUHZyJBdAP6P1xtnA8rH5trYuy1f39+YTS.NuwaydGBl2cnZuFxDijHZUc1wJ9t6tCDHjgwXGh3fEGx1nh0hHBsCPGoMH0IBuTha9nBswN1h0aokx8jaqTE+9.AExKCoemE6Q6xuTtGEH19L.pEe+Gv3D4Wo7AxOdPGN1f5iD4HvEO+XOzeDUN7EGyqnvfovP9wqlZrFgmxWtNvwheedc.IoqPMVKf5Xvihj7f+pZ.yKWAnJfFMMn.JPk.MwaefX2CDadfv5.V9T16fdQvaWKE5Mo6yuZFGr72n9W7vymU+OHwmr.96uoH6UJ0QkgvHHjP4xZBRspEpni9FqXQDlt+COm1ITA+dT6tZ1dJJQdbO23KwfeeAiuxMtg+Oz642f6eoufyywDOOl44P5neyYdNTPxmMyyyk24yl3A+ban5kDneAu1yoRehKJVB5mSA+4r2mMaOP7S7Ag9vPY68nJpx+.wIVe2GHef.8iB86ie5n87CWLneDbSf1U9jmhR9M3UlmG+9B7pneduRFZ76Kwql4imTjihAoaG0niMoO17JU65v9Wny6QX9DbeqCb9mDpiAK8yXk+te3HXdDReO9vPriHP+THVFFn5AWPrGUbwCD15tDVAaPUHifGN4voMcNsQVfwI+cbjHAeRHhuXOToO9JKWB0wG4BRMefPMLvE5e73UNcbIWetJ.h2cOFE+hTsG2Y6v7c1uk3E6APW.+9RVA+LIlHEvuu.ATj5E5Bf.O9uaBrt1bdR89p7GJP9EcHJPBvY+uI3j9pfSpiQle1fShe4tk+J6W9+mDBmDoJ98E3Ak+48.oKheeItvz+eSRn7eQetR+54f9TV7tmnBqyl87tdDA938A64e+gM9x9orD+RRFFOKM72xDF34ACeVx3aHH7Waf26mrPEF9.56t7RfOxXpzu91iVOym+n0u9j+0N9oUWwXfeCe63dKg9et6CH0ouGC8+F0PPIVAed7m5Cw2Rb9RLDRK.WaqAOd572kQ.F4hVIOv6ouJLU5+T7oqS334wK5EnDiJuYnMBp15oR+sYt5S6Rs85qZY2kF1ueisdr0icX8e79S343jmMyihP077Etb2ePWW+mOL7X3hK89y+7O+WusW5Scef4X313KLeFLGLCupa5L+TVBh2flsIX.8FTtKxGv8HXGszSYWOjS6ZX2CKgHhFJnrTGn2N.+ImntNxdc6isnnKcnMeRDJCLJXdoksVzMiT.Znj3Eyh1JSIDecT2P8PIaHYM.YVCvhGf1IASXXfIJ3oSf9s7iu7F7QD3C8vS+g9FEAGih1BBuZ9iCSfmIJ5oDKGuyCdc+cjp93m6eyDHUE4hFFeYRnO2eUe8ql5hY+TJKH9lTtrNO68od5897myfzhDDFt8ZnvWV2IBn.nat6G7oi3GYGu65Ky6+0tapWJD+KYjrQkX77X7UOCFQgY+dfwS2n22lopgAZY9B.ecFwo+9b8coPIwwg4cThCsQA0YPQDxnHJM3IG.bBrzuBmp4XaRbarEPFUh2gF3vwSDovsSehH0YhoVnnEF7iZGSahuyv+3gdPXx+v8qdWlN31DToNjJ8Z67BTTvOpocqndx.o+ZGHyW6.y+0NvBesCr3W6.K80Nvxe4AhSRwlfRHdLrIUJTxiCIfSmtpuBxC7f2Zp+a.pBei2.
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      @ustk No, thanks, I already understand everything. Thanks again for the help ❤️!

      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      @ustk my experience in js is a week (aproximitely), hence such mistakes. I looked at the snippet, and I want to thank you for providing an example. Any information is important to me, thank you very much again. ❤️

      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • Custom vectorized piano keyboard with unique octave indicator (Keyboard from VSL)

      I will be glad if my code is reviewed, as well as give me feedback.
      I also want to thank David Healey for his instructive videos. See.
      Visit to a HISE Bootcamp.
      Link to Figma project: Soon...
      Known issues: The keyboard breaks when zooming horizontally or vertically. SVG does not have stretches.

      Resault:
      Template.png

      Script:

      /*
      	Author: It_Used
      	Date: 13.08.25 | 02:20
      	Copyright:(c)2025, Vienna Symphonic Library
      
      */
      
      Content.makeFrontInterface(1140, 100);
      
      // Define Keyboard (KeyRange: 24-108).
      const var fltKeyboard = Content.getComponent("fltKeyboard");
      
      // Create LookAndFeel.
      const keyboardLaf = Content.createLocalLookAndFeel();
      
      // Declare SVGpath for state: Key up/Key down.
      
      // --- UP State --- \\
      const WK_up = Content.createSVG("168.nT6K8CFE.TOA.HMhd7ATAwB.4hv5uwu2QVD0.9e+ppX3aU.JR51iQmVmq3DEBXZyXBQSx6ZzdURRBEBF3qrPdOvdj20zAvQAbgzgEsLf4sYLwLqRsHniE8fRoozAAjR263CLf5d1CzyaH70XUqkW9cEpgxdy8bAj2RW6wb6Uq2NIiGcay3R.M..P.4AbQn3dUtuJC4BSWQNfg0qJenRrnX.TlgEV7ZVF");
      const BK_up = Content.createSVG("443.nT6K8C1nBzXC.XH1LMBHsUOhXDdaecZP62idX9gSldMStetkbjQholalOUBgHjggEDD.DAvP.PqNLjRxRCEwxb2eFT0zBFVKrrrXrCnt2nVZkpSbw8TZRpk0JEB+O6r2xqIDrlzHb+hs7FAQmQb+eKitOTKFJhUIzFJH7niuwK5vir+92h9u.1XdsF7CxOHCN5QCVX.jeFOx+Bs7gitMTJIKrVBmlZDWmY0.t+gyUv+vCPfZEEsL51PQ.UPxROsOHwvzogxgpokhVZuToGffs7+qVEb2ZsrcwcKen7UZReZpTPIYwBY9njr.wZtVdUw8CgsJ39a4EqpYJQqO7qT..r.EwxlWZjkiOxtyuXiw03EYXieQ+cQ9elO53+FN6czsoAJZ0gw8LdGrwJ36VKuSKDHSrNAOfVVMUmbHfoltVkvLf.FQJTQKGbgjv0BAf.jzgVOaqWYgTojSyCryHCU9DNIU6.99huUvXwhGx.TD6IC412RQEBzVdWIbA3EjH.7wo0K7xOp6s.xPy3R9Phj8+CGx66hQ+gMJiTHELSPtJw9cZKfzOEKUrMyCakoXe5F.HDPN4hCyVCu0td.");
      
      // --- Down State --- \\
      const WK_down = Content.createSVG("338.nT6K8ClFATjB.X4D.QB.q4J.PwhQvcWYhBifmey9u2K6SEjSYJzjMwEAZuQUUknt.F.M.bC.1.PVhBWBGG26QfVNe8I1h4PWepMy9IFVspkJMrge1kU.Gst0G1D+LeYUoW8kJedkopbs0FFJwFNcTQoW53CTl7HUjPtXoY5EY23.eRjvzQENcDgOo5qrjFDRz6MLIgwPdhdgPht0F9AgP4y5F7Oopc1RqTR2CfPhvUTJAZhNVVXjNtRTaEyALaqRZHB.69X4ytaeIC7Me9P+3mcu2fXAmFwEw.Pj0F98TR73mYJtpJ68GCP74MCKaZfVKKigPhNEyvl.cRRSgKE+3SbtZYX02gQ1Ee3yXWGGf.iwnXldMIgpV.sVdfDV.dYIBTONtdAVtiwUsBRcXDUvSAE3+eui4ruiBjHwHxnhuQRX9h8DII0MS67G4.nL+BKdsJC");
      const BK_down = Content.createSVG("377.nT6K8ClZAz2B.XWkDMBLqUCIFZ0xraRCFrVoCo1Uk2NKtD2FMch9IKi4898xHnRJ9fC.7.fN.zbN22lVUJKvTvvvZsBt4LkGw1JDYsKsUVOVqzo9+10NOlUY.ljd0NCziYpIUR09+djJKQw54E1INIOylEjzRqPbYKE5t3wLq1aZZd9hGin82iYM+gHnpC4Hok.KOjkkAdHtDATsh3QpLzUwkVi5oSxiOuvAUM+fEI7nUUsJRQeqxXmjGWhcXUPFAcYvRhi3QblZcLa+gd7+rWDs+dd7k0tGknc1JoRPVH3j7fmjRAvy7B2jYJEVCtGOrcNlFGj.kGikFLvt40LP22On6UVf8+Ld3i+a3ZWBWpLzBWZMxI4ow79yiYIdZJPIf.CBPJz7UkD9rP.P.RngdrH1B0kgg.KCXCq9gjC.3zA7gKeFIYH1FfWHQ.+i6WunkynNt.G1Mgjd9+gSh0.v.r+9sfP8NCwa+7OeFcw.H.HGr3vf0vasqG."); 
      
      // Declare SVGpath for keys with octave mark.
      
      // --- UP State --- \\
      const WK_oct0_up = Content.createSVG("503.nT6K8C1pCz1C.X7EEABPsMNhMA9.bUzPhHiILCY4UbyNQl9OY2Lst+MCOjYFAXD.8..M.3ff.JH0.4QBhnlz3nwsQWTTTRx.R.A4jTdvXQDQrDCiFLRJKV77foqgFlThzPQDyCDKgqLo.4z7v3XIcSJNPN7DYMPdPPv1p6yE946e260JSqY85bo0y0zx2+SkHjTbvbfVPBEKLQU0bYfhHNrjx7Au.Ml9cBKkIkHIIHZXgEL.0.S.Hn.qbe728s++KI7MdJuIep53s5laer04gr4q99cYWey44lx+as3MepMSPw+oLeY91+5gA.PAMPdjv.83DofstUl3BQe+9V4xRc9tv+ecq7016J0xK14wo2piY1ykMWoZwYxKlczuF40QkqFpQ0JYJqFRTzR.fY.fUlY.whQM.Lh5..4H.X0d.qM3EY10VaFmkQNSylrxRCLpMwFhmzkjX1mCqnlrXQKs9gkFhK9yAZctaD4mBFDWK1ONhg5zIq49NimrG1iUNSSVGhU.9heN8SWLaac5UqAXig+aqQnRFXlXk.HFZgHbXKnIzd.ANfFnF..m.0A.puCILKRXVjfopPTKbYrtJXKLnaO8cBWZpFibCokIIlgJe.p5cvZwXD9bvLFe62kBFPruox7W55Y8j7Y7qDwUAyLhmFk4RuHLcO.");
      const WK_oct1_up = Content.createSVG("255.nT6K8CFy.z5A.HmCtDBPo0M5xf07PurYJBrd0seMCVvQEynIi1Tx0LLuY3gQFV..HZnlVPoSbd.SqU7uKgO7DcyU7HMiQ7DsFm7t9MmBe3LIrl61el4LNmclqu6HgYtA6qgFkKXXw0d++6NBVZ6qRR2u0JPQ.jdUX99ZPWeeUqUAFKdPPx.JcH.DaC0zp69WMRQLaxy4bsFfAoLtuInmEpzEBEAsumGmDzmos16qJZYBcnzsc99jwFGXT2msunrgyTanlNTFf.GREP2C2DZ9DrlHcwMQqbj+VQ1lklgGMFwgWjV1msC3BTbgx8eFxvzA4vv5o7gRrHG.kYVXwqbY");
      const WK_oct2_up = Content.createSVG("582.nT6K8C1zCTdD.XSXYEBLsR5.XzUDQl9y4uzx4PzE0.d0ZHWIY2j1IzgDxHBuf5.Y.nD.EAPlXafhKTPob2CTB3WRoSfRXp4BSBhFVHBCNMzfBAATPxgkJL2cIiCJSL8wdddXXFPBGmGolJRhDwETpgjIRRMQh.4ATpnCcolKST7z.hET5ZL037vAjFOPoTSMObb.xCxgkJDD8hoxY06Um5lJt+kl2K6KU9l5m03Bkhmq9sczVD0tZL97ZSD4Gs9s9UJGob2706OCzu1RDgaQFN21qHB0KMElPpwAzCmEjPQe3kgm+kFq52eubdwkw74EyVa29++CuiYKwE4l5g77r6T1zeYkpaO2s+leaaOW62FiHE6Won1MUlJq4iaV2FajducKFWF64FF.E3vRElFNPd7n.BIy9u9kli4RYGulSq0K89WGQiw0yG2FiKx6LF4JaKhOaWE00xs25Y5w2mKFrRcMMEhTnprGW8u75lu9aMtPOXGpgghCSQ1jTndAf5.PYTWz3zPEQDC5f.feSI.bxdqohWZpASjlBDNlD050vMopwRm5TEkRRSnfxFfujGURTWQDxBy6orniJYpED3dPAeCIjc4.Gt.JQGNfmjnqMnWAAKlK9vu1UHoLPdhs8V7eqoVuaDH01PtGkDSXHRaBfcHyWfYtAAsf1L7LQ1yhHwJLzbaDgQbhOqxDIjIOuy+AqFwoDVrCi0jOqd9c5cOX6P4DiFV5GkR4AudCEHKjrJ+9ZutsNFirW+ULLgzLQFEPYx1Wj43G");
      const WK_oct3_up = Content.createSVG("709.nT6K8ClTEzcE.XZZoABDQBL.6pcnoDqYRC.EfG4z0PVrI6lz1QFA9GKh.UffX7G.SAPU.7tYn+R58iV+T+EXdDwQhEGt3.sdYlc0fCz.iCigHBs.awz2FGly7PCGLS.gCTdvBDPvff.JfIRFUbTUYNhfgEzcgtb4hCGCbgEKRXdToBJTnwgAREVTAyCJTlHwwtScJlGZXwAWfLIiCSom4gEIQl.QxgwNlGRrDwjKmHYTgf.q0UL4a4h1eZz1Sqmz2n2PjqtOLeqYWDmWpogXdte2oBlga9uZaeIKUSM5dywsVLc+vUe8H7uI7MIR4O6oBQkze3lOKSZeClG049t2l6k3e9Kha1GO53yNS2a9Yn1UpD9CpUiZ6csO8ptTaqZa0u1qyCYpZNFY31R+GYsk4RVpGpkd6c8WLsDNKo6NCMcOAC07LyVuMgmWtNJu8zTJsEQtzMaRsNokQM..EDIiJNfXYhjKMzewe9oMqMeJSVw8NtER3qFyFs13N4r07T8zsWyiW1ZVVaDo2Fx+rnRMWKwu4puEi418oZkTlrcGm3lnlVaXgmtDe617pP7PqLlreVKffhZXfjnPEMXffVJ..5.PUjB.AgEaITMDPCD.8CGw+vxwzOggmr6bkx45XnREHaaVIeBDh2nVwuFfvjG9cRaFFMuXOSXlpCPBjxmbpYCg7Fc+In4vvIfTaBDkAIEJFCNTGcuoH81jCBXx7zomPTCzn3F3oV1l2hjPv0Tqg+7YkYKBgOWRuz2yeVNILQ+3DqXAwhvzdyadJK3vN3KsfrjxYgXi23FHyAN117NFhYe.6Tz4DvDXCd4jvda+DQQUO0aDjfyDoPSY2AGbFMfxPefKTfFyTcFn.qrClJmkAlTBtyTMX.cYFf3stoYsft6lOMxoq6v406550u.FBJVnieM5pzkQf5GxLdkfJjQPMnL8xK5U0C");
      const WK_oct4_up = Content.createSVG("370.nT6K8CFnATzB.XmkBIBLMNM.fg1h1nQHHSsLaFrrTht2Xrztksrk+li.Isv.X.xBAA.O..C.MRhnjRIUoAxiTEkQQQJJCHADjCtDwQiHlbHiiGNvkFMdd3T0ktDtL4gAQLORNLwGWfbZdXbNTU3hCjCOQWijHJBiV0jodBZmK0ONwsrOB3hCmCzBRrXL9omTUOWfAKtLAxg5tGzBvRXqNtLwgGWlnfPzvBMX.pAFHJBf.LPZks9qO245Wq3Lsat9hskea12Tp319b+0Vatpes1Zp9hNkLS0T42OYmQZeB7psx1C.DzHIhBCziSjB5aohYsT86Mtosb+wWoTbt9hd0oV4k0rsUrdS1Wvp1I6L1Ma5OtsTI+aEm.BflIfrjGvRQnMsDFkjMgxAAjhZllf9RNnrAkfqOkyXZLT9HYwhxDj9CkMzRiA2zA87uPuoEDa.F0vNZarUfCjAbAWbS49YF5goK4xv5c4CgXQZ.TlagEunkA");
      const WK_oct5_up = Content.createSVG("567.nT6K8CF3CzVD.XnXa8ALOBCUrnyN8FUHdv8eLX4nfphcJSOkTRupvST5Gz2XoA.S.bD.qcFh3sFbvELNHTUDt.rgdlwAcHlKMPS.gCRdfBDNvff.J.8nxjFlYXiGXXQkVJKVrznw.WPgBDDyjJjPwkCxQEVTAhQhjHRbv7XGCwbwhCr3HRkCx1CwPAxiHNfbPXhXfPIhHVNOpLgfJeWq9Noz49r8YEeMmsuXd6I69X1z34jUo8ExmOJZHpolzc3QE9dszKgtNdL7Le0WBpVM1Wk8qj0tvSAb2Ry6b83JuEPLQbfPwgKNHjkl1M0mDp32ro+UMpu673EU8EdmN87ZkWS1mSqMLepz6f507s4qLs6tVtw0Zrto8V811IkcwMaxLrHV60qR2zChYooc0uFM.TviJSZ3fRDHVZ3fWai2DMUa598xkZ3x2Ps4ZhqzgqpYyOOtz0pz4apRHlbsIMuex9EuHWblXJKlW6+fG0Zul+cUsO7LlK2be+s.xgZPjrvdzoAQuF.3L.DoBDNLJEYyPBPBAr3NPi6lC15kQvrNVQQeNzApG1nMWFsVF3niqQLjJqToyypD.Wllhwd6VifDJ0ubu.zJxDYTYX917z9mKh1.rR4k4+rW00f61KHjZrBK4UshGFYdnZrw5JrMp0KC27jQuYmUMrO.Tb2NiRThocehuqDv8Tz3nJLa2g8isBt9KfmgvGkGuL4Le8aVvWQfyqO+Hsea22mn2dRbeBBXhV00xjiu3LqO");
      const WK_oct6_up = Content.createSVG("710.nT6K8CFOETdE.XhJq8ALOBCUrnyN8FUHdvaiDX6T3WrjRRbozB+87IJ8C5aL+AfU.XE.eaz1UJ9yUqq9Jvz7vABEFp3.0tc2c0fCtXwg4PHDZAViowyzbwg4LMWXvDgCLHoAJN3vBBBn.lGUlvvL6X7vBJJzRYwhEFLFnBJTfvzLYBIRb4v3XBJlfoQhjHPbN7XGio4BEGXwQjJGFSOSCEHOh3.xg4PlFHTdHhkyiJSHHf3xnU6S2TFuJ+4Vs3CuB8ztnpOFk6UllG8P0SIpqCeiqnJYs+y59AO2HW2SJp+1nBST9BkMaU9zYXo+ruLTi0lLe5U7SIdUaWW7OZw3O4tY0+b5VapC+zqV6SGaM2Ms6Ky8sIjZO0MuzL9nn7vWhG6Bw2.O9ttve5NW7E5IEgXMKjcqRDqU9zem3Scajp3hIU2yqxM+yOCcMuqok.haNUztV0+roloMQoU7OGF.E7nxDFNnDAhkENYxLe7nZx3hKZ74emVI2pgWxVheuepVnmJZ4YXlUlZnKxK2bxGx2Mq2TYz4NgPrcYkOuNg596y8P0ZGxYooFnqREV3n5q7fHVn8ouMxWQEG.FIpwAhxwJZjBPPGE.HC.EQbCDGMsUUiw.fDBbNcCoS+fHmg79GwUAQcjU4wnf7xeK8iuKp+wF4PnbUqSBHS9sfnw3l6i4rJgn.MGzS5FhEQvIJOXzIFSMookNBPhpbivE5zRGcEjNYxVax7nzG6oKADvA33pGswT441j.MI0A4h3viN6VFh5hXpuyF4FrHsMUmz+.rsJCXgCpG7dNA19w+ad4n+Wq6zdgP6hMutEktvI1diiSQqyEpDgYGQdxDCVgAlUoxGWJAOWHkkRsl57eS4pr.lWJvfRFMpcl4cR7Mbfq3gMKCnNDtog3i5iDNV769xEaSvML59mQ5q0+opC9J7vCYTnBTla5ESD6A");
      const WK_oct7_up = Content.createSVG("345.nT6K8C1WAzmB.XBk8HBPIha.32R8zXYeq6Cf0C1qmGhmi.pcWYWQDIbYxXGcLDfE3.vM.zB.LRhn9jNMMonL.CQQM4CBxyBSvbARDH464wIArcbwMeShjXZwQBy847E0v3rzfY64qI5gyDxHAcH58pTGaP9dfMQMXHwu71cyOAIT4ahDLakp.m.rMcNmuFvjy2DkTAGMdPHxwhjCAfHYjfT1cak.9tNcwHyt1bFWNF+80m8WeVg2Zpxca+r5MGSYL5VkxNiLWuzFqve00LCkRaMG.ffQBRYIxoY5fELbuozlWzTW2Mkw3RsTl4ZeqNa0s2w91yZlWpt8phU3rlqJdwpXLbBHPpn.p3gBegxvSXmkr.VM+H70b3LM1.6nDI9VbgCYArMM7FTPP5.h7fTCA3KDsXnfMXfYXGrsZkbfNfKRwEJ22yPJL8IGLr9U9vIVDCfxLVXwqSY.");
      const WK_oct8_up = Content.createSVG("812.nT6K8C1sFTQF.X4r84ALwAyP.FlX1sONAxG.L9jYiIRoKtTZo+e9eWj6m.pk.jF.mAvdzs8WtG1bRiv6LZ8xV5k1tb9b7bH0MGsny4kS0jRq.yiGVjPgAKN3kKyLeCNPiKVXryAgUfrX1aiEFy7PCGLQ3.CRz.EGfbAAAT.SjLvvQUk4HxEUPWEpRkJNbLfETnHg4AFTHwDZrv.ghJnf4gDRLAhE6Vpkh4gFUbPEHSxXgotYdPQRjIPjrvXGyCITdXRkkHYfAAAhjZactxiSZUTuenpw5Q9Tkg3AIS0yU8MO1Y2U5py26iZ53kLQ5nGtfVYunyMlw6Xt6R38OKHhzazzTlkuiuE8zEsSlabd2drSsmpzcYRG2bpWBMUGu70lRujpt5ori1WocRR+86jMIFvl2o6kaIslYDKpN58a8NJUM1cLpjscyy9QUUw8eukL7m0py14+mtSX8c9RzNK+q0eiyCu8zzq4tzYEVXw4dviTubWeRpatitVQlqa4jZyWib9ip7NmVzLst4ZYEh0pTt3on71a21kM.TPjLvvADJSjTYgkiKma5Zpkda6b7WddRmSmWGgNAqJBMilZ0Y3pGZkvyL6ikWPizaPqt87Xj5ksHc84L7+RDMJOaCt5u4KuYoUmKO6EoqwEobW5KlKGqTsX4sVZ5bL7VdUoylGgt4tpriAf3hZTXbPsrZPPBAB5..pD.yPU.DGRMFLBYPgRHHlbzIStrHSEK39gEaaDNZ9RvZTAKb+SCBD217Zn9nqOhtyoEpPDwwJjOc+IezZRTCPqPjdnwlRLcSXhav0ATREaXxTZtOqfij1PXbThJew0ISRyvlitPDQ45BMfSMIrlD0lA.JnOMk1LrONNaWjeCqLBw0MWQAtjj9dEnjW.G6QxPGOUSz5BGm.VqHmGHHX49q+oBgSmx7.5wy8D5RI9vHiH3Loy1tSTtv7gzXni.yX74TI+FAcNxiFX9kXbJioD+qVxLWf1KgLS+yQTFMHf3FmZ55F6kShFWFVeoQo1woCls32FaRhA3G5GcOjCX52YAVHRSB6xWmdHzUwmhOhX7UBpZFAJqxzXdwEld.");
      
      // --- Down State --- \\
      const WK_oct0_down = Content.createSVG("663.nT6K8C1rDzFE.XuXkQBDOha.H06e3+gUUQklIL5rpfZ3wz4IjPatjPkVqKGQ..HPUMvX.fE.PAvyXbFCc5xlkO3580kLCL4Fz3iTBUiIKJENZ7LAkiFoCB.AMBkok0ZwVhHEsspsppZYwfITTRz3DzSEURsAJBRiOONPRVKW4RiUhRnpwgRpqGqQJIQbZjjJqoQITObpxHTlNHv15dY7m+yV1c6yL826peHzeOlsPN8lsNy3r8abxO7Wm6V7hwbM9QP6LIXNGSBoFMPNORrnfbZLQfAdjrn0XEoTYtk9z3EoxZrxh9DHBHClAlY.aYm7uXa.t0ctaaca471Lzca2MjYZ7ysf6qYtecCWv0WcCtrEqaHhl091u6a6+mgw6qk0MtWFCt1F64aia91LS57xtD97c4XZue+8SG7WmA589Zlgq+..HDgxzxRyoZlf.IZQeEDPiRQOQNJHmDQMoMSP.4PiiFSdPpYxBMNQ4.AQjTgNVEl0HWIUM9vIofZbdzPZgIHMOZnbjTku0ytYds+as50gs22GyzMb+jet8Y5+WnmOL.GpwCJQHoifBB.QAD.PDBwL3wQXfvPHkTBwPoD.NOTeoZpEnEme0YFxKBzqj3R3I5MqgHBaWECE0qjmCnPO401IDZHrp3lurvhjZWq9.s6LxzJLXX+3f6iMKi3pQs.f05Ieyx8EE6.pGkOJQCF0R1XQFbAiVMby8rW+ZdOd1TZstTJzSmN3lS4uHzzEUUvZrDusUPwYXxrVkPvt7GtsZMMzXANeVBjJAvKHK.oCgxE6Q5YTM2Bnqc5Ijk4nMOb+cJ.kd9gNNUOnjpaOSH55Aa2.TFy8JgEnUlW3ffsLXpgtBdydBgGhI0KUrIZX4QteUl26hZX7");
      const WK_oct1_down = Content.createSVG("417.nT6K8ClzAzKC.XMlMMBHsUOhXDdaeI1Hq0CBk0pxb13AX9un6RHIakFtYxI.oHgzZPD.CAPP.L8v8A8pQgSGEwl3btOI5pp8vZXXXIIDXcuR8zRMEQF2TpJpdNMUgv+icrqmYUEfQqQ31I8ddkhpTIt+WOktPULNJhsItKU8wZQ.SWR.6Y1E2ez0xdNA2dOyRZ4hFVb3Lb2wB6uGCYmw8Ml2.kmAjiL7Y4hiQoEY2fE1SnmPrz8wpQgSRCwimXgPgn2pDVCnyw+xkVzY3Q2wq3dMEmAD1XdN+PISK5MVdtl67u87FRu8PmeYbo8ThN28e74RAftCPX7c35gRUmbH.3DEwlj7TZumWpEBjpjl4fE87pZp5w.rU001nvooVFnTf93wZgKpUhdZuUJFh3dI9Y9DbK8d5Yb2SnJeonUnmKDZT3zIf.EfPDkGMYBEs.ZTd.I7CvKIQf8330KZ4Nlq6qfTG9BIv4+s5XtgWcBKBMpbDmjBgAmd1qls0gRS6iFFw1pgq6YeFEiHwHxTw2XILdwdfjjxMSq7G8.nL2BKdQKC");
      const WK_oct2_down = Content.createSVG("748.nT6K8CV1DTwE.XJa5IBHQNGDQ+B+2Up4QEyHeTZlOOrQnVQDQDorY1dY+u..FjWCAB.Z..F.WTqjYqd4rgZgKmLMqV.IdGHCH53U0pvFKuV93ICqhUap5m07iU3yqPGVNPTRldXoYcQEOlPwTEPWNH.DVQzPpgwXYSjKUNEygACllFCrLMIY4HQYBFYTKHJUnrblLIxBUpJlhsbxTIALPQZnVrFWNSRhDAIQsRc4HYBRDFUDMjNH35XY9k8hYyY06mN+S0MUbeVddureM9zx+VmcM1PSQl2N+31waQU650O97ylHxOdJpv9O+aMW0b+9EUOu+NPm0WhLfL5v49ZKpP0YFxxjUrIXwI1kyIt7.hRzjIXSThdXQfAlbIic4jIiYpWebv3dI2zCcMuFpZn1tGe5W06Wd8yW+uFeP2S7YYp52e+37hKiW97hYqses+YHiw7kXC4lXpLOelxm9K2ZmhOc64t827ea64y98wnRw9a50GKaLy3l0swVor+vGN..HDQColF0W3xYBRxBKpzrZJHvx4RkIUpn.kkJSRKHoHn7.TEOr.wEHoLVNRSQThHhZ8blAwkClQsVNPhTSTfhf73xBRV.AAZJRBFFRl8ecVdOl2hOJ6myZNOmkd+qi3w3yyW2GiMjL10JW4iUL63UQc4a8VY2F.3enFFFKIkoFgFRJCxBvo.SUEY.ghyyXTQLfnA.Monj1RqFYAbd05.lr9Fva35VOrkQMA5dGvOeKuexT2SgLK+lfQC5KaUdrTUG7W.WPuwZivsCQpWSRmfTlUhLoBDF9o.WQ0DbWqObWn3oeOI3NQvaAPFtA.fDBKZNAIGOboRluiVhBQ.6Y6xAS.eDAA84ZtM3Ir0ud.Ai1jfkjcEc5YHXwrb1OfG3t+y6kBGD2qnadrYIdBYKIpPDb08frDDxGMC6jGv2ChtkDQeyquRGFoA+O2l+fF6L7qh.KzKSOnwlv+xSkYtBjX4mYWgCpHjFTlo8ESf9A.");
      const WK_oct3_down = Content.createSVG("879.nT6K8CFVFzxF.X+7IJB.yBM.yNQObuDN+HJ8R6z07Y10I2TRII8p9G7MU++uqZXDcB.a.vF.mhL0iBMRlfwxEJTbvXQxFBLvEMbjoHdnAkNUk1TjOPomh3AjzJvDKINC+RrPThdqNquG9XHQJJOztTMaJ5OKzcHE4BTENR1.RJCKjboBNVLQyAAfPhRGafnTpCBEMYLri0oSGHPLXCNbpjhrAyEM7.klfIClTjKWrfA5PjBoRQ7HSBclXoCTRsOEgSEJVlTAkNLEoBmKrzAQoiMGDrxEsV027QW3xKkwG04wndus+Y+k4R0Ml5y6Uakont5ko9U+t0FtKWV+4suy1o6smg+AW8pVFdzR0eQK+aK+illdDe64Z6QqdgmpF+mTQSoGsJ+t4d0rsN5WY8y6Vh9rw4Qq52ZVUWcmheIHCf3RSVyUu9VZpRbYqwiPletRkXd1U2xti3qehFtv6KC+ywK2VoqkGkq5YOF+139cYSw6wpqXTwbY+AWoD+X6Nt8oJantXtpEYD6yodLfmZYdIZCOCWt5Wq00ba5W7Rg1965s1dblK0xZa70psB.BT5XCDHHmlrACLx.I0JHPJhlLWxXQAnMxvYyjMQf4gIVHYCHzLYCGoHa3XASDTPokdd7OPo6AJkhbgEDGLSrbgDMKrAiIWLgikJc5y4QG2ds851pqMY7IqRSup2qcd8sZco8p3t2R9qhKdgO7Z6Lsquz9Ror9HNwkhs0eP0Y0JUtabWkxmtt..1JpgggBTYiHDV.AJET..x.RQTgAQwjSQTsADMPSNJMrznob8a5ZROXpBpk6Cg0yIMw5P+2FJifZeT3XrKYNWIOqcseRLYVhVTAgIehYhsw.swzk5eibX0oHID21z0HWyg8Hh7sOsgF59bO4vzHZB.JAmQPH2Q23FLCgQd.Ffjuz8dnTIxki8YTQ3XZGih7Twv4.HBJ.zohiASA4LgkTskGkA2LJiLXczPy+1ygMhkIgrGxnKwDwrXrol0ujk3Yi+L.HVNdRObcaPTWWJNnUv1LEltVHkzz3zXJpopt0RY2hVybM3c3Isv.XXM8XzXdlGBGnxoFouFmnIjHPkDBlAlmx+OvSttcCVdgauQz5a4dWm8PivZ0MMfc6YgmW.bLIxTgMZFuE5gfwK.HUmJ1TdXstHnFTlh5EUx6A");
      const WK_oct4_down = Content.createSVG("529.nT6K8CloBzCD.XJXgUBDsha.q6ldn+8U.bn6lIalQS797GfbDQDkTF540hKoppZJvfS.cAPU.rD.5KxjP1ocST6D1YDkhkSEFJZvrP.wI5AKHOTLTzXmXohgwXNyDpItcwWWWLLDTwxhxNqjhh3htORSR6LJBRh5MkorcdYxfqGHK5xd8NsnLA5ghtdamTrh.coSrTwH8imK53X6P5NG+9gK4225i8hrzfWiCV.qYt6Z8Sfuc3em6.kyiDTjCLKIHmJKBHhRhemWnz0cr8syIzs24El8sng3i1Q2OhZ2Z5qsj4rzaftiWc56A7XW2HcRlzeOTBeYCJeF1MO2kLrc7OKas9htF+Z0wbL6aU1OI6ZU1db+O65lOx9Kg8y3+E+l+VitmceqRW5bqajLFBcm8WKaF1NZW.PiIVpXXZvs2o0SkDISLq7fE6jZJZBx.ZkIqJFJZrOULHovCDmJKP8TIwNqrfjXXhtQmeomP2Wuy9ht6LBjZI8.EwgBAFJZTI4IxiEDkKui7+fQt0ZGeQOxcq0B1.BX.YJBs2DIT2BnA4AjvO.ujDAVOtY8BWtCv0oUPtCCgDh4+qJGyR7pmyRfByfXYf.onlgInGjCJLp9fkf6LEiaP3T9xmEKJIH8Gh1vVZ.3FGz4cqnWcXmJMsLZZDaslttmwYTThLiHiJ9FQByWrWRRRxloU9id.TlbgEudkA");
      const WK_oct5_down = Content.createSVG("738.nT6K8Cl4DTrE.XDa4EBHQJNDCpVg3CvF.KKzwXmrhwdTlHo7aR6ysQvWK.gC.dDf.fF.dAPJWpDmb5vRXxYyiDKvDtDHCHJgq1Z3qx6ymNYXsksowt56aY3ianCImH1jHHZ7HggEPpTQjEPXNH.DRR3HyCkRkOjf4xoZNMZz73gAZDEMI4jwRkL1XIHKWrjbpTgxEVplxTImMWRPCDENrjhwjSzDITflXoTSNShhPQiIgiLGDrM964nsVe6F6n5Z74a0yohrot+o9342K0sPK4+z9aaSUl65YgX94sXCO+6sHC9oVThW0+bjgcuWc7T+usW+Rrgj4asn8K1m1KEpxboHSvhTr6Jo.CDHKTpPgJxBEHZHv.Uvrwlb1fwBsp4RutY0+V94dL97Oy65X9cpb+f+qzaWLubaka9r93Odetu6J17t+kn4qW+8T7Q8uUkqR8W2hVt3yydiG5teLZq1SV44oVp046YWsT+7GVaI3Lu9W73WsVpJ7d7YC..BR3HyiGZmvjSDTlKt3xizqf.IGLWpbwhBLMtDkIAkIBKO.YADMf.CTlMRNYhnXIBIVxW4FDSN3FKkbhPwhr.QIBDLKj4BnHPQTlnwxecUyZp18w8249VUx8qx842UeXx6pd+J12hUGaOuNNSsudsJ9l5+4b1W.FHpgwwhZYHXlYAjAP..vpfglhB.wRiRYJZHfQC.MonHeockascdMEACH8tPxgqW9H1rjIGjPt82a7S.84p2qU1Zw9rNgtYf0VmBDhcGL0y2gUF7o9+X.jJlkAXpiFtUU7YkhhsfBdYrKMHOpQ+ENito1.PF07mi8JqAthOXYzVTpXn6kEJ2ApkeX9Dpf.DPtuZNKz95r73TRM1fZ0LkullKKObwM73eZEJnkL.NTXPYJIfe1y2DhEcXFa2B2ZiFyoJZ8j59iNzWCPv3MtQm6Yv2EowLhLx0FjBuedFPmf.IU5Yo6P09HOYUlAwKJexC");
      const WK_oct6_down = Content.createSVG("875.nT6K8ClPFzvF.XKMKFBHQJNDCpVg3CvFhkPvgXlrhwdTXujraR6ysQvWK.gC.djl..G.wAPSvhSrKmSfIBjEJUlPEYgRDMDXfJX1XSNavXojUoN4zgkvjylGoV.IdHHCHB4UaMboxakOdxvZrso0uZ4Ga3yanCIGKrIQQz3QBiJhTghnJfvbP.HjjvQlGJkJeHAykS0bZzn4wCCzHJZRxIikJYrwRPVtXI4ToBkKrTMkoRNatjfFHJbXIUiImnIRn.MwRolblDYAEMlDNxbPlyM+37xp6UU8WUmiOnZ47aMOFsz6aoZdK939dpeYOOrYqy8xGdWmtHDr2q+dgHeIZJ9K8uDe5cg9ZOUsLdKud0w3SpzqQywCW547+Ym2iOrlmhQCU45dz5asnwty2Bsr86eVnCwWzvVstkyJTkIqXbOeat2m3snoOe9CjMu1AIrtwqMU0icruE9f9Rer26Qa4843CpqlcmUI5+uR+YaExc5bxJ0eKe6mrh551Egn4m45TzVK1U7o28vu4Sgpi2uOFePbwJxsu1tUWe51w2O+O05QCS0hMmXypF1e8butqtEF.ffDNx73g5InLWbwkGokBBjbvboxkJJvz3RTFnLQX4AnJhnADXfxrQxISDEKQHwROmaPL4farTxwBJVjEHJVDAyBYt.xBnHJSzXL++ip0M+peK9ntpd7wL6i+UqzjeEqnmX18wH2phSkx70OPZWeeue87qehJ0x49WjOGse8r6qR93luEmqaWq.fghZXfnnZ1LyfE.IAE.ICH0TEGDHOrkQis.hF.zjhRYiF4gV+.rpo7KWBXS2mBKc1mw7AJvFQNfdhrJ0JAVI5FURp0ryIkfAKEQjFnjHNs+jPXmNHix3tk.0mESLUSNirZU0jkPljVjercz8B4+vB0FrWfrrBtLGogSvHlJy.feQ.kt59Cq0QJLc5n+s1ThGkdzd5nfyOT8bGSpkabp0ahNlW9gDT5p8IE8CtE55vFMCMy1DArnkUqYyCtAJklPA.OZ9D8woDFGYuBx5ZjWswSprQ5.eLYfuM6HzQAVF8DFXGingoEbdJXl6npRVaHMg5xto16dAZlxQCRtgaibsB6lWjK2quY2I0YIZt3oYqhouNC+cAvTpKCC0frwaimdIu.Phg7r8aHEWDnBJSz7hcG8.");
      const WK_oct7_down = Content.createSVG("500.nT6K8CVYBT0C.XmmaQBLKhd.sJ6+Pel9shUv2SaDaNbYRuHFxUHkxj86L+ax.GzIn3iU.3D.HAf2PtNBLUx5TwPYQBFKrCQXfZnJRcZQBFbSEpEFi8KMSRcypsrrVVHfRUkCSohfd3Z4ZjTDSgfdlreaYKioWREXUeprLC5Lsxo4o5r72XpSkjGqsoB0hvb9CmqmMeaOy0y3i4r+eMGJfyg3buGxDSM5ABBqJ5gghh.flfvwzqok+GigLMhkcldsvPELHe3Nb+gb8VacqOYeO+Fw2gaeq6WnjMi8a2QeetW+woD9sK9dIbFgRX7c+4dIrcdiVT1Zm6ve91XrY+708VOc99l9BYvN5MXC8FMoresI6gd6jyXG8cxb867MN+WK8FMXG..ilJTKKsH6LspRMYhzBOMPASmjfjhLvRQphZQBFbkZgnDpQXnnvTkBBlRU8DsPyxx2e4QrLzYpesLSk7rUQ0GILSGrHACpIUI0pGGKGOZMoqe2grYuLTCJPZlglrSLXoPGyzBZ1YdSFJ7.ZlaLDG3kSHfGWiWfcGO5HDDCFlSFL0Os7FExWMMINW7hsW5vWG7o8PdTFwwwEOAN1lCu3hMIgHojMRnzSayItCAqQ.EYaImIhyxGEWjDEYl3arGSA1a1SRWyz1eTffxTKrXhnL.");
      const WK_oct8_down = Content.createSVG("980.nT6K8CVuGTkG.XFOZBB.yB9rSzC2KgyOhRuzNcMelcuHI6lr08Eudj++eW0vH3J.7Afe.rpV98ntUqdnz8t5dsyPbyiIPOJTcQJzHYBFKWnv3fwhjMDXfKZ3PSQ7PCJgqk3TjOPoKEwCHIVfIbINFtSBOQJ5dCqGeZjAEsHEQraeWK5dbz4PJxEnJbjrAjTFVH4REbrXhlCB.gDkN1.wLCgPQSlJ6Tc5zABDC1fCmJoHavbQCOPoIXxfIE4xEKXfvDYHKEwiLIzYhkNPIiuTDNUnXYRETByTjJbtvRGDkN1bPfL90Ve9VdVqWWludxZcOmmEplg6paktmmY72JlXxdolxOepekdnt2bQKZHaUdO3sIu8+Oerh1cq9w6q71tTuD4o+KxEdOW+Jp1mtWY1co2S52W6U2dH9uq5C0t+tZXV1xViZWOmbp9SueVM9b1etOZiEmIV+gdyyFeTdJmddcHry5v9JUwszmcuzuyZumLMC486DwXWFdO6Z0odx74nT85dvTuE+G0Ixp6Ot+L+4mKqn6w2xCUlYt3qg+x7xduqsiY2X945bYjazYu+uxygIPW+5lkeH04t76IU+QqxyRj19C+XgMm00oVeY5hW82C6FZ6l16neUq56IeN.HPoiMPfjMmIav.iLPRuBBjhnIykLVT.ZiLb1LYSDXdXhER1.BMS1vQJxFNVvDAETxWzi6CT57.kRQtvBhClIVtPhlE1fwjKlvwRkNHdQJeU6saNeGp7xYqbWJWKaYsWCnYEi2hnk39dtmWbh3c7ZGZus5mEMF4VwxOza+oItLm8tX05+ruyLdYyH1noYmHa0+29a4+W8uMJfKiZTTf7zJC.F.jP.n..nP.LCsxPj33R0LTggM.PyVnNMfVVJg9LsX.HOA.Lza+X34L9GGOzbyCKkjiidJSYaSTC1Dl7cEyzA72.Uja0EjCRDyc5tLuaILNXhgaoqie3I87fPfQk0tEblnDQ4tvlUJcv2hkwI6N.GzpmCQFbHpBvABkqIUuGHUN1IYMy4RJhQjhAMjFLeEYh+jUF6AeA7FgTmImSHevGjHHEL.AfTfWr4f9.EJ9l9Il9QHbcXRBfKxIeuNiovE.ZgJUpTvS8Zsd84bLXejiEBFT3lJuXByaorAH0KWYybKEeytfuXBMCXuofbnZx2QBT3hZluOysMcFRDbxqeGBFl.9Mg5GZepMkd.TDEFOm5UjxFhAKGKakPVigyQJ+LJn9I0ZCRwbJm9Vqm+NFtFwGDasQo1yTpcAUGn1L8lazz3SDdn11uUI1gybZC48Q5zZYhktXxoN.");
      
      // Draw path white note via LAF.
      keyboardLaf.registerFunction("drawWhiteNote", function(g, obj)
      {
      	var OctKey = 12; // First octave key.
      
      	if (obj.down) // Key state condition.
      	{
      		g.drawSVG(WK_down, obj.area, 100);
      		
      		switch (obj.noteNumber) // Separate by octave.
      		{
      			case OctKey*2:
      				g.drawSVG(WK_oct0_down, obj.area, 100);
      			break;
      			
      			case OctKey*3:
      				g.drawSVG(WK_oct1_down, obj.area, 100);
      			break;
      			
      			case OctKey*4:
      				g.drawSVG(WK_oct2_down, obj.area, 100);
      			break;
      			
      			case OctKey*5:
      				g.drawSVG(WK_oct3_down, obj.area, 100);
      			break;
      			
      			case OctKey*6:
      				g.drawSVG(WK_oct4_down, obj.area, 100);
      			break;
      			
      			case OctKey*7:
      				g.drawSVG(WK_oct5_down, obj.area, 100);
      			break;
      			
      			case OctKey*8:
      				g.drawSVG(WK_oct6_down, obj.area, 100);
      			break;
      			
      			case OctKey*9:
      				g.drawSVG(WK_oct7_down, obj.area, 100);
      			break;
      			
      			case OctKey*10:
      				g.drawSVG(WK_oct8_down, obj.area, 100);
      			break;
      		}
      	}
      	else
      	{
      		g.drawSVG(WK_up, obj.area, 100);
      		
      		switch (obj.noteNumber) // Separate by octave.
      		{
      			case OctKey*2:
      				g.drawSVG(WK_oct0_up, obj.area, 100);
      			break;
      			
      			case OctKey*3:
      				g.drawSVG(WK_oct1_up, obj.area, 100);
      			break;
      			
      			case OctKey*4:
      				g.drawSVG(WK_oct2_up, obj.area, 100);
      			break;
      			
      			case OctKey*5:
      				g.drawSVG(WK_oct3_up, obj.area, 100);
      			break;
      			
      			case OctKey*6:
      				g.drawSVG(WK_oct4_up, obj.area, 100);
      			break;
      			
      			case OctKey*7:
      				g.drawSVG(WK_oct5_up, obj.area, 100);
      			break;
      			
      			case OctKey*8:
      				g.drawSVG(WK_oct6_up, obj.area, 100);
      			break;
      			
      			case OctKey*9:
      				g.drawSVG(WK_oct7_up, obj.area, 100);
      			break;
      			
      			case OctKey*10:
      				g.drawSVG(WK_oct8_up, obj.area, 100);
      			break;
      		}
      	}
      });
      fltKeyboard.setLocalLookAndFeel(keyboardLaf);
      
      // Draw path black note via LAF.
      keyboardLaf.registerFunction("drawBlackNote", function(g, obj)
      {
      	var areaPath = [obj.area[0], obj.area[1], obj.area[2], obj.area[3] - 8];
      
      	if (obj.down) // Key state condition.
      	{
      		g.drawSVG(BK_down, areaPath, 100);
      	}
      	else
      	{
      		g.drawSVG(BK_up, areaPath, 100);
      	}
      });
      fltKeyboard.setLocalLookAndFeel(keyboardLaf);
      
      

      Snippet:

      HiseSnippet 14484.3oMk6luyjqbkmXWMSKC2BtArA7CvE8e0SyoYy8k1vvC2222IFfAjI2IStmIWfef7imeDLKo4JoFRWAOUgBeeLIYDQdhy42RDQYuN8pbaaZ8m9M+N+q4xe527+xu06ZbugqIqc7mT3+oey+y+V60xsx8eh8ZNaaqr3m9M+l+iR+3t+l+9+te52+m+e++hMaHa7U4e5i9oeJbp8Uod6618+zmZ+eQqcXPLqnzu88e1Si8eQ40zH2zvzmmQx+weKzOMm8pOqtzL6GO1+ge6OIms07S+l+4eKBR0KJHHJTTbnrLzhrLL3RT5xJhpW3PzPE43PO+k3m9M+OITztOs5smsWt8znrSEWdMSGi+gNHrcqMen7GW.+SdO87e3i+Itl1gB6eIrr8S+zu4uy9OEj9O9GBR+u+aMZKZ+ie9eJX8+5u+F+7e5M9yCZ+l+C+sFRv+OvP527mMj969CCo+29sduVam2+S24Gim+teafx+twve3g9o+C++X+a+W+m+c+8Le1alV+29Yk8+aAOOwu6um+Yn8u8yvnfPTfH3+7+2+LDx+FBzu6umaZ9ZsstY+e6e50+IDHD7+y+bXa43X1O6c8dtYZr80Oq2lulsd869c+y+q+teG2z3d43N36r9Rw0mKTdtdsJ6U4+DLLFz+4eFFB5+z+G+C+t+ge2+5+5OyWV0NV9yZkW4SYqE+7+zyu4lMV+LTPv9Wfgn9OA9O76dxP11+4uYq+b0v9e7Q++7m+kdptbma587z3yE+S+i+YOy+3ere3VKe998y5SS8LiEhkkC+w1s++9CqmU8m0lu98uf9zqrg+rW5e5Oaf+ZHas7m8Bkly1a94po0eda+2GCe58e9y7+5O9QwyTL3+823e4e4e4mCr+4eeNvu+h+q+W+kgPj1+sOy+Ec9SS+O8OBSPAN5SnQwIJ.5aw.JazTPx3ybvBh07E+ywGDmPdHP5Rf44Xzr.PUWb3Vm2guWP4EXiSuhYc7NIRuKBbcYEXEQWVsKr9Vzg.cy70gIu9tVXSuBaKQ+PewcSdrUfpxcZ5lgoyEg.kSuBu.l69JSlDJNXoOh9kvb8YwEUNSGhaDwQNQvBhoRqzqrKTWPCPPaPLlbmQzhf8OpbXrdQNlU0PKpkitqiwf9C0Bgjogh+9oo+Pjf8WORfgg9eOR.OxdGyAFKCqavJuEX0DyWjU9J0l.osHlt1anvvaubuOuyoYZHavJfsVtqtVfmGjm4qMn8hodm6oKmvwYNRonOzMqXn155Z7J23NxXXZ+rW9Akep6bOjp.KfEwJx4hB+5vsbNPyFoHiyambfRs1cKeMQ0l.kaQUYxw1OGZ3eaWAnQZn+.BGWrIRxcZIyYh6vEFC1UJZcBvtQV2ta3qpnsFx9dHkO5cBD3NP8UvWfub1UoBOSK3v1NfA1mtVaVxGeumpOqmm5aBS+3OIUUsQBrDJjijts953kV4HYPpaY5rusRxAaB8X2J3Q5dXQvAEW8lJJcFlvxbhpyhE4hOH3J3SPXHJsqu05b+5Sb6ADpPRbaoCvKG5xAKbT.QShW2aSLpoP0GT5ERqGpnDgZe7z3k8VMYrpBCMBdmKWMMrG1+UuBTzQ02QSJut6KDKSEX2ccnU1RTRs+Tm2E25kLW.MuoR.AHMcymfuwGMRmf97DJbXvHtNBr2gEQJ4LnBcxfjGSPZjmVyDafm1OYYz1McT.bRmDDMN.0Fps9xB5d16pGzuR0ptsDzBVMt3x5mhKwEAk4sMwZ3tB49.sW.9mvG9Q8H+Sw5uV44OJj+qmVhh9KEnChL9crfwX7fNrfKXpf1GMNeeEkzv1V8t7h9ChFgmPmWh5cmwg.S5Gmff9m1S7odImCDFzNrgMhURBgvoJzrjRAtAyNpb13hVQLbatW0XstDtO.TZaGRBlGPuLIXJhpWsrneZNeCRTT8Pz7kuyTDNJm+.obPm8d7TBtPBBJXoa22aGAyW70VS3Kqch7t2DF5J0G1EME01M6PhzL01XW3hjVSyufcW7cQ3pra9F3qxj1XFFF2Yt65mIbwnms3lJyBRPGicsmUpvQZTRaCf990GjpXl2hGBGf1cOMJkuKI56D08YUBJINaRLCNsrzpPMs1m90T356.3KWWuZMA.Tu78zjXHjZGXgRzq3HIoJv1iw3mhak54PvsvhJ9PvhDEVeKy8Blv81ifMV2Ww7Ae8XDPAJ+zhs9oksS9P9br4iiaLcCEuhBjgGAoDF3nN.qVwlJ2+dLn+FS2jj+xzcJyMxyzcTOuAq9R.mhXJz4ZlKm3Z3D2DbPOho1NOhnwqFZEsVLJZpS4QWU5JNPRvJSv6bSDjgv.Usu9e+9McicGSuW5.VkOYSaKHzJb4dhF.FxzZHHAbnq.xj6tMYVIvEhFnnSUy4.GS.VwTw5ZPn61cwNOQS.eG8AIGNKMsftQpcjBoMw.nVdblCSdpGTypqumoPdmmweqA0YV+N3nOrEex6r05yWl.CfJAExwffMUWmxky32cRQMuhCrEYdk70soE0IeH8kdFPcAIvZD+FPQAYOztT+3KX0IW6PYzNxp2ctLeuHYQ5RTEB41krVeYNHJ0A1K01Kp+cGCR2FAwZjHHrhBPu.sEHCMMhM5YTwFkZbpfMcPRe0lnTjpZqTAxwZqdSFzySu9fkC5NVWrJCyB0WWCpwEysPW2wAhdyPVqUJpjHCKVEI6.BzRD8Yr+ZzbGTB1ntqfFn1qAB7K3CZ8VkMkI2QF.oUo3qCPYPYoUzuUPey1Vj9AZwO+2f8+QGw1Oez9b0zq8ruk+76r09++G4+yK.8qx6gC8G48l4tge38HEDXXs2LLaLXnAyCtsajaUz4RvBxuLcFnsRPz21AL3r5RDYh4Ao.e.XPqp.Ukg.wbXaFGtQGO1bh788cOAcAYv57K9F6v6rxy0Jp6ppERRVMsTKN32ba6vewwqUunOAhcS9EMV4kmposIIehgcgs8W3YhKAZLhRDBHUukDJ77InKn6SD.ud4N+7u4Ug1rBZ5NAP4IUMxlqcmjLe.MFnewp0qzKqnHmFWKnCBA5AJOBtjWRhPsA.noPZTn9QobFGcCeHqbEBqdEagl9URT4EF1vIP1FpwCPom8AvzCnHML.dMCnMyyvq6KHEJ+T01dv.JqSI.cH1o6K58u.kuVHgfITgN0fwNlPlaSfu5MhlRORN0Fdc+QDCxoeQb1ARMQcQz0+1ErJArJXHA7Ae2.TuAGDDSFLFp.bw3g4DFJLS7cuio20v5iFC8YiCwl228cwvu4VFGVicz1nq6EaznuXReRW3wdyJxGoAaY1TieqrfQa19dUBtMvz6IMnI.jtozjxKROK6EdvBSbaMP1hynqX7PbOnrXZsbdr1nxcAHiYk3nHH3aPHFv4ObJ5ZtwgcUSy19Z4Iq6pwZ5iYVTudJulEay4l5UTFpUKAmwe8M8HlmN+qtXIAROqn85moSxHb7DpNxDxE9i.lK8l2h8Xtej0eYA9mAd9Gxlg+UylQvw+E8rWf23O5YeysyyZOAYfeVAQZ+YMQkcs.ZqzfK7qiv0nRKr+Ijt9mDzZGwPPP4zwgP6Iu7BPuk.xOZ0Vj7utBHkMZcH42DeStSa7lsDUWYcf.tb.S278qgkODx0I6LDOI08ZwwGPE..DlrgoDKttHefTeTZ0UDDSSm9P5VFrDvHp8jbeBp9RFjOiC5dlfNxv0QO67BKeSrhYRe+ix3ag4aAVAlsOukdye+dZClXQMMg80381KZ5tCQoXej2aeFWqu7yFGL8Eq.kbErQ3P3SoejUJ+5vvYIuCHzAdnenVxP7nNpKD98FGJqed8IUo342aFruewmHqcWkk.6SBiOVxS9KlBP90ATnP9E.kaN+BdvXu3DAV8MWbv36.9G.jKrO2mX12BPfEPoxQJIHcvJ207mxrepvAS.G4AEXrGhypZz7smxQ37YQibm7pbimez5y1HFJyxYZbWwxv3aeV2qpi7RokS0Sm5nnnHNVzlU5szzfpaC+gf+bcmhqqgSyiuA+4QtWSCZd9j2fMB93o5PnjeY5Dsrm78LrxyAO49QixyS0Lcl.QD7FePcGne3QjkV.8.9aHT19l2KzautebHsmpSSl5wiIsQuQGnJ8LnIgHr3t+.6xWm4HZh.uHyBoYHLXOevby8Vny1oDsu9MPu3BNR4m7hi9CRLgqvLDZ..tOsIZGBXC30jjqD9v2kI8yYVHa.CkYYVQDHhsxBDQSivFACpKXsYgHhYcEedoIFIRfIJBJf90UXPzztfbDjU4QlHc+PKlahzmAuEHMJ5HImGM4WROMl1IgtHlZlViUVj.Dz4FBdB9AxaMwU2WFFBM9iyqRQTeHwG9PmYraaEKMWW2v44.24OVv7L+Ym3GcidaK3vygWAVU5o.leVrL07fGv30MvxaNvCgC80XZ9v8MtuP+itrwpSwpOcRAt9QN7mrWDSqispIyB7nE1LkbJcuv.k1AUcjLeH9GWLFiXXzFzn+9ANPdR+Qh4FUHY4xT3mLdYHX6G4B7dwxtYrUujuhpdpOY1pf0I0cfuZjOT0uyy3qcxarVN4U5Tr9bAvrHdLwGtx0B0YsTP+B+kULgMFeqXHtTuKFymBNAYstUU.5zO6alhsqQ.A55025NhB1ImvQcXnR+EkMn+pkMjPz+hxOeg6WBfwooSLr7Nr5fDyuFm3WRb4.EpjvtgrCWUHFtgcDYnkzZ.CpphIk.8XrC.I2SFAbwoZCA7ADhK3ObZDj1QA2JRFdAUwcC1x0VKytAlcbiHJMbQZyIo6AV+Tt9kk296OXxqTbECx8CRLappeFP064OVaj3xqEdP6K7mXU8GOpYbEB8Yt3T8GjON18doNHkFevDUo+TL5M8FqVPwY.z4r9vbPxck+nS6sbhecE3BTfNVFVCbY5Mr2x6ajQD6tkcK8xkjH92QyS0wE6kHSrC0YzeRej+qE3YfWbcrEp+B3aPIkL4mG1aEWLKhIVm96RzAKMuzRtAIHL5cjAhdzRZslLXoGilWldHYzIivAy7zbyAsoDu1rnl28yVRyf9.ubwkLmZJlfB6BHkr8PBENKM2WP7hJRei2Tahvjy3kECGDo9U3Gi52Q6lpent8U2Db1uMxb2Lm5eXtAE3UZUMqhSZ5zLtKOJomLVLJU8BOnL2EbQWDuD2fQMwVgH8ot2htZifSCCy3mPDOAVGcMhzN9fM+QnEClZJs2eX8kzazgGJpr35267kDvjy1j1K5CqkgZUUMowUci1BFwUUgpffOkiAO9FYpExT7M3s4dzqwIc.78731pt98JQd+IFd7nqfbVVnRIKeCxX3wGwpucRzubyDEM9Da4EOLyYy1c9NeNgqlT7Efx3CWgRkeFKeOihfpHmouzqOSxTvcbrwmj2Sus84tGQEQmBgGPZ5r+B4uTCPlzmnwVaE494F4pLzTQ2A.keIl4n46cwUVgpF5WSTsspGYbI0wsHnhxWLlvvjlhMIkfD92X7e4i4Jv59VjAv63DXAkw2UcwOY6kfvHkKZTcZWVo4WId4+R7Qw2J2f56dlAe18KeiXvWIhUna6SIaU6DCVFmSKDewfHvwg9.JxpFN1VZfOe26TgKcpWzWo14XaLpScpgG.w8WTfi8qVfiRB8KRSFY7uer18tmUgU2vz.rpFtAdzQV1aSOSbc0uYGId8dueasGXnETY6KXL34CUGnEHHGngayXmqRvDyY6C1oiiipJmLCe2iXmCmV4gb41VIyu8hFEEn9P86765X0LN5Vtl5GRQU4oEw4l9AnMbcbVNQscxprsgPcSErou0frLO1VsXet8ataV20Xc5o29AVQULZ65Lm036R2reciWL20OpkhFFqru+x9DSmYDeZqJPc6z9M5EKDL7nET8src5ls9xLXD+YTX5bfGcr6ykavoyzMl85dP9XHVIucRKYIm2Ne7hveKqzv9XI0qiEOapIYymhvXeZKG3HZxO+oEKflBw5gV2BVK7fi9NCqPnCajgasu4q.jI7FjsZP4IMR5qqynwFuXemQ8ICSWS5vPEsq43JSe0hU+UbptOsbxQyIeGMWuwsaKCxMCE4G6OSB7YfhPeMSyVCp35XxYhx8vnSDwqmzvN+h+BiqN1IEzeHqV3wFHyeQxA9utnIhew2uHJ2ibBv3w3LJFcKVtf0wKSJw.4huTk5wXiUyMuT8r58c+L+0yGW5FIdh4wRSNO3xKwFzMw7uB5lx9A76fq0ECGLujGzLr+ADuaQ0C66uGhGjZ7rSbHItUJN1oO7wS1583AXjcMKO+UmZm8QO2oyOP3abZ5jcy+RFKwcjezvshJ69bSXtC6mjPYypb63l3JakF4PSqY85J0xnEZyoaL5UpDgRiG0owEDJDzwv2nXcASTBmusTSkmmFteg5HPWrcqUuaV7vNWBEwNGZ.G0SszAs+0iIGw8hHmBU8ifstSdk8QslobW+.rAza9YTj0If.i4ODjnBATBEuMoHS6i7fe6sXnWNeSTgCQtgsnuQrGte.kttOQERACqz+HMN6TeUNj.ZwE4lqIYZ5EzGQCP+uspdonUt7xgO+HJqEg2HHCml5rOE8DwdCKsY4tdYN4xxZ+FZ9FKa18oBbSw3S4IsvG4n7gXUsgHBfJInzOC.uB1rH0GzPxKA1.OqSs6V+VbOw37QDDUGje5YJRWUH4xl0lkYE0ztkXfCFu246pYniSo4MyrD7nQj3VnH5X6hidm5h+z00LOXzvPyQAQXaEuJzm7Of2pm7I9Iwzvj2zu0ZfAWcw5w.ViffpHf0j6RWY0vB1ZjDSJFSWOvUWMlgz3PH6b9j7NvX0BzOGwr00uY5UYymE9uT9Ol7U0yPpoZ2X2o0pdW+UpW5iNldIUV32HmpqEK.4sxLDj2iHEt4krrwMgO5J6Z+fpuX8WThP7qKPB9OheZI3W7HPpQc4unDIqkOlvGMZsy0Me5lEfhTQkhCOSGfoJ.LV.rL6FNPk9JXYgV868ipeVAwYTPn8WH+Pdzd7QMlsLeJSX6zw0c9yk5FQwe4q4zkmXTMQ+xxxNBNHEL78qNQL4WVU0a2GbCAQcwwGgQUeu0SXUbyw9hFypNTM8ixG6bymxm1ILVAo3CmNUIQOKuGgjVMnOYAX1Chx9ExM8WO4bxxUnmiADdH9heTAvB2P49vRcuONaI1SDLLHQYC4oLuvU1tLplrAbgSyXgHGg3oNC.Ox54Sy1ajEPemDOAr9Q2uEZPuDOfzSoHHKJhzJ8.0BaOABHGOLalC3dIjvSJy.wXiP6hZSoK0Bx3ysN83H42nFIB1CDPK588uk3lQjB3JB0wFZcuVb4Wd5ox2ndux5lQaTBPtVNM.tr3dY7YYpGrIyL3dODBXcZXxvYJfzR5weB43Iun4HOSSufYxodI4X5IZiVJIV46PEj45nyvlxOkygiuUSwRhGBFRG0NepeNkNQLVP7StwLqsWekza8wrFml35I3jJc9TGKNt7nQEcDegrRNbjZ5iwYjifDnnxiKrlyC0zNVaaIAP4G40N4b7RFaAAsGfU7r4lu3l7.pjeWSRKcDv37pK.6Xrh7rTip8i1LvgHl8XdvhGqrG8V03A5.QK1pZ8HngzsGtXifyWEUq3aEQOioodSV6l471uB32tRuD5d9NGlcRNdKQLowv+kAEcVZ6vGCCtCzPAhAqA8aqIQnXCdS77mKQLwU4Mif22.fqapbw0byRjElLvzG.YEXi.QKD2E01DMFe1E52+p.Wz154rbILyWmH4TbxyEVyLDLcJEoxXEI226tMfSV5gMuBNDo9sxUzX90.1KWRi7pEzZCMtQS98oZzV7VdyPRB5SgLuuF53zucvWf.ll4nUI+xk3Ox9PBhK3wS7WRBR9qqPB6WV7F3Hl62OJjX6ojYenTx.QQbotiSJWH3pf3fWdK07tEb9UTxiUQk7jyXoW57UBnfeM.eDWo+nPhtyzvXZTGjyww.ii87h06aNyCTNFA1gBy5q7CiRult3zCG1KJLRAnunq2UIDXKJ30W7mxOLm3Ty9RY1zEUFNFwxGeHgecYwn3ik0vqm0OC9Fb03k46Ohe6tP368YjLJrkOOZ53XpjS5p7gek0CRua95P9ZGNWLxTDfB5MUTYXMR574qLfUbCIuDc7v9SyV8nO2hKeKgfz45cyLj.qpbXcSTNmRvqDzy+LcODc6GgXzef5t4OfkVtXlAsgbPCekNDMuSM2DftNrnVbLGqmyJaOOBNiVyVVe906Q84JXnAfLITNptALHwHuBcXdMWBypgAonusMNXCYkOGCpF+V7X0iihjXo0sz97JyJM2CAUDjKaUcJEI8U5.5uJg7bUm5+XMi7R9KW2Npe0odJ3+3hFsI56HBFisRgwnevbYCJNDCuYYxbJApS2kzp3Nos6mNATRWF0Q7FbtGrSD7MyCG5FUztDbta6WB8TpyP7d38b5bxbYHCoswKrdOnN2EvqVovN6ZFMSzdsK8RtGJVsv30Kl5fp0X3rVAw+fuXGTPN2aPAopbFFFePuN8uecB5wjOEBriDlc6UMy0qD7GkqwXD8kO3SW+BV2nNVgUy6pyzHPDN22fU+3n1VP16LtdZOov1wsS4GT+wRWbJ9Ewt88xIUO8RSWZ1q8yVuz.+OkiyG3Nz980nLJdPWATFVvIHA3yWHDso3n85N3iR6UgIeFuLFNHh2IbQorzjatytu8G5+z9Qf5VXyaHKu.oX0a6878qDWIj74HVi.oOjPCte5l2wmVagild45BPQzYnH9c.YhnOSYaHgWa1DmJixTMv.9k9b21qqKZmffCpxO85juglufw.du6ES8h181TCXApr8h6wb78B19chvSlAVw2V+O4QktyY6s6gNCKYXcoWQs4zsyjluCu021wRSDZfl82QmFIgyPf6ezhY+iPOCupWmeRceq16L7zGq4YD4jQEEtu8dGIUaxrnxZzNjBk7fil1+8RmnsOxt8NydYmhLtCueS9EElNIfKugpUF2N9GLsOISAu0rHDlVNDlxiv0FzjV72hw1BSwy0ICKBltFjp2w1mWaYpPaR8iys2VSseDowhCB9n85xN.jWx0PTmMwt1U9QH3sh29prmfFJ8iG7LdyTZ2uo9LZ4.dbr7HvjoiziKVM6WSBy17GGpcVOlqKuSc84rWr6JFOFb0e4E2j8Ehw2UHK9zOc2ZopsC1NN2uQs7.Rwy856P6tMuCFNqQkmgx5.Oz.Cn5nkQOr9pkoYVTWI2hN6AjQjCydWGcgvXWDnDgyosjUf2MNqzavvE42RxxwXzK.Sr0duOIAwOtn3wcUn+J2JipOcAu64u+kr9NdrE7JlD6wukHyKyyVwX593b01IdfkvS8nJXsZcOfKGeQiGcMhuSwwEI58ZDiDCKmblfOl3F1PQDybaXPkvkdY0wEiijvDJ65wRbF8tP9N33ciUSLY.6bpHi5x4cbwgvv+irS6+98B6We+WIH9i6F1J+s3iHyOw8Nr7VOTPxPDkn.0AAN8CJ53qyUonG2XJc1Y6c18gKZRNffx1AFeiAqD.sY9dEmKx8B+bn2BEmBpWmSGS7Fs0mMnUQSUvLkTmouUbhiEjwfsepGJ8HrQVXaadadNM4nRw228Fk+1SHvciQk0s0xxz1MTKBysMnw8Abn1cdQZwQUwIOs6wFvjihuU97or+fo7WX7hDx2.WgvuHtzoPHlKkuKsF1rMoF1LuPWoxxOsHidSDR1bjaP6XSnqDaJ4wNIZXaZ4tNVkmp6TwTzsNBEKL4mr2SeiJLcltd1PyKyJyMvLj.lk7l7SbF3Nzq8rrWYXjv52uxPL5RRIu1pHVR1KewE8EJ5E29pvRlby.DM7GhLBf20GDK8PF6Qhb6vhDXYsYzv5d3jm67zjuvhS+TBP4I8LVYvonSGpW.dh370m2mtWSoCUfJoNkB71stNVNlpxu4cLlL7rAwraaE8JrmSNYMLcv.Yb57qMCEFfjiTBLd3tlpRyKtsSqUjMrRGy676+.c8fSuAjsgCUugfHccajCzUtSkfCDM91RGTZ9fS0QdpshkEzggGzlm8PG8vIt5qsbuO6g8DOnoke4T5rvnv6RnDwSM16kNTWTEbikZY1rHANAnkt2bi1VXPvJ7oxqynCeV+9PE7XiFbiP+7VUONF.shn0PqEc1YCrBBWo75jRPf.bVp2R0gSDxEN1QLmoMzH+hZMBHsvp.1Oca2W816sI5fG1G46agffuoq7e1BrORhOWC6s+tSJsukZXbGyXVFx1ox7USVCbhq9TfvAOw2.gcb4EtRWO1ngUNvKUv9B5ZSy.qwt4LKOYbblLDPewKJ0ZgwfgHzppM8345c1hqB1ZoFEHsfUkzXLm8xfADhlzXx+Jaw2udQJF7e7PRbybqwAFaLX7meTsTfkWf3X6glOygQYho+LR3Jqj0Ktmbp.NIWemZyCxwXaCpS8khgZ1o1SR3X.Me2RAedl5aZbbrhBe7qOOBOcMDbDQ7mUmKLMBp+Bz9Zc4cRfPkyhCJrBUQQeyruxNPjU+tcftoZylxtV.0QpCnWjKHQBr.R4Mz4iLcjBqK2TrFwvGkW4HGrDej3RdePYLf.1+loqUmLAqo0YRHAoR.1a7s85M0wOFjtbGsuiqsqGQl4C4FuN.N6CuSPcPNVPKLDdyvCGWXBXq3ogaDVrOPP9ghTz8Ck86xj7IJ+FSDpRRLWlpcN6XxWn30t+3nUAhx+DB5H8S+7NZVfsata.qRfhbNcF+.bM.BBd76zTn3neEM5QZs1bPSQ5m.UwFzBE5DZ9bMpB7jbDuQ0xowfw2Z7o9n2JUfBU178RFIrBafo9EfJjbe0TbpnPQgzRwLGVHVp7knYU9hArgGuWG8hUi0XNm+cGaMy6B3kgMnZWOhVQwC345EhjRQg1eb3a7OPhUzKNJp55NM7VHkn.G0QX0Jbz39qr4k+5IWjX+xAtJDl2+3gAPMCWgU1wTh2AfE.IXFyQ3RtzOcvxZ0YLzg2geZMAtHA3CHnXWDGCKX5yuAF4uzkrTfsV+DpdqarDBpTHIyIiiF.M+UT6SHMpB2RSP1L9aHx1.zqEaoPSae2gh3ojWNBVC1G9B1Qlxf7gN21y0GwIdcZAlBW0LbCChbq5FJIXxNIrhI9ZxpAiq4C5JmrAypCMa4m9JL51NoigqOFO7ba3YTb1begImv5xKFvazYJihGmP2S0jbk.Q71DvCxHHuLrn3yZoA88IP36WFv1dNCHl.nvGYNAD3PVzjWCxmVEpyeos.xLhfxAnEBr9.XZ+FJpQuRG+KFcp1r8Ov8N6dJ8iOTf6uT1IAabu6Th87aJheXWFxUZeg0ozlLGUl+8IiB49Gqcf3b5H7tTIdDDQTA0UDvGwRaDOxjjYbjR.TxFs1HZxljksxMfD41Cx9XNrg3Ycqxgy2zZHoOJGdQfsSgPVlQfcQScL5dPmgCIokoegN.scDNsB7Ux7GLJNbSChPQnmOQnSVs460TU4umXt8JAOtn56U8b0jmjGIA8ErVAODjmzCMc8b7ajaRoxGXN54Fb1dlKa787qZpHQOYcCAYXRUcYEEcGnJeEVXMfzXoR79J0z5ceAvRK5A50UDhTqQmNLjZDVafNAZfyKrLpvDDQPzxQQQQMk9IwZQWUtS1uSfdABIOVNtth8czqFY.eL91A6tHlvjW.gCNrRK9MCEOzZs2wfAuP5qUo1mxSeDuZcMfgJGNbsrfhU+fG9UvH6OGose23bli7beW4ODznOwxKROAF4.wmGsXkGMhNUZofZ57MiwVbm4GKYhVpIihjU9j6vm1vFVmGrOhSFOvRdFFJrzcCTkUnOEfLsvcU8cuDdgmHGerlCaUIgtCbQzyJwirLlUrlnTvlno7nJNGhpZkm+TxfinS5KBWydOuS40xGWIwIF.KjAfJQBcxkFPsaMOqGMyeAN85S1Y6hwdmDUyMK2I5OLQI3UQy.9WYyY+0gEnH+ksmULT797wfJ.ohJK3EqA3koiU9GdS.YUJWhaHxDXHEDeWEEpYZIRi..fOKow7uXAy.+9XTsQGpk0vcn53TP0O+aryoHq9WAi7tI4hQldyfdX+NK6o2MnLc2pe40TL4.bWseJUVLW9HQGK6npZcu6ajohaoc+RV.i0WvzEF7ImPqKeh0LT24hgoxtwUJqZzeliUvHQesEZxSR1VOlyLetqYk4RvfDrenRgavuSKZshA2ticx0gT1i80P7Dmu6lkPsmfZ3f+yvSWXh8s15MiyTqgD+5ovVHDBoySAiV+gDD1wXwmmJQfdLWHiA7Khfr9mfJd+Dc.vNj3tVTH.11mK3Ihs20.LQTyghE2tPkNZ.YZ.sCCE7kDXoDNKE0umEAd663MIsoBriU.stYhGkPcQD1Pudf4rfijFFD85cSohLWEpqW3UvG5vzY27jkiV6gxc293B3.jy8VzkxFw8uDZb.WGZHgSK8R8K3IVh.vnzuR7NHNlWh8OxSdFYOlXhIL2olTyF2i2mER3ItlJzqdmlTnjxYwEsiGs.AkmgGQ5VCSSfuAWjOnAcllQBMuwBx5iGywKK+dXkgS+DTARU1VsYPO5L1gYz37axUmgSEVsRnbBm7sdBmzjbFZLiGuu8TeQA4S5.AiZeSds.ujt2ZdMug1JSqRjdcau5K7KLGIjhMJb34EiDRkEWuOyHKuJn1ReMQMiti3RuznUTaQlRnus74l1cZkV17nuYCp7AgFRMXOKOp+789NHHr5bccMqeRqL+CxkpfOH3InqieMiyQ2CV2FCugsmopw583TN0icbWq3Y14dBtZnKEiCba.DQ01pzRez3UsDyHEqkWakt5IgMg9L0JkMIMaGfaG283ks4wPSxJOdhuejkeUSI2PtYsUKhSmag88VNkETk4sisLhCBpnNWsSAnXU2maphQeky9VpDeGz3To1FR+iuXfxrpf2SMsLdLX5089aOyzLH5ps5wutsu.fupMZ5UpWkNG0N3OViWmFf9z0ilzBnCJGZV3Zk+Jy1OJR0bL3Krtvvdnb+8M5cr57z7NjaBRS3UtA5Kze+F0FaPE+3LcPhUZ7bRb5i36QkNY6dd1GSRuOAr95su+hKrnN6iyMdFVQzaJ61uoPFFUuHRpeGAl+Pf6WajJ9Q.ut5PCTN3sJreQ71t73CJVCtPv4ekkWE6uAHFNxe7LlLwdyw+nsItNfke6wc6BwPwH.U.X9HwfR1fiGIMoTU9i3ldeQbLnFsoGGopeq7.e8iyYxJOHt1YmM7zKOeBd3D99ldOAQ0zuq1fGJ3LZxV9592wuimZdTsXdwOqr+5HJJRW+QZ0Yyo4RWSCZytkqmKg9i41Fbi9o0WEImUKRxZ3mETlai5L30M6EYu8Wa.eM4s5eHS09VCGMlvF2TBftVCCAAukpY8tJpkKD7wmIQJkW0mWnkuI.6uZ4863z0TjeqpwJ231T9NZ7F50J01kx8FBlv.01XMZKrChUSJRJ9xVG15cV0dazKbBFx3HD4WtCOdm8YKS3TKEgMrP50WeQZoksQ2rKBjBcjqSjE.aoPjF7.B.XQfOXcRqUScgBH.L.D1t+9U4haDd9RVmtH6q2TQZYhvloQf1sJgywwoe2Plf754U7zWHqDH5RUSYOAS6UVTehvqVA5xSe43e9xXS4qbXtrV0EG2r67tb5sMRzmqmwCgNaWpBEnvQMKyyq4qfob1Jv2q8okDnxYGJUpzw570BDKLHaLXhJ6FBuh+iKOFLltuVfe53YBs1SnXi149BMEXuywUy2fArnJc4RN+9xsh8pJNoBbZbnVYTpiSUeltpuhPWnMyF0m97sflphLkTC72vTPTQoarWKiQuheqZromlxmsMru+9Hw2uQuUtUkVzg8JZMx008bXJfts.ze3A36Swe0sU+ugb9+z++Iv38WejyymgI7HmW0jmaNrFk6gPVS69H98ZyQg+f7DYlKw0ly2HMvZNvB9JvJQvBFa0nY9243eciOSdRmz9xuy+nkWsdANEc4j35sYR7V+1zwNNQVBZa1HmxaY3NY4TR45ZA6YemNA63eHk20EU9hq2s2pqB6bJ0zH8lDslIkWvPAq6vsWGNVQ9gLtKe1+w9c37viN92FQt1b7BlqcMOHv2OyUUO7y9dldMM1NsJ0s5O7wFzDXiagkDhDi3ojXYPWSMqS6.SznXHZPa1ZX.2zYYdACD3I0wzXawbV.DaxbzSg9MQP.4c0u9D8hzG3yVzizi5NrrsQJM32vZBOFqmj8913uRnNA9vro4OaWqdxJHmJ+EL365wPNb0A61Ll6merAigzXE5zjVWD3wzulyAp.Vtyhz+jm0mQuRiZUTt+gPElbGneDaIBfxmzg5SP+hKUzC.69ir3hVI78R8zEXuPLrovYHLhjnMe.RovLET8OzQjnQagypjEjIbffr+HL2Jk99a2CO5f1N5Y68REnhjdzb9QCqtwNeuBSuBqlEXxCcVEHm+fgqYRyXrBqR3YDlHumIpnVedi8QyJniBKutVGF6nrsi+v3wY4qfqzYXpCJDL5vfSpkSJLjfx3Sh4B.UXjl.oLqOlldaeJ1ToGvAvxgi.Ekebyczj9H+cHgoiwFD76bU8PCK3gaqahZp7ir7eHkWtb5Ue11qGC9LbxT61m0KQzxvqcJRc1OtZxH8.ovdX6CfSOnWMq2SpfBeyx27RRG5BoNPjbhFHFrScnmIdtUbOHfLouoYqhsHYUyP1Z1APvrceBFzVDh7cKk5BydiUbxcn+b7HQufJBybeYLM+bEHu89mTSsaZ7URTeWC3pTH89OCCZZV4GFjnkoBpi85fl9w1IpJUkvWH7MBuhEyPXQRaEulTSo5voaMui3r+hZ7fdQj7EQX5PuQ+DRri8SYgn86m4q.7jIBaHZYqjfGuUZpkmb+UN7.+sDv+Kat3fs38SQerlgl3+dffld6u0wC+dff3Ocq+6AB5F.Ak.OXrex68V0d6Uov1InFLXKjT6xavGWoFCG6Yl8MdpKXxD6tt+a20fzzO78K+fUvhEjYjOcl0aUb9MccaB5SJlTF50OvJjzVUbbtQcXaUa7qaFUq9laCJ2080YPRsWsTl4p2CJO8dD6fi6VVM08T4Q6Wx5gqc3drBl+Dau1p+CKpqY1dWknrZdrRPqxiDD2QPiC2og7A9DFAiAdyyb6gKiGCzmyDAATQAuasFSwHyLrD2tIxlRKznQoKlKSrrVSVtnNkdzprKyuhr.TTKWpjpRqQ8guD+UMcpUvldg1mBnCTu46EmqCtHbLRfj2HsVqCuab3BvvKdj7rMdregvtsRQTFNxcDc+Mbau+R0+ghKN25YdC4M513jUIMWmwGXFk08iEi.n1WqeDnqncKWQHbxvnvP4lWFd8NPAG3iKPRlv4K77SUnRsRhGTcbbXg5Qr2X392gZvAjSHTe+f4UO2h7wRrzN+P8b6C7dPTIN7AhEfEDtCmGTiw63qYQ3Rp7O6K6BhfUUOwrGXZbkQ8n7idoodV1t7uOSo8ppeuQc8EG0chwXFUaFYdxHNWcNU73EzbjObsdmYqiUks5edvpF1IHqFxybwlrCd9fln5cGqC.zNCY.LWpQOtOWPdnSzBDrb2UJrL9N9AjQFYtwq+jDxxNMpr7SIE4ieFUnSL5nNKosRpUhEWZzgOBuWxhV.qp+wYBcbLEV+pR.Tg44ebxP9BR7x+X4.Z2.aDAu6ZbSZEwpCA.WmmH0hXi8Pdyp8B98AIi5WQGyphlUUHUlPEbw.2Yn0Kk9JFMAmNwwNYyMfN632lxsmn68fPuE7zC7LaWSCf55sG5B6JWecSwhA7kERbMpZckcWWZp16q7f5EXUoCX+NNM2Bjip9K7QfMX+Fo9h6B7wpKKepbIu49r7YnrFygH5Zde7YJEAJtcAb7uhFbFWv7Lqi8AKIWb6O1kFrY.sRo4oNl3EkR9vdhm1Esc3Mu5fCVpmT8wfP91gITjhWLVpcrdRHuPMdfXb1MLS1nF+7ASjnfIc3zgycuNqMeikXHpSCY4SBhBThR5N5TxRyzmGW5uX95OqwwAUsdj09tP4CncSM4JUlrPD+H6yzL4CpLE3ekiFweCs6P+xweJLg0GhCL986LGVcslBvMUB.6xA5slfuHdY7Yl4ItejEOCj6O6nHzAxNAktUFQaC.Q4AkYpPr2MY0CNw8OrSbXE0V4bhqRGUcek9bYtmvrfXKklgm6qq4s00vP4J2fdNuolpBzTrzNedu5phgmgXhV6TjqPbP47pNGt914D1zCs.R7rWemzx1DKTy2bZt2KuMJyrtftPawVAJMjTqtpQy+Hcx6YfyvxtnhWW2z.VMT883dYpGPpsV+wh1qghsu1B5xknl4.04TgYuVrRJs.DOPpyJWHhF6LZoxPbJK2i.dlto2znKTxEqciIeAfUn7XrnMzGN8Mw2RZ330D.RHpPqWzzCzrIeMwMh4nDMlVK2THpKH5thkndclSQPZXBDo8buXIPv1AUeMsM4GKzytFIM2rVF1Ldu6p5Zz+55L276Cg8o0i7yNwiie8efIFbCn32ruNOQJwbV0uSlK2z85IWCbfjTz8jVkY3lUBTflkjzjrRMlVJQpWS9n6yoZmNTOr5oGOYKccylBmT3IpRBlNjoyKg16IWIE0FU8RxBWlmmSbvSTGxZiTT3LxvPwLhrYKB+ajD4Dkcgu3wwgfEiI7.2GzFCkZ4oNC2waurKkcNlEGPgjLk2JMWmRBQc7BICnYqRdLvYvdtQW2vk9UUm9ZqwMi5+0NqG+54xzT+wb4OR98RfwhVor+XwznW8t4PzpurZb+ba9xnb30GYEhgUHpGw+c..kQPekQUAIYpJevoBooF2CVJFuo1wK1tryuZUrsT8e4ndKm7jXGM9Es5no6G7yZon1dNj1bOh16Q+8qvllvAmrRXkRtho3tGqkiJdA2hTYZGivlrfyZVYjFdQ9Mls5ovnZd2JSmuXnLlqP9yW9ANVvZ9dSXvCctZaGuAUB+W32Lr7bvUbuUmjy9l6v8zWJwmUJBXmBZwUe4Sje56Vck6jldSak1O97lAiwItB9rW9cp46eck9QCmaWoSCEVRGVDtDEM7o3L8k062ByC0DyY86uemPhnNDeVLMbZUNW1WLtij6nkJmETXgto7gBvpbsA90B8AwBI7t+GdrI.sSgBqH.0Y326QIvulP7vQhHBPJjo+rfyAsCrmFGBeF1lFY8Nel16SYnAcNb4tUZqvakPf5hqKwR+B02EEujWuv+RqFbrc+90m6OWoedqavgQQveDGIVXQjBMUbRhM5SgW70+i.fDjxi5Cqc.c.r2ZKiDGHmbACI6nK0.mjmEeV1ZSPdrnfmmzkcm7A3y4UshcD.9PeoLD1NIgR.fyx4kaGLMGPbswaHnovxD7lHJDNBwThAXhwxfEbBkRSPY6oVC6pNi2JYeAa0sc+7Pi2Lpb0qG5Cl1pmCqm3wGWD2H393L1vC9qi5onY3WdFA+yn6VBNebRvdWm8urMbCJg61MCBOVd5zF99XeyTtvQsLfXKyrTZl7LYIOR8wmexVD2XhPKRyX+ixp82Q4MnuHSkR+rg+VvPDK73z5NCXRYW+M0dLDNv5mK8hjKY3woj2xYP.HzYX.QTeLTqzZS88qHuU4.EA6rAGAAGsA041Ns6PQcgz8qqM.suBGMMpBCUqo02hAksX.0e5jXTLcZIIq67KNs9t11BUujLOeNX9AxWBW2LjHfAcYPBcbt7Wuv20+jonaF2TmMszVhpPQVYW4zCsKjOLx6fs+cHP80Wjl9CEByGVm42bNh4xyreYX6WTB9HIGXBqjXbg4p13z0vXzIpWJjz.zEHRvTxPJV6+V4smb4WoGyyB5fLU9UQqXUzfBOtmnUFncjyeE6xVocpT9wrc5q.XZsZvr+WOpzsBJrb83xtVAVQezA0OwrWYSqLxPZQIW4ZBkW6UOenAW7mop7wzSDGVezlzgOVWaFuDc4yOWJkX++qXt95osQBh6fpqNmpHc2q2SV7DbkKJNg+DZUkNffyAEHPCPq.gp1XuIYabrcsWSHf3Cw8M69FwMyZmDGRLP2SmtGRTlcl42L65cl0VJ9moSwMga.n9ET+C6YW7zZ6Z1n+Zm8saL6t0Gq+QRuiOm0Y3I6+1C12cy8JcwNeZPq86u44eu+agtIlCpWiDdhmwvS8s15r5tFGT0gb6sUZVy10vH5r8L5Lr0EP4wIqc6EPa.9Wtw6nT+aVpEPFnKdEvGzkwo5tdvWWyH5GrkYwB4SwsLECncXgbZfYjqEm44tzh1fyeFc6HvqEWQu8HMcVQ2q02VtP96JjWC48lFVHm1.8pMJ+dcHrlr.nOdx6YNDDwqYtFqs9RfeEw95Kilg9HHkFcnwuMCwFrTCQUqSQL7X29D5sPDyhD3PfwTzilF9Ib.ia0MFZb9cTT+Vz.Q.ZR8IAH9sFljMH9wAPyhDRSx7eq76DCMcTG+W8YtgVqEH2K9myfWkLvyPR7VMC7JKIdqkAdUjDu0y.uUkDuMx.u0jDupYf25Rh2lYf2FRhmQoL.r5KBv6guvOTmP5bKfh7+ep7Ii.KYwiLnkcoiLnkcgiLnkcYiLnkcQiLnkcIiLnkcAiLn8DkKOObIEK2iJRQFaECo7Y3SsTGPNmyTa4Pr58iel51naO6Yp3D3XLJeP+xQSnKKc0jY2kFoEJmVnxU5+td0qd++lic2dzwtiRjIqlY2pY63VMy0E4VvGs.o64hKYMbWZ472kWK+840erp1smqN74GC7bbnAyUMR3iAOkiK4J5Hth90DmH5XCUx8poYMwW+xXMQq3GmMkgdt64x3M7oIxldN1HoHh+dVNVTI44ggec1d0HbBR6hIiA14SC3LLcxUidMyhFSBiZp0ng83d9BaS3hPkbugmvZjwrunoiGgyb6bJCRaFjAETSc8R4lzrn4vzBIgONV4UG6QqNinNSsWaaa+.ZKb+j8mL5CO7vuN8nkSFVXLmdCehwiBmXVuPibp2kWWeQHZelYy6t36zKWZEbjZrPeGxvFhirhOOCT1l.aYE5Ova.3DZ+pB4+jEKZj3+NQgbu90CH9cYVgS4ZMZaRjCeKeeJbznqEcJshJaAEQBag.MkJtgX7S85zwgdnm8zliTx4NcIttTGL5hwNKjdN0B1VkJ77fH5HklNDdS9PmGgzw6NlTIez3v1y.9jnTdz365ZmJ1qm+dkA3p33Kq+8e8GJyxlm+rJLKhfbXZxEEoc0DEPsyTD6IRultgL9vzzx5O.iiV5IYbzWZJ9KpGi2ly7ywElSNBUU+WjiI7zZA0ca2FtLOIAekp4WjkTVelv+IuHrp9PBOfA0vpPEQSnhxhlb8G.WM2BXYbrbITFWAZRcsEBX4XhRCTNWhRiQJU5SrB79pUbGSjIX+IwHPN4JXJWM0CQYcCEQWzzqy8gpfuZYMMTy3XYYcrhrNtprNtlrNttrNtgrNV84cDaRsUDzOLtrQQA5cHZ.mK2ttDXGnX2px+vevBYg
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Release Triggers with Sustain pedal support

      @d-healey Thank you, I will study it and maybe make some changes, or I will use it as a reference.

      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • Release Triggers with Sustain pedal support

      I tried to write a script with Release Triggers, something seemed to work out, but still I wanted to do it the same way as it is implemented in Hardcoded scripts, that is, to add the ability to adjust attenuation, but I can't even imagine how it could be created. I found this script, but here it is broken, it is always the most recent value of the table horizontally, no matter how much time is set by the Time knob. Since I have very little programming experience, I would like to ask for advice on how to improve the script.

      // Init
      reg CC64;
      reg NoteID = [];
      reg VelID = [];
      reg i = 0;
      reg KeyPressed = 0;
      reg Cycle;
      
      
      // Callbacks
      
      
      function onNoteOn()
      {
      	Message.ignoreEvent(true);
      	if (CC64 == 1)
      	{
      		NoteID[i] = Message.getNoteNumber();
      		VelID[i] = Message.getVelocity();
      	}
      	else
      	{
      		NoteID[i] = Message.getNoteNumber();
      		VelID[i] = Message.getVelocity();
      	}
      	i++;
      }
      
      
      function onNoteOff()
      {
      	Message.ignoreEvent(true);
      	if (CC64 == 0)
      	{
      		for (i = 0; i < NoteID.length && VelID.length; i++)
      		{
      			Synth.playNote(NoteID[i], VelID[i]);
      		}
      		NoteID = [];
      		VelID = [];
      		i = 0;
      	}
      }
      
      function CallReleases()
      {
      	for (i = 0; i < NoteID.length && VelID.length; i++)
      	{
      		Synth.playNote(NoteID[i], VelID[i]);
      	}
      }
      
      
      function onController()
      {
      	if (Message.getControllerNumber() == 64)
      	{
      		if (Message.getControllerValue() >= 64)
      		{
      			i = 0;
      			NoteID = [];
      			VelID = [];
      			CC64 = 1;
      			Cycle = 1;
      		}
      		else
      		{
      			if (Cycle == 1)
      			{
      				CallReleases();
      				Cycle = 0;
      			}
      			i = 0;
      			CC64 = 0;
      		}
      	}
      }
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used