Happy holidays, guys!
tomekslesicki
@tomekslesicki
Best posts made by tomekslesicki
-
Simplified install - MY SOLUTION
Hey guys! You helped me a lot as I had questions on my HISE journey and there's something I'd like to share with you:
THE PROBLEM
One of the most confusing (read: support-email-generating) things about HISE is the sample folder location. Unlike Kontakt, it doesn't look into subfolders. Plus, since HISE exports the plugins as standard formats, chances are, some people who'd get the instruments might not have had any previous experience with samples or Kontakt and would be surprised that after they've installed the plugin, things don't work right away.SO...
I wrote a script (ok, two in fact - one is for Mac, the other for Windows) that solves this by auto-generating the link file and placing in the correct folder. When the user runs the installer, there's an option to locate the samples automatically. There's only one requirement for this to work - the samples need to be distributed along with the installer. I'm using Pulse to simplify the download process and it's perfect for that. The most recent versions added update functionality so if a new version of the plugin is out, it will be downloaded into the samples folder and auto-run. I'm sure there are other solutions out there but it's just something that I'm using.HOW TO: MAC
Create a text file with .sh extension (so for example, yourinstrument_locatesamples.sh) and set it as a post-install script in Whitebox Packages. I'm using it as a separate component named locate samples so that the user has an option to have it selected or not.Here's the script:
#!/bin/sh instrumentname="Blisko Cello" devname="Felt Instruments" FILE="$HOME/Library/Application Support/${devname}/${instrumentname}/LinkOSX" if test -n "$FILE"; then rm -R "$HOME/Library/Application Support/${devname}/${instrumentname}/LinkOSX" fi installer="${instrumentname}".pkg mystring=$1 echo basename: $(basename "${mystring}") echo basename + remove "${installer}": $(basename "${mystring}" "${installer}") sudo echo -n $(dirname "${mystring}") > "$HOME/Library/Application Support/${devname}/${instrumentname}/LinkOSX" exit 0
You only have to adapt the first two lines - instrumentname and devname. Export the installer as instrumentname.pkg and you should be fine.
HOW TO: WINDOWS
I'm using innosetup on Windows. Here's the whole script:[Setup] #define AppName "Blisko Cello" #define AppVersion "1.1.2" #define DevDir "Felt Instruments" PrivilegesRequired=admin AppName={#AppName} AppVersion={#AppVersion} SignTool=signtool SignedUninstaller=yes DefaultDirName={pf}\{#DevDir}\{#AppName} DefaultGroupName={#AppName} Compression=lzma2 SolidCompression=yes OutputDir=.\installerbuild ArchitecturesInstallIn64BitMode=x64 OutputBaseFilename={#AppName} LicenseFile=".\installerAssets\EULA.rtf" WizardSmallImageFile=".\installerAssets\install_logo.bmp" ; BANNER WizardImageFile=".\installerAssets\banner_blisko_cello.bmp" SetupIconFile=".\installerAssets\windows_icon.ico" DisableWelcomePage=no DisableDirPage=yes DisableProgramGroupPage=yes SetupLogging=yes ChangesAssociations=no [Types] Name: "full"; Description: "Full installation" Name: "custom"; Description: "Custom installation"; Flags: iscustom [Dirs] Name: "{app}\"; Permissions: users-modify powerusers-modify admins-modify system-modify [Components] Name: "vst2_32"; Description: "{#AppName} {#AppVersion} 32-bit VST Plugin"; Types: full custom; Name: "vst2_64"; Description: "{#AppName} {#AppVersion} 64-bit VST Plugin"; Types: full custom; Check: Is64BitInstallMode; Name: "aax"; Description: "{#AppName} {#AppVersion} AAX Plugin"; Types: full custom; Check: Is64BitInstallMode; Name: "locatesamples"; Description: "Locate samples (recommended!)"; Types: full custom; [Files] ; VST Source: "{#AppName} x86.dll"; DestDir: "{code:GetVST2Dir_32}"; Flags: ignoreversion; Components: vst2_32; Check: not Is64BitInstallMode Source: "{#AppName} x86.dll"; DestDir: "{code:GetVST2Dir_32}\{#DevDir}"; Flags: ignoreversion; Components: vst2_32; Check: Is64BitInstallMode Source: "{#AppName} x64.dll"; DestDir: "{code:GetVST2Dir_64}\{#DevDir}"; Flags: ignoreversion; Components: vst2_64; Check: Is64BitInstallMode ;BEGIN_AAX Source: "{#AppName}.aaxplugin\*"; DestDir: "{commonpf}\Common Files\Avid\Audio\Plug-Ins\{#AppName}.aaxplugin"; Flags:ignoreversion createallsubdirs recursesubdirs overwritereadonly; Components: aax ;END_AAX ; PRESETS Source: "{#AppName} UserPresets\*"; DestDir: "{userappdata}\{#DevDir}\{#AppName}\User Presets"; Flags: ignoreversion recursesubdirs; ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\Uninstall {#AppName}"; Filename: "{app}\Uninstall{#AppName}.exe" [Code] var OkToCopyLog : Boolean; VST2DirPage_32: TInputDirWizardPage; VST2DirPage_64: TInputDirWizardPage; SamplesDirPage: TInputDirWizardPage; SampleLocation: String; AppDataFolder: String; function SampleFolderLocated(): boolean; begin result := FileExists(ExpandConstant('{userappdata}\{#DevDir}\{#AppName}\LinkWindows')) and (not IsComponentSelected('locatesamples')); end; procedure InitializeWizard; begin if IsWin64 then begin VST2DirPage_64 := CreateInputDirPage(wpSelectDir, 'Confirm 64-Bit VST2 Plugin Directory', '', 'Select the folder in which setup should install the 64-bit VST2 Plugin(you can choose not to install this version later), then click Next.', False, ''); VST2DirPage_64.Add(''); VST2DirPage_64.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\VST,VSTPluginsPath|{pf}\Steinberg\VSTPlugins}\'); VST2DirPage_32 := CreateInputDirPage(wpSelectDir, 'Confirm 32-Bit VST2 Plugin Directory', '', 'Select the folder in which setup should install the 32-bit VST2 Plugin(you can choose not to install this version later), then click Next.', False, ''); VST2DirPage_32.Add(''); VST2DirPage_32.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432NODE\VST,VSTPluginsPath|{pf32}\Steinberg\VSTPlugins}\'); end else begin VST2DirPage_32 := CreateInputDirPage(wpSelectDir, 'Confirm 32-Bit VST2 Plugin Directory', '', 'Select the folder in which setup should install the 32-bit VST2 Plugin, then click Next.', False, ''); VST2DirPage_32.Add(''); VST2DirPage_32.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\VST,VSTPluginsPath|{pf}\Steinberg\VSTPlugins}\'); end; end; function GetVST2Dir_32(Param: String): String; begin Result := VST2DirPage_32.Values[0] end; function GetVST2Dir_64(Param: String): String; begin Result := VST2DirPage_64.Values[0] end; function GetSamplesDir(Param: String): String; begin Result := SamplesDirPage.Values[0] end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssDone then OkToCopyLog := True; if not SampleFolderLocated() then begin SampleLocation := ExpandConstant('{src}'); AppDataFolder := ExpandConstant('{userappdata}\{#DevDir}\{#AppName}\LinkWindows'); SaveStringToFile(AppDataFolder, SampleLocation, False); end else end; procedure DeinitializeSetup(); begin if OkToCopyLog then FileCopy (ExpandConstant ('{log}'), ExpandConstant ('{app}\InstallationLogFile.log'), FALSE); RestartReplace (ExpandConstant ('{log}'), ''); end; [UninstallDelete] Type: files; Name: "{app}\InstallationLogFile.log"
What you need to edit is the first block and the banner .bmp file if you're using that.
That's all folks. Hopefully it will be useful to some of you!
-
RE: "The sample directory does not exist" - how can I change this text?
Ok, to hide the popup, you need to comment out line 130 in FrontentBar.cpp file (PresetHandler::showMessageWindow("Sample Folder changed).
The "The sample directory does not exist" text can be changed by editing line 197 in ModulatorSamplerData.cpp (the one below "sampler->getMainController()->sendOverlayMessage(DeactiveOverlay::State::CustomErrorMessage,").
Hope this helps somebody! :-)
-
RE: Roadmap to HISE 5
I just wanted to chime in and say I really appreciate your work, and that the recent additions are awesome. Thank you!
-
RE: PLUGIN DELIVERY: Latest & Greatest?
I've been using Pulse since 2019, and I'm the guy who worked with them on native HISE support. Recently the ownership changed, and even though we - people who were using Pulse - were told that the terms of operation are going to stay unchanged, they informed me that they'll actually change the terms for me anyway. It was 10th of March or so, and they said something like "hey, we're changing the terms for you, and they'll affect your pricing from March 1st". Not a very respectful way to do business, in my opinion.
Also, keep in mind that all Pulse does is it gets the multi-zip archives from the server and unpacks them. There's no license management or anything like that.
Anyway - I'm using a custom installer now I built with HISE. You can pretty much replicate all Pulse does with this @d-healey (thank you!) tutorial: https://www.youtube.com/watch?v=mqGsqJoBxiQ
-
RE: The definitive feature request & bug fix roadmap
Feature request:
global modulators on FX plugins!Done: https://github.com/christophhart/HISE/commit/7028aa13c3c5612bf152620a3d1a8ca94702bc8b
-
RE: The definitive feature request & bug fix roadmap
Bug report: interruptions in audio when using convolution fx plugins and Cubase’s Direct Offline Processing: https://forum.hise.audio/topic/4247/cubase-direct-offline-processing-audio-dropouts-on-fx-plugins/9
-
RE: Tell me about NKS and MPE in HISE
@ustk I’d add to that that the experience of playing an MPE keyboard is way different than your standard keys + mod wheel, so I’d recommend getting at least the Seaboard Block to get it right for the users
-
RE: HISE not building M1 architecture by default when exporting
@Casey-Kolb I think it's because AAX doesn't support M1 yet
-
RE: Packages not updating files on OSX 10.12
I figured it out and thought I'd post the solution here, maybe you'll find it useful. Create a file called YourInstrument.sh (I used SublimeText to do that but I guess you can create it in whatever really). Load it into Packages as a pre-install script. The file should contain the following code:
#!/bin/sh FILE=$HOME/Library/Audio/Plug-Ins/Components/YourFile.component if test -n "$FILE"; then rm -R $HOME/Library/Audio/Plug-Ins/Components/YourFile.component fi exit 0
If you have separate packages for AU and VST files, each can have its own .sh script with a path to the file.
What the script does is it removes the specified file before the install progresses. Done!
Latest posts made by tomekslesicki
-
RE: HISE would crash when compiling ScriptFX network and now when trying to load project after reinstalling to the latest version on Windows.
@Bicrome no, in HISE - open the project without loading the hip or xml, create a new scriptfx, load any network and then recompile all networks with the export menu
-
RE: HISE would crash when compiling ScriptFX network and now when trying to load project after reinstalling to the latest version on Windows.
@Bicrome I had the same issue yesterday. What helped was that I recompiled the networks with the latest build before opening the project.
-
RE: Buttons don't update plugin parameters
@d-healey no, meta is only for components that are declared as plugin parameters. In the snippet I shared, the button has save in preset enabled, but is not a plugin parameter, only the slider is
-
RE: Buttons don't update plugin parameters
@Christoph-Hart thank you, the buttons are working now! The only thing that is still not working is changing the slider's value with the button's callback - the slider's DAW parameter value is not updated. Here's a minimal snippet to demonstrate this:
HiseSnippet 894.3ocsV0saaaCElxIZX1aqacnO.B8J2ghB65X2DTLTu3jzYrkTg4tfsqZYnNxhHTjBjToyXnua6QpuAsGJIGI05tlYr5KLv4+Od324PEpULvXTZhWumuJCHdes+hURaxrDJWRleDw6V9mRMVPGTp5vUYTiAhHdd67TmBut6RJ98lmbHUPkLnVEgbthyfekmxs0ZCm9Kbg3DZD7bdZCu2a5blRNSIT4Hd1we.IixtjtDNi5bqiO4molDh2O3OIZzAiGSmv1a7nngwCF7vw6Og9nI6GOBFMXLcLbvACGGe.w6KNNhaU5EVpELDucOTEsZQh5UxxBbN2vuP.NggjEXkKUehRD4NhNsjYIbQT35FkgfYIrtssSYa6N9mxi3Wqut88cEFBpinYCzqSa3sSK3MrI7Fz.da.RdMfztkP519KXZdls1hCOek+bIdaFSw6olPozWRmuui+LE5gz9fT5kvIZT35H5OYvf6Gf+cuG2qGdWYrAWQ0AkwdXt0pjCC9wf0IXIXmoRyTRTn+ca40c2TFVH3Qf9SkgJuJxPOtTvkPPbtjY4JYfR1pLt7nUh9r0I49X4D4v8582851JcOv.1ycl5W5viee6rDpbID0Gs7Zrx2nynKoUPXFUHt.oy82LBwr13LblxBOS1u.k8dcuf22Tb7FsUkKAn2nY2zl9eKv9x7zK.cydjyQjQ0ll5+wooMmhXksnFNpjykb6yx.4Ga1hT0WcT5JTgtZKHz2xuYmivQd621R0PRAvat+g76yOhZoqSGlYrZYf1xcGDuifqv8SkyKc8OBLWZUY3plquRwMH23h+WWW3+Y4zU0nfO8U7HaRsh+bZBvWlXapgznjcaWxRFXqRVQJaTxWZ9OWRtITjujKCoZbAKNhiMjNYsUUt5EQhfytLvThDC8JXtLTCH81s6f7gKev0dpnbA01dWn6EiJCHyq0BH2RFogaW07Ek+2VPdSg3s8C4VVxlwXmMfQjY84.iUOq7M9GGGCLaM.20+j+3yyaHjeSka4xkmRsZNRr7OKOcA9TLCvpKkfvM460wMiVJOvI65.K.YTgvaweUFG5j8pLNbsQRJkoUufUNY6d35KKzfXRVvz5hesAJGrgQ4T7czWvXsS0GD3C21.GssAt21F33sMvIaafOZaCb+OcftOy4mxspzxwFB4zviKV854crjhLvB1J4c.eM49r
-
RE: Buttons don't update plugin parameters
Hey @Christoph-Hart could you please take a look at this? Thank you!
-
RE: Buttons don't update plugin parameters
Ok, I tested it with the snippet built as an instrument plugin and it's the same. Further testing that might be helpful:
- there's a button that has isPluginParameter enabled
- when the plugin is loaded, and I adjust the plugin parameter instead of clicking on the interface, the button responds to change
- when I click on the button on the interface, the button responds properly, but its plugin parameter is not updated
- when I adjust the plugin parameter after clicking on the button on the interface, the button no longer responds to automation - it does respond to clicks on the interface, though
-
Buttons don't update plugin parameters
Tested in Ableton and Reaper, but I guess it's most likely happening in other DAWs, too. This is with an FX plugin, I haven't tested with instruments.
When clicking on a UI button that's enabled as a plugin parameter, the button callback is executed properly, but the plugin parameter's value is not updated. This is regardless of meta parameters and radio groups, I tested it with these on and off.
The buttons also don’t respond to being changed from the DAWs plugin parameters. The plugin parameters that are supposed to be changed by buttons' callbacks don't get updated either.
Sliders work fine.
@Christoph-Hart I'm sure you can solve this!
Here's a minimal snippet - it needs to be built first, of course - but it's not anything ultra clever, just a slider and button set as plugin parameters...
HiseSnippet 791.3ocsU0saSCCE1tqYZs.iMId.xkanIT+acqhKnz+fJnaQjwD2M7bbZrZhcThyFUHd21iDuAfcRZSKKqqqRjKp54+Oe746Xi.NlDFxC.vxWL0m.fOWybJS3z0AQYfg8.vc0FgBEj.8DUcl5iBCIV.HbqOnT.KUDD+8620A4hXXRlJ.3RNES9L0iJxzZz9STW2AHKxETuE7tQ6gXNqK2kGIwyVZU.9H7DzXxYHkaEz.eDE5.fuV63Z0wMrNwpVsia0DiZRZYirsqV2pQilm1pZ8VnFm1jT4X.b69VTAOvTfDjPYR6vslZ5vukkTfKogzqcIJgp.SYkSTC55PcsLl0bBA.XQirV0VIspWoMhZQmqOqksWrA8rHVroAKrJHU8I.I3BPpXBj1WyDGP8EYVT34YZCYxaPaj7tYQnj3K.dmVWtzAl3MdnIjAARg4AbPyJUNRW9ygu0NhgETNSmyNiKHmyN3vx+rbox+pr9+Zx1NWapxDvccIA4ZVMNDrp.OfE4cMI3H8aPtQj4NJO9K2S2d85o3jS8BNxYCYTw49jT4AbWKUuR8+6eC.Raax6hBoHT5pH9lX2zahNQBAmAnxj7xkTUEDeHVjr.dnjX5RsHAKkjDU4kjuNrGRfTyGovSBYeRffp5LvdjajLxjokRZ8HgSDb+X764yYpCCbm09D7i4E9twsmlgBZ6aoVBIUUCZIEcHzwNhYR9tQioLCTfjUKGxRH26IGA4t59yzBngFK6mD6E.OLJWQKJCkeObsQYt0OWnKQfKEOQOLAAf6yJk6C3VQtHwxKITqOSMHmxWhYpnerPpX5hqWeBaNprxMGqKD2WyfJvN4iwB4fQEQ3+.FS229Bs911DrHCfE0F7sMc45iT9uviDT13QHQ.UN.ocVjmo7cILQVcFi3FpFTJn3rIxUTxpNfIgYEK7G4WpwpJYXpwpyLB7P3.9U3DRuZi9NwZjXhEOYUR9zqTVOGVtm7Alqv3kS08Br1lFX8MMvFaZfGuoA1bSC7jMMvSe7.Uu++9HA2Kg1..iL5GuUFB6yPxIv3oUveEHoWlM
-
RE: Do something only when automating?
I just figured out I can actually do this by checking the button’s value on the knob’s callback and just if it from there, which would be a much simpler solution I guess
-
RE: Do something only when automating?
@Christoph-Hart thanks! In this case, I have a bunch of buttons that control stuff - isPluginParameter is disabled for them. I want to add a slider, which would be plugin parameter enabled, and would set these buttons depending on it’s value (slider at 0 - button 0 on, slider at 1, button 1 on, etc.).
The end user never sees the slider, it’s only there to automate the button states. The buttons are displayed on the interface, though, and they should update the slider’s value when they’re interacted with - button 0 on, slider value set to 0.
What I actually want to achieve is to prevent creating a loop where the button state fires its callback, and changes the slider’s value - which then changes the button’s value, and fires the callback again, and so on. So my idea is:
-
button pressed on the interface a fire button callback, and set the slider’s value
-
slider automated - change button state, but don’t set the slider’s value again (and don’t call it at init)
-