• Looper Function DSP needed

    General Questions
    1
    0 Votes
    1 Posts
    20 Views
    No one has replied
  • 0 Votes
    6 Posts
    82 Views
    StraticahS

    @HISEnberg Yes HISE tutorial then custom UI instead of the simple HTML list.

    I never compiled as standalone tho?

    here is my adjusted script from Example:
    Its probably not usable and makes it even harder to debug but might give enough context.

    The HSIE example worked inside a VST for me i believe.

    /** Custom User Preset Browser using a webview! This example project shows how to use a webview to implement a custom preset browser using a HTML webview. It supports bidirectional synchronisation, so if you load a user preset, it will update the selection in the webview and vice versa! The state here is just a single knob that will send it's value to the webview to be displayed. The HTML side only consists of a javascript file that defines the callbacks and populates a standard HTML select element. You probably want to use something more fancy in the end, but the communication will be pretty similar. */ // All const var declarations must be at the very top in HISE const var userPresetObject = []; const var expansions = Engine.getExpansionList(); const var expansionInfo = []; const var wv = Content.getComponent("WebView1"); const var webroot = FileSystem.getFolder(FileSystem.AudioFiles).getParentDirectory().getChildFile("Images/preset-browser"); const var uph = Engine.createUserPresetHandler(); var expansion = null; var expansionPresetFolder = null; var expansionPreset = null; var userPresetsFolder = null; var expansionFolders = []; var presetPath = null; var pathParts = null; var webviewInitialized = false; // Flag to prevent re-initialization var expansionFolderName = null; var folderExists = false; var j = 0; var k = 0; var expansionObject = null; var rootFolder = null; var folderName = null; var wildcardRef = null; var sourceArtwork = null; var artworkFolder = null; var targetFileName = null; var targetFile = null; const var initTimer = Engine.createTimerObject(); const var startupTimer = Engine.createTimerObject(); const var presetTimer = Engine.createTimerObject(); //Content.makeFrontInterface(600, 600); // This is required because JS will mess up the "\\" path on Windows inline function getEscapedFilePath(file) { return file.toString(0).replace("\\", "/"); } // Let's build up the preset database. For our example we'll use an array of // JSON objects with a `name` and a `file` key that will be consumed by the Webview and // populate the select element, but you're free to attach whatever other things you might need // Get root presets for(userPreset in FileSystem.findFiles(FileSystem.getFolder(FileSystem.UserPresets), "*.preset", true)) { userPresetObject.push({ "name": userPreset.toString(1), "file": getEscapedFilePath(userPreset) }); } // Get expansion presets Console.print("Found " + expansions.length + " expansions"); // Collect expansion info for the webview var expansionFolders = []; // Track unique expansion folder names for(i = 0; i < expansions.length; i++) { expansion = expansions[i]; Console.print("Processing expansion: " + expansion.getExpansionType()); // Try to get expansion root folder and look for UserPresets subfolder expansionPresetFolder = expansion.getRootFolder(); if(expansionPresetFolder) { Console.print("Expansion root folder: " + expansionPresetFolder.toString(0)); // Look for UserPresets folder within the expansion userPresetsFolder = expansionPresetFolder.getChildFile("UserPresets"); if(userPresetsFolder) { Console.print("Found UserPresets folder in expansion: " + userPresetsFolder.toString(0)); // Get presets from this expansion's UserPresets folder for(expansionPreset in FileSystem.findFiles(userPresetsFolder, "*.preset", true)) { userPresetObject.push({ "name": expansionPreset.toString(1), "file": getEscapedFilePath(expansionPreset) }); // Extract expansion folder name from the preset path (0.2.2 working approach) presetPath = getEscapedFilePath(expansionPreset); pathParts = presetPath.split("/"); // Look for the expansion folder name in the path // Typically: .../Expansions/ExpansionName/UserPresets/... for(j = 0; j < pathParts.length; j++) { if(pathParts[j] == "Expansions" && j + 1 < pathParts.length) { expansionFolderName = pathParts[j + 1]; // Check if we already have this folder name folderExists = false; for(k = 0; k < expansionFolders.length; k++) { if(expansionFolders[k] == expansionFolderName) { folderExists = true; break; } } if(!folderExists) { expansionFolders.push(expansionFolderName); Console.print("Found expansion folder: " + expansionFolderName); } break; } } } } else { Console.print("No UserPresets folder found in expansion: " + expansion.getExpansionType()); } } else { Console.print("No root folder found for expansion: " + expansion.getExpansionType()); } } // Convert array to expansion info for the webview // Metadata for known expansions: descriptions and tags var expansionMeta = { "Hardware-Lab": { "description": "A collection of distorted, textured sounds with that classic, vintage synth touch. Expect experimental tones, heavy synth sounds, glitches, and that analog character processed through hardware pedals.", "tags": "Analog, Bright, Vintage" }, "Immersive": { "description": "Cinematic sounds inspired by legendary film composers like Hans Zimmer and Ludwig Göransson, but also epic composers in the rap industry such as Mike Dean. Cinematic, Melodic, and built for epic atmospheres.", "tags": "Epic, Melodic, Cinematic" }, "Pro-Essentials": { "description": "Your go-to expansion of proven sounds, first designed after studying the sound behind various hit songs of popular albums. Everything from simple and essential sounds to carefully processed and reliable tones.", "tags": "Essential, Polished, Reliable" } }; for(i = 0; i < expansionFolders.length; i++) { // Use the expansion handler approach - get the expansion object expansionObject = null; for(j = 0; j < expansions.length; j++) { expansion = expansions[j]; rootFolder = expansion.getRootFolder(); if(rootFolder) { // Handle Windows/Mac path compatibility var rootPath = rootFolder.toString(0).replace("\\", "/"); folderName = rootPath.split("/").pop(); if(folderName === expansionFolders[i]) { expansionObject = expansion; break; } } } // Use specific metadata if available, otherwise fallback var meta = expansionMeta[expansionFolders[i]]; var expansionDescription = meta ? meta.description : ("High-quality presets for " + expansionFolders[i]); var expansionTags = meta ? meta.tags : ""; // Use HISE founder's method - generate complete HTML with {EXP::...} syntax // Use exact expansion folder name (with spaces) for {EXP::...} syntax var expansionNameFormatted = expansionFolders[i]; // Keep original name with spaces var expansionHTML = '<img class="expansion-cover" src="{EXP::' + expansionNameFormatted + '}artwork.png" alt="' + expansionFolders[i] + ' cover art" onerror="this.style.display=\'none\';" />'; Console.print("Generated HTML for " + expansionFolders[i] + ": " + expansionHTML); expansionInfo.push({ "name": expansionFolders[i], "type": "expansion", "description": expansionDescription, "tags": expansionTags, "htmlContent": expansionHTML }); } Console.print("Total presets found: " + userPresetObject.length); Console.print("Total expansion folders found: " + expansionInfo.length); // Debug: Show what we're sending to the webview Console.print("Expansion info being sent to webview:"); for(i = 0; i < expansionInfo.length; i++) { Console.print(" " + expansionInfo[i].name + " - " + expansionInfo[i].coverArt); } // Grab a reference to our little budddy // That's a bit ugly, but we grab the image folder by getting the HISE project AudioFiles folder // and then doing some next level-hacking to get a subdirectory of the Images folder which I think is a nice // place for web stuff... // Call this to make sure that there is no intermediate temp stuff being carried around wv.reset(); // set the index file (this is already the default, but I'll call it here so that you know it exists) wv.setIndexFile(webroot.getChildFile("index.html")); // Enable caching for better performance //wv.set("enableCache", true); wv.set("enablePersistence", true); // Initialize webview with proper timing inline function initializeWebview() { Console.print("=== INITIALIZING WEBVIEW ==="); // Wait a bit for webview to be ready, then populate data initTimer.setTimerCallback(function() { Console.print("=== POPULATING WEBVIEW DATA (TIMER) ==="); Console.print("Current HISE zoom level: " + Settings.getZoomLevel()); // Now we call the updatePresetList function that is defined in the Javascript of the Webview // (and tucked onto the global `window` object). wv.callFunction("updatePresetList", userPresetObject); // Also populate the left panel with expansion info wv.callFunction("updateExpansionPanel", expansionInfo); Console.print("=== WEBVIEW DATA POPULATED (TIMER) ==="); this.stopTimer(); }); initTimer.startTimer(500); // Wait 500ms for webview to be ready } // Add webview ready callback to ensure data is sent when webview is actually ready wv.bindCallback("webviewReady", function(args) { Console.print("=== WEBVIEW READY CALLBACK TRIGGERED ==="); Console.print("Current HISE zoom level: " + Settings.getZoomLevel()); // Send data to webview now that it's confirmed ready // HISE should handle webview scaling automatically wv.callFunction("updatePresetList", userPresetObject); wv.callFunction("updateExpansionPanel", expansionInfo); Console.print("=== DATA SENT TO READY WEBVIEW ==="); }); // Note: Scale factor handling removed - letting HISE handle webview scaling natively // The webview should automatically scale when HISE's zoom level changes // Initialize the webview with a delay to ensure it's ready startupTimer.setTimerCallback(function() { Console.print("=== STARTING WEBVIEW INITIALIZATION ==="); initializeWebview(); this.stopTimer(); }); startupTimer.startTimer(200); // Wait 200ms before initializing inline function onKnob1Control(component, value) { // This just simulates the communication from HISE -> WebView // (the function window.updateValue() is defined in browser.js) wv.callFunction("updateValue", value); }; Content.getComponent("Knob1").setControlCallback(onKnob1Control); // This binding will call the given function when the Webview is // calling the loadUserPreset function (which happens in the onselection callback) wv.bindCallback("loadUserPreset", function(args) { Console.print("LOAD FROM WEBVIEW"); Console.print("Args received: " + args); Console.print("Args[0]: " + args[0]); Console.print("Args[0] type: " + typeof args[0]); Console.print("Checking if args[0] == '__REQUEST_CURRENT_PRESET__': " + (args[0] == "__REQUEST_CURRENT_PRESET__")); // Check if this is a test from filter click if (args[0] == "__FILTER_CLICKED_TEST__") { Console.print("🎯 FILTER CLICKED - BROWSER CAN CALL HISE!"); return; } // Check if this is a request for current preset if (args[0] == "__REQUEST_CURRENT_PRESET__") { Console.print("=== REQUEST CURRENT PRESET FROM WEBVIEW ==="); Console.print("getUserPresetList() returned: " + Engine.getUserPresetList().length + " presets"); Console.print("uph object available: " + (typeof uph !== 'undefined')); if (typeof uph !== 'undefined') { Console.print("uph.getCurrentUserPresetFile available: " + (typeof uph.getCurrentUserPresetFile === 'function')); Console.print("getCurrentUserPresetFile() result: " + uph.getCurrentUserPresetFile()); if (uph.getCurrentUserPresetFile()) { Console.print("Sending back to webview: " + getEscapedFilePath(uph.getCurrentUserPresetFile())); wv.callFunction("setSelectedPreset", getEscapedFilePath(uph.getCurrentUserPresetFile())); } else { Console.print("No current preset file found"); } } Console.print("=== END REQUEST CURRENT PRESET ==="); } else { Engine.loadUserPreset(FileSystem.fromAbsolutePath(args[0])); } }); // This binding will call the given function when the Webview is // calling the savePresetInHise function (which happens when saving a preset) wv.bindCallback("savePresetInHise", function(args) { Console.print("=== SAVE PRESET CALLBACK TRIGGERED ==="); Console.print("SAVE FROM WEBVIEW"); Console.print("Args received: " + args); Console.print("Args type: " + typeof args); Console.print("Args length: " + (args ? args.length : "null")); if (args && args.length > 0) { var filePath = args[0]; Console.print("File path received: " + filePath); // Create folder if the path contains a slash (indicating subfolder) var userPresetsDirectory = FileSystem.getFolder(FileSystem.UserPresets); Console.print("UserPresets directory: " + userPresetsDirectory.toString(0)); // Handle Windows/Mac path compatibility for folder detection var normalizedPath = filePath.replace("\\", "/"); if (normalizedPath.contains("/")) { var folder = normalizedPath.split("/")[0]; Console.print("Creating folder: " + folder); var folderCreated = userPresetsDirectory.createDirectory(folder); Console.print("Directory created: " + folderCreated); } // Create a File object from the path var presetFile = userPresetsDirectory.getChildFile(filePath); Console.print("Created file object: " + presetFile.toString(0)); // Save the current preset to this file (remove .preset extension for Engine.saveUserPreset) var presetPath = presetFile.toString(0).replace(".preset", ""); Console.print("Preset path for Engine.saveUserPreset: " + presetPath); // Call Engine.saveUserPreset with the path string Engine.saveUserPreset(presetPath); Console.print("✅ Engine.saveUserPreset() called successfully"); Console.print("✅ Preset save process completed"); } else { Console.print("❌ Invalid preset data received"); Console.print("Expected: file path string"); Console.print("Received: " + args); } Console.print("=== END SAVE PRESET DEBUG ==="); }); // This binding will call the given function when the Webview is // calling the overridePreset function (which happens when overriding current preset) wv.bindCallback("overridePreset", function(args) { Console.print("=== OVERRIDE PRESET CALLBACK TRIGGERED ==="); Console.print("OVERRIDE FROM WEBVIEW"); // Get the current user preset file path if (typeof uph !== 'undefined' && typeof uph.getCurrentUserPresetFile === 'function') { var currentPresetFile = uph.getCurrentUserPresetFile(); Console.print("Current preset file: " + currentPresetFile); if (currentPresetFile) { // Extract the path without extension for Engine.saveUserPreset var presetPath = currentPresetFile.toString(0).replace(".preset", ""); Console.print("Preset path for Engine.saveUserPreset: " + presetPath); // Call Engine.saveUserPreset with the current preset path Engine.saveUserPreset(presetPath); Console.print("✅ Engine.saveUserPreset() called successfully for override"); Console.print("✅ Preset override process completed"); // Send success callback to webview wv.callFunction("onOverrideSuccess", currentPresetFile.toString(0)); } else { Console.print("❌ No current preset file found - cannot override"); wv.callFunction("onOverrideError", "No current preset selected"); } } else { Console.print("❌ UserPresetHandler not available"); wv.callFunction("onOverrideError", "UserPresetHandler not available"); } Console.print("=== END OVERRIDE PRESET DEBUG ==="); }); // This will attach a WebView function call to anytime a user preset is loaded // and will update the selection (window.setSelectedPreset is defined in browser.js) uph.setPostCallback(function(presetFile) { Console.print("=== PRESET LOADED CALLBACK ==="); Console.print("Raw presetFile: " + presetFile); Console.print("Type of presetFile: " + typeof presetFile); Console.print("Escaped path: " + getEscapedFilePath(presetFile)); Console.print("=== END PRESET LOADED CALLBACK ==="); wv.callFunction("setSelectedPreset", getEscapedFilePath(presetFile)); }); // Handle request for current preset selection from webview Console.print("=== BINDING REQUEST CURRENT PRESET CALLBACK ==="); wv.bindCallback("requestCurrentPreset", function(args) { Console.print("=== REQUEST CURRENT PRESET FROM WEBVIEW ==="); // Try to get current preset using Engine API Console.print("getUserPresetList() returned: " + Engine.getUserPresetList().length + " presets"); // Try to get current preset file from uph Console.print("uph object available: " + (typeof uph !== 'undefined')); if (typeof uph !== 'undefined') { Console.print("uph.getCurrentUserPresetFile available: " + (typeof uph.getCurrentUserPresetFile === 'function')); Console.print("getCurrentUserPresetFile() result: " + uph.getCurrentUserPresetFile()); if (uph.getCurrentUserPresetFile()) { Console.print("Sending back to webview: " + getEscapedFilePath(uph.getCurrentUserPresetFile())); wv.callFunction("setSelectedPreset", getEscapedFilePath(uph.getCurrentUserPresetFile())); } else { Console.print("No current preset file found"); } } Console.print("=== END REQUEST CURRENT PRESET ==="); }); Console.print("=== REQUEST CURRENT PRESET CALLBACK BOUND ==="); // Trigger preset selection update when webview loads // This handles the case where plugin reopens with a preset already loaded Console.print("=== PRESET SELECTION HANDLED BY UPH CALLBACK ==="); // This is just a zoom factor combobox that demonstrates the correct scaling // of the WebView - HISE handles webview scaling natively inline function onZoomFactorControl(component, value) { if(value) { Settings.setZoomLevel(component.getItemText()); Console.print("Zoom changed to: " + component.getItemText() + " - HISE will handle webview scaling automatically"); } }; Content.getComponent("ZoomFactor").setControlCallback(onZoomFactorControl);

    Also make sure if offline you have persistance and cache enabled.
    I also clear the exported_webviews folder from time to time

    If it works in HISE it usually works in VST build aswell at least on my end.
    The scaling and initializing bugs i had were both in HISE and build.

  • Get Audio File Length Independent of Audio Looper Start/End Points

    Unsolved Feature Requests
    6
    0 Votes
    6 Posts
    48 Views
    d.healeyD

    @HISEnberg said in Get Audio File Length Independent of Audio Looper Start/End Points:

    since this could allow the user to modify the buffer via scripting if they like

    You can already do that with setRange()

  • HISE crashes when setOnGridChange(true, onGrid) is used

    Bug Reports
    1
    0 Votes
    1 Posts
    13 Views
    No one has replied
  • 0 Votes
    5 Posts
    38 Views
    F

    @d-healey I just delete the script node and I can see now works , but I will made more test on diferents Daw-s and I will be back with more info , tank you a lot , you save me

  • WebView Not Scaling With Zoom Factor

    Bug Reports
    21
    2 Votes
    21 Posts
    2k Views
    StraticahS

    @HISEnberg I wanted to try if next if having webview dimeansions not fixed but using something dynamic like VH or REM like in web context would fix scaling.

  • Installiez problem on macOS Monterey

    General Questions
    6
    0 Votes
    6 Posts
    52 Views
    Christoph HartC

    @sletz I'll need to check, but that installer is ancient. But yeah I'll be moving away from this installer solution going forward, that entire thing has been nothing but a complete failure from my part :)

    At this point I would suggest you just build the development branch from HISE from scratch - the compiled binaries do not include the Faust toolkit so you would have to recompile it anyway to use Faust (which I assume you want to).

  • Not working: getMinValue() and getMaxValue()

    Bug Reports
    19
    0 Votes
    19 Posts
    139 Views
    Christoph HartC

    Alrighty, that's fixed now, not sure where this regression came from, but it didn't treat embedded script files correctly and assumed that the file was deleted - I vaguely remember a fix a few months ago regarding non-existent files that might have caused this.

  • Token Parser - LoKey HiKey setting?

    General Questions
    3
    0 Votes
    3 Posts
    37 Views
    LindonL

    @d-healey said in Token Parser - LoKey HiKey setting?:

    @Lindon Set the root as single key. Ignore the other two. Then once mapped, select them all and extend the range down one and up one.

    yeah thats what I've always done... Im just looking to remove one more step from this process....

  • Matrix Peak Meter Tutorial

    General Questions
    17
    6 Votes
    17 Posts
    2k Views
    S

    @clevername27 said in Matrix Peak Meter Tutorial:

    HI! thiis iis exactly what ii was looking for since i cant make iit by my self yet! But how can i make it vertical? i replaced Horizontal with Vertiical but it turned just grey. what else should iin change in there? im new to scripting

    sorry for the double ii's, my keyboard iis fucked haha

    HiseSnippet 5204.3oc2a0uaabrcmx17hPkz1bKtEs+4.iBHpDZZI4jabspy0x5CagZaIXZGmTiffQ6NjbpVtCu6GhRIWCTzmv9HzGg9Fz96blY1cVRJEWCCmjR.aHt6Lm4LmO+cNyviyLQp7bSVqU57hKlpZsxmzdvEoEi2crTm15v8ZsxG29Xk7zmpJTYsd3ESk44p3Vqrx0eDMfU5biV7m+6+zCkIxzHU8iZ05aL5H0SzSzE0O83G7unSRNPFqdgdRvn+hGbXjIcWShoDLy0auQqoxnSkiTOSRC6Zsasxua+XcgIaPgrPk2Zka7PS7ECFalkZG+2ny0mjnnurYqAfP1GefIIl3X5os1crNI9X+lNuUqUZebsH35VQven8S0w5pmWKJ9T9Eh5YDJOV4ZMYuq2f81Lj81Hf8VBKsR.KcCKK86aOHJSOsn9MVUygoPsLTBwdHqXGaqq8u2q8tFLhzh9SjmpNHCeoZFc+iarQOA9u02d0Uu8m8d7ypel382mOnT6o6+h8e9gO6QhCd4y18EGdzy9km2dH7VD6elLMWHSiEi04hBkbhvLTLTkkoJx+.wauG+baXvcawKn8xvxznBsIUf+NVkqGkphECMYhbc5nDkHZrLMUkjS6WYYr1zSTL1TNZrPWHlAYCQIYYgYhrPGISRtPHOSkg3FhIkIE5oAznuXfpPbABvHRKmbhJiHp+kDczof3JwKzIp0xESyLSUYEWHTrecenETo9UelRXRoEKh7G4oMEgIYxfYoMwNto6rwXVzZ9jcNnw1kduJd8dDsRUfoESzfTRlPDcNQEIKyUhGe3f8oIngmK1koiDFZzzTtPjKmP6QGq2EhthwQlIXTqaEXBlTkCg0RewiUYJgD+iYXYFhsBhl6m9w9srNMepJB65sq3hYJVTi4poUbBhpvrB1YHFmHSkFi8c5ndhbyDEIZAEyarJj9RjZJXBAFJpXwo2GujdOBamXl8JS1o4HQf5dhCGkZxT9WeHF94y+vWlqF.BFo10oTum3UiUfMxHstXlLsPTXDSTx7RmLfr3jIhDHLSDiLzNRmVXEZz6shPHPmZRwNlnyZXpYJHNUoQ79EVqzPMkESKKrjxyQGKiiwXFn+QrCdh9TkX2ACfHgeJYJSp0bgZxTHz4Mp.VEPJaJgyNQUnIzwj3zyQj0Irj0HWKY4PJjRxYAgGHSLGQqj5rgCKkh8LEkT5oxyoz5P.oKFKRgY0YNCs.EISIVoEqymlHg4tHWQjtPwRnQYxoi0QBk0dPzUJRzop0wLkEfRSyfEPZg0+XhImdVDMPxDuu3UJQrWTqYiPmeBYCIJJyRsuvLbnnqtupOdN7f0rV7GUYl08aImBmsJTPsuSJDLYfgC7v6S1GhWuw2SJrWu42ygYRTCKnumoGMtfYk5ge3PavBqKVNKpmXRMXaBkCYQEaRWq.5sDsKth0bB9zrM5ZSDiJQ3AR6bhAx4pnYdWPPZnLOfh2AckBQ2XxX4chFyLkIwvGD7cuM+dJBF3gKHCRVfehBNIHRjObIwX93dgaFR1hoYsH7AgpbaltG7wufviwDXO3PV8DVVpRgMMBM.QF4UZspjSw9VE2i7mRwxa0iPumOFAgrgCQPtTwHnyxmXf..w1gWhP6DrxhBfwin0nLElHlcJqWINSrCY6AglL8BQ7EoxI5HNnbjUhV68.CRD6uLQlg3sHT0vxDR2Rzvq5X9ZLxLH5BYsUsQeccXPBGVNvPFxwpIq0dvHFdpwYkSx66UjHrkHBwFAVvdHbZg3PR3qgytyFcJGb1P4osg1pxIvqtO3IbJfzABBXBWlyF5vllCkt73kAAJoLH7q7wBHyGgL2IPo8dL6DirWNW553pfgAildpWq+BG6INSlT5EQyTrGJMygYlI1HBDaOLwXS8LEwHKbywplf5g+J4qsY+MHuIN+DkQWmWv619h+UnVoGkivWHzU+f4Yy0ULSgDka.BP1fDgBheHEQIvJy4e0mvObYeXoDDt6kImINBRMtzEwsuhOLbjaE9Q7nDyIHuv2HyzRfZOmGxtjUp0wsQxbJPBoeXcS+UQcLHRGFwO.PIY5yqpeRbegGOdDSpmX.HfmXLmtSZ7AJURWFK9sQfw0flWcNh4ZyLC6hy7rhfQTLiB6y7xj9qh2IFwb7OXQ1bzPdAe4zXpXDrtarMMnNjB+wnfnGaxz+HXEYxQCGRwTuOI42dIBh8TCQDcVPdfa+xih1T93IdaiBnaWcI669YpQZJ.mmBcuYLzNOs4ntYuJIZWJq5I+aqK9oUWsSsfuVD.86XrMXUQLhRAOWxyyB5vZVa4spL28WsCIk3m9Py4nJsrhuEaarL8gAtD4E1dIC46BGxlyOjWoiQ.pfQr07i3wJNwRvPtCMDdWU4AZC2SgTQjGX5DrMxYiKkLZbEB35f5yTq4y9Gt8HI5NLIsKKSmvEEdfiJFaWFZU8Ku5OWBadHaoUuFh7UrpB6x1vnyC9Jb06aWx.lngEMEgwYsiHXr8MXgKbfavib3SqybwKq2Z1qFty10OeGWU.2eiPMxtlrTU1yIzUjA68Ea0PeIy7jpgFd6UoZfBG1yL5b0AIFSlkFy+9cflt9oigMfJufcYXWQ+K7afi4JFHR4dI+ePPw30gqdr0KjjA0RMxxfPKRgdh3FmfHxdRmKGpdpiarcUgi9XGER2pRqYC.vTlboC9BEkyudzyjYT59Kc7FjHcjpd7QI5oSUwW53AxzEkHKLpYiQ4OMENVqHFus0DhpYQOTasWhweeBii6EjoTUxDWLigL.9BOsPbRoM2VENTWz7EDnVNZmIDpuR.M+9ha8kKSV1XD2odDwj3IawgrYSQlShENDJ.cmEhPOnPMUr48DORRU5Pl0GlBSiILZDwNmPHtnv2C3bmVJ7JpjSHm.d9RtWBjcTcLG.JAFcD1MX1wQY0Y95pg7DkchfDLzVDFdFSQxekRZchyi8DI8+lT2jA7MBuPk64.rr7FxFP3PtzVx.OiKuNnzqfvNmQfcb8HvEkJHTeyZX0p75pXsZQxeoKOABMbiHkHSi0rpi8+IbMww13t7Lvxw36KmXoUm5Mg6u9b9O1ddxbfS.5CBXIGjKDrVWf95RNrI9sI1Q.YuutHABmLKtSp9YOw8nlpPhP8TfpbYghule0sXmKbXVIFg1d0wW8qvCqp9WLAIIf10ZFPlYSLbULvJAYX8aBa2LrJHckVkZ2AxDisSNvO3INAuW63EDKcpaYAZVVM80gANIMTy3nVw8a347lFAFXYNWfgKI.WtI+1FoFprDu8xyf4b2Nb3BDiSVeBf4R.UCqJEekqq02qApPsxTcDDCV2DqYKDoYDp8fVPLVFfWtGCBFlHj.ZzkCq1xeotXZiz.PGptYBWjBYfImfTcLfB2bb8d5DoaIHT+qQPJsf+Y5sDduQLwvMA3.u5xKV+ZhcI0USYMdHos3U3nJR4ar.3oIRDjqbJ6TLyvU0gJ4kfWyVneBMqGnGSTVhInQjcFr+rcSgrBSis6AqHfM38dZTCansxbyhqE0qvldaEYNYUVLW2ySSaUaReNEmVwqQwdhsXyrNIrmNy0Lg8kxzwFvGO2FflQbvGZx7vPD2pIhGevykjNXq6w0+3ppTrKurtD.1I8LyLeLdxyrzUWiEmFsAES0mCefd9XCMK.qy7.l51fUuUCFccwmEZL3bq3ZKo0OFyDU3xsy7OWpotEvqBm5l6KTTBR.l6eLkdhGWOu46zLT6yIIWvzkpTutK.0tavT3zTyr9hAb1Mt3ZtGtTsHTlPqViL2z7VNPMU6uK8cAv2nO19uoz3qqePMPw0opY5.geGGttdyArqYcL0cSh3n9hGFjOMrVPnB4hihsDlYRlxb2N7o00AHBbAn6SwMHcPOesjReSyJLVhYwSQXmhJHPKVrT0qNalXxhIOhl3qxoZmHquwUEZZQW0yR4Fi4LJccT0H3WNiDj9PTXyvkQAgcm4QYCSuW2rntdyUAWulf66MWsY1xwrfhnBarMAlB+YK5T5vVSM6LVqrgFOSmWxs2u41FU9WnY.UNsQE3MWSVbXTH6w071yKj0mC8xKYP5AxH.DcTejq4QNN4.XB280D2y+yelJtIOGB.FUNYY4bcH7rgNZ3cbmxQrWGw3NQwMhxaH3h0UuFmfB6oNdY29nLgaMerRho6rXwHyoj9140J2dqd+7aKoMlAEj0mI.V7EpLe6zbN9i8wy6D3QSvYbgrQ.EJkPCYPXe3trsuif5JA.yIKUBrzhl50L99agLv1vLeFs5l1QU+v1q7AAvMgWBxyMsTmw8FsWkALyPCgZWER+cFR4isnrsQkhc1zbAXzVToYoiaCF5SzymKwKRRgfunZtvrGPUUDV09WkMpGkJuMcjBqjSi42rd7IEJWzMKZJxdHL8gakPL0RrFNp4sEbGCVpog2sqAtg3R4JHx.reg2qKmZvcYRrihxjYxKxsHiMn5O.rBYDlZx4i6uW04mYia6iB3QtOoLm5hu2iy1caH4iLiR0TGbS3Zsj49rN1xobsbWbxEgHwXZ7xTt60b6RzYf5jwrSQzq5bKINhPsWUgAVDWtnYrzQWoKaD6yKNZDEvDEAhuMf.uFoDbcNhafL0O2tbjdmOginijYLAW2AZVzMvswuZqeoAO1OEwcT8GgXgPnbfjJx6.S1dtZ96dYEqu9BdTIxbuc579UKb9fDVDp79pyf1B+vQNJ3u57haEqlRMc24msjdq7yy9KoIBLm+8qucEDB.fyhffPuLOZABfsU6WePf9tij6hUGYgCfTrVBVi+vFJLWgcT7RI.J5GVtn13tvTG0Y.FYrFes5zp3CmyRVXZblrnz1GKFTBs7mXNeMx9gZGWtMw1PjMi6LmJ94V.GIptgo56srd3QRj2b4.guSSfvboiDtTfmJqpYjgUZi+l6eAmDlpch2qTsTEP9jyR5XGEqJ6lpcSctJpjOpiuyTh74VziJES.GBKfomqjOrel5BtelWQ66+7Oe6pt1DBXMUMyVLJ2JbOt0TkuBJt1QnrjSmRwc22F8lioWlk4OF15xTb8wwUpxbTNn9O9DuUoVO.5PC4sehbZt6taTxXXB3RvT86XQJu.T4K6HIVW7W9KhtW0oZ70y0+z04t3Xs5dhhhEQY2ULiWIq3PvbI51WVTmVUlOWiusU.Q6E2wC6SHUkaGqAXa3La6aNukskQMr3V7AdO0E5iXhFhTxn+JNNlFhoZud+49SHU8lgKwRfhLPXJojq1yNjTTNnPrcs89mj6fiarxgp9+Pa0e1CTpyapLKsWR.Z2W0Y0lLDc6dnvhD+NycmLpJRwUaoIagZnckWEz3m+YayEpDHygc1EImrBCKXslYxqPQaCF2sYGmCBvdz7ZL1NW5KMgtgBFJVGeWRfmMmkqBhu0hYZhLxUnGelyNnKtxq3zhdsnlvALz3tX.tHtLIIN12jkkYs700ux5T84hMs9BgkalWmsXA2aaBi.Dub2z0SzIxpt8zPbZmCLEc04Lh63TPq+jQ1nm9JvYg1k5GbIA+e8ksia1dgdyUu2xeoqZuKIIBIq7oQNzA8KRREoGjZs4IZe.u0bPD030QnD8KKkrPOYhh.XR.5VspR8aaMSbgTpZRqIWWcvxKH66ZazUsPDyVCrRfruAgggmvOE.x44zogvM7igiDZ4Gb.LrYueJVWppMwb9.vThSwwv8o7aNX4TDopR54T7Xzt9U3fhPgS8nlu7c+7FZhK0W1a9bo1OWQOoduXzvxr2r5anis2cr+T+INvcf3zU0ZyfC8eDI5cmGc2a1XT2DjnwCH8zBWOfkb15zRWgCwj9LSg5nztquJrAV8MqJl+UCGtz2QbXlIIQkszWSWDnrqZhcsYI5YyjVMvVqbilWJ51W9khN7NaGYEXACzjdHpG5HjB4xtI2sbRY7Wu7v8jER5lT6dV8YBgmsm5Lcjxdup6zdOU9oElo7XcplVq7wEtKBt8lTGpXZoiasxeS6F5pVmWeO1+GevE0eQ+.GC3uE2yckGZcxH+Md+SZ+Ea8U2cy+oM13tazRWnlD9h6dmu5ta8E28KCdwVt2rAlF9WKdGesOYk1+zpBwMqDLGFey6It4.9JaJnhM17l8nAv2TN7pM4uM2ksDO20d.7tApQzUM6IpX5VLhWgR53WDbswBdZiKOV3nm+tY1bQNUMyVFDwStoDb4ICdZvsWL3oMu.fzKV8Ms3jNUZCw+wCrsQrV+r2CZs3cs+Sa+TSbIvo27p+SBO2Kfoei6aOcm5QkSEWD96gX9eO.23s62CvU+yU3skc+8sOVWDMd4760VB+Bmk2W+9EZs3unh+p16y2hsZF7FsO3a+.7ym3ip9Qsvd.Oxu7+0sCcItheWKvFAU1zPP8pFVUs9tGrje4KGlRM09XCvOMuX95u06yMu584MdqsEnsj32L1t+ssYQ9ukXXKr6eyvveZ6ik+Zvf.Honbn1jh.bvyJmzLGAd1JWiRsa+9Fz2IFZ.pjj+x+C93d4lz2Ww8xM8uLTj72YEIeb6WgpN4ekarznc6A67pqHDv+4a6Ossou0+z1NBHTOS8B5FGCr9..Q.km6ca0LVTQYZygaeTiQQaOTbxjfw8QOv+vsBeHLCZPL78FT5o5.jM+W+o8SoVjMf6K3Q4QXyR1Ug1IGWhL5r2vlgSr9waE93GKyhgdH5phOdi2t3i+L+J+9c+p6W42GNfGuexj1wyi1Dm669EATEwdnrLov+zlYTepI0LcrIU2PQ+bE75GMR0v9Yoanc3el.0O4O7fmqP8f4pPT2OgOxKHmTuixhM++7OJykpu9GZaYWA+yo3WD816EPhW++WCR7s26Cg.+0sV7uuMBEukfUkheYzkeHxi+gXMlHixL+PjskFjS+GwOA66T9GgdGT+N9tXyVbaNHnCn71VSP5heHJhrWuEx9r74r06vbty6vb9h2g47kuCy4O9NLmu5cXN28JmCkodG2u9WXyiGb79bmPVYEKXE17u0+K.JgA2H
    Reply

  • 0 Votes
    3 Posts
    386 Views
    iamlampreyI

    +1, I thought this was already possible

    @Christoph-Hart would this be a nightmare to implement? it's a pretty critical feature for any sort of guitar amp software (most guitarists don't want to wait for a DAW to load lol)

  • a set of Buttons to Change the slider pack value

    Scripting
    20
    0 Votes
    20 Posts
    2k Views
    ChazroxC

    @ILIAM if you rig your sliderPack LAF to the value of the stepSequencer slider (switches), you can do something like this. The sliderpack LAF depends on the corresponding switch value (call by index).

    Step sequencer sliderpack trick.gif

  • Filmstrips issue? (vertical sliders)

    Unsolved Newbie League
    8
    0 Votes
    8 Posts
    85 Views
    ChazroxC

    @dizavin sometimes if "showTextBox" in property editor the text box blocks the slider. Try unchecking that and try again.

  • Tempo Sync Switch

    Scripting
    6
    0 Votes
    6 Posts
    64 Views
    ILIAMI

    @HISEnberg Pay attention to the Frequency knob in LFO and Compile!
    SyncFree.gif

  • Global Cable + Third Party Node

    Scripting
    3
    0 Votes
    3 Posts
    72 Views
    iamlampreyI

    @Christoph-Hart Nice, thanks for the quick fix!

  • Simple copy protection done right :)

    Presets / Scripts / Ideas
    152
    7 Votes
    152 Posts
    53k Views
    D

    @Oli-Ullmann hey, could you maybe upload this again? would be a big help to make this thing work in my projects :)

  • 0 Votes
    2 Posts
    47 Views
    A

    I've added some screenshots of my basic setup in case anyone can help with this. I'd just like the TimeRatio knob linked to a Knob in my UI to control it there. Furthermore, if there's any way to increase the TimeRatio's amount below/beyond 1 - 2.0, that would be epic!

    67e99fec-60f5-40a9-b682-a5147f411d4c-image.png

    0f259c5f-be8b-432e-80e9-6734b2bf51cf-image.png

  • 3-band EQ (solution)

    Scripting
    1
    1 Votes
    1 Posts
    31 Views
    No one has replied
  • Effects / Modules / Routing

    Solved General Questions
    7
    0 Votes
    7 Posts
    51 Views
    Oli UllmannO

    @Christoph-Hart

    Yes, that's a good starting point. Thanks! :-)

  • How to add multiple parameters to snex_node in ScriptFX

    Scripting
    3
    0 Votes
    3 Posts
    68 Views
    B

    @Christoph-Hart I see, thank you so much! I had a feeling I was heading in the right direction but just couldn't quite get it to work.