Preset (.hip) opens empty



  • I've just been making some changes to a .hip file. I closed HISE, then re-opened it and then opened the same .hip file. The project though opens completely empty like a new project, except the master container correctly has the name of the .hip as its ID.



  • I think i need to make a Hip2XML tool so you can see whats wrong.

    You can try the debug mode and look for assertions in the meantime.



  • @Christoph-Hart I shall try the debug idea! What about making XML the default save format - CTRL+S?



  • JUCE Assertion failure in MacroControlBroadcaster.cpp:219
    JUCE Assertion failure in Processor.cpp:156
    JUCE Assertion failure in Processor.cpp:349
    JUCE Assertion failure in Processor.cpp:393
    


  • @d-healey if you close and reopen the file a couple of times, does it eventually load? I've seen that happen here where it'll load empty projects.



  • @dustbro said in Preset (.hip) opens empty:

    @d-healey if you close and reopen the file a couple of times, does it eventually load? I've seen that happen here where it'll load empty projects.

    No luck with this method unfortunately ๐Ÿ˜ž



  • So I remade my GUI and closed HISE. Reopened and again it wouldn't load ๐Ÿ˜ž I was about to cry lol. Luckily though I'd been saving as an XML instead of a .hip (xml should be default!). I ran the XML through a validator, no issues. Then I ran the UI desktop.xml though a validator and found the problem. I seem to recall coming across this a year or so ago too in a different project.

    The problem was in a previous version of my GUI I'd used a panel as a custom button but in my new version I'd replaced the panel with an actual button control. I'd deleted the panel and given the button the same name the panel previously had. The panel though has a callbacks property which had been assigned to Clicks Only in the XML, but the button has no such property, so when I made the swap =Clicks Only got left behind in the XML for the button and prevented the GUI from loading.

    Anyway of getting HISE to flag this kind of issue?



  • Yes, sure, I'll make sure that illegal properties won't cause more harm than necessary...



  • I had for a couple of times same issue, luckily I use make a cloned copy inside two other hard disks... it could be quite annoying (without speaking of the moment of panic for having lost the job done).



  • @Christoph-Hart said in Preset (.hip) opens empty:

    I think i need to make a Hip2XML tool so you can see whats wrong.

    I hit this problem again with another project. Can't we just get rid of the .hip format altogether?

    I made a recovery XML but when I tried to load it I got a message about invalid xml. I fixed the invalid tag and tried to load the file into HISE again but it just opens up an empty project as does the .hip.



  • @d-healey I'm facing rhe opposite. Saved a huge xml (3.5mb) and it does not open. .hip does.



  • @hisefilo said in Preset (.hip) opens empty:

    @d-healey I'm facing rhe opposite. Saved a huge xml (3.5mb) and it does not open. .hip does.

    Did you try validating the xml? - https://xmlvalidation.com/



  • @d-healey nope! Nice one. Will try it tomorrow



  • @d-healey to be honest this is the only thing I don't feel comfortable with Hise. Never figured out what's the best format to properly save my work.



  • Yes I'm a bit lost too with the formats, and the menu is not clear to me neither



  • I've seen somewhere in the forum the xml is safer to use compared to the hip
    In fact I don't know why the hip is made for. I use it in my sand box project so it's easy to test some code whitout loading a new project or xml every time, then when I am ready, I import the code in my main project...

    I had too many issues with both xml and hip not loading, so I think this way is the safest I found for me at least... but maybe some of you have a safer way to work?

    Also, everyday or after a big change in the code, I duplicate the entire project and keep 10 days of backups... paranoiaโ€ฆ ๐Ÿ˜



  • Or just use Git.

    Itโ€˜s weird with all projects I did I never had any issues with loading the files so if you find something reproducible let me know.



  • The XML recovery isn't working.

    Here is the .hip file. I had to change the extension to mp3 so it would upload (maybe .hip should be an allowed upload format).

    irishWhistles.mp3
    irishwhistles.hip (done ๐Ÿ˜‰ )

    Here is the recovered (invalid) XML. This is missing lots of things.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <Processor Type="SynthChain" ID="irishWhistles" Bypassed="0" Gain="1" Balance="0"
               VoiceLimit="64" KillFadeTime="20" IconColour="0" packageName=""
               BuildVersion="650">
      <EditorStates BodyShown="0" Visible="1" Solo="0" Folded="1"/>
      <ChildProcessors>
        <Processor Type="MidiProcessorChain" ID="Midi Processor" Bypassed="0">
          <EditorStates BodyShown="1" Visible="1" Solo="0" Folded="0"/>
          <ChildProcessors>
            <Processor Type="ScriptProcessor" ID="Interface" Bypassed="0" Script="/*&#13;&#10;    Copyright 2019 David Healey&#13;&#10;&#13;&#10;    This file is free software: you can redistribute it and/or modify&#13;&#10;    it under the terms of the GNU General Public License as published by&#13;&#10;    the Free Software Foundation, either version 3 of the License, or&#13;&#10;    (at your option) any later version.&#13;&#10;&#13;&#10;    This file is distributed in the hope that it will be useful,&#13;&#10;    but WITHOUT ANY WARRANTY; without even the implied warranty of&#13;&#10;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&#13;&#10;    GNU General Public License for more details.&#13;&#10;&#13;&#10;    You should have received a copy of the GNU General Public License&#13;&#10;    along with This file. If not, see &lt;http://www.gnu.org/licenses/&gt;.&#13;&#10;*/&#13;&#10;&#13;&#10;Content.makeFrontInterface(800, 580);&#13;&#10;&#13;&#10;include(&quot;manifest.js&quot;);&#13;&#10;include(&quot;settings.js&quot;);&#13;&#10;&#13;&#10;Synth.deferCallbacks(true);&#13;&#10;&#13;&#10;Engine.loadFontAs(&quot;{PROJECT_FOLDER}fonts/BLKCHCRY.TTF&quot;, &quot;blackCherry&quot;);&#13;&#10;&#13;&#10;reg i;&#13;&#10;reg lastArticulation = 0;&#13;&#10;&#13;&#10;//Dynamics\breath control&#13;&#10;const var dynamicsCC = Synth.getModulator(&quot;dynamicsCC&quot;);&#13;&#10;const var legato = Synth.getMidiProcessor(&quot;legato&quot;);&#13;&#10;const var knbDynamics = Content.getComponent(&quot;knbDynamics&quot;);&#13;&#10;knbDynamics.setControlCallback(onknbDynamicsControl);&#13;&#10;&#13;&#10;//Dynamics knobs&#13;&#10;inline function onknbDynamicsControl(control, value)&#13;&#10;{&#13;&#10;    dynamicsCC.setAttribute(dynamicsCC.DefaultValue, value);&#13;&#10;    legato.setAttribute(legato.knbBreath, value);&#13;&#10;}&#13;&#10;&#13;&#10;//Settings button&#13;&#10;inline function onbtnSettingsControl(component, value)&#13;&#10;{&#13;&#10;    Content.getComponent(&quot;pnlInstrument&quot;).set(&quot;enabled&quot;, value);&#13;&#10;&#9;Content.getComponent(&quot;fltPreset&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;pnlAbout&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;btnAbout&quot;).setValue(0);&#13;&#10;&#9;Content.getComponent(&quot;btnPreset0&quot;).setValue(0);&#13;&#10;&#9;Content.getComponent(&quot;pnlSettings&quot;).showControl(1-value);&#13;&#10;};&#13;&#10;&#13;&#10;Content.getComponent(&quot;btnSettings&quot;).setControlCallback(onbtnSettingsControl);&#13;&#10;&#13;&#10;&#13;&#10;//Curve editors&#13;&#10;const var btnCC = [];&#13;&#10;const var tblCC = [];&#13;&#10;&#13;&#10;for (i = 0; i &lt; 4; i++)&#13;&#10;{&#13;&#10;    btnCC[i] = Content.getComponent(&quot;btnCC&quot;+(i+1));&#13;&#10;    btnCC[i].setControlCallback(onbtnCCControl);&#13;&#10;    tblCC[i] = Content.getComponent(&quot;tblCC&quot;+(i+1));&#13;&#10;}&#13;&#10;&#13;&#10;inline function onbtnCCControl(control, value)&#13;&#10;{&#13;&#10;    local idx = btnCC.indexOf(control);&#13;&#10;    &#13;&#10;    local params = [&quot;Expression&quot;, &quot;Dynamics&quot;, &quot;Vibrato Intensity&quot;, &quot;Vibrato Rate&quot;];&#13;&#10;&#13;&#10;    for (i = 0; i &lt; tblCC.length; i++)&#13;&#10;    {&#13;&#10;        tblCC[i].showControl(false);&#13;&#10;        btnCC[i].setValue(false);&#13;&#10;    }&#13;&#10;&#13;&#10;    tblCC[idx].showControl(value);&#13;&#10;    btnCC[idx].setValue(value);&#13;&#10;    &#13;&#10;    //Show velocity table if value is false&#13;&#10;    Content.getComponent(&quot;tblCC0&quot;).showControl(1-value);&#13;&#10;    &#13;&#10;    //Set parameter label&#13;&#10;    if (value == 1)&#13;&#10;        Content.getComponent(&quot;lblParam&quot;).set(&quot;text&quot;, params[idx]);&#13;&#10;    else&#13;&#10;        Content.getComponent(&quot;lblParam&quot;).set(&quot;text&quot;, &quot;Velocity&quot;);&#13;&#10;        &#13;&#10;    //Show velocity dynamics button if dynamics is selected&#13;&#10;    Content.getComponent(&quot;btnVelDynamics&quot;).showControl(idx == 1 &amp;&amp; value == 1);&#13;&#10;    Content.getComponent(&quot;lblVelocityControl&quot;).showControl(idx == 1 &amp;&amp; value == 1);&#13;&#10;}&#13;&#10;&#13;&#10;//About screen&#13;&#10;inline function onbtnAboutControl(component, value)&#13;&#10;{&#13;&#10;    Content.getComponent(&quot;pnlInstrument&quot;).set(&quot;enabled&quot;, 1-value);&#13;&#10;&#9;Content.getComponent(&quot;fltPreset&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;pnlAbout&quot;).showControl(value);&#13;&#10;&#9;Content.getComponent(&quot;pnlSettings&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;btnSettings&quot;).setValue(1);&#13;&#10;};&#13;&#10;&#13;&#10;Content.getComponent(&quot;btnAbout&quot;).setControlCallback(onbtnAboutControl);&#13;&#10;&#13;&#10;&#13;&#10;//Preset handling&#13;&#10;&#13;&#10;//Get samplers&#13;&#10;const var samplerIds = Synth.getIdList(&quot;Sampler&quot;);&#13;&#10;const var childSynths = {};&#13;&#10;&#13;&#10;for (s in samplerIds)&#13;&#10;{&#13;&#10;    childSynths[s] = Synth.getChildSynth(s);&#13;&#10;}&#13;&#10;&#13;&#10;//Preset buttons&#13;&#10;inline function onbtnPreset0Control(component, value)&#13;&#10;{&#13;&#10;    Content.getComponent(&quot;pnlInstrument&quot;).set(&quot;enabled&quot;, 1-value);&#13;&#10;&#9;Content.getComponent(&quot;fltPreset&quot;).showControl(value);&#13;&#10;&#9;Content.getComponent(&quot;pnlAbout&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;btnAbout&quot;).setValue(0);&#13;&#10;&#9;Content.getComponent(&quot;pnlSettings&quot;).showControl(0);&#13;&#10;&#9;Content.getComponent(&quot;btnSettings&quot;).setValue(1);&#13;&#10;};&#13;&#10;&#13;&#10;Content.getComponent(&quot;btnPreset0&quot;).setControlCallback(onbtnPreset0Control);&#13;&#10;&#13;&#10;inline function loadAdjacentPreset(control, value)&#13;&#10;{&#13;&#10;    if (value == 1)&#13;&#10;    {&#13;&#10;        local idx = btnPreset.indexOf(control);&#13;&#10;        idx == 0 ? Engine.loadPreviousUserPreset(false) : Engine.loadNextUserPreset(false);&#13;&#10;        Content.getComponent(&quot;lblPreset&quot;).set(&quot;text&quot;, Engine.getCurrentUserPresetName());&#13;&#10;    }&#13;&#10;}&#13;&#10;&#13;&#10;const var btnPreset = [];&#13;&#10;btnPreset[0] = Content.getComponent(&quot;btnPreset1&quot;).setControlCallback(loadAdjacentPreset);&#13;&#10;btnPreset[1] = Content.getComponent(&quot;btnPreset2&quot;).setControlCallback(loadAdjacentPreset);&#13;&#10;&#13;&#10;//Patch selection and loading drop down&#13;&#10;const var cmbPatches = Content.getComponent(&quot;cmbPatches&quot;);&#13;&#10;cmbPatches.setControlCallback(oncmbPatchesControl);&#13;&#10;&#13;&#10;inline function oncmbPatchesControl(control, value)&#13;&#10;{&#13;&#10;    local patch = control.getItemText();&#13;&#10;&#13;&#10;    colourKeys(patch);&#13;&#10;    loadSampleMaps(patch);&#13;&#10;    &#13;&#10;    if(Engine.getCurrentUserPresetName() == &quot;&quot;)&#13;&#10;        Content.getComponent(&quot;lblPreset&quot;).set(&quot;text&quot;, &quot;Default&quot;);&#13;&#10;    else&#13;&#10;        Content.getComponent(&quot;lblPreset&quot;).set(&quot;text&quot;, Engine.getCurrentUserPresetName());&#13;&#10;}&#13;&#10;&#13;&#10;//Populate patch selection drop down&#13;&#10;const var patches = [];&#13;&#10;&#13;&#10;for (k in Manifest.patches)&#13;&#10;{&#13;&#10;    patches.push(k);&#13;&#10;}&#13;&#10;&#13;&#10;cmbPatches.set(&quot;items&quot;, patches.join(&quot;\n&quot;));&#13;&#10;&#13;&#10;inline function colourKeys(patch)&#13;&#10;{&#13;&#10;    local range = Manifest.patches[patch].range;&#13;&#10;&#13;&#10;    for (i = 0; i &lt; 127; i++)&#13;&#10;    {&#13;&#10;        if (i &gt;= range[0] &amp;&amp; i &lt;= range[1])&#13;&#10;        {&#13;&#10;            Engine.setKeyColour(i, Colours.withAlpha(Colours.white, 0.0)); //Light key colour&#13;&#10;        }&#13;&#10;        else&#13;&#10;        {&#13;&#10;            Engine.setKeyColour(i, Colours.withAlpha(Colours.black, 0.5)); //Dark key colour&#13;&#10;        }&#13;&#10;    }&#13;&#10;}&#13;&#10;&#13;&#10;inline function loadSampleMaps(patch)&#13;&#10;{&#13;&#10;    local sampleMaps = Sampler.getSampleMapList();&#13;&#10;&#13;&#10;    for (id in samplerIds) //Each sampler&#13;&#10;    {&#13;&#10;      //A sample map for this patch was found or sampler is transition sampler&#13;&#10;      if (sampleMaps.contains(patch + &quot;_&quot; + id) || id == &quot;transitions&quot;)&#13;&#10;      {&#13;&#10;        childSynths[id].setBypassed(false); //Enable sampler&#13;&#10;&#13;&#10;        if (id == &quot;transitions&quot;)&#13;&#10;        {&#13;&#10;            childSynths[id].asSampler().loadSampleMap(patch + &quot;_staccato&quot;); //Load staccato sample map&#13;&#10;        }&#13;&#10;        else&#13;&#10;        {&#13;&#10;            childSynths[id].asSampler().loadSampleMap(patch + &quot;_&quot; + id); //Load the sample map&#13;&#10;        }&#13;&#10;      }&#13;&#10;      else&#13;&#10;      {&#13;&#10;        childSynths[id].setBypassed(true); //Bypass sampler&#13;&#10;        childSynths[id].asSampler().loadSampleMap(&quot;empty&quot;); //Load empty sample map for this sampler&#13;&#10;      }&#13;&#10;    }&#13;&#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;&#10;}&#10;">
              <EditorStates BodyShown="1" Visible="1" Solo="0" contentShown="1" onInitOpen="1"/>
              <ChildProcessors/>
              <Content>
                <Control type="ScriptSlider" id="knbRel" value="250"/>
                <Control type="ScriptSlider" id="knbStacc" value="-2.9999986"/>
                <Control type="ScriptButton" id="btnBreath" value="0"/>
                <Control type="ScriptButton" id="btnRR" value="0"/>
                <Control type="ScriptLabel" id="lblVelocityControl" value="Velocity Control"/>
                <Control type="ScriptButton" id="btnVelDynamics" value="0"/>
                <Control type="ScriptSlider" id="knbExpression" value="127"/>
                <Control type="ScriptSlider" id="knbDynamics" value="127"/>
                <Control type="ScriptSlider" id="knbVibIntensity" value="16"/>
                <Control type="ScriptSlider" id="knbVibratoRate" value="90"/>
                <Control type="ScriptButton" id="btnCC1" value="0"/>
                <Control type="ScriptButton" id="btnCC2" value="0"/>
                <Control type="ScriptButton" id="btnCC3" value="0"/>
                <Control type="ScriptButton" id="btnCC4" value="0"/>
                <Control type="ScriptLabel" id="lblParam" value="Velocity"/>
                <Control type="ScriptTable" id="tblCC0" value="127" data="24...............vO...f+....9C...vO"/>
                <Control type="ScriptTable" id="tblCC1" value="23" data="24...............vO...f+....9C..3rO"/>
                <Control type="ScriptTable" id="tblCC2" value="0" data="36...............vO....+PMvd6C..3rO...f+....9C..jwO"/>
                <Control type="ScriptTable" id="tblCC3" value="0" data="24...............vO...f+....9C..jwO"/>
                <Control type="ScriptTable" id="tblCC4" value="0" data="24...............vO...f+....9C..nqO"/>
                <Control type="ScriptSlider" id="knbGain" value="1.4901161e-06"/>
                <Control type="ScriptSlider" id="knbPan" value="0"/>
                <Control type="ScriptSlider" id="knbCoarse" value="0"/>
                <Control type="ScriptSlider" id="knbFine" value="0"/>
                <Control type="ScriptLabel" id="lblPreset" value="Default"/>
                <Control type="ScriptComboBox" id="cmbPatches" value="1"/>
                <Control type="ScriptSlider" id="knbTransition" value="-11.999999"/>
              </Content>
              <UIData>
                <ContentProperties DeviceType="Desktop">
                  <Component type="ScriptImage" id="imgBgEmpty" x="0" y="0" width="800" height="600"
                             fileName="{PROJECT_FOLDER}Background_empty.png" scale=".5" text="imgBlankBg"/>
                  <Component type="ScriptPanel" id="pnlInstrument" x="0" y="0" width="800"
                             height="580" itemColour="0" itemColour2="0" bgColour="0" textColour="0"
                             borderSize="0">
                    </>
                  </Component>
                </ContentProperties>
              </UIData>
            </Processor>
          </ChildProcessors>
        </Processor>
      </ChildProcessors>
    </Processor>
    

    The recovery file is written to the presets folder but when you use File >> Open XML it defaults to the XmlPresetBackups folder, so maybe that would be a better location to place the recovery xml.


Log in to reply
 

8
Online

502
Users

1.8k
Topics

13.6k
Posts