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

    Posts

    Recent Best Controversial
    • VSL Velocity Histogram

      Hello, i created velocity histogram looks like VSL, maybe it will be useful to someone.
      This is a not ideal version based on 128 sliders (i know that need uses sliderpack for more effiency). I want update this in the future.
      Feedback on the quality of the code, suggestions for improvements, and reviews are most important to me. ❤️

      Screenshot:

      e952b42f-cf14-4b2a-9211-b2c273508403-image.png

      Snippet:

      HiseSnippet 3779.3oc6ctscaabEFFzxzITI1wIMM8bJpZZBUrBMAHAOj3DaKIKa0HYqZ43C00McD4PRDCAvB.JaEW2ld3p9lzWm9hzz66Z0tGfM3AQJGq8t9lnQQNKxYlMlM9mu4vOEzRaEFzRFEEDZja9aseeoQtWM+166G2akdBWei0W0H2YxuoHJVFZlVzx62WDEIaajK2bWUUPtBmzH4qu9hKK7D9sjiJxv31Atsja3tqa7nR25Repqm2Zh1xa4t6Xst5kVuUf+JAdACf7Yt7kM5KZ8PQW40Eplch7FWSD0yH26mW1tS8xsrDssKKqWGdSMKmNxcpVUZUuS8c1oovtZCQCKibm5JsciCB2NVDKiLxcxkCZu+18BdjeZGba2H2c7jp2XYrMzyoEuVfWa0snpTiU5450dqLgJx.tJaMR1lKU1dy7a511cX4ijuylTg4nHFW.ychISu4lH8rFO8JOV5MiTJ2XozISSoWO+1sBc6GOpFU9jOeTqIShzVYbh+0Yye9yattuabo48AEOBTeo4skdWyMJNX9mL+7Ef5WU1xSDJM6oJrqX24K.iYQwl6IBM666AMOnka79IwzMTrq4GatRferzOtjnc6sD9RuhKLqFtvRlkguW7iluvrptTjLt3BOxscbOnkV1MLOmoEzZSHmNmiYmvfcM8jchM2IHrsLbogEF51sWVokdVW6dRUKgKdkjjXh61HOWH7n4KntM2ChGtst+CR5bkf4J7b+Roob29w6aJBCE6WJsoQwhv39AQ2EZuSRy2VUhITDDUf+cMK5z+wKdfVeuCo02ahVeGnUVIs5NJUwrn0n5tFTmc4jJuVxs0vZ6DDZVzEpFp007BJkDdw4N2hlic6pjW7VFB4IyWnf5d99tOXxQyO0OXmhKnpZAXzvcowtcm3s2SomYWhIGHuyzUMbb3ZSWWT79dRnpEtsLL1skvagoaytt9KffzApP7XE5zXVWVY+sgQPUbkJW1ZFs.lTdK4iiWNPcM5H7hjynQsBC77tSOoz6vajzW.SoUKJrgTD5+LtZR+12V3MPdC+UCEceFMDxsjFtUP+A8Upy0ClktDLHRtszWwR6A3uRKJCeMcK2KcYmCqGS5qhIw8T07jChTNi.pMEOTN9zRyvfA9vRqSRUiO7nlW6Z99pK34gACmEmtarrqLC1MoqFex92beY0v7CLU+Ctref5pMryd57yCWxsfEwgYep0rFeIwjEwRpy0uKrtX5RE3TUrXnSyV4rzgsjSxk3lACf1KK1YfeK0b7hcWLMeguGaFIrZMDpvOYgVWEAolYlLWekfPeXhpheSV2.KV.uIFVktTWY7FAvTkkUxQTQmEyZw18DsCdTeAr1wno0sBkvdQaAEVLogiZjZF+MSkzaJaA4RWOYQwRi2+IQfIdn3QlQIAmjocKsirqq+Fh8kgEGgUcK0FZ3pgA8S6n0fkrS57Q86RlIch5TAQkdjabuK60umnX4GWN4K0TVamEWxzdIy6qd2CvKrneeu8gyt7vCdshCGj04vTrzL5fYd2cRSZXXJsqKNqLXkqn9ujLn7h3krCb1linLsGRGl9C1cGnMlB+1ld.UDUBtzOG4wDJAlGPDqAioEW3lhuncOguqZx0XZtZ0rhKTFJ89NvTg5KYBe23Aika1Uew121US5bXBuMlAVkGlBGhPNr4pVCeW6AKkrJwnr1o1K1r1oVVV6T6Hk0plenYciluXy5FMyx5FMORYsp4GZVaU9EbZCcPVdCuDSb6mqDOo8Sm4OM4rcv56iVOWM8ac+1vwIfihugnyvkzWIYsPSOQGyfc9B3xWZ7S6pVSGZ8TqclrX6FAAO7x9sWCNJPxZKXiKEBKBpbSsV1x8KntY2.lqKB2N4DWpccGtWvRpNF2P3nszzHM24Yuzz8gdnDrEi39kAUp3v2U4AvFv1Kp1cTU1dpM8yJAtnIYVZKsg3r.EeXyf2Obyu6.wXMtzO0wEF1T03PIOoe23doaqO0F2SIsnrlts8DCpY1KCGNZlsUZrpzIFIyZKjSWwG1jRhijIweijQ9hSYInCDznUtcy3mgCdPO35qVDeXII8yPPqHd6kHG6AWfjKFTXRoEb6.kp16N8zVKZdAPvT0lVcg8JoRfUB1sefOvdoaoBaB5jddNUCl7nZETGroPAIzLyot3exAt1CCchVoF3KaWVc5rIJGlrs3nt3o340FdlnLAe3PRorWo5mjRVQ34sCX1ezwfRUmTrWUapdm7+loVW3.haFuMqNUkUIkUzVIMoG16pxXS+f3Qiokl+fievs70gVjcXNHGgTzSwjlJddSvksnqLQYF1D0AKgzHChmbPScRDXtiJOSFRvFM9.CLpa9tuq4Lp5BiWX5QZWb5oL3v3zgeNyJ3ocUHQZbgx3Ag9oSl9n4OvWCkg.ekJbC0XzSvEJUCPcOn.N9vyTRmR1O3UrSmTIEpxbr5TKupLVoNl1LpNcj7YDXwziUsjYxhSCanQtSN4m9R9C+SeY7ObnVoq1OVCC7UeH.2nuz+v9HiLvsHLLx8UXVAMMN4yo4L3mSS5x+FtsMx8R4UZXYijD1HWgSk8woY7bGrEmfs4DbENAWkSvNbBtFmfqyI3FbBtIsfe4THoLqnsXEsMqnqvJ5prh1gUz0XEccVQ2fUzrXMaVrlMKVylEqYyh0rYwZ1rXMaVrlMKVylEqYyh0pvh0pvh0pvh0pvh0pvh0pvh0pvh0pvh0pvh0pvh0pxh0pxh0pxh0pxh0pxh0pxh0pxh0pxh0pxh0pxh0bXwZNrXMGVrlCKVygEq4vh0bXwZNrXMGVrlCKVqFKVqFKVqFKVqFKVqFKVqFKVqFKVqFKVqFKVqFKVqNKVqNKVqNKVqNKVqNKVqNKVqNKVqNKVqNKVqNKVqAKVqAKVqAKVqAKVqAKVqAKVqAKVqAKVqAKVqAKVqIKVqIKVqIKVqIKVqIKVqIKVqIKVqIKVqIKVqIQVq.9Y4VlW3V7B2lW3U3EdUdg6vK7Z7BuNuvavKbdTmEOpyhG0Ywi5r3QcV7nNKdTmEOpyhG0Ywi5r3Qc17nNadTmMOpylG0Yyi5r4Qc17ntY9yT3yVeUQrP8aw.9iIeqvf9pGva0OU9bqJ2yskL82ogB4WUF8v3f9IsEeLJLxcpzt8zY+FOnd.cS502J+rd3aMdrQt74T879YuH44QWkT+cLmReJzUk71XIpex8C6wy9M9ytOoOxm0GpWj7vqaja97YO75FYO24peGX9O+i+8+byc15h6Jd7nekXLuzvDK2TI1ahkL1yld1syXOI5YEcfm67gsbxmx7rhO3CKtp+N66k1e8EgfFLlXbHp7dYO+DoWRiif7YkJemho78NGSkO6T46kXJekOlJeURkuWlo78gGSkupoxWAlx2pGSkOmT4adpx2odCTaNdJe0RkuWQKejju5ox2qpkORxWiT46zZ4ij70LU9NiV9Nhx2vmmyj6kWSqezzOz2wY05GM8CMd75Z8il9gNOdCs9QS+PqGeGs9QS+PuGuoV+noen4iu62F0uCnKOux4QR+P2Gukl+nwen8iumV+noen+iuuV+Hoe1n+iefV+noen+iend+CR6eXi9O9QZ9iF+g9O9wZ9iF+g9O9IZ9iF+g9Odas9QS+P+G+T87WZyeQ+GlZ9iF+g9O9YZ9iF+g9OVPyej3uJn+ietl+HweUP+Guil+nwen+iegV+noen+i2UqezzOz+w6o0OZ5G5+nnd+CZ6ef9OVTyez3Oz+w6q0OZ5G5+3bZ8il9g9OVRqejzupn+iOPqezzOz+QIs9QS+P+GmWqezzOz+QYs9QS+P+GVZ8il9g9Or05GM8C8eTQ6eij+spn+ipZ9iF+g9Obz5GM8C8eTSqejzOGz+Qcs9QS+P+GMz6ePZ+CGz+QSM+Qi+P+Genl+nwen+iORyez3Oz+wEz5GM8C8e7w54uzl+h9O9DM+Qi+P+GWTyez3Oz+wkz7GI9qF5+3xZ9iD+UC8errl+nwen+iUz5GM8C8erpV+noen+iqn0OZ5G5+XMs9QS+P+GWUqezzOz+w0z5GM8C8ertV+noen+ieo97yjN+bcz+wmp4OR7Wcz+wFZ8il9g9O1TqezzOz+w005GM8C8ebC89Gz1+.8erkl+nwen+iekl+nwen+iap4OZ7G5+Xas9QS+P+G2RO+kz72Fn+iOSyej3uFn+iaq4OZ7G5+3NZ9iF+g9Otql+nwen+i6o4OZ7G5+3Wq0OZ5G5+3954uzl+h9O9MZ9iF+g9Odfl+nwen+ieql+HweMQ+GetV+noen+iemV+noen+CgV+noen+icz6ePZ+iln+iVZ9iF+g9OZq0OZ5G5+Pp0OZ5G5+niV+noen+itZ8il9g9O5o2+8Ht+K9m28xnADWM.dDAvLADcf7EZAjn.hVPdnV.IJfnGDOs.RT.QSH6p2Dg3lHnKDeMARj.QaHAZBjHAh9P5qIPhDHZD42qEPhBH5DITOEl1T3r+TnGoIPZDX1eKzi0DHQBDchLPSfDIPzIxdZBjHAhNQdjl.IRfnSjGqEPhBH5DYe8TXhSgQmHeol.IRfnSjmnIPhDH5D4OnIPZDX1eTzepV.IJfnSj+nV.IJfnSj+jV.IJfnSjuhr.9ZGyEPzIxelr.dli4BH5D4uPV.O8wbADch7WIKfu5wbADch72HKfux29NH8VgAsjQQAgF4N4sRDvyleyf1C7DwAgqzS35ar9ppBuJ7RrB2.eik2uuHJRBpat4V2ONIoTIzISSmu9h4NwUZ6BWisiEwxHibysbP682FTE3tbt7VF2NKgmKeYisC7BRekwJ8b8ZOLqTe32Omo3qmeK23V8lcNdhYjiFFuPxw4RywSm+Jc5HaEOJAOY90t6D51++59aFLH10u6lh3PWEuc8A6tcvfvVRn288kdQJt3Dp4KouubFm.zT6j27eguvJsTuOGVoUVkF6J.98yaE3GCXLzo4d4jRfbxWrqZ1R9MUu2zxXOE5NtNuK.3edqVSdolJPapAVgZfUoFnC0.qQMv5TCrw2bfp0et7f3fcSm1XXr4VWYUQr.Xzqjr.UBsZ7+.J9soE
      

      Code:

      // Init.
      namespace VelHisto
      {
      
      	// Declare histogam
      	const var pnlVelocityHistogram = Content.addPanel("pnlVelocityHistogram", 0, 0);
      	pnlVelocityHistogram.set("width", 128 + 10); // +5 from left border, +5 from right border.
      	pnlVelocityHistogram.set("height", 30);
      	
      	// Declare sliders
      	var velo = []; // Initialize empty array.
      	var startposX = 5; // Start positionX (5px).
      	var startposY = 5; // Start positionY (5px).
      	var W = 1; // Width (1px).
      	var H = 20; // Height (1px).
      	for (i = 0; i < 128; i++) // Declare 128 sliders.
      	{
      		velo[i] = Content.addKnob("velo" + i, startposX + i, startposY);
      		velo[i].set("width", W);
      		velo[i].set("height", H);
      		velo[i].set("style", "Vertical");
      		velo[i].set("min", 0);
      		velo[i].set("max", 18);
      		velo[i].set("stepSize", 0.001);
      		velo[i].set("showTextBox", false);
      		velo[i].set("scrollWheel", false);
      		velo[i].set("enableMidiLearn", false);
      		velo[i].set("sendValueOnDrag", false);
      		velo[i].set("showValuePopup", "No");
      		velo[i].set("mouseSensitivity", 10000);
      		velo[i].set("visible", false);
      		velo[i].setValue(0);
      	}
      	
      	for (i = 0; i < 5; i++) // Make left border rounded.
      	{
      		velo[i].set("max", 8 + i * (i / 0.5));
      	}
      	
      	for (i = 123; i < 128; i++) // Make right border rounded.
      	{
      		velo[i].set("max", 18 - 8 - (i - 128));
      	}
      	
      }
      
      // Paint panel.
      namespace PanelPainting
      {
      	
      	// Start painting.
      	VelHisto.pnlVelocityHistogram.setPaintRoutine(function(g)
      	{
      		
      		// Declare assistant variables.
      		var CornersSize = 5;
      		var a = this.getLocalBounds(5);
      		var Shadowpath = Content.createPath();
      		Shadowpath.addRoundedRectangle(a, CornersSize);
      		
      		// Draw shadows.
      		g.beginLayer(false);
      		g.drawDropShadowFromPath(Shadowpath, a, Colours.withAlpha(0x000000, 0.25), 2, [0, 0]);
      		g.applyMask(Shadowpath, a, true);
      		g.endLayer();
      		
      		// Draw gb.
      		g.setColour(Colours.withAlpha(0xCECECE, 0.20));
      		g.fillRoundedRectangle(a, CornersSize);
      		
      		// Draw velocity numbers and lines. 0.
      		g.setColour(Colours.withAlpha(0x000000, 0.25));
      		g.setFont("Rajdhani", 8);
      		g.drawText("0", [5, 17, 7, 8]);
      		
      		// 24.
      		g.setColour(Colours.withAlpha(0x000000, 0.25));
      		g.setFont("Rajdhani", 8);
      		g.drawText("24", [5 + 25, 17, 10, 8]);
      		g.fillRoundedRectangle([5 + 25, 7, 1, 16], 0.5);
      		
      		// 56.
      		g.setColour(Colours.withAlpha(0x000000, 0.25));
      		g.setFont("Rajdhani", 8);
      		g.drawText("56", [5 + 56, 17, 10, 8]);
      		g.fillRoundedRectangle([5 + 56, 7, 1, 16], 0.5);
      		
      		// 89.
      		g.setColour(Colours.withAlpha(0x000000, 0.25));
      		g.setFont("Rajdhani", 8);
      		g.drawText("89", [5 + 89, 17, 10, 8]);
      		g.fillRoundedRectangle([5 + 89, 7, 1, 16], 0.5);
      		
      		// 109.
      		g.setColour(Colours.withAlpha(0x000000, 0.25));
      		g.setFont("Rajdhani", 8);
      		g.drawText("109", [5 + 109, 17, 12, 8]);
      		g.fillRoundedRectangle([5 + 109, 7, 1, 16], 0.5);
      	});
      	
      }
      
      namespace veloIndicatorLaf
      {
      	
      	// Create laf object.
      	const var VeloLaf = Content.createLocalLookAndFeel();
      	VeloLaf.registerFunction("drawLinearSlider", function(g, obj)
      	{
      		// Draw gb.
      		g.setColour(Colours.withAlpha(0x000000, 0.50));
      		g.fillRoundedRectangle([obj.area[0], (obj.area[3] / 2) - (obj.value / 2) - 0.5, obj.area[2], 1 + obj.value], VelHisto.W / 1.5);
      	});
      	
      	for (i = 0; i < VelHisto.velo.length; i++)
      	{
      		velo[i].setLocalLookAndFeel(VeloLaf);
      	}
      }
      
      namespace FadeTimer
      {
      	
      	// Declare timer.
      	const var FadeTime = Engine.createTimerObject();
      	
      	// Declare fade velocity indicator function.
      	inline function FadeIndicator()
      	{
      		for (v in velo)
      		{
      			if (v.getValue() <= 0)
      			{
      				v.fadeComponent(false, 250);
      				v.setValue(0);
      			}
      			else if (v.getValue() > 0)
      			{
      				v.setValue(v.getValue() - 0.020 * (v.getValue() + 1));
      			}
      		}
      	}
      	
      	// Start timer.
      	FadeTimer.FadeTime.setTimerCallback(function()
      	{
      	
      		// Call fade fade indicator function.
      		FadeIndicator();
      	});
      	FadeTimer.FadeTime.startTimer(20);
      }
      
      // Get note velocity.
      inline function getNoteVelocity()
      {
      	local i = Message.getVelocity() - 1;
      	velo[i].fadeComponent(true, 1);
      	if (velo[i].getValue() >= 0 && velo[i].getValue() < velo[i].get("max"))
      	{
      		velo[i].setValue(velo[i].getValue() + 3);
      	}
      	else
      	{
      		return;
      	}
      };
      
      
      function onNoteOn()
      {	
      	// Call get note velocity function.
      	getNoteVelocity();
      }
      function onNoteOff()
      {
      	
      }
       function onController()
      {
      	
      }
       function onTimer()
      {
      	
      }
       function onControl(number, value)
      {
      	
      }
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Few questions from a newbie

      @ScreamingWaves said in Few questions from a newbie:

      @d-healey i would start simpler as well, but that's what i need at the moment for a school project, and i have 5 months time to finish it. Would it be that hard for a newbie?

      If you have such a small amount of time, then don't waste it creating a plugin without scripts, because you'll probably do it quickly without revealing your full idea, so learn programming, at least from the same videos from David Healey, he explains it perfectly, I only know two languages, it's Russian and Serbian, but even with the language barrier, I understand what he means. And I have experience using Hise/in programming - only a month, or even less. But I can already do many things that I couldn't before, and I'm proud of this result. Of course, this is mostly due to the participants of the forum, David, and all those who helped me, I am pleased with the fact that it works.

      posted in Newbie League
      It_UsedI
      It_Used
    • RE: Hise won't open on Windows 10

      @bendurso I had this on Win 11, and after clearing AppData path (Use Win + R, paste and run it) %AppData% delete folders HISE or HISE.exe.
      You will lose the settings, but Hise will start running.

      posted in General Questions
      It_UsedI
      It_Used
    • RE: How to control loaded samples with preset.

      @d-healey oh shit this work... How did I not come up with such a simple solution? 🤣
      Thanks again! 💕

      posted in Newbie League
      It_UsedI
      It_Used
    • RE: Few questions from a newbie

      @ScreamingWaves said in Few questions from a newbie:

      Но просто из любопытства: сколько времени потребуется эксперту, чтобы разработать что-то подобное?
      15 каналов, по сотне сэмплов в каждом. Чтобы загрузить и скомпоновать их на семплере TX16Wx, мне потребовалось 4-6 часов. А как насчёт того, чтобы сделать то же самое на HISE и сделать из этого новый плагин? Вот эту часть задачи я пока не могу понять.

      Advice (Soft):
      Channels split - Adobe Audition/Cockos Reaper. (10-30 min) (i have script for creating sampling template into reaper project).
      Auto mapping by sfz - sfz tools, or Manually write sfz with NotePad++, (1-3 h). Or Use Hise sample mapper (5-10 min). as I understand it, the idea is to create a vst based on Hise anyway, so the skills of using the built-in sample mapper will not be superfluous.
      And, the amount of time I wrote about can be spent even by a novice, the main thing is to get past the feeling when software new for you, and then the process will be more or less focused on specific actions to get a specific result, and when this feeling of novelty appears, then you spread through all functions trying to find the one you need. This is where most of the time is spent.

      posted in Newbie League
      It_UsedI
      It_Used
    • RE: Few questions from a newbie

      @ScreamingWaves I think it will work, but I can't know in advance.
      I use this naming format:
      Mic1¹_21²_3³ [A-1]⁴.wav
      (You can use many of your custom separators into sample mapper).

      1. Mic position.
      2. Key (numberic type).
      3. Fixed velocity value.
      4. Key (string type).
      posted in Newbie League
      It_UsedI
      It_Used
    • VU Meter.

      Hello i create a VU meter, maybe this someone is can be needed. 💕

      Screenshots:

      43cc2ba2-0bf0-4f54-898a-2276145fdc96-image.png
      fa90902a-ca67-47be-a25a-64e97d66a57d-image.png

      Snippet:

      HiseSnippet 1929.3oc4Z80aaibDmz1zHRsoMWa.t93B2WjupSgT9e5P+y4DaqbF0JVPxIoEAAGVQtRbuPsq.4J63FDf9Xet.849goeQ5Gg6aP6LKIMIkoUT7YmKoUA9O6LyN6r+lYmcmwoanzkEEICMLqdx4SXFl+Tq9mKT964S4BiC22v7tVcnQJVH46+m+8+gwiNeBMJh4YXZt7iQQLqrhg9y2+0OhFPEtrLRFFOSxcYGwGyUYT6t6ejGDzl5wNgONmzat6gtRwdx.4TvbV1x1XB08UzQrmPQwVxx3anQ9FlegEya3N1tNTul1rc1AFrsyVCYC1bSlyNC2Yvfuh1byVzVNFlqdfGWIC6qnJVDnzGI8Nuuu7LQ7B7LdDeP.CG3XzGV4XxF64yC75lhMQFFlVcyPpkiQp6a0g6wufdFhcOMCR1LxCZlKMOSxIuIYOeSxLmIsRrI8YV8cC4STYbP64WlPMyhbJXRwbMVh8ysdvCHGJ3pFU2SJTLgpwX5qXsCgAGBiCGRcY0ZYaWmrss85+1pUA4e1SIcXX7gGyMfFRUbonQUA3yh.+GC3qYW8MUqTsBH+9ZwXWLuFUq.t8HE4TZHYhHHQdxumjZCTOutTAKn1ZYrWqNooM9EXEUxH2Hhops1YbOkOHgiy1kw1mwG4q.9arExt5aKtOl.9QEWLp3lnKRMaSDROCHB1dplKtHZo6ImB5gUa3TgKhJ0Fsd0JfF.UjGH.+.ORQEZDfSAmeDn2JHbPATP4yiZLhoNR5RCdjbpvKpl1t0RrWe9egARsUJg99TO4YcoJ+bHnaHCh1Ph0zyLSHDb6gJk40i4BVwn.VMZ8X8pkMwXwMbjdZZqaTCOfx9gxIw5BhQFq0elpqSP8nONG03Ltx+gAS7o0ress9SchcilasN3CqSdAN5kytbCFEuR.dFqlZkos8N.+mVa1qqUwnFCgDLK7t5Hx3j3v24Z0V+AWqsl+Z8hsH+FxF0II+nChzg.KVsCDifXBzgFmVsKi9piXmBQ21qS9BRqMgIU+Jb5un4KIeIYCPrl.t05kIaHxCfwyro5cauofuZ8dr4btI2bGQDSGOfExcImxYmgaR9PRtUGNZwGvBhZKCwKoZScgLtyE5Wm76..v1ANgldDM2xEGI9NQxr.6MRPx4Bks9pKBPb1rrs7LVg2.BWLTRTrWqVH6I0ytfgewg.32aAlep8CKQaHMRs05Q+NOepfCIN2NlYQPuj34+.hoHjpwzzrFm.1e577jSgDdmH6qBgTt+vbg.LBeUNzFavuE+FnTVolzZe4ghgqs.ZnZ7OSTzatrmZAiWZ29is3kV1srQXbAb9+X6KSbBEx4cCmVvYtoE5camVHKE6B3t6cKmdv4lN8fykSObamivo73pYw4qLWwhkvXNp6cj3n2schia+HpONRf7d4nubhj.TsUuNGrmqWX6q7oONuD36z.dajyUJyF3yi.YvGHkyw4fdtpUdaYUxDxFFxh7KoZrdwbvBvubkYJjZgxxd1SSlv9TEVSRBxGWVgVIGO36fcaMssTPZDB0RrGMHX.TPeV4PIUCURETgLcQX5hUz6rYTohFFqzZNNoabbmmtFPIJoqBQJdhTwNFWt2nkjLKqgCKkGV7TnLH.VkxXGu9yYh0huMpNffASYWHHTrdwN.Xc0c.HeSIbiqkKmfRAVq9wSXIiubOBLRJ.D9smdHBcXaCRnAxMgEp3nIXtO6TtKKtIBUr1mE8JkbhV1wSjBTClqpzbuaZKFvJxM3dXGix7bFuF1Ol2GVuyS+Ecw3fVWUkzSn3xuQJ+5z1Dc4NYbOqNRuoATUwFqfm9SX.XcgtXfMnPDwUmmukTy1skUVrtszVF3gZ8JP0Ezb+Lqtbkqe416RkXuf2411dS5c0csNX3P3.alwthU6+zbaT0Mto74wlxOw54zSY5lNpMjUsd9iYhahFM9WW3FMdLjn9T1IvafhlHiXN40be1X9IvYfnBTmYFMKcFEntOSMUTT0wjJHEhEvsbiyI2c1MkXy7DgCfETFLtfl5vec1v+8Wef.6rTeFry8NNxE.FLXMOp1cJ7rjmimVcxOwLxMyS9angdfSysvoskW3Pl7Y1JdnNm7kzzyUus5C6GzLC+vSjcyz13Jo1Xe93IArCDvimfaEz13u.tFXHcZfJkZwlF2QJjS7kBta9ftdL3oaiFwJDXU5F5gJEbQcFk6uaOV.iFkcN8u8u18H3UFzP.mXWSrv48tE5k5u9UVwlKASjP9eiKfV9+Ku.pfK+NW7m7RG9+3TS4mkPffTblyUQXJ7.ZA.74IO2Igved2Rtr5P3DUnpqDds8rv+x2Tg1qrvwH3V5SmXZLsD.4eJYv5PhOcL36YAOk3i.yM9Oe1nNT3JErrhmLcbe3EatLvTEPwGXoSlKgE4DO1FGG+9Kgmdv+A9jvzAGalvzIk4hCIvqo9zwC94VvK7ZRzI+I+3m8+Cgi7CwZLl5FJ+V23p6wbr2QSA12B8+CEpX0AGSbLzU7mGXGCOD8accKppKMwlW2Itw0chadcm3VW2It80ch6bcmXq28Dw5Dd3Tkbb74Dn3otGnaWhoYbcS5iLF+WfEl5Yb
      

      Script:

      // Init.
      Content.makeFrontInterface(800, 600);
      
      // VU Meter declaration.
      namespace VUMeter
      {
      	
      	// Declare VU Meter.
      	const var pnlVUMeter = Content.addPanel("pnlVUMeter", 20, 20);
      	pnlVUMeter.set("width", 116);
      	pnlVUMeter.set("height", 35);
      	
      }
      
      // VU Meter painting.
      namespace VUPaint
      {
      	
      	// Draw VU.
      	VUMeter.pnlVUMeter.setPaintRoutine(function(g)
      	{
      		
      		// Declare assistant variables.
      		var a = this.getLocalBounds(5);
      		var CSize = 5;
      		var ShadowPath = Content.createPath();
      		ShadowPath.addRoundedRectangle(a, CSize);
      		
      		// Draw shadows.
      		g.drawDropShadowFromPath(ShadowPath, a, Colours.withAlpha(0x000000, 0.25), 2, [0, 0]);
      		
      		// Draw bg.
      		g.setColour(Colours.withAlpha(0xCECECE, 0.20));
      		g.fillRoundedRectangle(a, CSize);
      		
      		// Draw L meter.
      		g.setColour(Colours.withAlpha(0xFFFFFF, 0.50));
      		g.fillRoundedRectangle([5 + 3, 5 + 3, Math.range(Engine.getMasterPeakLevel(0) * 84, 5, this.getLocalBounds(5)[2] - 3 * 2), 8], CSize / 2);
      		
      		// Draw R meter.
      		g.setColour(Colours.withAlpha(0xFFFFFF, 0.50));
      		g.fillRoundedRectangle([5 + 3, 5 + 3 + 8 + 3, Math.range(Engine.getMasterPeakLevel(1) * 84, 5, this.getLocalBounds(5)[2] - 3 * 2), 8], CSize / 2);
      		
      		// Draw L numberic view.
      		if (Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(0)) < 0.01)
      		{
      		
      			// Draw L bg.
      			g.setColour(Colours.withAlpha(0x000000, 0.30));
      			g.fillRoundedRectangle([5 + 89, 5 + 3, 14, 8], CSize / 2);
      			
      			// Draw L db info text.
      			g.setColour(Colours.withAlpha(0xFFFFFF, Math.range(Engine.getMasterPeakLevel(0), 0.50, 0.80)));
      			g.setFont("Rajdhani", 6);
      			if (Engine.getMasterPeakLevel(0) > 0.0)
      			{
      				g.drawText(Engine.doubleToString(Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(0)), 1), [5 + 89, 5 + 3, 14, 8]);
      			}
      			else
      			{
      				g.drawText("-Inf", [5 + 89, 5 + 3, 14, 8]);
      			}
      			
      		}
      		else
      		{
      			
      			// Draw L bg.
      			g.setColour(Colours.withAlpha(0xFF0000, 0.30));
      			g.fillRoundedRectangle([5 + 89, 5 + 3, 14, 8], CSize / 2);
      			
      			// Draw L db info text.
      			g.setColour(Colours.withAlpha(0xFF8080, 1));
      			g.setFont("Rajdhani", 6);
      			g.drawText(Engine.doubleToString(Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(0)), 1), [5 + 89, 5 + 3, 14, 8]);
      			
      		}
      		
      		// Draw R numberic view.
      		if (Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(1)) < 0.01)
      		{
      		
      			// Draw R bg.
      			g.setColour(Colours.withAlpha(0x000000, 0.30));
      			g.fillRoundedRectangle([5 + 89, 5 + 3 + 8 + 3, 14, 8], CSize / 2);
      			
      			// Draw R db info text.
      			g.setColour(Colours.withAlpha(0xFFFFFF, Math.range(Engine.getMasterPeakLevel(1), 0.50, 0.80)));
      			g.setFont("Rajdhani", 6);
      			if (Engine.getMasterPeakLevel(1) > 0.0)
      			{
      				
      				g.drawText(Engine.doubleToString(Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(1)), 1), [5 + 89, 5 + 3 + 8 + 3, 14, 8]);
      			}
      			else
      			{
      				
      				g.drawText("-Inf", [5 + 89, 5 + 3 + 8 + 3, 14, 8]);
      			}
      			
      		}
      		else
      		{
      			
      			// Draw R bg.
      			g.setColour(Colours.withAlpha(0xFF0000, 0.30));
      			g.fillRoundedRectangle([5 + 89, 5 + 3 + 8 + 3, 14, 8], CSize / 2);
      			
      			// Draw R db info text.
      			g.setColour(Colours.withAlpha(0xFF8080, 1));
      			g.setFont("Rajdhani", 6);
      			g.drawText(Engine.doubleToString(Engine.getDecibelsForGainFactor(Engine.getMasterPeakLevel(1)), 1), [5 + 89, 5 + 3 + 8 + 3, 14, 8]);
      			
      		}
      		
      		// Draw line.
      		g.setColour(Colours.withAlpha(0x000000, 0.30));
      		g.fillRoundedRectangle([5 + 86, this.getLocalBounds(5)[1] + 1.5, 1, this.getLocalBounds(5)[3] - 1.5 * 2], CSize / 12);
      
      	});
      	
      }
      
      // VU Meter refresh.
      namespace VUMeterRefreshTimer
      {
      	
      	// Declare timer.
      	const var VURefreshData = Engine.createTimerObject();
      
      	VURefreshData.setTimerCallback(function()
      	{
      		VUMeter.pnlVUMeter.repaint();
      	});
      	VURefreshData.startTimer(11);
      	
      }
      
      
      // Callbacks.
      function onNoteOn()
      {
      	
      }
       function onNoteOff()
      {
      	
      }
       function onController()
      {
      	
      }
       function onTimer()
      {
      	
      }
       function onControl(number, value)
      {
      	
      }
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: Release Triggers with Sustain pedal support

      @d-healey i find bug, your midi list isn't cleanup after function complete. This error may trigger the release notes again, even if they have already been played. And this happens if you send another message from controller 64, no matter what value it will be, 0, or more than 63 - releases will still be triggered.
      Add this at the end of function playReleaseNote

      noteIds.clear();
      velocityValues.clear();
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: VSL Velocity Histogram

      @d-healey said in VSL Velocity Histogram:

      Arrays should generally use const. And if that bufferSize is fixed it should also be a const

      it is my typical stupid moment... Sometimes i forget primitives.

      @d-healey said in VSL Velocity Histogram:

      This one can be a local

      Yeah, after publish move it part to init callback, into inline function, to avoid cluttering up the onNote callback. Now i update post!
      Thanks a lot for the advice. 💕

      Edit: Post are updated!

      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • RE: VSL Velocity Histogram

      Update: Histogram based on a ring buffer now!

      Works same as pervious version, but maybe lightly different in FadeOut anim. (Thanks @Christoph-Hart for advice). 💕
      Updated 15:08 26/09/25: Added opacity fade.
      Updated 17:02 26/09/25: Some refactor.

      Screenshot:

      6446796b-ab89-4eb0-b0f3-90f026bc54a6-image.png

      Script:

      // Init.
      namespace VelHisto
      {
          // Declare histogram panel.
          const var pnlVelocityHistogram = Content.addPanel("pnlVelocityHistogram", 0, 0);
          pnlVelocityHistogram.set("width", 128 + 10);
          pnlVelocityHistogram.set("height", 30);
          
          // Ring buffer for contain velocity values.
          const velocityBuffer = [];
          const bufferSize = 128;
          
          // Max value for each velocity.
          const maxValues = [];
          
          // Init max values buffer.
          for (i = 0; i < bufferSize; i++) 
          {
      	
              velocityBuffer[i] = 0;
              
              // Make start end bars same background shape.
              if (i < 5)
              {
                  maxValues[i] = 8 + i * (i / 2);
              }
              else if (i >= 123)
              {
                  maxValues[i] = 18 - 8 - (i - 128);
              }
              else
              {
                  maxValues[i] = 18;
              }
              
          }
          
          // Add velocity into buffer function.
          inline function addVelocity(velocity)
          {
              local index = velocity - 1;
              index = Math.max(0, Math.min(127, index));
              
              velocityBuffer[index] = Math.min(maxValues[index], velocityBuffer[index] + 5);
              pnlVelocityHistogram.repaint();
          }
          
          // Fade function.
          inline function fadeValues()
          {
              local needsRepaint = false;
              
              for (i = 0; i < bufferSize; i++) 
              {
                  if (velocityBuffer[i] > 0) 
                  {
                      velocityBuffer[i] = Math.max(0, velocityBuffer[i] - 0.010 * (velocityBuffer[i] + 1));
                      needsRepaint = true;
                  }
              }
              
              if (needsRepaint)
              {
                  pnlVelocityHistogram.repaint();
              }
          }
          
          inline function getVelocityData()
          {
              return velocityBuffer;
          }
      }
      
      namespace PanelPainting
      {
          VelHisto.pnlVelocityHistogram.setPaintRoutine(function(g)
          {
      	
      		// Declare assistant variables.
              var velocityData = VelHisto.getVelocityData();
              var CornersSize = 5;
              var a = this.getLocalBounds(5);
              var Shadowpath = Content.createPath();
              Shadowpath.addRoundedRectangle(a, CornersSize);
              
              // Draw shadows.
              g.beginLayer(false);
              g.drawDropShadowFromPath(Shadowpath, a, Colours.withAlpha(0x000000, 0.25), 2, [0, 0]);
              g.applyMask(Shadowpath, a, true);
              g.endLayer();
              
              // Draw background.
              g.setColour(Colours.withAlpha(0xCECECE, 0.20));
              g.fillRoundedRectangle(a, CornersSize);
              
              // Draw velocity bars.
              var barWidth = 1;
              var areaHeight = a[3]; // Full height.
              
              for (i = 0; i < velocityData.length; i++) 
              {
                  if (velocityData[i] > 0) 
                  {
                      // Calculare bar height.
                      var barHeight = 1 + velocityData[i];
                      
                      // PosY: mid position - half height (bipolar view).
                      var centerY = this.getLocalBounds(0)[3] / 2; // Do not reduce getted value (0). Because dividing by 2 will not give a ideal middle position value.
                      var y = centerY - (barHeight / 2);
                      
                     	g.setColour(Colours.withAlpha(0x000000, Math.range(velocityData[i] / 5, 0.00, 0.50))); // divide by 5 is a fade opacity speed.
                      
                      g.fillRoundedRectangle([a[0] + i, y, barWidth, barHeight], barWidth / 1.5);
                  }
              }
              
              // Draw velocity numbers and lines.
              g.setColour(Colours.withAlpha(0x000000, 0.25));
              g.setFont("Rajdhani", 8);
              
              // 0
              g.drawText("0", [5, 17, 7, 8]);
              
              // 24
              g.drawText("24", [5 + 25, 17, 10, 8]);
              g.fillRoundedRectangle([5 + 25, 7, 1, 16], 0.50);
              
              // 56
              g.drawText("56", [5 + 56, 17, 10, 8]);
              g.fillRoundedRectangle([5 + 56, 7, 1, 16], 0.50);
              
              // 89
              g.drawText("89", [5 + 89, 17, 10, 8]);
              g.fillRoundedRectangle([5 + 89, 7, 1, 16], 0.50);
              
              // 109
              g.drawText("109", [5 + 109, 17, 12, 8]);
              g.fillRoundedRectangle([5 + 109, 7, 1, 16], 0.50);
          });
      }
      
      namespace FadeTimer
      {
          const var FadeTime = Engine.createTimerObject();
          
          FadeTime.setTimerCallback(function()
          {
              VelHisto.fadeValues();
          });
          FadeTime.startTimer(11);
      }
      
      // Get velocity data.
      inline function getData()
      {
      	local velocity = Message.getVelocity();
      	VelHisto.addVelocity(velocity);
      }
      
      
      // Callbacks...
      function onNoteOn()
      {   
      	
      	// Send velocity data.
      	getData();
      	
      }
      
      function onNoteOff()
      {
      	
      }
      function onController()
      {
      	
      }
      function onTimer()
      {
      	
      }
      function onControl(number, value)
      {
      	
      }
      

      Snippet:

      HiseSnippet 2071.3ocsY01baabDFPVzSEmlNIsc5G6bi+DXLML.snDcURZrdKVSsr4H531LZzj4HvQhKBDGFfiRh0i+Czes8eP6t2gWIAiXTafkFAb29xyt2d6t24gIBOVZpHwvr86WDyLL+ssFsHRFbT.kGYb1wFl+tVmSSkrDhdnCWDSSSY9FllO56vAL2YaC0y+9udHMjF4wJGxv3CBtG6M7YbY4nC+1+FOL7TpO687YUnd2u8LOQzQhPwb.OOpkiQL06Z5T1aoHYa0x30zz.CyurEyex9NdtT+dNr82G9XO29SXi2cWl69S1e73WR6s6.5.WCyGehOWJRFIoRVpg41GJ7WLJPbajVAefmxGGxvObMFAZVO7ohPezDwQMNJfG5OL2QkZ.RYXoa6QZ21er04bedw3ktuOWMAojipNPyspCuGUCdtUgmSE30.jLq.os0P5KZMxKgGKKmAwyeHazRD4VCR5YM1Z2eeqm+bxYQboc6Hv+mBqELxGXgulmJEs+XaB7.TbLyKjlvHA3vSSnyHwzHVnsZdX4LURtglPhiBAdEdb4hWWP4WSNRDIYQRapu+PjMqmzDgOoKwA9oyAJg1DE1oLo0Stk6KC.hc6Mf7Th68yP.iOMPBb7hbZyMqK3QSIimOYBD3OQjfVhDVRI2jIHvnBmyRqYlYScnlqulb4UGTYZsvFw+mLXJ.g0024z6zhToMF0KnPdU0wL5cePo3JhOWD3ZERPFzxTnlaTnVbfImCHbxWUALv2O8oczB4is2Q8W7ot0bI+JEyESW7hB6WyHoRZhjvh7IioIojTHjAdy65oIh4vfoAzXlcAW7IHb9JR+NEC8wh2vmBCUqYb8jS9RjomS50oDGep3MVXJKSteC5fewFJZ2AjmQveAFeFtvrVouoxqI9aW9Y950q78KCm3QRQQ717HOIWDocW7nPdDqXPBrUIOZ1Jm8NsqCKXTZHvoO6N.QEJALuRrkO64TYfMXCVvVL867HK2d62USQmNMrnubvAR3UExB3uhOQMW20vxSgHfR423F0DVLrwSZkQWceHVD4d7WS.RzXwpY2TDi4mdgVKfMLgBK0MXya1VnUCOvPxU2L8MP5LRM5py051BVc0Z04eFww1w0A2nr5jPFwpKl4OKY9xj4r5D8o0ENmacUkv51zsIKskpnxh7xKmSYxbAcLURWYMMgImmDsjuIOz4SsqTKSUvYHB.HWeVAs75a1qqlgh9KDyAdXV4fxZZmh7m6rSkhhPUUfYZjpFHmBkxSKyAhkEuoho.N+B0uhUdPM1NRjDwRRyJlzu9jnfjP4XTHuAivODy.mZ0eIgLJf5KtMFBnpTH1KgAshLDFrpNKIEqTeAJOl+ELOvzlFxrncqhnNMWk33D5sXY.PPUbBSsGylxidCcAKwRs0qB6Ss8AlNNQDqAvoIhYJnUhmtDkxwVFSsukKCdUXb.0x4NG0Cz0fcu9c5R50kbI90U0DOMNNbAzd60KKQbWPMJgBaZL9yYck06pZfPTiFfVMgyiNA+mBmNcpoxIPSx+O3pKx5i0iqG0Ai72wVkvpUKE6.K+uV0TDLG8xWb0AprryCCI5dkru+DiUiosCYQSkAadFRjoMM+HfringdyUa0.aZEHtjMWXXtPtvkT3p4EaRcCEo+vegLi6ShEobU9nmQBngSxTMwZLOVDhar4ra6zLR7f8YrjeXM6Rc5.dcrIGkm+XAIRHgjZ9ygLV.oRleVeh.k1jCYdz4PeO97afSYfsrtfzibKD4n3aJ+FHIDg6yf5b.r8CYkHWIllg3B.b4vDZLpz2Uu4q04p149B5y2bpplk.Q1rUB.dNoOtoPuEtOr0nixgnLTFZl8I7Tv1vx6DAjPGC0SigRQ12+R4Z1bcI8RGrNIuKYQ2hcIcKictpbT.ft1867KnT4JaLilOaLrQlPg9iwhboadViZY2pk0.36THWt0Stf9S9AzHNb5lAqIOgyRYZeO6NfQGfiKAmuKzBH7yfqVC281sQ16sqhevM1KSHtNKIk049yYB4A9YuqxV6aV+82qQ82eub82euGf9Ql1L8O3kMp+AuLW+Cd4CP+HSal9ccZF.v34H.dMCB89E.AEWMigOA+sVST42hSRVCTkm3OeFHUxIQPIdVVuEJpe23eBzoU0CcmSOFAqnAxsGhUTKayZ4d8JZWpZO9k.stTwympjqkqq1J.e32wJO2NwGKX0tgFNyZzDZuSehgBNf9wYoozorpMrgPXmBn03w0Tpust9kxFSsssaWnRQzaER16PC9in6A5pDncDd35k.6NEnCzIJzkkwjIZfCyQpLG1tWhHLDanogo09oeFFsz4t5pKhTPng410uPqVq+Bspdead5tOqPnHBuNi2EyhV2svYj0xJ712eF5CvaAKaLftXVhjiPv7X1MbOl9Nw1o0wrzqkhXEsyhEQnDLerTM6mkeiY3ICL39Fl+oVMcP.i6.KyDuxxE4unt5IP9O9ekcwm5FBvQ9y42E5pWQ2m25bgOz+hr9MFh2qZ1DfWu10ycFZePA7EUu20+ucMhaJD+hVC4Ruflw3VMfQXs4WCLlc4qeVqSfS44IKA31sN8e7qyMsZnO72Tn0kDNFG714yFA0m8Xf1if3FLp2bKL9T+sSdHBt+U8w+AdxlzE+1LaR27IMlQ8RD+nmduFd8t+F0H.lhTWE9NsNG+l3Zn1+U0OCc4w+QOu5hZEF68PY7EOTF28gxX+GJi68PYb+GJiCteFw+y.d0boXldaigw4COQk7xz7jH7BBTQqF+W.sdb86C
      
      posted in Presets / Scripts / Ideas
      It_UsedI
      It_Used
    • 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: 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
    • 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
    • RE: Rounded Rectangle / Panel masking?

      @Chazrox
      Paint routine:

      const Path = Content.createPath();
      Path.addRoundedRectangle(area or local bounds, corner size);
      g.drawDropShadowFromPath(path, area or local bounds, colour, radius, offset in array 2 elements);
      

      and if you want delete inner shadow:

      const Path = Content.createPath();
      Path.addRoundedRectangle(area or local bounds, corner size);
      g.beginLayer(false);
      g.drawDropShadowFromPath(path, area or local bounds, colour, radius, offset in array 2 elements);
      g.applyMask(Path, area or local bounds, invert in this case is true);
      g.endLayer();
      
      posted in Scripting
      It_UsedI
      It_Used
    • RE: LAF errors

      @paper_lung throuble with Colour in else branch on second condition if(obj.obj.isHighlighted)
      Use double-click on the error line number from the console to move the cursor of the code editor to the place where the compiler show the error.

      fixed code:

      Content.makeFrontInterface(600, 600);
      
      /// Set LAF for combo boxes
      
      const comboBox = Content.createLocalLookAndFeel();
      
      
      
      
      comboBox.registerFunction("drawComboBox", function(g, obj)
      {
      		
      	if (obj.active)
      	{
      		g.fillAll(obj.bgColour);
      		g.setColour(Colours.black);
      		g.setFontWithSpacing("Oxygen", 15, 0.1);
      		g.drawAlignedText(obj.text, obj.area, "centred");
      	}
      	else
      	{
      		g.fillAll(0xFFD2D2D2);
      		g.setColour(Colours.black);
      		g.setFontWithSpacing("Oxygen", 15, 0.1);
      		g.drawAlignedText(obj.text, obj.area, "centred");
      	
      	}
      });
      
      comboBox.registerFunction("drawPopupMenuBackground", function(g, obj)
      {
      	g.fillAll(Colours.black);
      });
      
      comboBox.registerFunction("drawPopupMenuItem", function(g, obj)
      {
      	
      	g.setFontWithSpacing("Avenir Next", 15, 0.1);
      	g.setColour(Colours.white);
      	g.drawAlignedText(obj.text, obj.area, "centred");
      	
      	var a = obj.area;
      	
      		if(obj.obj.isHighlighted)
      		{
      			g.setColour(Colours.white);
        	        g.fillRect(a);
      		}
      	
      		if(obj.obj.isHighlighted)
      		{
      			g.setColour(Colours.black);
      		}
      		else
      		{
      			g.setColour(Colours.black);
      		}
      		
      		g.drawAlignedText(obj.text, a, "centred");
      });
      
      // declare combobox variables 
      
      const var ComboBox1 = Content.getComponent("ComboBox1");
      
      
      // link 'comboBox' LAF declared in 'Set LAF for combo boxes' to above combobox variables 
      ComboBox1.setLocalLookAndFeel(comboBox);
      
      posted in Scripting
      It_UsedI
      It_Used