HISE Logo Forum
    • Categories
    • Register
    • Login

    Multiple instruments, single project or multiple projects?

    Scheduled Pinned Locked Moved General Questions
    94 Posts 3 Posters 22.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • d.healeyD
      d.healey
      last edited by

      Ah that sounds clever a way to do it, good suggestion!

      Libre Wave - Freedom respecting instruments and effects
      My Patreon - HISE tutorials
      YouTube Channel - Public HISE tutorials

      1 Reply Last reply Reply Quote 0
      • d.healeyD
        d.healey
        last edited by

        After more thinking, I think my needs are going to be too complex for the preset system to handle because for the different instruments I'm going to have a different number of samplers, and I'll need to be able to change the sampler IDs on the fly (because my UI makes use of these for the various articulations), there is some other stuff too that will make it a bit messy to handle. So I'm thinking I'll use the preset system for "like instruments" that share the same articulations, number and order of samplers etc, and use a separate VST for those instruments that require more than the preset system is intended for. But I'll stick to using a single HISE project for all of my woodwind instruments since they are closely related and rely on the same code and most of the same instrument setup and I'll just create separate .hip files for each.

        Libre Wave - Freedom respecting instruments and effects
        My Patreon - HISE tutorials
        YouTube Channel - Public HISE tutorials

        1 Reply Last reply Reply Quote 0
        • Christoph HartC
          Christoph Hart
          last edited by

          For what do you need the Sampler IDs besides setting the label on the interface?

          If its only for displaying the name on the label, it should be doable with JSON:

          
          // onInit
          
          reg instrumentData;
          
          // in onControl
          
          // This will come in from the preset recall
          value = {
             "name": "Trombones",
             "releaseSamplerEnabled": false,
             // ...
          };
          
          instrumentData = value;
          
          // Activate an additional sampler if needed
          ReleaseSampler.setBypassed(!instrumentData.releaseSamplerEnabled);
          
          // Set the label name
          mainLabel.set("text", instrumentData.name);
          

          I still think it'll be more cleaner using just one plugin and you can't underestimate the workflow benefits of just having one preset file.

          If we're at it: I don't know if you knew this, but you can save the presets as .XML file instead of the binary .hip file format. While it increases loading times a bit (only in HISE, not in the compiled plugin), you'll get a ton of benefits by using a version control system like Git for the XML file and the scripts. It even extracts the scripts from the preset when saving and stores them in local .js files and reassembles them if you reload the plugin.

          If you do this right, you'll end up with nice clean commit history that looks like this:
          0_1488716408854_exampleCommit.png

          Especially if you are planning to release the library on GitHub as GPL, it would make a hell of a impression if you could actually reconstruct the building process in a nice clean way.

          1 Reply Last reply Reply Quote 0
          • d.healeyD
            d.healey
            last edited by

            This looks too tempting, okay, I'll dig in a bit more and see if I can get on with it :) and the GitHub stuff is an awesome idea

            Libre Wave - Freedom respecting instruments and effects
            My Patreon - HISE tutorials
            YouTube Channel - Public HISE tutorials

            1 Reply Last reply Reply Quote 0
            • d.healeyD
              d.healey
              last edited by d.healey

              What is the ValueTree automationData expecting in the Content.storeAllControlsAsPreset() function?

              Also, I keep getting this message with the latest version when I select a User Preset (even a new one)
              alt text

              Libre Wave - Freedom respecting instruments and effects
              My Patreon - HISE tutorials
              YouTube Channel - Public HISE tutorials

              1 Reply Last reply Reply Quote 0
              • Christoph HartC
                Christoph Hart
                last edited by

                I think a filename string with (or without) an extension. it will write it in the user presets folder.

                You need to use semantic versioning for your project in order to use user presets. The reason is that then you'll be able to bump the patch version number a.b.x without having this popup appear (which is annoying for small bug fixes). If you add new controls, bump the minor version number a.x.c and it will add default values of those new controls when you press OK there.

                1 Reply Last reply Reply Quote 0
                • d.healeyD
                  d.healey
                  last edited by

                  I think I'm misunderstanding something
                  alt text

                  Libre Wave - Freedom respecting instruments and effects
                  My Patreon - HISE tutorials
                  YouTube Channel - Public HISE tutorials

                  1 Reply Last reply Reply Quote 0
                  • Christoph HartC
                    Christoph Hart
                    last edited by

                    You need a patch version number. 1.0.0 will do :)

                    1 Reply Last reply Reply Quote 0
                    • Christoph HartC
                      Christoph Hart
                      last edited by

                      Ah and you don't need to specify the version number in the filename of the preset, it will be stored inside the XML itself (using the current Project Version Number)

                      1 Reply Last reply Reply Quote 0
                      • d.healeyD
                        d.healey
                        last edited by

                        This is a preset I created in the preset browser not in the script that is causing this popup

                        Libre Wave - Freedom respecting instruments and effects
                        My Patreon - HISE tutorials
                        YouTube Channel - Public HISE tutorials

                        1 Reply Last reply Reply Quote 0
                        • Christoph HartC
                          Christoph Hart
                          last edited by

                          The preset has probably still the old wrong version 1.0 baked in. You can edit the .preset file (it's just an ordinary XML file) and correct the version number manually.

                          But I'll add a safe check that you have a valid semantic version syntax in your Project Version before creating the first preset to avoid this in the future...

                          1 Reply Last reply Reply Quote 0
                          • d.healeyD
                            d.healey
                            last edited by

                            Do you mean the .hip preset or the user preset? That might be where I'm getting confused

                            Libre Wave - Freedom respecting instruments and effects
                            My Patreon - HISE tutorials
                            YouTube Channel - Public HISE tutorials

                            1 Reply Last reply Reply Quote 0
                            • Christoph HartC
                              Christoph Hart
                              last edited by

                              .preset is the file extension for user presets (=collection of front end interface values). The .hip preset (NOT a preset, poor name, bad decision :) doesn't store the version value (only the Build Version of HISE), because it doesn't need it as it can get that info easily from the Project Setting file, while the .preset files are supposed to be distributed along with the plugin and don't have that kind of privilege :)

                              1 Reply Last reply Reply Quote 0
                              • d.healeyD
                                d.healey
                                last edited by d.healey

                                Ok that's what I thought. Then I'm still confused, thank you for your patience :)

                                I made a brand new project folder, inserted a script processor, put in one command Content.makeFrontInterface(600, 250); compiled it. Then I opened the plugin preview and went to the preset browser, created a preset and then when I try to load that preset by clicking on it I get the version number error. This hasn't happened to me previously. I can make a little video if it helps.

                                Update:
                                So I opened the preset file in sublime text and the version was set to 0.0. I changed this to 1.0.0. I tried opening it in the preset browser again and I got the same error (it said version 1.0.0 this time though). I click Ok to update it and it resets it back to 0.0. So I think there is a bug here.

                                Libre Wave - Freedom respecting instruments and effects
                                My Patreon - HISE tutorials
                                YouTube Channel - Public HISE tutorials

                                1 Reply Last reply Reply Quote 0
                                • Christoph HartC
                                  Christoph Hart
                                  last edited by

                                  have you set the Project Version at File Setting Project Setting?

                                  1 Reply Last reply Reply Quote 1
                                  • d.healeyD
                                    d.healey
                                    last edited by

                                    Aha! mystery solved. Nope I hadn't set that, never have, I will from now on :) thanks again.

                                    Libre Wave - Freedom respecting instruments and effects
                                    My Patreon - HISE tutorials
                                    YouTube Channel - Public HISE tutorials

                                    1 Reply Last reply Reply Quote 0
                                    • Christoph HartC
                                      Christoph Hart
                                      last edited by

                                      This is important as it will also show up as version of the compiled app / plugin. I'll add a safe check that requires to set this before exporting.

                                      1 Reply Last reply Reply Quote 0
                                      • d.healeyD
                                        d.healey
                                        last edited by

                                        Excellent, that will help newbies like me :p

                                        Libre Wave - Freedom respecting instruments and effects
                                        My Patreon - HISE tutorials
                                        YouTube Channel - Public HISE tutorials

                                        1 Reply Last reply Reply Quote 0
                                        • d.healeyD
                                          d.healey
                                          last edited by

                                          I've got this test project with 2 script processors:

                                          <?xml version="1.0" encoding="UTF-8"?>
                                          
                                          <Processor Type="SynthChain" ID="Master Chain" Bypassed="0" Gain="1" Balance="0"
                                                     VoiceLimit="64" KillFadeTime="20" IconColour="0" packageName=""
                                                     views="32.rk1bzA........JPT.............+Oe7wG+SA...." currentView="-1">
                                            <EditorStates BodyShown="0" Visible="1" Solo="0" InterfaceShown="0"/>
                                            <ChildProcessors>
                                              <Processor Type="MidiProcessorChain" ID="Midi Processor" Bypassed="0">
                                                <EditorStates BodyShown="1" Visible="1" Solo="0" Folded="0"/>
                                                <ChildProcessors>
                                                  <Processor Type="ScriptProcessor" ID="Script Processor" Bypassed="0" Script="Content.makeFrontInterface(600, 200);&#13;&#10;&#13;&#10;const var knob = Content.addKnob(&quot;knob&quot;, 0, 0);function onNoteOn()&#10;{&#10;&#9;&#10;}&#10;function onNoteOff()&#10;{&#10;&#9;&#10;}&#10;function onController()&#10;{&#10;&#9;&#10;}&#10;function onTimer()&#10;{&#10;&#9;&#10;}&#10;function onControl(number, value)&#10;{&#10;&#9;&#10;}&#10;">
                                                    <EditorStates BodyShown="1" Visible="1" Solo="0" contentShown="1" onInitOpen="0"
                                                                  onNoteOnOpen="0" onNoteOffOpen="0" onControllerOpen="0" onTimerOpen="0"
                                                                  onControlOpen="0"/>
                                                    <ChildProcessors/>
                                                    <Content>
                                                      <Control type="ScriptSlider" id="knob" value="0.46000001"/>
                                                    </Content>
                                                  </Processor>
                                                  <Processor Type="ScriptProcessor" ID="Script Processor2" Bypassed="0" Script="&#10;const var knob = Content.addKnob(&quot;knob1&quot;, 0, 0);&#10;const button = Content.addButton(&quot;Save Preset&quot;, 150, 10);&#10;&#10;//CALLBACKS&#10;function onNoteOn()&#10;{&#10;&#9;&#10;}&#10;function onNoteOff()&#10;{&#10;&#9;&#10;}&#10;function onController()&#10;{&#10;&#9;&#10;}&#10;function onTimer()&#10;{&#10;&#9;&#10;}&#10;function onControl(number, value)&#10;{&#10;&#9;if (number == button)&#10;&#9;{&#10;&#9;&#9;Content.storeAllControlsAsPreset(&quot;Test Bank/Test Category/Another Test.preset&quot;, &quot;&quot;);&#10;&#9;}&#10;}">
                                                    <EditorStates BodyShown="1" Visible="1" Solo="0" contentShown="1" onInitOpen="1"
                                                                  onNoteOnOpen="0" onNoteOffOpen="0" onControllerOpen="0" onTimerOpen="0"
                                                                  onControlOpen="0"/>
                                                    <ChildProcessors/>
                                                    <Content>
                                                      <Control type="ScriptSlider" id="knob1" value="0"/>
                                                      <Control type="ScriptButton" id="Save Preset" value="1"/>
                                                    </Content>
                                                  </Processor>
                                                </ChildProcessors>
                                              </Processor>
                                              <Processor Type="ModulatorChain" ID="GainModulation" Bypassed="0" Intensity="1">
                                                <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                <ChildProcessors/>
                                              </Processor>
                                              <Processor Type="ModulatorChain" ID="PitchModulation" Bypassed="1" Intensity="0">
                                                <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                <ChildProcessors/>
                                              </Processor>
                                              <Processor Type="EffectChain" ID="FX" Bypassed="0">
                                                <EditorStates BodyShown="1" Visible="0" Solo="0" Folded="1"/>
                                                <ChildProcessors/>
                                              </Processor>
                                            </ChildProcessors>
                                            <RoutingMatrix NumSourceChannels="2" Channel0="0" Send0="-1" Channel1="1" Send1="-1"/>
                                            <macro_controls>
                                              <macro name="Macro 1" value="0" midi_cc="-1"/>
                                              <macro name="Macro 2" value="0" midi_cc="-1"/>
                                              <macro name="Macro 3" value="0" midi_cc="-1"/>
                                              <macro name="Macro 4" value="0" midi_cc="-1"/>
                                              <macro name="Macro 5" value="0" midi_cc="-1"/>
                                              <macro name="Macro 6" value="0" midi_cc="-1"/>
                                              <macro name="Macro 7" value="0" midi_cc="-1"/>
                                              <macro name="Macro 8" value="0" midi_cc="-1"/>
                                            </macro_controls>
                                            <MidiAutomation/>
                                          </Processor>
                                          

                                          I've got this preset

                                          <?xml version="1.0" encoding="UTF-8"?>
                                          
                                          <Preset Version="1.0.0">
                                            <Content Processor="Script Processor2">
                                              <Control type="ScriptSlider" id="knob1" value="0.63"/>
                                              <Control type="ScriptButton" id="Save Preset" value="1"/>
                                            </Content>
                                            <MidiAutomation/>
                                          </Preset>
                                          

                                          But it doesn't do anything when I load it. It seems presets will only affect script 1 which is set to frontInterface.

                                          Libre Wave - Freedom respecting instruments and effects
                                          My Patreon - HISE tutorials
                                          YouTube Channel - Public HISE tutorials

                                          1 Reply Last reply Reply Quote 0
                                          • Christoph HartC
                                            Christoph Hart
                                            last edited by

                                            Yeah, as I said, it just supports one front interface.

                                            Check out this example:

                                            0_1488794377602_Preset Example.zip

                                            The second Script Processor is no front interface. Instead it uses a global object that contains the value for its knob which will be restored by the main interfaces' onControl callback.

                                            This is a little bit complicated at first, but once you understand how it's connected, its a pretty easy procedure.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            41

                                            Online

                                            1.7k

                                            Users

                                            11.7k

                                            Topics

                                            101.9k

                                            Posts