Update new loop range on sample load.

Try this:

function sampleStartChanged()
  local zone = this.parent:findZones(true)[1]
  if zone then
    zone:setParameter("SampleOsc.SampleStart", SampleStart)
  end
end

function sampleEndChanged()
  local zone = this.parent:findZones(true)[1]
  if zone then
    zone:setParameter("SampleOsc.SampleEnd", SampleEnd)
  end
end

function loopStartChanged()
  local zone = this.parent:findZones(true)[1]
  if zone then
    zone:setParameter("SampleOsc.SustainLoopStartA", LoopStart)
  end
end

function loopEndChanged()
  local zone = this.parent:findZones(true)[1]
  if zone then
    zone:setParameter("SampleOsc.SustainLoopEndA", LoopEnd)
  end
end

defineParameter("SampleStart", nil, 0, 0, 0x7fffffff, sampleStartChanged)
defineParameter("SampleEnd", nil, 0, 0, 0x7fffffff, sampleEndChanged)
defineParameter("LoopStart", nil, 0, 0, 0x7fffffff, loopStartChanged)
defineParameter("LoopEnd", nil, 0, 0, 0x7fffffff, loopEndChanged)

defineParameter("zoneScope", nil, "")

function onUndo()
  if undoInfo.updateDisplay then
    adjustRange()
  end
end

defineParameter{name = "undoInfo", default = {}, onChanged = onUndo, automatable = false}

function adjustRange()
  local zone = this.parent:findZones(true)[1]
  if zone then
    zoneScope = "@0:"..zone.name.."/"
  end
  --print(zoneScope)
  local sample = AudioFile.open(zone:getParameter("SampleOsc.Filename"))
  if zone and sample.valid then
    defineParameter("SampleStart", nil, 0, 0, sample.length, sampleStartChanged)
    defineParameter("SampleEnd", nil, sample.length, 0, sample.length, sampleEndChanged)
    defineParameter("LoopStart", nil, 0, 0, sample.length, loopStartChanged)
    defineParameter("LoopEnd", nil, 0, 0, sample.length, loopEndChanged)

    SampleStart = zone:getParameter("SampleOsc.SampleStart")
    SampleEnd = zone:getParameter("SampleOsc.SampleEnd")
    LoopStart = zone:getParameter("SampleOsc.SustainLoopStartA")
    LoopEnd = zone:getParameter("SampleOsc.SustainLoopEndA")
  end
end

function filenameChanged()  
  local zone = this.parent:findZones(true)[1]
  local sample = AudioFile.open(Filename)
  if sample.valid then
    local name = string.sub(string.match(sample.fileName,"[^\\/]+$"),1,-5)
    startUndoBlock("Load User Sample "..name)
    undoInfo = { redo = true, updateDisplay = true }
    this:setParameter("undoInfo", { redo = false }, true)
    
    local newzone = clone(zone)

    newzone:setName(name)
    newzone:setParameter("SampleOsc.Filename", sample.fileName)
    newzone:setParameter("SampleOsc.SampleEnd", sample.length)
    local rootKey = sample.rootKey
    if rootKey then
      newzone:setParameter("SampleOsc.Rootkey", rootKey)
    else
      newzone:setParameter("SampleOsc.Rootkey", 60)
    end
    local loops = sample.loops
    if loops[1] then
      newzone:setParameter("SampleOsc.SustainLoopModeA", 1)
      newzone:setParameter("SampleOsc.SustainLoopStartA", loops[1].loopStart)
      newzone:setParameter("SampleOsc.SustainLoopEndA", loops[1].loopEnd)
    else
      newzone:setParameter("SampleOsc.SustainLoopModeA", 0)
      newzone:setParameter("SampleOsc.SustainLoopStartA", 0)
      newzone:setParameter("SampleOsc.SustainLoopEndA", 0)
    end
    zone:removeFromParent()
    this.parent:appendZone(newzone)
    undoInfo = { redo = true }
    this:setParameter("undoInfo", { redo = false, updateDisplay = true }, true)
    endUndoBlock()
  end
end

defineParameter{name = "Filename", default = "", onChanged = filenameChanged, persistent = false, automatable = false}

function onLoad()
  adjustRange()
end

Load Sample.zip (7.61 KB)