Little trouble with nested includes
-
Yeah there doesn't really seem to be an agreed upon convention for getting TF working in C++, some people are using numpy/eigen, some are making their own wrappers like Frugally Deep and cppflow...
@Christoph-Hart Can third party nodes support prebuilt static libraries? Or does it have to be the source code? I might just have to bite the bullet and remake my autoencoder in pytorch since using TF in C++ is just a mess
-
@iamlamprey Using Machine Learning models in C++ can be quite tricky but here's an open source project by CHOW-DSP that uses machine learning and juce to model a Klon Centaur pedal.
I believe it uses RT Neural which is meant for real-time audio, however, the process should be somewhat similar.
https://github.com/jatinchowdhury18/KlonCentaur
https://github.com/jatinchowdhury18/RTNeuralHopefully, this helps with getting the implementation working.
All the best!
-
@KimiA Legend! I'll take a look, thank you :)
-
Okay think I have Tensorflow and CPPFlow building thanks for your help everyone!
Once I figure everything out and make sure it works properly I'll write up a quick post about it, in case anyone else here wants to mess around with Autoencoders (or god forbid try getting a GAN training)
Now onto the real endgame... how does one print to the HISE console from inside a Node?
-
why are the simplest things so difficult for me
// Parameter Functions ------------------------------------------------------- template <int P> void setParameter(double v) { if (P == 0) { // This will be executed for MyParameter (see below) String s; s = "test"; jassertfalse; debugToConsole(hise::Processor::getProcessor(), s); } }
-
If you‘re creating a third party node you‘ll most likely end up debugging jn VS / Xcode directly so you can print and breakpoint directly in the IDE.
Just open the IDE project in the DSPNetwork/Binaries subfolder, it should have the target set to the HISE Standalone app that will launch when you start debugging the project.
-
@Christoph-Hart do I have to manually target HISE if this happens?
or just debug the HISE project instead?
-
@iamlamprey Yes, go to the Project properties and select the HISE x64 Debug.exe as Command:
If you then click on the Debug play button in VS it will launch HISE and as soon as you load a node from your DLL it will jump into the code and you can step through it and print stuff.
DBG("Funky");
is your friend here. -
@Christoph-Hart Got it, thank you :)
-
@Christoph-Hart What would be the best way to add JSON-loadability to a node? Is that a realistic ask or would I be better off trying to just make this a base processor instead of a node?
-
@iamlamprey there is no API for communication with Strings so that will be a bit tricky. What data do you want to communicate?
-
@Christoph-Hart Yeh that would explain the error.
I'm trying to load a tensorflow model, so the data would be both the model itself (layers & their hyperparameters) and the actual weights & bias of the network (the "trained" part). They're mostly doubles I think but there's some strings in there as well for the type of layer & activation functions
The goal is
audio sample -> [network] -> output, where [network] is a big ol bunch of matrix math that does all the blackbox stuff automatically
Not gonna lie I may have bit off more than i can chew here, I've been watching Cherno's C++ series and I'm starting to grasp some of it but man my brain hurts lol.
I think I'll have to just get familiar with the tensorflow C api, all these other libraries and dependencies seem to pile up errors, and I really only need a few pieces of tensorflow (conv1d, leakyrelu, layernorm etc)
-
@iamlamprey Do you need to load different JSON files on runtime or can you include them in the C++ source?
-
@Christoph-Hart Ideally different ones at runtime (loading different models), but I could probably get away with including all of the models, then just use a node Parameter to switch between them and hide that parameter from the end user
worst case scenario I can copy the weight values manually into a struct or something and write my own activations (those are pretty simple), then the only part left really is re-creating the convolution layer, which is probably the hardest part
-
Here's an example of a "trained" model (it's not actually trained, the weights just get randomized on initialization) if it helps explain it better
-
@iamlamprey Is the structure of the JSON always the same? Because if it is then I would recommend spending some time writing a batch tool that converts it to C structs, otherwise I would stick to loading and parsing JSON - there are classes available in JUCE that do this for you but embedding Strings as hardcoded values with escaping the special characters is a bit annoying.
And yes I would definitely go the route of embedding all model data and then choosing the one you want with a parameter.
-
@Christoph-Hart It is the same "for now" because Tensorflow is Tensorflow and they'll probably change everything in a week for no apparent reason
Embedding sounds good, while I've got you here, can you recommend any great C++ resources? Now that I'm finally getting around to learning it :) anything specifically JUCE-related would be bonus points
-
@Christoph-Hart do you have any suggestions for this?
I've added the directories to the Additional Include Directories in the C/C++ properties, added the lib path to the Linker->General->Additional Library Directories, and included all (and also tried selectively including) the .lib files in the Linker->Input->Additional Dependencies options, using the Debug build for both the node & HISE (and I double-checked that all the options I changed were Debug-Specific, and the Library is the debug-build), and everything seems to build and link just fine.
But when I open HISE and load the project, the node is "missing" from the Hardcoded FX & ScriptNode. I know there's an issue with the library, since commenting out the #include fixes the issue, but there's no error messages or anything up until HISE loads the project so I'm not sure where to even start looking.
Also happens for Release node/HISE/library.
-
- Compile the debug dll from within Visual Studio and check if there are any error messages
- Check if the DLL exists at the place that is shown in your screenshot above. If not, then the compilation didn't went through
-
@Christoph-Hart No error messages compiling, I cleaned the build folder and re-built and the .dll shows up just fine.
I noticed:
'HISE Debug.exe' (Win32): Loaded 'D:\Documents\HISE\TensorflowHISE\DspNetworks\Binaries\dll\Dynamic Library\TensorflowHISE_debug.dll'. Symbols loaded.
Followed shortly after by:
'HISE Debug.exe' (Win32): Unloaded 'D:\Documents\HISE\TensorflowHISE\DspNetworks\Binaries\dll\Dynamic Library\TensorflowHISE_debug.dll'
The Torch library has some .dll's as well as .libs (but no dynamic .libs), so I've only included the .libs. Could that be what's causing it?