Scriptnode: Granulator
-
@FatMitchell Yes, just set the audio file slot to external, then hook it up to an AudioWaveform like you would do with a Looper or Convolution reverb.
Then create parameters for the knobs you want to control and connect it to your UI knob:
HiseSnippet 1416.3ocwX86baTDEdOYuN1NPlDlPunyYlfGIvIvLTX4eHkQjH6a7oXRCiy56VYsi1a2ataOao3IcT.UTPGUzPAMzRIL7mPXnmLCETB0T.uc2S2cJxwwQSHnBOZ28812298d62akcik9zjDYLxYotihnHm2.6MRn5uUeBSfZuMx4J3NjDEMtpcpMGEQRRnAHGm4tidBmklGY97mquIgSD9zhoPn8kLe58XgLUwrtMtKiyaQBncYgkrdsFs8khsjbYJfm4v0PQD+Ajin6PzlUAibVnY.SIi8TDEMA4L+lxfQd8kmHr1uOKgcHmpGTG4Aajc5VRdfFw5YQa0mwCbGetSPvt3VvByYYgqi6vBX4yWvFW0rP0BOJyGNUlDdyMA7p+7f2Y.ImRPZdKjtF1yOlEoJVQimKiaKfjSOBP6kgh0VjyOg2RBFHTqFRFPaECCxcXkaWq1MqB+4FeTuTguhIEUkhcjJ5thUtwxmt7RK+3kq9rK0q2YtlNLwRNmFelKqyzwmmiqHRCOjFeypGS3ozbCgi+jb5BWLN02dpKYnTzVvT6FQyFe9EEnLZCxEUxPHDakIS71YYhMRCXxOgbLsmLNDwBzUGSLWcj4vT99P.QQPNuC9T2818iatU2CZs681t4dOtKMQ0NLJkmPW8DxwnXh3HJbligbH1Q6oYllh.83ZdYHz.q4rv5JYvxiyBnwF7bI7cExCmDFO7K+4eccz8ausFIPoR1AEN7QzXESywNaSOFt1Zq6VBuMMYfRFYXhvHoPSKNK9RyECy4gFOrwnhAxFQiI91AFAHyNVs0CpiRHgQbZaQ.cnMudBKP0WSAeMPJ8ori5aHHAxPH4n6JuPJYn1suE7Zj9K+.raIpQ55nELFfBYAAbpqLgoqSKox8ifXXjG6QF97zq+824oO5yVOrrPHBERFVVWLIsWO1PiBVOFOLQAXpcHHrgbdK78SnUCn8HobU0jAv9vYhAzftRi8OepIhDCxhvUY8JKiyQJZZoCPzRFjxIpIUxzx2YKncrr7gViP.a3nxGiWB4sZmq71EEhWC6xT98OaLV4Lvn915+AXLqovaha1qG0WU.v4wsdvr1An1EuC.1F+kyR+PL0AehpgxfXmzPyUuVLtFCXGs9w3FBeNtP7MJlBUQztRWNYzJ16Z6A.+lUOjK8GnKxmVwNqhbSsEq32mHDTdxrHruvqnlkn8joJl3nND3dk9ZMb98fmP3S2JCcZNnhVfvNt1XIUOpHvL3efOYKVOmvfEqOdwh1AncnpSjwCL4nruCEB1DRhgjOn2v5nM3b4IZEIVVoKjXLy4J4ih5KELe8TVKFizMBkoB0X35TYGYfVQpEwGHpQtDsz20v5daPEHMdU+7JwIh8DECvVL9IU1SMDxPiHIHun4a2wBIZk+JNyUpSfsLTOBtjUwFm1I6qW0mvQ6aaq.fUGEKiXPL1Z5QPOK6cZzTGgX5pkV9hi3IwmQymSGNtYVo59xizIHaOD6F1DpHCft+F2xRwcXhryi0lNjg4iM8aKwSPNIeDzRov0BgnB2KDP8J04XrcdCnmXImxVp4uRZ546zuz4vq9fQOY8MRUxP3diQHDUBKKLMV9s0mFKnFWHr7MeUse2fkKYUhQScjdAwdsFSG6unwKGObY7chgxbiCOyV0swKH9uJxC5G.Y6yL0l+ZH5Kh8.YZRv+SAeapJUPOufaUIJAkmo18UOxxc8O96u6udxm9z0MOhUPMMdRxdSa1vLQT6qmJI3397d8zlR4fPhQeeldj7qktQgD+X4A91Fr5S7hlY.wQg4mJuD7a1gwUye4OFWa0Z52zxNv2W+tk2sNBc197dyfOu+L3yZyfO2ZF741yfOevL3yGdt9n+uFjIZaJyPcbaZ693zTPf24XZ8g9Wv+UzoM
-
@Christoph-Hart How can we control the sample map selection in the granulator from the ui? I can't link a knob to the combo box in the granulator itself...
-
- Register it as external audio file
- Use the
loadFile()
method, but with the samplemap wildcard identifier:
const var af = Engine.registerAudioFile(0); af.loadFile("{XYZ::SampleMap}MySampleMap");
-
-
@DanH yes I just typed it out of my head...
-
@Christoph-Hart Forgive the noob questions on this, I'm coming into it very cold.
What does the XYZ::SampleMap part of the wildcard refer to?
Essentially I'd like to select the sample maps in the Granulator with a combo box
-
just set the sound record opening to outer, then, at that point, connect it to an Audio Waveform like you would do with a Looper or Convolution reverb.
Then make boundaries for the handles you need to control and associate it to your UI handle.
Thanks
-
@mrfurniture5e amazing....
-
WTF? When a spam robot starts to post working answers to a super specific problem you know the uprising isn't far.
-
@Christoph-Hart any chance of an actual answer to the question though?! :face_with_tears_of_joy:
-
@DanH isn't it simply :
af.loadFile("{PROJECT_FOLDER}MySampleMap.xml");
?
https://docs.hise.audio/working-with-hise/project-management/projects-folders/sample-maps.html -
@Matt_SF I hadn't tried it - I thought it was a different kind of wildcard :man_facepalming:
Thanks, will give it a go now :)
-
@Matt_SF Do you have any idea how I use this to select the sample map within the Granulator?
-
@DanH I didn't try it but I guess this should work (thanks Christoph!) :
const var g = Synth.getAudioSampleProcessor("ScriptGranulator"); const var sMapSlot = g.getAudioFile(0); sMapSlot.loadFile("{PROJECT_FOLDER}MySampleMap.xml");
Don't forget to setup your granulator node so it uses an external slot :
For the loading of audio files, you can also take a look here, the process is similar :
Changing Impulses in Scriptnode. -
Nononono, the
{PROJECT_FOLDER}
wildcard only works if you use it to load a sample map into a sampler. For audio files slots it's different:You can basically load three things into an
AudioFile
slot and it tries to figure out what you throw at it based on the wildcard (or other things).- a single audio file. This is where you can use the
{PROJECT_FOLDER}
wildcard to reference the embedded audio files (or the project's AudioFiles folder). - a SFZ file. Then you need an absolute path with the file extension
.sfz
- a samplemap. Then you need the wildcard
{XYZ::SampleMap}
- like, literally:XYZ::SampleMap)
:)
The
XYZ
in this wildcard means a 3-dimensional mapping (Notenumber, velocity and RRGroup) and is used in the HISE codebase whenever an audio file loads a sampleset with multiple samples. - a single audio file. This is where you can use the
-
@Christoph-Hart haha, I just figured you had written a generic example .
-
@Christoph-Hart OK thanks for the clarification! I referred to the [documentation] (https://docs.hise.audio/working-with-hise/project-management/projects-folders/sample-maps.html) but it is indeed for the usage in a sampler
-
@Christoph-Hart Rather than a sample player, would you like to add a time stretch node with incoming audio process?
-
@Christoph-Hart ok so how do I load this into the actual granulator?
I tried this (cobbled together via the convolution thread) but I assume it's meant for audio files rather than sample maps... I get an 'object' loaded into the single sample window as opposed to anything in the sample map one. Do I need '.xml' at the end of the loadFile string by the way? I assumed not...
const var g1 = Synth.getAudioSampleProcessor("GRANULATOR1"); const var af = Engine.createAndRegisterAudioFile(0); af.loadFile("{XYZ::SampleMap}AAB303-PROTON"); inline function onComboBox1Control(component, value) { g1.setFile(af); }; Content.getComponent("ComboBox1").setControlCallback(onComboBox1Control);
Thanks! :) -
@DanH well, you pass in the object reference to g1, but I'm amazed that it actually worked and displays the object pointer :)
You need something like this in the control callback:
af.loadFile("{XYZ::SampleMap}" + component.getItemText());