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="/*
    Copyright 2019 David Healey

    This file is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This file is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with This file. If not, see <http://www.gnu.org/licenses/>.
*/

Content.makeFrontInterface(800, 580);

include("manifest.js");
include("settings.js");

Synth.deferCallbacks(true);

Engine.loadFontAs("{PROJECT_FOLDER}fonts/BLKCHCRY.TTF", "blackCherry");

reg i;
reg lastArticulation = 0;

//Dynamics\breath control
const var dynamicsCC = Synth.getModulator("dynamicsCC");
const var legato = Synth.getMidiProcessor("legato");
const var knbDynamics = Content.getComponent("knbDynamics");
knbDynamics.setControlCallback(onknbDynamicsControl);

//Dynamics knobs
inline function onknbDynamicsControl(control, value)
{
    dynamicsCC.setAttribute(dynamicsCC.DefaultValue, value);
    legato.setAttribute(legato.knbBreath, value);
}

//Settings button
inline function onbtnSettingsControl(component, value)
{
    Content.getComponent("pnlInstrument").set("enabled", value);
	Content.getComponent("fltPreset").showControl(0);
	Content.getComponent("pnlAbout").showControl(0);
	Content.getComponent("btnAbout").setValue(0);
	Content.getComponent("btnPreset0").setValue(0);
	Content.getComponent("pnlSettings").showControl(1-value);
};

Content.getComponent("btnSettings").setControlCallback(onbtnSettingsControl);


//Curve editors
const var btnCC = [];
const var tblCC = [];

for (i = 0; i < 4; i++)
{
    btnCC[i] = Content.getComponent("btnCC"+(i+1));
    btnCC[i].setControlCallback(onbtnCCControl);
    tblCC[i] = Content.getComponent("tblCC"+(i+1));
}

inline function onbtnCCControl(control, value)
{
    local idx = btnCC.indexOf(control);
    
    local params = ["Expression", "Dynamics", "Vibrato Intensity", "Vibrato Rate"];

    for (i = 0; i < tblCC.length; i++)
    {
        tblCC[i].showControl(false);
        btnCC[i].setValue(false);
    }

    tblCC[idx].showControl(value);
    btnCC[idx].setValue(value);
    
    //Show velocity table if value is false
    Content.getComponent("tblCC0").showControl(1-value);
    
    //Set parameter label
    if (value == 1)
        Content.getComponent("lblParam").set("text", params[idx]);
    else
        Content.getComponent("lblParam").set("text", "Velocity");
        
    //Show velocity dynamics button if dynamics is selected
    Content.getComponent("btnVelDynamics").showControl(idx == 1 && value == 1);
    Content.getComponent("lblVelocityControl").showControl(idx == 1 && value == 1);
}

//About screen
inline function onbtnAboutControl(component, value)
{
    Content.getComponent("pnlInstrument").set("enabled", 1-value);
	Content.getComponent("fltPreset").showControl(0);
	Content.getComponent("pnlAbout").showControl(value);
	Content.getComponent("pnlSettings").showControl(0);
	Content.getComponent("btnSettings").setValue(1);
};

Content.getComponent("btnAbout").setControlCallback(onbtnAboutControl);


//Preset handling

//Get samplers
const var samplerIds = Synth.getIdList("Sampler");
const var childSynths = {};

for (s in samplerIds)
{
    childSynths[s] = Synth.getChildSynth(s);
}

//Preset buttons
inline function onbtnPreset0Control(component, value)
{
    Content.getComponent("pnlInstrument").set("enabled", 1-value);
	Content.getComponent("fltPreset").showControl(value);
	Content.getComponent("pnlAbout").showControl(0);
	Content.getComponent("btnAbout").setValue(0);
	Content.getComponent("pnlSettings").showControl(0);
	Content.getComponent("btnSettings").setValue(1);
};

Content.getComponent("btnPreset0").setControlCallback(onbtnPreset0Control);

inline function loadAdjacentPreset(control, value)
{
    if (value == 1)
    {
        local idx = btnPreset.indexOf(control);
        idx == 0 ? Engine.loadPreviousUserPreset(false) : Engine.loadNextUserPreset(false);
        Content.getComponent("lblPreset").set("text", Engine.getCurrentUserPresetName());
    }
}

const var btnPreset = [];
btnPreset[0] = Content.getComponent("btnPreset1").setControlCallback(loadAdjacentPreset);
btnPreset[1] = Content.getComponent("btnPreset2").setControlCallback(loadAdjacentPreset);

//Patch selection and loading drop down
const var cmbPatches = Content.getComponent("cmbPatches");
cmbPatches.setControlCallback(oncmbPatchesControl);

inline function oncmbPatchesControl(control, value)
{
    local patch = control.getItemText();

    colourKeys(patch);
    loadSampleMaps(patch);
    
    if(Engine.getCurrentUserPresetName() == "")
        Content.getComponent("lblPreset").set("text", "Default");
    else
        Content.getComponent("lblPreset").set("text", Engine.getCurrentUserPresetName());
}

//Populate patch selection drop down
const var patches = [];

for (k in Manifest.patches)
{
    patches.push(k);
}

cmbPatches.set("items", patches.join("\n"));

inline function colourKeys(patch)
{
    local range = Manifest.patches[patch].range;

    for (i = 0; i < 127; i++)
    {
        if (i >= range[0] && i <= range[1])
        {
            Engine.setKeyColour(i, Colours.withAlpha(Colours.white, 0.0)); //Light key colour
        }
        else
        {
            Engine.setKeyColour(i, Colours.withAlpha(Colours.black, 0.5)); //Dark key colour
        }
    }
}

inline function loadSampleMaps(patch)
{
    local sampleMaps = Sampler.getSampleMapList();

    for (id in samplerIds) //Each sampler
    {
      //A sample map for this patch was found or sampler is transition sampler
      if (sampleMaps.contains(patch + "_" + id) || id == "transitions")
      {
        childSynths[id].setBypassed(false); //Enable sampler

        if (id == "transitions")
        {
            childSynths[id].asSampler().loadSampleMap(patch + "_staccato"); //Load staccato sample map
        }
        else
        {
            childSynths[id].asSampler().loadSampleMap(patch + "_" + id); //Load the sample map
        }
      }
      else
      {
        childSynths[id].setBypassed(true); //Bypass sampler
        childSynths[id].asSampler().loadSampleMap("empty"); //Load empty sample map for this sampler
      }
    }
}function onNoteOn()
{
	
}
function onNoteOff()
{
	
}
function onController()
{
	
}
function onTimer()
{
	
}
function onControl(number, value)
{
	
}
">
          <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.