FX Plugins and child Containers
-
@Christoph-Hart That's what I thought. Thanks for the scriptnode hint.
This means we will never be able to use global mod in FXs...What I am doing with the ARP is triggering a callback in the main interface script (via
component.changed()
), another solution would be to call a function.
Is it possible from this snippet?
I just tried to link a parameter in scriptnode with a slider in the main interface, but the communication isn't bi-directional so I don't know how to send information from scriptnode to main script...In the end, I want the ARP to read the sliderpack indexes. In my first test, I used
arp.CurrentValue()
which is very convenient as it directly passes the ARP index... But from scriptnode I don't know how to achieve the same thing...HiseSnippet 1807.3ocwX0raibbDdFR0qk3ZYuZwZjC4x.dhBqBA4t1qyhEAh5WCEIthQTQYuDX2Zlljs0vtGOSORhdgA7A+1Df7LjmfbIGx0j2f8ZNkTU2CmeH4JOhI1gBPfc0cU0WUS0eUMrWnzkEEICsrW67IALK6OjzehPMZuQTtv5n8sr+HRWZjhE5XDs6j.ZTDyyx1t5WfBrWaEK8m2s8tTepvkkIxx5BI2kcBeLWkIsWmi499GR8XmyGm6zeZmibkh8j9xX.OUIsrBntWQGxdMEOVEhk8CNviqjg8UTEKxxdkckdS5ORdivb9K3Q7K8Y3h1V8ACYDenz2CQLJ0ZuQbeudSi6HKvJ8xxBUMYgmP5x83oxyxFORugSlF4yG1UtK309GGdsVD7pLO7VmrSX.a3PNE7VxSobRZWDUUKhppkCUyiDq8jBESn.LsA90PoObTkFQeDouaHOPsarRIEVbOTjAEIhtl5GWnzvpD1XcxYrHl5dah99bOVn1DeL40wi6qXAIxlwHOpSYLxCInEzXY4PwizFn+U72CLd21kIc.VQFpNlMI5+lLBDLALl2wB4kyZfmLe13QIFXO43Kk6JuUahGS5y9lXFbYOUb4CnbPYcxotJ50rynhgrkKZVizeT7fA92o5qXT+wETuGvtnMwSfnYL+bofkaiDqQrqBFxipnV1+RR6Wzb5mA6tO7+y5A+6q2Ym6gutf4Kc4pIy6qLjWveCd5t6zr4KOF72yi6YVWZ+8XxILwP0nR6slmfd6heK3s2HQucUAucWUEaP.hRgf42m4ybQpoe7hhEZneA4zXUPr5+QlaCR2dG.zegSM3bofRV1+wngNP38dLSqNV43pWwvUuQhgx1A4qeH4HfKMb.EZWlmr1bVqJ+KaRBaaywzqXGFBKR0nwKZ0ZKmOqUqMe050fiEI8YMc8YzvFnDyePqzHky0zPmrG8scbb9MNSM7PFFcAPYuP0ndtSUGsRl9mPuj4ipp+79z2bp5Y.fK74BlyfXgqhKENgLpW+dM3d2t450d650PiglGRhfQy4dzvlkWf42cTZcdkQCy+MNqIPG2nthcqp9VN0OR3wt0otyScfiC+uNXUbEX+MeUsuSiqDL7rMeUJrjhWKUrSEM1r1aqsVsuqlyraMXvB2KohwmEtvswYaBuKEaHhGeIKbKGcUT5AgBmh8qeP45W6Zdpj6fRwQBt5z.Vx56dLnbc2qTBZ2OjnB4CGxBOVTrKRmZ+8+11kkcZcRtm6ye8tHwzyaBDSM0zt+Nj1UzDHl98GsOdH3tSB9gXJfEp3Xpyde10v7mlKhqQ1mEckRF.gUZcKjdKWHdaJt9GzNSRW7UeUmfoIwiz5XLiyguoML9ZHL4Jbo8HcepDqgY5Tu+A2izSFD57GyAAGYmwzr8rp2IRqzNikwBU9IchvQP3eK1UiztYqB.YMUxjkFfnufowvpDyksbt+6y69+x0ctg6oFgsJ+qv5QL9vQJb0SgUCfGJFWNEFurCCJuo5JXn9Bt7hd0b48YvU1WZs.RTXraoWrONba9YwwW.IYC3pUAhTjrTDAsYyWOcOFPuUoe+gxB2MH83J2QKFuUV.dwah+Di2z2m3fACfVrYfcExgu4mg2swd9bWsjJPv+HPJbgZAcJs+SjCDCgFMMcAxcEa+nfWyT2HCupQcunf5a5nI9SoeCBYv0R14xd9zIMhniC7goOUrsbtDFK6JrVcdN6jq36hmngqo4ezxPsOy6utZ4RhyRjWHFlJFda4bnLSZJnxDMaqhE9xdmIiUbwvtTf1Bt5qeKJ3EygI9She7JdErugYcKbMVz1mI7zK92vmjMaiqsS1r8zMyZ4Xk7LSWSj7c3aXA.g.OFQoROjE4PJNI3jdTjwYCBFJPMKKroaZs6CPMZaA.dVndBjYJH1tJZ1o+jCF7Cjhi0ThUHS+9eXJA2VvILEgmAUNXK9tQ4+ALvTZuor9n8qX7fItzQvGXF+aL2iafbgH5SxEQYG4mpPYNvspI+gdtHtdHfqPlFR+eIwZWMi27bZHLgnF0yJD3KP+h8aSpB5s3dvmFjx1vT5wLsNPfMkRHiuFFgvvyzkKtX1WXpK81KlcVkSj2vBm4W5BFOIHXNoua69oMhWak29j+7W7O+1eX69WwtwjxyexCtEtrGEgcKvzlUtoaLrm3JnmQU7AWMxdTe+KwoGRf2CIwPi0AP4jmUu3K84tX3YkqDEsxzUfiu+Q9pcJejuZm7QdZ1XgQtoRrKVVNmGKD.ExIu+PSeuKq.nrOVK+ip4Tc9hSfN.GSUvz8KlC6Kyrr+rvSOl5FJ+RWSeDLwtpVBT1Iz+zrqQ5hqcRGgmPZAyWhrEeoqKNMwuBlDYw57rkPmmuD57oKgNe1RnyKVBc97kPme8cpC9qTuSrRN1LoIHn2A5hKa6LdtpV+GqHXYVA
-
So you just want the main interface to show the current arpeggiator position? If yes, just use a timer, poll the attribute and change the slider if it's changed.
If you need to know more specific stuff of the generated notes, there is an advanced feature of scriptnode and this is to hook up a inline function with a single parameter to a
core.midi
note - it will call this function for each note and expects a value back. We can also use this to store any value (in this example the note number) into a global variable and read it in the main interface:HiseSnippet 1799.3ocwX8zbaTjEuGa2lXEbHNUn3.WFxAV4ZCBIHI.EEkk+aJSrhUE4XxdYoZMSKoFMS2CyziiUR4p3.UAeEfODvYNPAeG1Cbl6bfK64ceutGoYjkhih.1cNnZ5W2u26W+lW+68Z0LV4wSRTwDmUNZPDm37xzVCj5da2iIjj82g3bEZCVhlG6ZEs0fHVRB2m33r3cQANqrDw776arEKfI834hHjiUBO9AhPgNWZy52SDDrGymejHrvpuU888TxsUApT.OKRqRhXd8Yc42mgKaAJwY4c8EZUbKMSySHNKskxePqdpGKsq+XQhnc.GGTizBLjU7dp.eDwnTx18DA9MGtuSHfUZlGEVzFEtNsgvWLRddz3plIby0nX7vYgKBd0d9vq5zf2BSBuUoaFGw61Uv.uk8UpfjZiipEGGUKNanZRjP1VI0boFvzZ3qwp.XoZChtBskWrHRuUpVqjDgOJxhhLQmvBRGK0fLC1XU5C3Ib8KrIZEH74wFS7Jz6mF1RyixjcNib05yhQtLEsfAKyGJtpw.s5KdFv322XVBGfUTw56wGj7GIh.alHN2+dRU6yaf2bxnwUyLv1pv1psTmZLw0ns3edJGNrOR7rugJ.kUoG5oYmve.S1kOe6lUns5k1oSvEp9RV0u1Xp2DXWLl35vtITbjRxKLw4r1kp6yzLhyqSqcmJvyIU1tRkN6rC75iNA9IXyMeA72w7.kmPO3Y6OBYL+04uu0lUp7A2C726l1zNdl820nGvkc08lYuU4.zaG+wf2djB8V+w71EkYrFEHKkRdPKd.2Comd9IFS0PuF8vTcTp9OIysFsQycAJv3gFbhPvLl5+Jng1U5+LLS05jB70KY4qWKyP4yfb1WltOvmF2gAkLKRXaWKYguZAZFiakPVe9dwvfQZT9NUqdS2aWs55e3pkVsDT3LQ6dBK1EOVWy8ibGpZWNh+HH4VpKeCyr2vpSQsvJwwfV6J6Jj7JdwbnXgQ3gs+LHvW1phQRkDLLZds7sy7eLuqa.zmvwXz.rS0JUMxe621ceoPKXAhDtKysafpMK.cofAEcbEcbE5+VhqToc84c.e6uZIQmxugHYG6vxVULFd80WszSWsjK7jYnBSl40RmU.nbKL2lEDzFR6K2IU5oEJY40K8zRq.9IGyuwGUzXqa8Rlyvmh6tBK7CyWgI1h9zLQtoWeh030C467gfpYhyJcF71Pr4pj2Wo4GlAxRmUx87S0oyTmKK+M.9tLsosewt.EKKSCayiuoqImdzBgz3w6fX4YqCBOaFXgEpjXxvgQ7rwWbiYE52vYFJD7RTSvM+.4u8uexO9O+9eYCxC2eGjcKyLfEAuDwi0Bby3rC+DnGU6A0Un6vS5qUQl0lcpAZJ945zSGw.7yp5CFM3K9G0SzCvPyxlERBE99A7lpDAF5KPi8SIX+AhmXP9Su92c2e8Ie4FgE6ulPBYmVj3KAJ6IN0zXbGQPXhFv19gP+xHi+CgiavAJVZf1MoOXm.grO2+HkY8SgiB5rU4mFf8OVrcWrG+rIP.WjmB4hjvFYPQP8BzCb0YtE8YEtqQaJzd8lNdWXJ3Eau9uX7Npk8c6zAHRyA6Rz8dz7d8gYGJNNSF6JkkGC9GAxKmMzcuGUapEhV1gNVcgcRhtOW+XUb+x2vOI5Fq6Z35ERHGimyqj.M1cj5tFtxxBITKOm9tHI9PVUyRx3Ji45zXYlnRmMxlQw7HVLX1lArAkSXgQAPyiZ9McaCcT0GO.MIAWjMBrEthxd151IyCO3x+YcSpGnR0BY2FL3LKbB1bEE3VuP6zYnCj4r.RAZGWEGioqs3Reyf+C7jMYMbrS1j0FNYN6II6ikIaH6c3M7SOkBe+PoJe.1WZOF1h0flLcO7vDRfCYqPgTuQYsKiZTi..97P8.H5NlXmEQyN797V7CjpgFJUfDJ68OQ3iti5bSXE1zuG.eWwpUMRJ9uCXsmcWXv6KYydANUgAfPAkhafWsvFXzZ9KC4SftKYCWnmGGWWFvUL2.o+OEGyIHOhECMHZP84EBgVzu66ioIImzgzjEyB4P+m6atD4dw1q.NfbXzHdkrleH6Jw16xJSbBTq09dCg73w6W9V0avNcbYe8+p9ApGyiO2eazsp+vnnyKEVaqBEN+1uAe9gMZ0m+XaLGAesJUI6dJPcjjXJ5lU.bXK.VNRbDTYXQ7qVI5vNFIYP6JzhrYjlosCDdXQk7nh0PCGAn4h23DxDab3RlSaiSHSYiCqs3FeX42ha7bo1LwFXZ4wSbqmhafwBKWvLySGU+OgzKj4Eq9TOKON9E4RFIv2Uo4OQbEZCbr6n1DoT3RCXaYhO0yCKJ+V0Hjoqy6LG57tygN2ZNz41ygN2YNz48lCcd+KTG7+ScyTsJz1vFHn4tljKGmBjHj+KP6Dj.E
-
This post is deleted! -
@Christoph-Hart I got this part working with no timer by just calling a changed() in the interface script from your SaveToGlobal function.
Now I got another issue because no global modulator is allowed in FXs.
I got 4 filters for which I need to modulate Freq, Gain and Q via custom tablesSo how do I sync them?
Side question, do you have any example on how to use a script modulator please?
-
@ustk Did you ever find a solution to this?
-
@LeeC Nope, I haven't yet. The solution would obviously be scriptnode but that means I have to move my pre-existing modules in a dsp graph. In my actual case it's not too much of an issue because my FX is based essentially on filters.
The main problem I can't resolve for now is the use of a table. Modulating in scriptnode with any waveform is easy, but the implementation of a table that is controlled from the main script seems to be rather complex, for me at least. I haven't a clue...
-
There is a unified way of how to control complex UI types:
const var firstTable = Engine.createAndRegisterTableData(0); const var seqPack = Engine.createAndRegisterSliderPackData(0); const var audioFile = Engine.createAndRegisterAudioFile(0)
If you call this in a ScriptProcessor's onInit method, it will create an object that can be accessed using the
processorId
property of the UI widget.Once you've registered a slot, it will also become visible to the DSP network of the script processor:
UI <-> DataSlot <-> scriptnode
Check out this example how the slider pack and table is used in scriptnode:
HiseSnippet 1675.3oc2Y0raaaDDdorW+ibbSSa5cgbxA1UfJ9GEifVqXI4DkXYoX433fdHflbkzVSwkgbkrUBJPOz68b6k9FTzq8PAxKPO0mf9F3K8TOzNKWJRJIZaEE3TmpC1bmYGxuYmY9lgRUcX5DWWlCRY185ZSPJWCWqqEuY9lZTKToBHkOBWVykSbRIEsYWaMWWhARQYhGHDnL6jHuOmtwlZlZV5jPQHz9LpNYaZKJOTZ0bOlZZtklAYOZqH6dkbkzYV4Ylr1.dl.qhr0zORqAYGMw1RfQJSUzfxYN03ZbhKrmMYFcq0jcrkb+6ScoGZRDKxfpA2HoXT9lTSip87UWDRYxpgd9DRO+l3xTCZf7vSfO1SQpPKhdFnjneHMYePJyYAosXlFhavY.OkHvaRI7tAtltC0lGpQfs4vkrffScM3XOJrj6Eo7FbdFrAKd5VZGQ1xAVDXvBqoptTpUUUu88p21RmSYVoXV6v3jJVKb6juN4rI+ljoFTU85wpS7XbXllDmXUKhzNmmgKX0t0gDmkR0QyrMIXif62+46Ti14qtzqirQlUIKJuhMwecXDHSLQ.j+wFDKR3iP.JbuHw79Qh8zDOXJbOlA6ccFjG3il+anw0PJDb16jN3y54g+zoxAauZo0CD1oRY99e85QzaPKlMT+dUV7w0NXwpcdbqkE5cq.+o9hQ1uDyQA5m3CzZlTChSUnXxCs.9CDD.Yrx0Cf6WgWakz4eVkGs31c2ta17q8jFcq7vh7cV7v6Z0IasGc3c6HVu95h0q0UktYaAbRuXAvnr0Vd0mbbEXSObwrOowKyR2a4U8VasdZD5okJHdHPRp+QLbraSb3TQzUo.oCPXHy3mEWf3dDmY6ECZYyrDADkouvnvIgQfR45FtnPtioF7lBm8uUPnlDZilbwp+BTZ2K5WxviEz6lmZqCDYGC8vGoS1PX7suHBLT44N6mU..c5Cfc73MGhS.XlXFsM038SWI3k8U.0X8wKHJ9sbo7tQ4seK3vTikCK1JnQDt2.Wkx0aFOdSDCdEkjWx30uiv73h0qSz4gfcR7VG7dl9eJIVR5mk.OeAP5KoIJf1ocqvbPWQtCjHg.od0FAB76OjfqfmOIPV5xAhWmTFt1o9hTEsZPsHo0cHfSUv0dGB+XlyQKbKP8st88lOYTSpScbkEgCZ48sL1kzfJFdvSunteAUg8gV6Rdo.nmiogdSb1q01fx1hdtO762aOfwAMdrcH1ZNj8XUM05tfqVKaSxtfcKk5PSl9Q0nuhLb2J+51ME6XA8lZVVDS2woo1.ywL8nk0LXKr97gdhUQQQYnz.PEJJlhfcYs4TqFk03NTf+BKRmfwwzI488VQBTBQ+Q4ZUwZQMYMhkg2h+A93qLSP1FnLSOkgsVQ9IVdo79WCWIxuwXHWSHkY.GCyrklNbb0splfb7FXQ2cnjj3jVOnzbJgEYDY5CB0sgyg9DCUIvss2flR7Cb7s7X3gwL8u9Y83hWB1grFaWHOQLJSY2nispLQjdXfWA2bgKkPB9oEnaZrqsILD7Y5HR0WVneDPXRbKlg73rOPdyHfLXG+2fyYjwYMCHYpOLBXG9eZPw6Nxl.mbPngWVU8sIAHrW1dZNMHbutKZNvaw.rQR98dqf6RIqNfkR16xTq8GbDxxZmLfrS2Xa1wDmAdsJXzJa6gjd5F03DaAclP1qu4O+f+7Ue2F0Nhbr7DL5NkIpxG1Pv.EIFLMl6M0UeAgqAIJNjzRMWAJCiIJnnLnP.1BPHlCaJbCQpcPnQJy6cbqXGzDlvkmLEsD9o+LJmW.74uY3.n3vX3.3yeSbAPf8LR.7G+Awmecf.3Wp+a+die4yxU7DnkfqqXHJwA3Ujjt.YmYR20jStWxxfbRLYdQcCTDJq4Bnrxb0lyBK3rt7nrtTpU9Pmw5zMP8EAfIMGLB3wWIj++D1p4v0ZwX7lv.buSTVwDAy884F4HHr2Klx5e59SU+zB+wFe3RYE4c+u.JqX3u7GkowPiaMmLqrwkIi0nmVpjveE792SHc6cIt8RnFxsq19PSpt.TnAr653m5RFQSuPxnDQRKRd0o6qLj5MvvvImCUICgyQ2MdeVQJ6rFxjL.TVI246Khn037c78d4UOaoo6vdgt7EgEoRy3IARRs79MFlEWVrNU3WKJVMsJpE0f9Bccw2+ymmAgh2l6LF1r7XXyJigMqNF1r1XXS1wvl6dt1H9oWteaNqk76FDDTsnWxkhRX+rIP+Kpn8FRA
-
@Christoph-Hart Amazing Christoph! I tried something similar but without knowing the how to... I'll make my day around this tomorrow
-
@Christoph-Hart said in FX Plugins and child Containers:
HiseSnippet 1675.3oc2Y0raaaDDdorW+ibbSSa5cgbxA1UfJ9GEifVqXI4DkXYoX433fdHflbkzVSwkgbkrUBJPOz68b6k9FTzq8PAxKPO0mf9F3K8TOzNKWJRJIZaEE3TmpC1bmYGxuYmY9lgRUcX5DWWlCRY185ZSPJWCWqqEuY9lZTKToBHkOBWVykSbRIEsYWaMWWhARQYhGHDnL6jHuOmtwlZlZV5jPQHz9LpNYaZKJOTZ0bOlZZtklAYOZqH6dkbkzYV4Ylr1.dl.qhr0zORqAYGMw1RfQJSUzfxYN03ZbhKrmMYFcq0jcrkb+6ScoGZRDKxfpA2HoXT9lTSip87UWDRYxpgd9DRO+l3xTCZf7vSfO1SQpPKhdFnjneHMYePJyYAosXlFhavY.OkHvaRI7tAtltC0lGpQfs4vkrffScM3XOJrj6Eo7FbdFrAKd5VZGQ1xAVDXvBqoptTpUUUu88p21RmSYVoXV6v3jJVKb6juN4rI+ljoFTU85wpS7XbXllDmXUKhzNmmgKX0t0gDmkR0QyrMIXif62+46Ti14qtzqirQlUIKJuhMwecXDHSLQ.j+wFDKR3iP.JbuHw79Qh8zDOXJbOlA6ccFjG3il+anw0PJDb16jN3y54g+zoxAauZo0CD1oRY99e85QzaPKlMT+dUV7w0NXwpcdbqkE5cq.+o9hQ1uDyQA5m3CzZlTChSUnXxCs.9CDD.Yrx0Cf6WgWakz4eVkGs31c2ta17q8jFcq7vh7cV7v6Z0IasGc3c6HVu95h0q0UktYaAbRuXAvnr0Vd0mbbEXSObwrOowKyR2a4U8VasdZD5okJHdHPRp+QLbraSb3TQzUo.oCPXHy3mEWf3dDmY6ECZYyrDADkouvnvIgQfR45FtnPtioF7lBm8uUPnlDZilbwp+BTZ2K5WxviEz6lmZqCDYGC8vGoS1PX7suHBLT44N6mU..c5Cfc73MGhS.XlXFsM038SWI3k8U.0X8wKHJ9sbo7tQ4seK3vTikCK1JnQDt2.Wkx0aFOdSDCdEkjWx30uiv73h0qSz4gfcR7VG7dl9eJIVR5mk.OeAP5KoIJf1ocqvbPWQtCjHg.od0FAB76OjfqfmOIPV5xAhWmTFt1o9hTEsZPsHo0cHfSUv0dGB+XlyQKbKP8st88lOYTSpScbkEgCZ48sL1kzfJFdvSunteAUg8gV6Rdo.nmiogdSb1q01fx1hdtO762aOfwAMdrcH1ZNj8XUM05tfqVKaSxtfcKk5PSl9Q0nuhLb2J+51ME6XA8lZVVDS2woo1.ywL8nk0LXKr97gdhUQQQYnz.PEJJlhfcYs4TqFk03NTf+BKRmfwwzI488VQBTBQ+Q4ZUwZQMYMhkg2h+A93qLSP1FnLSOkgsVQ9IVdo79WCWIxuwXHWSHkY.GCyrklNbb0splfb7FXQ2cnjj3jVOnzbJgEYDY5CB0sgyg9DCUIvss2flR7Cb7s7X3gwL8u9Y83hWB1grFaWHOQLJSY2nispLQjdXfWA2bgKkPB9oEnaZrqsILD7Y5HR0WVneDPXRbKlg73rOPdyHfLXG+2fyYjwYMCHYpOLBXG9eZPw6Nxl.mbPngWVU8sIAHrW1dZNMHbutKZNvaw.rQR98dqf6RIqNfkR16xTq8GbDxxZmLfrS2Xa1wDmAdsJXzJa6gjd5F03DaAclP1qu4O+f+7Ue2F0Nhbr7DL5NkIpxG1Pv.EIFLMl6M0UeAgqAIJNjzRMWAJCiIJnnLnP.1BPHlCaJbCQpcPnQJy6cbqXGzDlvkmLEsD9o+LJmW.74uY3.n3vX3.3yeSbAPf8LR.7G+Awmecf.3Wp+a+die4yxU7DnkfqqXHJwA3Ujjt.YmYR20jStWxxfbRLYdQcCTDJq4Bnrxb0lyBK3rt7nrtTpU9Pmw5zMP8EAfIMGLB3wWIj++D1p4v0ZwX7lv.buSTVwDAy884F4HHr2Klx5e59SU+zB+wFe3RYE4c+u.JqX3u7GkowPiaMmLqrwkIi0nmVpjveE792SHc6cIt8RnFxsq19PSpt.TnAr653m5RFQSuPxnDQRKRd0o6qLj5MvvvImCUICgyQ2MdeVQJ6rFxjL.TVI246Khn037c78d4UOaoo6vdgt7EgEoRy3IARRs79MFlEWVrNU3WKJVMsJpE0f9Bccw2+ymmAgh2l6LF1r7XXyJigMqNF1r1XXS1wvl6dt1H9oWteaNqk76FDDTsnWxkhRX+rIP+Kpn8FRA
This is gonna be so useful! Appreciate the knowledge @Christoph-Hart
-
Is This Work With File Player Aswell?
-
@Natanr Do you mean getting the arpeggiator to trigger a file player on/off in sequence?
-
@LeeC Nah, I Mean Showing The File Player's Waveform And The Start End Loop Markers
-
@Christoph-Hart Christoph
I Know What The First Two Does, But What The Third One Stand For?const var firstTable = Engine.createAndRegisterTableData(0); const var seqPack = Engine.createAndRegisterSliderPackData(0); const var audioFile = Engine.createAndRegisterAudioFile(0) // << This One?
-