HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. Casmat
    • Profile
    • Following 1
    • Followers 0
    • Topics 117
    • Posts 536
    • Groups 0

    Casmat

    @Casmat

    i make music

    44
    Reputation
    82
    Profile views
    536
    Posts
    0
    Followers
    1
    Following
    Joined
    Last Online
    Website casmat.pp.ua
    Location New York

    Casmat Unfollow Follow

    Best posts made by Casmat

    • For You: Soft Saturation in ScriptNode

      Hey!

      As a way to express my thanks for the massive help in this community, I'm making this post along with another hard saturation post to share my saturation! All the original dsp was based off of:

      Soft saturation — Musicdsp.org documentation

      favicon

      (www.musicdsp.org)

      x < a:

      f(x) = x

      x > a:

      f(x) = a + (x-a)/(1+((x-a)/(1-a))^2)

      x > 1:

      f(x) = (a+1)/2

      To create the saturation, add the snex_shaper node in scriptnode to your project, press the three dots -> Create new file. Name it and then add a parameter the same way and name it something like drive. Then open the code editor from the snex node

      The main course:

      template <int NumVoices> struct snex_softsat
      {
      	SNEX_NODE(snex_softsat);
      	
      	// Implement the Waveshaper here...
      	
      	float gain = 0.0f;
      	float out = 0.0f;
      	
      	float saturate(float input)
      	{
      		if(input < gain)
      		{
      			out = input;
      		}
      		else if(input > gain)
      		{
      			out = gain + (input-gain) / 				(1.0f+Math.pow(((input-gain)/(1.0f-gain)), 2.0f));
      		}
      		else if(input > 1.0f)
      		{
      			out = (gain + 1.0f) / 2.0f;
      		}
      		return out;
      	}
      	
      	float getSample(float input)
      	{
      		if(input>0.0f)
      		{
      			saturate(input);
      		}
      		else
      		{
      			input = input * -1.0f;
      			saturate(input);
      			out = out * -1.0f;
      		}
      		return out;
      	}
      	// These functions are the glue code that call the function above
      	template <typename T> void process(T& data)
      	{
      		for(auto ch: data)
      		{
      			for(auto& s: data.toChannelData(ch))
      			{
      				s = getSample(s);
      			}
      		}
      	}
      	template <typename T> void processFrame(T& data)
      	{
      		for(auto& s: data)
      			s = getSample(s);
      	}
      	void reset()
      	{
      		
      	}
      	void prepare(PrepareSpecs ps)
      	{
      		
      	}
      	
      	void setExternalData(const ExternalData& d, int index)
      	{
      	}
      	template <int P> void setParameter(double v)
      	{
      		if(P==0)
      		{
      			gain = (float)v;
      		}
      	}
      };
      

      What I recommend is just downloading snex_softsat.zip and then in your project folder -> DspNetworks -> CodeLibrary -> snex_shaper (create one if not there) and place the .h and .xml files in there.. they should show up in the dropdown in the snex shaper all ready to go.

      There you go! Feel free to use it however you want and enjoy!

      Note: this isn't going to give you the full saturation, just the waveshaping (hard part). You still would need to wrap the shaper node in an oversampling node as well as having filters, gain staging, xfaders, etc to make a release ready saturation, shouldn't be too hard to do however since they're all nodes in scriptnode

      Thanks!

      posted in Presets / Scripts / Ideas
      CasmatC
      Casmat
    • For You: Searching a Viewport

      Hey!

      Here's a handy dandy simple viewport search snippet I used for my plugin! Thought it'd be helpful to put out there just in case!

      HiseSnippet 1278.3ocsW0uSabDD+NCWTtqIUMU8AXqU+iiVvXBozJgZJfwjZEfXEmfhDPiVtar8VNu6oc2CvphGi9zz+oOR8MfN68guyfgVY0fPVdmu1e6uc1YF2UJB.kRHsrce23Xvx9IN8Fy0CaMjx3Vc10x9ycNfpzfjjIZmwwTkBBsrsW3UFA1tKZk92e+y6Pin7.nTjk0QBV.rOaDSWJs6VulEEsGMDdGaTEqewVcBD7VhHQBhmEbZZESCNmN.NjZLqlik8iZGxzBYOMUCJK6E2QDNt2Pwk7L6OhoXmEAlEqY0CCTl38DQgFDajZ0ZHKJraw4VYgQoaIKrPFK7UNGvBYSjWxFeQpBRoGU4C6ZSCuElBdqUEdMq.uY.I6JPZwLH8LmdARVrtTiAOelSGNd4zmhzdUnjYqUs+vwY0U2gpXAjiXvkwBolzCnxfgjcDW80ddsDn+bciQzyg8j3hIwy+4MatLY80atzld38hRStfJIQmEk6+OQJ7c.naIFEK33B+5Srn9TNdQr9sfJIRqtWOKMw3pm6pq1UBqzCzjinQIfxaRnan.zdMbkt9xj5yZ6Bg9TLRs4ZICLa4w0+E5Efw7sMe7JIPScdW535mtIY0UwKY9.fnGBJ.CgYCIZAIHS7EErGjEQuRvlAFlFFov.N8F232DLte8S30WJ+HUv9HFaQihNCSw8X7HFGH8S3AZlfSD7ImTCSIEQ9AEzzxYXaIue2yMRDPiHpTCKI2iOcyBURX.b0qgwER8bmGXitw562lO.AIlnnCPJ5slH6mBEjD+0SNQ8seCZLxic5miHBSQfQw5wKaHUNBFbGmvetH9mOzbsmKDo.LBHvb6Kj93cjjFXJRw3YzSCsXewkfrEUA9K0PEGwvvmAvCvTcUF0PNG4F7RtOiGRBPaWgwU.WwzrK.R9QE2DCVcKHyFwIpg90OtN46Hk6bkuia96iiK1bTS8SMImttWa9n.zlyZJdK4fAkbvDLmdpQT2MAubSQDiOnH+jwQvygKITojNt.n2ykkIvKOIkHmTwfujwmTGcmJUJ6bZ7JE7FdO6D3caCwpQ5Co5DIMxeoMIOvE6z9cq60M8v+89WqpXhX9yhhWP928ECFwJumNTng2v8Se03csG41p52el5xiUDHmoZS+K4C4nOOYzYfr5aVigXQ8o6T3b+cJp1HKHiZpXnf2gyzuIF32W6Mqb9D+166rKUSMsWxkg1gooZlAB16BWf8pyZ135rKnNWKhw1tStDPw5TsOMuUz9zyfHKVnoMzD525pp8+GWcwkrP8vRArsNaPQ2d2GswFabiQ5PfMXXkoEd4Vlx7V1O1IO9lkktcyM27mo1cWX9k4vDBKZ8kh0m3Tlbduf8kacGvdKf8WxsRT3nMJTjcME1aoCuaZINS+2z7cCDLMc711KsciG1qAG+4Ns1wgJDgIQT8zSZXFuJWAlTMU6cSSZSUpwUG+5+swO9uBwm4zkg0WlMFqMCLhodeJvX9PaO0oc+9PftDfK5r2G9zLgl0aEIZrP7ATrCElD4bXxndXJY.XFifi8mPY10L4kYqaZVaXfd.OLcAl4dStx0LqsyUtVgRqQz.o3iAYkRLiE93TIHl3oSD6hiliqIqYkVdA8yoYilVivIT+XPf43uBVQX19774vm0mCedwb3y2OG9rwb3yOLG97iOnOlebv1IZwnrmCnftsSq4Za2lSwLqzrPq+APj7wcd
      

      Feedback and search algorithm suggestions welcome!

      posted in Presets / Scripts / Ideas search viewport snippet
      CasmatC
      Casmat
    • RE: Mono-ize

      @Casmat did it! 188688b1-98ab-4270-b942-f46986867116-image.png

      posted in ScriptNode
      CasmatC
      Casmat
    • RE: Modulating Oscillator

      @alhug @Lindon @Matt_SF Thanks guys for your help, didn't think it was this easy haha, might need @Matt_SF to teach me how to use math nodes more

      posted in ScriptNode
      CasmatC
      Casmat
    • RE: The worlds most annoying bug

      Yeah, I've had this happen to me really sporadically, when playing the keys, sometimes one note would hold until its tapped again. For me it happened most often when mashing some chords really fast.

      posted in General Questions
      CasmatC
      Casmat
    • RE: SVG Help!

      @d-healey For anyone else with general hise svgs looking wonky, after fiddling around basically to get the svg to properly display, all the render data has to be specified in the path data for hise to correctly render it. Since the svg im using above stores many of its render properties in attributes when taking the path data, those attribute data will be lost.

      To fix this, I saved the svg data in a .svg file and opened it within inkscape. Clicked the path on the canvas and went to Path -> Stroke to Path which basically took all those attributes/what we see and generated a new path that outlines the stroke, then save as optimized svg and take the path out of that svg file and use that within hise to get:

      0772d786-b6b7-48bd-bcc1-b695c84414d8-image.png

      also had to change area to match size of svg path dimensions in inkscape. And used fillPath instead of drawPath in hise

      HiseSnippet 3608.3ocsYu1ihikdG.mZltVscmrQ6Jk88klWUiXjE2unUqRar4NFrAiASTzFiswXvXSgMWi1uq4iP9Fj7+uouT8L8NIpU1Qyr6Od34b7wmyy4.3R8PjsabbzgLO7V8q6cy7v+3iStFlrVZskeXltxYd3e5QEq3D2COcOTiq6shiccx7vCeeaF3g29lLo+y+0+RCq.qPa2OGJSFiHea2A967S9bT0222OHnkkiqt+tWkco220NJTJJH5HFOe+i4xr2xdqkm6PKl128XlG9MMc7ShNLIwJwMNyCuoQjy0IqiNGdOeC+X+kAt7E4yLAcz8vshBb3HlQyHs1OvQ8i22wYPun94Ygu+9rv+7iJ9N9eJ9mmM98ouwSetEud93gu6KGde+WL7x+5gWtWM79JCoGd0P5M2GR+gGmXeveexmeGNd9GdraHVbVYgo8WOTtmalu6c+wGkhPFgIB6r1515.dwmZwyUxk6mdB+O+3e5cuCS8wIOs+o+7SerA1Gbw8gpUx5mQB2e+SVGdZOhHakXgT+ghUpTSHIWfiRnfVwKSVHc9Kr4gcBZ4aqCaX0GVs.cqn8ABZUELX7N8furYFiWOZqfl6ZS11Q8fOUxhwa7xFAsA6cnWL.d9UO37KS7EztpukdnFbYkHlStaqEzjbho0Mg2HegWqS08DzRDJv9WYKsVU5SCfOlWzBdYtUXLmzFN+TW3NkTXb2dvA55vF0x6JnMRvBt0kMvUK6w7EzgijhX7Cxv8MOw1lOuCFykKv1tdObifrL9YW3pKZuDdqA7sYifaILBdg0LXiFco23x3wxvaNuiwEa.uR7DimU.t73hz6DY7MB1nOKJw9+VG37WaCWpgF8LENFTLYN95vsF6AaXXCeRMhwS1Q29Liu+JGa4Jx11VD2WIlBN3Z0TEV8Ra37tqnqOjwmdAdc0ozqah4srurDNPZA7l99L+7GgGrHh4TrEl+KYbD1PxMcMJWZ+TD9jQYFOZLVG6MOK6mJwvsjkcga2Cq6EL6.muyN3j4CnKKi5DYAU549v5ilv7saf5pJMMfMjWC63OmtSCTGtd2Blu+Z3qZKY7wRntUXsMbqgafqLyg4n0D04KuReulue9etac5Ze4ulyoOPVSvK0WyAu3bZ+u0PQVa0NdcCZV.1QxhdzrgxZaaZxbpmGtSBG+A8MFg7qMIsetA24lZ50Zrpr15wJLmZGgUM6xwrw.MYspcZx6qB6fUWKv3KZLFw2Vgy40rfunmmyyl2fCOdhqWG5OQVadg8LmqdvUOrg4DlGdllCWi50SG4ucFyWeI7k8pLmwQvcF1+WyUKBunhDaa61Sk0NsrJq8tLA135M3VkcfWJDSaGBq0bK8hSvsjrY9GyCOnhN8xJvESFvbVUG1wUNsexBqNrJ22smNn5U37mpAe4kWXbkxv8r8oEyA2XrE2eoj.iICF+7V1m86y8imrfCGKwb5qBastB2iKIwwV0qzV2v8XwUG34CFafqpskmIjaL7RUGFuZVLe5YOiN9EX0xpLmAFvurqW5YTYw5xs.YZucbMpXcdNl6PXAmRomSdCqu4mciwmZBWO3HiaTC0CsF7BiuZEb8163YikZ.Oxxm4rcCpkbZsh4D1DdXOaFua.p8pErf42uErr8blyssnVs7AdddqdMguXLkVaCpsKtfm4GLTB1nD+bg66ERt7yrhgU4bqZHWp5s4Ck+Bu8rSCrCHG8KwKaH60n.s29EMjM0KQuLbNhunJ8ocFLtfI7kP8Fx1hMoK7xXzmq5QO4rZC4ymUomWZH5+qynsjUZHKtwkNYbeXoPZ+McQ9COSOnba3lUnKMoUC4nflKfqdVFWqipzazkPbmkzBUEaH28RHscnPC4lg4n6sHqnrY8FVvi0pKJKdUkVZXMQ4sRtzaUqJJWJNlV1rhnbzwpz61UFss0fkb7Wsjnb7QK5kyfEidgtbwhnsGqPmeEbj3.a3oinsVRaJCaV4.cSAXEmZzBoVPv4Ww5RvZ9pziTXeJ4QexF9ryY5q23X3rnKrwXL11VViVOOb27dzAqv8h35yzs0v834JBqfiay6cAUZMYLmHdzgNpUcdsho2ODygQUKS2cIlaOOqiGWWRvbdtwSoiag0hyu3QO2GqQaWESGIi0NyiEoGuGqolFRqgani05ZSTniDQMfYfActKCZHOcfKs9NVyHui9hCpkDURnqOG0XlauQ6OE0ddCJSOTG0jZhYoeQeNqqj7YchApgap0hdqIpsEeoCsoMq4U6Q+hG1KbVnu+G2W3I8KrvHbR+Ww5nPWtqYZ+LX1UU4ZkR6e8E4P7fzqqwxBvNoim5KKwO8HcbVzphpr40zwexbbxQ2w4nGLIKhmM89Ununlb2poyC4y1PSNp6JZqyX1QLZFssaKD2ZX58d2NHtuL8sicQbgxb9OPqulrY9D5qI3SpJ0zmdP6gH+yFzqWLRSNWotoqcgpH+0UWktWVSSN9PBcusiQ7q9+Z9h+Dz+JSocVpiwfZK5NilpIeFe8Nt+pBr37cz27LPNdyRqUEmgSSsaSWcArmRgzZ9X3R2BnyVBVzvfNLKbz0lotNaqZNt+pQAFOYCctPXSMcZYc3tUjnuTDWWujqb+q7LXwDeZgiXrMs5D58Bv0rjoGL.2KSGkimObPi2iyCr938dzfkexw+ReYElCsEGRmy.ysQiEncai47sMtld91EEL9mDPuvDqQwsVP2pROL1bGROdNVSKYKkd91413doYIdNYiVnFvy3HcmYn1vaR.84MnlwqlMsxQgz4M5S4qqJK5Lh9PkppxmM5RaTuLpOwQVbdHaQXmr7L+F0yiZ9jJzwUtoJGcoH87hWPc6K4oMtcB4OO8yQR2ir89mu7YeadbzLodpxpcuUA+ZqWYyVU5ptoPe5b4uzUU9pFs198HtfEcy0q6pp6ti1ycAxQo.cI+wvs6kiwO0C42aUpaIg35knU1Uoi5F2o4gimbqipd3MZMkXDOxn.r3z.X6JzMO31QUN65hbrMwDtsRI3tCl.erTpmo.eJrLrct1vMVTgimcMfcTpBO8Xs1p2J2nFGOCJ0VciZYZEgbsUkMtVmW29mQ7FIY4bRbLhOXuPU0CaC2i3Q6DgMqtisMnAczV3BakfEO4CqGHy7UWCubWSXs9dvMiZAOc0JzmMeoM74QqX+D2g1jwsO1EtacFe04dv0ph1JqdsO8Tz+5d2F.WpCtt25lSgWqoX7Hm81P3nJQvEtNhwKe.8ytyprs3m3ntoE9cfX7HdC4zOZLi2tH7Kqmv3aqh92dgNr2bQLuYpNkWqUsvZwTYC33Z8g6kmVLQCqcm1NCN2oYcTuUe7b1OMc35RM5o62.WdqI6GmWfWzeAs2E3NIzJWJw0WEK1+CEQMSo8zJ46.eUdImm2oBGZQ2zadW0a5GS85UnNLWV5ZggvsUr489sSndq6LZOoRnsEsos0E6g0HO5zZ9M6+EVrZ0FZeEqozTh69oOuTQB+Zayz3QSQ7binMwuiDmLIQW55V3fqbr4cLVRSe+J5RqyAusG84A0P+r3LueEOHKqsQYJsYV7sE2HkmyOwMmvOgQOcdqlIh2+HmOw2qEwiZSqkM.dkMmyMwueVStvIttnU4B9Fz2DmkNlKh15ox0Nk80PbYat9FstQS7466zSW6Z2TSW8DqGL05i38JLNsOGAaWk0OQ9iapsYr.sW3zln+avZLO84HGE4QoqWKP7sxrlza0RjeGYVqdNqMxQPJsFV1EdlHqsiNBuYVVV+KJrBwGTi6Kxki4jsL2unoQWsH2GoM1A4On.2e0rD6+J439tRMsfmjSJMNFOabxw8okFav6w7b+a7jIvEJx80cqh6qMyqlteev.DepXp06g3iBp+q3tRsvb05XdFxTKQ3c444L0rqxe0hH849EvbdzPdVTzV7ME1TvlmQYd3E34GSO6xaKVuzknijcQ7yl7rttymi9I+EdFn2R74Qa1OL87vI8P7ww7LybUw2cZysgzhVUjztoekmwdN4JbgEzlkdA0XdMoEq5CO8JOqtaQKXiMomymLA0p6lmddtWeXrEisUSB4Tq2sJeXuf7nt+L6Os0O7md2dgfHKmVGh1wGZ1ye7om8i7cvpaniTzgP2CwOm+0OHN9f1TsBcCx+pmHmmahTzt8Qg3EO+C2e6efs4NEhcSTs7CSFGcLwOz84UGCsS7iBe16Ge2+w6dK6S9T6RV6Gy9ZPjsUPCNDheN8R+VO1E2eBrOe++KVHv2ach2A2qHCjvJ+ffzmI39e5o+0749I9u0v+UH2+FR3u9ie7Z9TT3vnD2QgOmdse2e8cO8yeqUq9puGuaODED3d3q917gFe3WqgOGdb2R2C+DlCCN59oDy7va9xGO6i+se7ru9oGaeex+UIFE1MzOYzd2v+VOS4LeXECZZWtZymo6Ghg716dHwmCgGjcO4a6d+I791Gkci2lDsOM2OrLm4geSR569693y+kK0Y7cx7vu8w6K6Yt7omg96W89qe9Ap288m8cRV+o.+6wuesKWM+Tj+y8uOyu7QM+6eTIx4XfUxW9ju4i6+CuAlu+hG2Lejxgw9IWe8eNf+e6wg++0g3e3QU+D60e8w328UFiXU4uGiwO7GQ328XyUqbsS97.7MO1Z9ee9KFj49VdOEqjC9nd3wgG2MAaescwUODUIrd+guiUl2ecN9ZNCLwMzI8E+23e9valmu9gO7l4+3alYmk8gn+h88cY7OSwuMMBFSgo+EZd6iJ70OkOS5NuWOOuy2w+uXa+kc0ungE9VaXwu0FV5asgk+VaXku0FV8asg09eug7Opk3wjnc221jIihZyzisd3gl3qVFbuZMy+CXZD9FJ
      
      posted in General Questions
      CasmatC
      Casmat
    • HiseScript Questions

      Hey!

      I’m just starting with HISE and I looked around the community, videos (thanks David Healey!), and docs! I got to say, it’s a great platform and I can’t wait to learn more about it! I do have some beginner questions though. Everything in HISE seems intimidating and I can’t seem to build something functional. I felt that learning the HiseScript would be the best thing to do first. To learn HiseScript I would need to learn JS, right? I found that codecademy had a free course on JS and was wondering if that would be enough to learn what I need: https://www.codecademy.com/learn/introduction-to-javascript

      After that, should I go look at the scripting docs? What’s the best course of action and how did you guys go about learning and mastering Hise to create audio plugins. My main goal here is to complete a project. The best example would be David’s player, Rhapsody and his LibreWave plugins. I would like to create a plugin which would play all my different instruments with things such as ADSR for filters and amp and fxs like delay and reverb. If you would like, you can check out my website and the screenshots of the kontakt instruments are what I’d like my plugin instruments to be:
      https://nestacoustics.com/instruments

      Just would like an overview and some tips to how I would go about this tremendous project and how I would create this. Thanks again for reading this far! I have some development experience, but now is when I’m venturing off into the audio plugin realm!

      posted in General Questions
      CasmatC
      Casmat
    • For You: Hard Saturation in ScriptNode

      Hey!

      To express my gratitude, I'm making this post along with another soft saturation post to share my saturation! All the original dsp was based off of:

      https://www.hackaudio.com/digital-signal-processing/distortion-effects/hard-clipping/
      (Site seems to be ridden with popups and ads now so I'll put the main dsp below)

      out = thresh, when in > thresh

      out = -thresh, when in < -thresh

      out = in, otherwise

      To create the saturation, add the snex_shaper node in scriptnode to your project, press the three dots -> Create new file. Name it and then add a parameter the same way and name it something like thresh. Then open the code editor from the snex node

      Here's the fun stuff:

      template <int NumVoices> struct snex_hardsat
      {
      	SNEX_NODE(snex_hardsat);
      	
      	// Implement the Waveshaper here...
      	float thresh = 0.0f;
      	float out = 0.0f;
      	
      	float getSample(float input)
      	{
      		if(input > thresh)
      		{
      			out = thresh;
      		}
      		else if(input < thresh*-1.0f)
      		{
      			out = thresh * -1.0f;
      		}
      		else
      		{
      			out = input;
      		}
      		return out;
      	}
      	// These functions are the glue code that call the function above
      	template <typename T> void process(T& data)
      	{
      		for(auto ch: data)
      		{
      			for(auto& s: data.toChannelData(ch))
      			{
      				s = getSample(s);
      			}
      		}
      	}
      	template <typename T> void processFrame(T& data)
      	{
      		for(auto& s: data)
      			s = getSample(s);
      	}
      	void reset()
      	{
      		
      	}
      	void prepare(PrepareSpecs ps)
      	{
      		
      	}
      	
      	void setExternalData(const ExternalData& d, int index)
      	{
      	}
      	template <int P> void setParameter(double v)
      	{
      		if(P==0)
      		{
      			thresh = (float)v;
      		}
      	}
      };
      

      What I recommend is just downloading snex_hardsat.zip and then in your project folder -> DspNetworks -> CodeLibrary -> snex_shaper (create one if not there) and place the .h and .xml files in there.. they should show up in the dropdown in the snex shaper all ready to go.

      There you go! Feel free to use it however you want and enjoy!

      Note: this isn't going to give you the full saturation, just the waveshaping (hard part). You still would need to wrap the shaper node in an oversampling node as well as having filters, gain staging, xfaders, etc to make a release ready saturation, shouldn't be too hard to do however since they're all nodes in scriptnode

      Thanks!

      posted in Presets / Scripts / Ideas
      CasmatC
      Casmat
    • RE: Create Simple Saturation Effect

      @DanH Yup! It’s still hard for me to understand it completely but I can piece together the dsp better now after trying to convert existing waveshaping models out there:

      For my hard saturation I used the basic algo in this site:
      https://www.hackaudio.com/digital-signal-processing/distortion-effects/hard-clipping/

      It’s not the most detailed but it’ll get the job done.

      On the other hand my soft sat I just used musicdsp code which in my usecase sounded better than some other algorithms i found on the internet. I just ported that over to snex in the shaper node and it sounds amazing!

      Check the forum for a new post in 15-20 minutes, I'll post some goodies! 😊

      Edit: Just posted!
      https://forum.hise.audio/topic/8958/for-you-hard-saturation-in-scriptnode/1
      https://forum.hise.audio/topic/8959/for-you-soft-saturation-in-scriptnode/1

      posted in ScriptNode
      CasmatC
      Casmat
    • RE: ScriptNode Can't Compile

      @ulrik just recompiled for the fourth time and somehow works.. Thanks!

      posted in ScriptNode
      CasmatC
      Casmat

    Latest posts made by Casmat

    • CSS Label Hover Question

      Hey!

      Was trying to style a label using CSS for a label as there's no LAF, but I can't seem to change properties when the cursor is hovering over the label, unless its focused. It's also noticeably slow to update, which I'm not sure if its just my computer. Any ideas whats happening here or how to fix it?

      HiseSnippet 1138.3ocsV0saaaCElJIpn1cIXAnO.BY23LDmXYGmebwvbiS7lQSRMpxJ1cEzRTVDglTfhJIdE8cnuJ8MXuD68XWNfcg2gR1VRItoCFsN+.yuyO76b3gmC6KEtjnHgDYT9pwgDjw2Y5LlqB5DfobTuSQFaXdANRQjVoPmLNDGEQ7PFFq9KZ.iRqgR972+7IXFl6RxfPn2JntjyoinpLz9seEkw5h8HWQGkS68a2yUv6HXhXfOqZVCEhcuFOjbIVq1JlneEGEfL9Qy59Cbq6eXiirO193C2+Xa6lGMX+Z0c8ZdbiFGzvyu9Q3CNBL5Im4QUBoiBqHQHi0NQ3M1IPbKOcCdKMhNfQzKrQNvNmB2Uv7zgnFE0Ifx75OKQEg.uzOKssZZZ64lWP8nywyReeeh.qLKxm.MVoH8Vs.8rySuZ4n2BnjQNJsVJk1zzwURCUYRz74Yl83vooOFNmxSkTcQq7OqZ1Q.ZvU6NBeMoqDVL2hJ0qUaGql019EkKCGUQJqavRqywCHLaqexZlgCIpNhQgBNrnxVoh2pnMrArNQQ4rwURfbv4BWL6bg35Wx85RHrJZqRcvtQDvYJxcps1wZqNNNo6aheKu2dVmMBSY68Jx3Tb3+9kS2Esk83LJm3nFyHNADsmJWpbIVhlue8xkrfOCDROhrpD6QiiZYYeP3cunfnVV01sY3cVQBF0yRNb.tBjNl96t02dt1PY6PoHl6U0ENz.6tut0ZLW4oZ.IkJUqpCuzK.ykqgphYzg7VVLhuZFdH1yixGVUiUjryjHoCCxI5CveqOMlaEHtgH2Y9RegabTVh3Ky+CuO++gtIexsQTdXr5Q7oRh4QgXIb5+UOVSHF3ZU04zqo9mbzqUqHBi3pnB9BHYqG43cpKuMfpHINDJk1pXg5CpiSqDAk7i4o6ofeoPQdMux1keO3fOT159h78WnL8MFofwHxEJV2SU9XFVgGOZ.b3CkbrXxbEg9FEaFY94aFkuWoa5E3bJJ383T0qCI7OWGTzza8v29sdmhUXcGroXfdgDohpofwojaf4Go8yJYdJI5ZkHDFELu8BL2RkHc8Yc6vbBCQgdZO0L461n6xOPZb9E2R8TAY.z1ADccTFRu1o27cn+QgwZonuIoSQdbnhXzrAXkdxjIS9qhn0yCixEEOqXTjTIMMJRqpxGEG2NWT771Eih+bvChhSaquXkLAcvvL58wqPSdHo2XiOkfl0JRiB.SVPnr4la9uoyzev3GXvmvKlgUEmFpeyvTAPUYgQP5wL7HpZb92T7UaD4+WJtoYepxMXwbbkEvQn18aAGm9vh0MOy2GZSkQv0L696eadEA5MhXEzM8BrRRg5MyKiG4.G0tDX24vcIcWAiUzUtoqqoWqy.NDtWxBn1dxTg150FSEZOSHZD1UJdmaZuH8SWdZBBvIdxy7JAu2DVaYiR5OkOOOBdI06bcK5pGXX8k0vFKqg6urF1bYM7fk0vCWVCO5Kan9gtuLVIFkdsAgtn+YIM2MLNiigJvjpUz+AU5.XF.
      

      Edit: also noticing that if I have my cursor hovering on the label and zoom in/out on the interface designer, the label gets updated

      Thanks!

      posted in Scripting
      CasmatC
      Casmat
    • RE: Is there a size limit for SVG to BASE64 files?

      @Mighty23 I'm just curious to what the benefit of using an svg would be here for your use case? The hollow mooon svg holds an image element inside it with png data. Hise's converter tool only supports path data (that I know of), hence why its not working.

      posted in General Questions
      CasmatC
      Casmat
    • RE: [Feature Request] Get rgba values from pixels

      @Allen I was actually thinking about this same exact thing a while back, getting features for image analysis would be useful. My use case is finding the most common color in an image and displaying that within the ui.

      posted in Feature Requests
      CasmatC
      Casmat
    • RE: The worlds most annoying bug

      Yeah, I've had this happen to me really sporadically, when playing the keys, sometimes one note would hold until its tapped again. For me it happened most often when mashing some chords really fast.

      posted in General Questions
      CasmatC
      Casmat
    • RE: Viewport Styling Methods?

      @d-healey One question, should you use just one panel in the viewport or generate a new panel for each list item you have in the viewport?

      In my case, I'm working on a custom preset browser and will have multiple laf elements inside each viewport plus mouse callbacks for hover and click, what do you recommend?

      Option 1: Use one panel and using row height + for loop, you draw elements within that panel. However, I'd need to make this parent panel on All Callbacks to get mouse position if I want to have a hover/click effect for each list item.

      Option 2: Generate a panel per list item and enable Click + Hover callbacks and do hover/click effects like a normal panel.

      Thanks!

      posted in General Questions
      CasmatC
      Casmat
    • RE: Add SVG to Panel Using CSS Renderer

      @Gab Ahh! That's smart!

      posted in Scripting
      CasmatC
      Casmat
    • RE: Viewport Styling Methods?

      @d-healey Ah ok! Thanks a lot!

      posted in General Questions
      CasmatC
      Casmat
    • Viewport Styling Methods?

      Hey!

      I'm wondering what the best way to style a viewport is nowadays. I saw CSS functionality, but I don't think I'll be able to utilize CSS until there's a way to draw objects within components. I know you can put a panel inside a viewport and style it that way, is that still the way to go for customization, or are there dedicated LAF functions implemented. I found some drawtable methods that seem to go with the viewport, but I cant get them to do anything that styles a viewport.

      Thanks!

      posted in General Questions
      CasmatC
      Casmat
    • RE: Add SVG to Panel Using CSS Renderer

      @d-healey hmm, I didn't think about that, would you consider it'd be more efficient and better to use than what I currently use:

      namespace HoverAnimation
      {    
          inline function applyPanelHoverAnimation(panel, alphaSpeed, clickCallback)
          {
              panel.data.alpha = 0.0;
              panel.data.hover = false;
              panel.data.alphaSpeed = alphaSpeed;
              
              panel.setTimerCallback(function()
              {
                  if (this.data.hover)
                  {
                      if (this.data.alpha < 1.0) this.data.alpha += this.data.alphaSpeed;
                  }
                  else
                  {
                      if (this.data.alpha > 0.0) this.data.alpha -= this.data.alphaSpeed;
                  }
              
                  this.data.alpha = Math.range(this.data.alpha, 0.0, 1.0);
                  this.repaint();
              
                  if (this.data.alpha == 1.0 || this.data.alpha == 0.0) this.stopTimer();
              });
              
              panel.setMouseCallback(function [clickCallback](event)
              {
                  if (event.clicked) clickCallback(this);
                  
                  if (event.hover != this.data.hover)
                  {
                      this.data.hover = event.hover;
                      this.startTimer(1000 / 60);
                  }
              });
          }
          
          inline function applyComponentHoverAnimation(component, data, alphaSpeed, clickCallback)
          {
      	    data.alpha = 0.0;
      	    data.hover = false;
      	    data.alphaSpeed = alphaSpeed;
      	    data.timer = Engine.createTimerObject();
      	    data.bc = Engine.createBroadcaster(
      	    {
      	    	"id" : "Component Listener",
      	    	"args": ["component", "value"]
      	    });
      	    
      	    data.timer.setTimerCallback(function [component, data]()
      	    {
      	        if (data.hover)
      	        {
      	        	if (data.alpha < 1.0) data.alpha += data.alphaSpeed;
      	    	}
      	        else
      	        {
      	    	    if (data.alpha > 0.0) data.alpha -= data.alphaSpeed;
      	        }
      	            
      	        data.alpha = Math.range(data.alpha, 0.0, 1.0);
      	        component.sendRepaintMessage();
      	            
      	        if (data.alpha == 1.0 || data.alpha == 0.0) this.stopTimer();
      	    });
      	    
      	    data.bc.attachToComponentMouseEvents(component, "Clicks & Hover", "Optional");
      	    data.bc.addListener(component, "Component Listener", function [data, clickCallback](component, event)
      	    {
      	    	if (event.clicked) clickCallback(this);
      	                
      	    	if (event.hover != data.hover)
      	    	{
      	    		data.hover = event.hover;
      	            data.timer.startTimer(1000 / 60);
      	    	}		
      	    });
          }
      }
      
      

      All I'd need is an animation from one color to the other and I can animate that during cursor hover(based on your lottie video), then use a callback when clicked?

      posted in Scripting
      CasmatC
      Casmat
    • RE: Add SVG to Panel Using CSS Renderer

      @d-healey I see, I had animations using LaF but they were pretty messy and thought using css could tidy my code up, guess I'll have to stick with LaF for now

      Edit:

      HiseSnippet 5422.3ocsZt2rpabj.miiOohO65s1T09Afx6e3qM9nqdgdbuwYijFDHdJwawlsRIjDfDBI.IP.ox248aP1tEb74w8FmDW0Z65d+oV8LSO8zS2ivi49DW+zzj8kt6ggm25W5t+06GbNNak1Jmf3RFjR28uceGmzL+8kuJR87VmzTeuR2c2upNJ3tu5KKU7O+u+WpNQNwt9OKpTowIAt9sC1Dj8rTy+PqfnHcGO+gAadg17+AC2jXsjnjCf87qtmtzVG20NK865fp8E2WpgS5pR28826wvyrPx0QPhgm00kURjUVz02YwBeAlph7RK3W33RyV5tecMufrj8Cxbx7SgNUMw67fUI4wWGfwAoAyi7wGXJM.F4qhKosJHxy7ImSZoR28klO6p9UWcU+G22IvK3mj+rK6eu3EketEuzoc2W7yYRL+SXR28BS5KuZR+16G3tOXa1yuAsm+k6MhgUPvk3+JS4ptk9hgkuWKAzHNiZiyZe88vC+TKdm.M8OTF9iu6ie7gO9.rBklU9ny9xaYJ+ikepcNddlNw9Qu6a1x7M+PYnEf9ObS6sNYqvk1Wnu6deX5aBu3ce2q5zapRbxb.0+FdVNdpLZ8IlsUsFbYbWMCcW4JJW4kFScMC0ZabwbuXm5DiK1c6Pbl4PpSxYONuS3TlwZ0Icxl30IzN7fh0IFsoZo58cLuLcWMFvQgLwtfqss4Lyv3KcA1pQMayg8YlBbm8JSMIGxB.dYt7DyvMcCeMuxpiyDSB2zsLlSOjViX3ebamKy3rUrZVc0Ls7HIq1JVq3LseMOln2RwhseSfYD4LTrlskfxOusghkNEEp+Em5JVwCEmpkq2osNvw7.GYHRTrVHxBLCyNMEq.yBdoiphESHximzRQwZJOG11PgJTV7cDPcFtWlxRckLpCiqDk0.ZUXrzGYJRYIq2nvN0Dnr5NtKJWDVJ.8GgxmefixxLwE4saXorh2Fgb9RFJqsgGQ6Wxklx57HArsSmegxZnnN3GF218Lk03wCPeR3hSTVUWt.kuMJG34Yn7nCGorzqIg7JgCTVMm11Ak2D33AyAVGTkxR7xdTd3oTJqE7R.yzHEXsdTyeMGoMYInS+cKdCGebAkUE8KHepCvMZJgbTlOkk2L8kvX0b.vgL8.d7RAOJK141n7ia.loU.JmeBvRJonbp1.GKw.bTMBvlRTq.tEEv8pzD49HWQYDxyPc3z7AlYE11QZI.qucJvGjOg5jEC7hKh.ONUDXs.8.PdvPv1naXFfwFGAdXnMvLq6gyqyqPchOA7Tlcn7d1vbWY6EfGORaEk0xNRHe5HvK7qEB56uL.VGgMMnNiBor1aLBX8VsWSYY6OG0gqVDk0Zu.fYFntA7a5aQ4UZ.7rSukYxmBq0qIzq0LhZuEhAl4HsVKcWyNlCaZGvaRtXoQrcZOqKw4kbkSlZjTpCyAVF4Zms7AVC0wc5kk+j9ydCGN0eSeMRd8lAcuPsCFS0SpIZc1D01Lryo9UM2y26jgY3rAqeC6RB.NQLB3QgCA9xtXfyy0Q4K1BbsC7MLILy1CrkWJv0mkgrxJj8NBrxrI.uJ5DvFa6zvLT47Ef6bl.bOMVfSXDqCy9w7.mRSW2LbZp.vqyO.bntL11caAtxRJAn+Ch.1rhJvqmET2bnraMjsVV27xAo5.m1XAzms7ZBrBExrxsQcXANz1uG1OGVgiUEKfyiVC8ii2PTG2DnepKNF3NCxf1VapMpi9Efql6.rMaUf6Z3ALefZCygItKP8a0BlWmyVAL8tg.ORLD043nFPN2VqeC2ouSKyvFx8DeCebcKShU89HSxaYdQs8PfG0VB0o8XQzdZhqi0mhxym.rrnMv7P.lIoQpCvFcoA4Sm3Bbh.oiIwWvCXodi5XF1xdAv1Mh.48NtD6mUrfbGp.relYz0jDZDJh9JGfcasF30yy.VrVDvo9J8LuvxUvzCAtd3Ffcch6YNbc8XzN6H1yLrY.xqMLMA+CCxIsBMMuLWMA0wjCjSzQNYTaKSxVEjslr.3tzn9V8uXYFdZAxK0Zz2Dh0QldiSeXtr.G2ZhY.27BZOcjTFXF5Qg7HeBvhbn8a+BNeg2XygGhAe0pTC1wlDU+Yhl1LL0H1U2q2aXlnOTSZDaNrusdiPEqilcOoQOswLvGuGF+EKunSVdvpUuvoNPkChhKaqdW1ReDpwco8YMo8Vyg3UOFb83D6bSxz1CjfwqAV+th8NIyc7UpSrmz2u2vgXsdl0WXg7GMkCuwFQc5kei48Dxf0Zrc1RLsHJ5mG1i3r2ipMwHbSGvNLCTZS3abocOhUhhlktrzIszkJ4lDY8TXtx2s0oa1uq8k1DEM9F8BOZYo8zbkaw.Mqi02kqw6Nm17hB5WNX41gP2ppNLdhbC5RL54Y7FNKdZWhx3cHO10sKwdECxjwq5RbOUAY89a5RxI0aBbr4dnsSaibUy7tjjc8ZVnCSWBurIxyFH.xsJX0gT8H7AcPt4fZ8HFLMPVAeqkgJxmL5Ax83KrmJC.4LYHSkOsGYzfUHyM2EX1AHGqtpGYcnFxdKi5QRbya.7Ats8HKW6h795Gf9oR8Bty4dD6ri0AVqIKnOyDjaJVsGQYtD5erCjA4qVhb6JJlDkdDjqzslIge8Zvxc52GxNVaeMjCa.63gZ4Db9lC6HsbTQlUFXiUUzdCW0shIoCSe9tuliXUrHVgG3v5EpDKR5jVHmUoFHebDKvKRqaQjVSgLb.RKRd6Yf21ogSSKBs4YZfCl0xhXy0BYilsAcLBu.7oDfsZIdF3Y7HqMDYYNj41cBXuXfSNpgrTcf4O4jii6DnOspc4Hvcm.iUmr1HOnNXCJWVe.mKa.aiedkLfGxC1rTlMx4BZPaOdIEmivYYAekIxFif4twzTHJx4xdQfa1BYJVnlpg51c.27BiIYcslHeI7LbhW6caAdtwQSRhZWjiVsGVWpcJAXtiwf7MSPt4XjYF9VVch.DGltKDpyN0hAVq62D3yAhvdHmSwZVSaWwLbP25XMwWv1yMAKNRUhGxG5.7EByI9mzYRV7q4U7hM.8WMANiPstv3XvcYR2vZWj0rZydYMjmfUqIwxFOmgg91UCHVmb1GnA08pYEZWeAmYQ7gRyTUbdVCxdaHRcryqYcOH9iehXFxIPboRE9TfIapg5vC0gbbmpByeawc.eQBhu6rTA4cnuvdNTgm3rIB1OTa3vDf6tC1mPatJF3lQv9m0yNuAX0o6.eGWcjCU1.9tS9Q32tD.6Cs6JrFXnpNzVqYHSMvF16oJEh84JHa2xv.jy1C6ycE6fb+yvN+jNhA.umA1QIMKC4irP9hkQgH2iExivm6grDMDwaHOG4rKPzocKejGcAhdrsWi7ZZHOUsMGP1hGxeweRB41TdcIKq1CG2FsrAcDViLyrgPtu7JHO3DjSr1Js0ug0aA4PShasE99r9jIcH1EeqDOluMeTxLMq4CuXN752XUv29dKqlVPjauA1.ymi4uW0sGvFdDHudCUcTNli+121UvgE7J2gyNZFVWQgwb.VaPY8T33s6pSoYI1o8DHFZWpjpkhazfWyLdd.eHqOv5SZAb6tU5i7EQUKe4c8wuQwF3LUaTtbUAUqpt5n7ro.qM.NPJ78AmpB845UV32gY.71wVHyLmGZ6VpBdOmpEWvQSXb2wyBxIKMwyiqgbu9nb6lLpV8pSLw9oKsp0pTldP+CGYS05HYKv5c6cV0RrqGvQpsOoZI2Y.xGzgZnQPVdne7qbP0xMuRWPeelLUKUaVj42kB1lvAfi382qZELKA4882A1.SPg9jspV5vovwuEjNV0Z5VGjOsdipkglMxoihTsnclf5Oq1ZUqc32rCyEwvaeK+K4NicxsWYPn44HXttWv8mu2fLpZUja6xXPRDnpAL+LpljTwlHedPylDIgoHOTeXSRG1s0Jxi41jrbGkNvhVaZRrGMCYp3iMI4GYQdUNeSXu3z5.qmp1hrLVBYK6VsH47qa.b7kAsHFQVF.yH4.xinZB7lyAsHRmOg79g6.40haALq+IfGrnMVWX.eKB8PmNXsfCUf9uxzt3b7TMHNrocOLOrSq1jZacLwueIwDjOZgEvzyFAmioRT+h1Z2lLx+.rSx43F21j7M7Cw7YJKaSr6TaLNGECf9gzeBviriZCikObZDmoiiaSrNmYis8bBz19x32V0MeKblIqt32Vss6NP9ROWreZAbJalGVSLA0QuB9MW8if1ZQ0C+NqPMrOs8Vg8iBLV1jz.zd7AavftZHv07W.1ie8Hr1AEXyzz3Iebr0f4xxz4wXMzjgf9UCwZJUO0C5SyhZSaWzrMII7.VyZ0YBHeeNVWyYubKRx7br12v1bsHt6xv5i8FlCmErWBVCcXssv5hzBr15tEqZQrOLBq+tZyrVjzY0w5xsb52hTiiFYdQCX8kZIVGWqqRKB+tFXsdUStlDE58H2mbnIIYTG77.82uFheZrE4EFyA4FZ34GV31GpDMbJxmSZzjLZcBxUNHaPTpxfbb9EChgYwYOFebKDaGUi8oXdqJ5+br4joFjbYRQaG20frTRF6yjoDChs3EjO5WsAwPJB4doGaP3UFg7N0MMf5CUPaNZoaCRdv5hy4zZXChciFHSo1pAr9tAmuy0UA8MUKl6y3gymWwF8OBxGqSTFjg9sT5XPd+JnuUrxh5DiZcPl0ytNYz4In+e+f9fNq8w0k09s.NLDWuhzpUmjvGgqimnpnSLNDgqu0mxqSp0KDW28ZBeagQnOFOjM8fNwheZRQa2oSxsMw3mys1.xszw3Jo7.c37yUWi5vrPmveIEiC6LySm3x6iwmsbmC5TyBiaOWYlNoCrCBiYTANeSNFmyGZCi6jkX7ezFjUrv8ENMAcRNQg6W52wA9tGti39HpiPetzeIt+ZzIXrruzG22IMXoNYsVMb+n2vPns1bivX9yfMyqlh6eacDlKcZEf6qa07HzOxyv866nng9IdHlGPneU36pFZh4Gznn.eX6tXdiV00qSpMuKlOo+l10Ic5Xg4Yl3O.7sIiw7OCxlUmjV0CyKI1eErtXrEyWUq8VXcziCyoMe5o5j0TMQNioJvbdXdu0q0f3m1rX9vnf1PLi1.jGeXDDiEbByeNoteChxwQHarMFheNHVq3rhmZ.eSwFjYMDAdvXj2ooC6Epz.YUUSCBebEL29HsYPrc+h77m9r0BtLcsx27wGd5WIlJJwwSeexF7mK9cu72N9U+nxAu92ddoelVxlsIwvCE+d0fxu+6QknR8yLcBhy5mbHKH1+cKND6lEjD+tke2C+4G9p2+9knJW+eQw6t9WoT4qBx7g93qVRsHHJp3G09Ia4GJ+emsJHEGyIAd3u186Ye7cLRTbLreOCU02y9c+vSJzvOX4praZHSU8o2W9Y0A91K9efA7u7ce76e+CO7valpLexuyd6DWmn1IIqUh8z88ivey8GJTEmNFwQvbcP14H+Aq78AexW+fWvwx+4u9gxkyQq9Ck4o2d5i3yqJLxWHXti65k6SND68nK3P1+gx688JdS1dm3z.z88gOQqxzTUSK66j5+1NIXiyR+OT9v9n28G+FOXo7CERde5wkUNsI5iGxVH8C+N3oxvSwo+32tJKa6Gd+6yyyox4nR1u78rzzzn9ea4iA94pIm9wuktLcYVd3+91e+uCWaJ68ie6FFFJZQoxrTrUcejlRlQPtZY5GYnDjk.fRPfkmAdThGjC9bAA9HPOFQQQ1xXaY4v1QyHC+CnOCK9VFdIQ3A1pxBBvyrxBRBvyb7hBBNhT7xrBkw+hqLZTz3.KIvhMopHMGC1iLBUu1gLUgm33pxTsn6A6BdlGphfOSKwIKAVDXILUwghShUhwArWQd4x3eU81P.yPINFnIRLRbB3bPlkQBmCUkEE+Ls.TkmiQfE7MbR7RQPKgwBcIxbbBtvXKyKKWXDhnXFQZVzfYYkDJL7p7EOC+ofLLoggAmzUw931+xPwvIIhcEC+U2G58nqJwwiVJLmEjQWQUVN9m5Izxk3YDKVbjY3+rS1Owz+6MWei2AcmhUexc5VrhJilBjABsRv.PmMMGsLtn87pAKM9dNFlBOEKCZ1B7zWMe5pECArfww9zRM5njXJl6zREsQ7ZrBK.3aeN1QVfI5MQdnugtnwxz3PHywVU3VXZ4WEztBepJtrIyTEW0JeMD+wag32z9wag32FmG+owgtHtlsHfDVyvfZA5mMvGuYfEFJWQHJD.iSdn473aqJ77j+wWL4EDJbrLEtJHvpHbmgsZgirvw93MGawpRQ.2eqfbbYTTF69qKi35Nmnzi+MW2eJP4waAJOdMH+wmBxe7VT9iEA4OdKH+waA4OdKH+wmCxEX3vfbAb1baHtEjWjjnHYP4ag3OdKBu7sH7m5lnWXDP7M37EoEkwlVUBaLbXup73bRpHHiGxMH9hIPQn9OyT9Zn9O4id70d0hTOLbWCH44P6Uhsvj4noKVK34K7vWy7fIyjjulL6E4xdwZbQGJwd0GdMvQ7Z.CKqvyYGe7V1wqIWAI2B89byfWEpdYyS6tEb3n.UkJC+0UUg.LLiS4Oi7GA4W912+6+cXQhe+eDp++lZP682BkM+P43ja3aUXaxSE1b8w+Gk+12mFbApgAEXyfSS7wxk+5G9Ke8CEUU+vpji96uVa8SKcd1OJJI+iEpiGK4oCk7IEvKJdiUwe5DJkSh6lj42K9cEmT4g+xCke6qVr3y9N7nB6Shh72+YeMdGM1+y0v2EeXyb+8+.b9inC9+jhkt6Ke8Ec3W+O1Ecv85IWdghIwFwAY815e6Y8jHO7BLf7mdsHJc6nO.Mx.OJHdSItICzaq+9r.zbti3eLv0+58l3qtm3mtNKYagt2NaXo69MYEu8qe5VUf2vgRAvP+k2ukozoR2c+c3EW47Sv7kOc6U9pe8e8u9WGgxfyFt4IoEZQ+rD1mDk4eJ6Ykfl9eV5SubG+622Iw6PjS1quqI3sv41Kf0kWcAOvKwAdDryu7V57OwEPg9m8Bn7OpI9au2LHyc0m2F+hOiMBqX++gMd6Z6702WawBe2rmMvu7d8o+RuiN+cF9qeHwxNNY6Cv3ktG1L.Vkc8gQOFhlRw06u.iZu9L8SgRC7i8nuEL7Wu8RF746t8RlmdYoMNt6S9StW2MhWLneSgDvlhKt3Te08cvmKyTpXG5K8yaB7B9Sttutq9jFx9Ksgb+RaH+uzFV8WZCE9k1PweoMT5ueCwqQlxgrjMW21TpTGyZEozt6tZwNPDXQzZo+OPA4tWC
      
      posted in Scripting
      CasmatC
      Casmat