How to build SNEX Playground?
-
@ustk Thanks! Will definitely take a look!
-
@ustk Think I'm ready to try again with the saturator, did some research on the topics and I feel much more confident going forward! Seriously, thank you haha! Instead of going for that other formula, i found a more simpler cubic formula: https://www.hackaudio.com/digital-signal-processing/distortion-effects/soft-clipping/
So with the formula, would the equation in snex look something like this?
out = in - a * (1.0 / 3.0) * Math.pow(in, 3);
Edit: All the filtering/oversampling should be done with other nodes in scriptnode, right? or is it within the snex shaper node itself?
HiseSnippet 1321.3oc2X0sSbaDEdLvPxRRpZhRT6k9hdAQJEsKMMsR8h.rvlrpYAKLkj6PSrmkczNdFKOiA1V066iUeD5iPeDxaP643wK1FVQgsoIsEjf87yLy24+CDjoi3FiNi305fIobh2cogST1QcGwDJR+sIdeBc.yX4Y9NVaMIkYL7Xhm2hu.Y30ZIRwWu64awjLUDuhEgbnVDwekHQXq3Frw2KjxdrX9AhjZZ+zM5GoUc0RcNfmEosIornwri46xP0VfR7VdmXgUmEZYVtAzYKc7jvQ5SUN8OTXDuUxQhNjP3hbrIcGIjwASsUCg3QCpr7EcV9CoCDwhy4W4A9zBA9UmntOvagqBRctAPxqFjVxAo6SCixDo1JIHdtCsuBBHCYfqtNTb5R79UZWMnfxtVBaLuWFPb9AV8Ysa+De3GO96FlqhrBsxWq1Ua46oV8wq7SqzZkedE+KJZ3vYJCelLsTxyloXL5lcUGbUUdxa4YOw+DlLmethf42zmt70ymF4r5ZJpU8UB6do7R5dZYL5qvOe4H.ozsAe5G5uMyxvfRIOPuTdlUfvwaa9IPVsKD0htM2L1pSg75KE+fLGcbtjYalNg0MkB.+QiXHFnTFgcR85paPNV6qLG65Bw6SCD1nQyFiKLCLBdp+IvXYk48n6LbHOxVAvkn8dy7VF19FWFtRYYH7l3ie2RR+duoyLK.+EZUxdZFOkkwOPGHYSV0vRRk78AL9D+2J0QiCE+H+xUHoNHrEpwpQiXJEWZlmBokeO0bhruN2JTGOfYyDmAsO2MOIDZSGw6VhNfm2BXMjitMRi4EgbUbAwe.eUJrCR6UJryTg0J+1kaOUmMtHbT9Yh2sb9dSgS9ngm0groTpOsqNIUTlk5LJdlof3Vz1qAeSByMPGf38TgBIuX9DZjEGNPKmjNRqDQX7ycUSMoMSz4.ZJsqWxLGvDRL+2agc0wvsrbOVD3bmDvrivZFr+CjfxyVK57D0F3sJWoHKDhCArLX1Fza133gW7zAfN+GfoDzoTL9aQTtyqTf.J9D2iZT7yNxLhAcnHMvzC.LkwWqt754q+UuVsldt5BjBp5W.e1VztR3l5GSNDS5tHNvqBR0OqrOJ8.FjngYRgRQLOK.lriTalGKz8DNQvuKbEDx1BSJTurUNT26pJavAgfJle1zTmcfr+XnydwigXmTywhPeJEDzFHTk.tp40.1YWf26ddnkmhUm00KbL+TmCttln2fRYIVxkt3F3fbk9y6R6aNDkFwjSuHHyaKsdbBqnV3u8ToG4DdG5qYmvKVyqHG8QEzC0YI9ufCou3rfNWwhd+10cQuzq8hd6EYAHbPFSYR0Fdm527EjsdcYays4plp6X0PKz75AlWM8t8FSYtdclALUiKCnabSCvleSI+8muiBypC4f0DumIBLV1ExMBxkF9qEw1QcpevJ1qWm8KYYwPbIpwf0Ea1CeoqWO7l6XTS+YLxa4OBKC+9YQkOh6R0XQgVSwXn.65si5DtDJMKv3CfZwgrbocJ2l0VCzJ8zQPUQ884vf1iOl2rQyrLnMsVnWZEmGtw9bImYpUu8Ea7JXrDKaPwPi4xWby+aWlY75yoN35iMD7+u6NvK9+5cfu9UeP+v+cGE+LJzWdc+hPo+GmX4GhUm+P7FIrnL8QQt+hCrn+1Eb.6VU7+moEc.R62gbha6EJt+MIAFWbTTDlu9kvzmYel0miy7UywYd5bbludNNyyliy7MywY91q7L3j5Mys5DWNOvHXG2JxdtMWJR+I+I5asV1C
Thanks!
-
@Casmat for these simple one liners you can also use the
math.expr
node, just rename your variables toinput
andvalue
and you can use the single parameter as drive parameter:output = input - value * (1.0f / 3.0f) * Math.pow(input, 3.0f);
and yes, the filtering and oversampling can be done with dedicated nodes.
-
@Christoph-Hart ooh! That's definitely useful! Thanks Christoph!
-
@Christoph-Hart Oops tried it, but it seems to not make a distorting sound, am I supposed to do more than adding the math.expr node?
HiseSnippet 1591.3oc0X0sTaaDEdkMKDbn+jNIS6zqzjoWP5PnVNo.o4hvuNgIwfGDgvMcxrHs1dGj1UizJ.2L499XkGg9HzGg7FPO6tRHIvCAbSosjYB97yt642uywzMV3QSRDwHqo2cXDEYMC1cHWNXsADFGs45HquD2gjHow1FVqNLhjjP8QVV0ethg0zSfz+7wmsJIfv8nErPn8DLO5qXgLYA2tK+RVPPahOcWVXIse7xa5I3qIBDof8TG2DEQ7NjzmtEQoVMLxZxM7YRQrqjHoIfNqJ7G5NPbL2n+drD1AATEgCxEtHCazZCXA9cy80DDxB2svyqa776h6v7YmwuHB70ZA1EmnbLvp1kYRNWCSxpjIMgwjtC10KlEIKjnrmai2jCIjdDHTW1TL5hr9.dMAn.WNeH4PZ6Xf3rCL6BMaNmM7eO3o8R4dRlfaK3aIjzs4y9fFuqwzMdeC6yKpWuQJS8Lwhf.Z7HEqxtwW1AmkmFd.MdN6iHAozyTDb+pwzIuZwTOiWWRQAeSNStcDMitsHvWEqTe9hY.TVXC9zq2bchjnRJY7.8hnwRlxbrVmdDTUaRQSiWmlbnTDo0MLRvU2f0LxrZJSRocffHY796x.ylAVvWgKyxAcR4llgmQ7gCV9Xlub.TvZseMDZ.k0efTQ4WXuFCoA9kzgGHHw9nC5m2DM8j999mptIljFVv8zSO86qxsUFasxR5IxBkyMKcHo1uZgeWCa66Cu1aTl18+EamGOey4T7VmkDEPFtsmjbDcKcxED2iDjP0xek3X3X.qmnIeAyP4zZQM8ZoIRQ3yiIQCXdIUN45zdjz.4JQQTRrBjAjJiSMBWM.vIfqZGHfJ.AMmegmn+YokZt3SZtniVqcE86GP6H7oUtYUuMzqy4z.kon485D5dTOnBrjsb1qABaGPjtxgAm6l5tQdJ377gJ4XYwqzJm+Fb+Ru8BMdOfNdAT..+Q3mBOYUPIE5al.nqpBRfpcmmvjCKiNeMPpZdoHUWUS7N3tLo2fQai0FgMB8a+SXiY36eAdid8frZgANAt89iKXdyqMXdibrf80O9LYj1s22Yjv3+Nt.xLJlFQho6J5BsWylPBiBnP0NcN6CBDdG5x9M5EwYiLlvpJMl0yTlkLNvwS9YZDGZGQpBxqCQFy.DOL.Q3BfLdzrlfDExVMExlgtohVUW3R49ZBEBUlPGEsUlPmbgk.w2hJOVDenNcj8Yj0TlXehNH+1dm3fVIHPbrB5lkUkZbJZbhlXJby4g+gbSSf4H9aycA.a8VNJmTe3thfgQCDblmJ+YtpbWZkPQJWl6WufjrKgEnp+spsE.EAA21DERyvtDEL+cvpoXPAJMdduyJTqXuE0J5pPHOzEfDCovD9DCO0EmCeahefMEpmKoVhptRtIpns.r5IlBSOIJFFQV1ZtMND987JIUJQ+DOPsRSKKnfF8ZpWZRX8D3Y2SUjgrVBy3QoR6GZp5r+Q6YcluYO6ex9Qvud.P2QYBQhimUq3bF9OU2gW9ZmBFDePZ+760pNpTXQ0PlSAVPGFOSsBnmNjSNGuO9LWIMR0aUVO2CoGaBRk0zXAlK3BWSEKAUI3XcNuXF7lI6oj5QBNyUpgVUHNLjnqkGqcSJCGdOivaieCLjVurutF6dZ5dh3P6mSgxOEVtykrt+ebUW2O5JutuYugcg46IQhDXqnR274j0prr0oxTdU0Mrpnkx8ZCtmS4TSNyRZdqk6R3UtLftxM0gUZcs+7YavI.7mKE7F+sS7.mkTo5.tfTXW.81RNkOXA6VkY+BXABHu3UYvX8pXvSb0vfqtiPI8GwHqI+m5qDMwUaJ5mX47+6uWTkg9SmaitL0v5M3GQCf1TsM9M3r0Yy4VsOqifKxGmTTArCEFZ1uOsJrynbnUjRXe3BN2c4cnATRRodueX4WAiXHwczC.FqXw0+ayNx702gMlqsBbv9uSd6FsL6R2ss9UZ21O6163um6MbGJfe9+mL82hAL8V15zs8+946ahUnuIdiPhWr3sdlu4gBv3VZNfey0+09lF2QQa6fNxrEDVsGNJDF67VOOUM8Cg3ynOSqw3LOZLNyiGiy7yiwYVXLNyhiwYV5ROiZh+JoRQno9GXzcC8lnVVlMfzsBn+BToL8JA
-
@Casmat sure it does, it's just subtle. Drive the synth at 0dB and play multiple notes.
-
@Christoph-Hart thanks Christoph!
-
@ustk @d-healey @Christoph-Hart Tried to implement the original musicdsp.org formula, but it seems to be affecting the top half of the wave, I tried doing
return out * -1.0f;
and it worked for just the bottom, but How do I make it so the top and bottom of the wave is being affected? Basically making an odd symetrical curve on the shaper
HiseSnippet 1771.3oc0X0rTbaDDVhkAav3jXG6jT4jJW4.tJGpUDG+SxAVfk0lxdgsPXr8gTNCRyt6THMiJoYA13xWxobKmys7Hjq4leGxKPdDxafS2yHgjf0X7FaR4kp.lt6Yluo+4a5Y6jH8YooxDK6o2ZXLyxdVh2Pgp+J8obg0ZMsr+HRaZphk3XDs7vXZZJKvx1t18PA1SOok9y+r3xzPpvmUHxxZaI2m8PdDWUHsSiGvCCaQCXawiJY8MarluTrhLTN.vSMRcqXp+tzdr0onYSPrrmZ0.tRl3onJVpk8jKKCF50WtuvX+17T9NgLbfqkGrPFwsjgAHhQoVqzmGFzI+bmZYYS5T3EpY7BWgzlGvOTdg23SzJbJlQY+g8DUgWsJvysL7pWBdi.R1kfzjFHcIhmeBOVUnAwyEHqIffSWJ31KCEisV1ujrhDLPnlOhtKqUBL3vIL2spW+FNvut922cfvWwkBGoXcohsgXtqOyymY5YdwLNGUU2tiTGtMIxvPVxHUiQ5jSZhyIFDsCK4FN6QCGvNzP33W0mRd89zxgbeyotjgRwZBtZiXl30kHXk4pf+6Qq0jpnXfHSFXWLKQwQHX2jsGjUaBKSSZxR2UIi01FEKE3JXOqJKOxDHZEJoJtn2Vb.pbHB8wjxhbsNnbQyvCG7xcZrOOP0uPvO2nOi2qeoxom1HCiF.MC4Arg6HoIAV6zKuXZ5oBBBdEZMWwhJj9pW8purpzExDqMVwNPUXbN7ztlI9Aaxymww4Zvt8XDhW66bbu470uAJqIOMNjNbCeEcO155.KntKMLko0+P49vz.Q2UO79byH2Etsd7JCRUxn6kPi6y8SqLylrtzAgpkhiYzDjrAzpRFXTtbHvW.K0lfiUBJpO+stq9yctS8ae2521Ua0Vxd8BYskArJqLVWC04BAKDghV1iRYay7gruRX4vcCT1Jjp7TCCOxJ0Y07PvQkCYwIphcYgb4qJBJs22ZlW.rjGiA.3djACfsrJgDxBmo.pnpvBfk5hTtZXYV52YrTmVHdIRGtxu+nw3Di.iPc26CLlwseQxpc6BQ0B.NIo0SN6HxmImS3I5Me1rgNsdh6Hov+ERAcYbBKllv1R1AJulKkFEGxfrc1Mb1IT5uqG+mXGmiM1.gkQKly2jlkNNTwScp8JtmbPYS4.j5qMUkvAlOBPQ3AjL9rrh.jm2dBjQ1LtNNFyK7Xh.8.jgJSoKN1NSoatxRj4qyT6KS1UGNx9eK6yY78oZm7y5dfq0Rggx8QJbdVVp4PwRR0CNGo97vOVdCRg6PB1P3AD25tcvCodxcjgCi6KEbeL9YVp7izRQxA3ECly08ooaQ4gX9u8DqCTQfysEEYZF1ghz8Whf2fAInrj48OLQsBdKxUzYgPbnCPIFwfa2SMxvENm913+.LEoueBalpFpG8J0LHffawEIoB1AOKsOEtuypBltLfoD17k0WNe8MsaktB0TWfifp9IvscZxJgvJsVf01XRG11oYejcUoTkdsfb8CxtVlrEExzvTIuPd.KoCP7iiVZP.W1haTA+U6KfarL2Gs7.nv2TVVQBhAQ.6f7bmUgz+.niQ8lgf2pjmEwd9HHp0lKxPbA6Ua5AGQ1+rnmhEikmksyaW19FObYKQ2w4HMS36wrN1RakkrX5LWl5CcRC+F7kUiUeFgJngCSYyWwlSe7JumYfLrRj6HAB62otVqRIhSQ5go8UNUWvjA16nOD4Mj5MQkCPkXYsSNV9zWd7XID2pFK+8e629yEOVr7k89iq1vbPzuS53gx25znF+ZiS0V+ieZy+ZQyqC7hjRUefq8n6+MaX89+nOKYSVJSYVkSvAjcQ8qmdXVxZoaiZ8og4KDPjtrTtaDUSsOVsrWt6fqZTdAxigdV0uAVS4dU83txjHm6w.1Xr0F22EuBN9T+JXSazaAs6lFKSgGKTZkOhtEJqqISMPT0binJVgGuVvwys7YHWXIKOeiNTQkECFWYkZyK8Jl+dwUEHGsGCNMAanIgnUX5fEX.zZr9wCtkmXg3EJK99P+zPbwuReh0NouP.2w7KDXp2Weg.Sd55i7jg2G.uLnRauSmiQONdywph8Xg3cQHFuLI6Ac4RqVZ0VJj4MTUDz2jAsM1qGq5sli5.sjRAMFTH4JM1jExnokJ29pFODZxhlzVeyyX4KbeqeBvHiWeAw.WGjOv4+Rb6LMM6DecWsS0q6dmi2w+kdmwUn.k4GNQ5Om.z3K3nC2N++GuOKdD4YwdDQ8SjOy271ajv37ZIv4Vn+dumlzFG63ZsmowGB9RTqH3Zmm46i4zeM3eF8bVXLly2LFy4liwb91wXN2ZLlysGi4bmSbN3M9KMPIiL4+ffNqZdPisooGcof0+BpxhvJC
Edit: Don't know if it'd be useful, but here's a cpp script of the same music dsp code being implemented into a program called psycle: SourceForge
Note: Since the snippet probably doesn't work,
you'd have to create a new file andcopy/paste the get sample function and paramemter callbacks from here: https://justpaste.it/3iopy -
@ustk @d-healey @Christoph-Hart quick bump/update, on the other cpp code in my last post, the code had this:
if (sl > 0) { ProcessChannel(sl); } else { sl = -sl; ProcessChannel(sl); sl = -sl; }
which I think is what gives them the odd symmetrical waveshaping effect, tired to implement this in hise, swapping the
sl
forinput
and I got an even symmetrical waveshaping effect, I'm lost haha! -
@Casmat nvm got it! Had to tinker and multiply a couple values by negatives and add if statements!