If you are like me, you have your MIDI tracks separated from your Kontakt instruments. This way you don’t waste Konkakt instances.

This script searches recursively for all instruments reachable through the sends of the current selected track and opens all of them.

DEBUG = false

ROUTE_CATEGORY = { Receive = -1, Send = 0, HardwareOutput = 1 }
ROUTE_PARAM_NAME = {
    Mute = "B_MUTE",
    Phase = "B_PHASE",
    Mono = "B_MONO",
    Volume = "D_VOL",
    Pan = "D_PAN",
    PanLaw = "D_PANLAW",
    SendMode = "I_SENDMODE",
    AutoMode = "I_AUTOMODE",
    SourceChannel = "I_SRCCHAN",
    DestChannel = "I_DSTCHAN",
    MidiFlags = "I_MIDIFLAGS",
    SourceTrack = "P_SRCTRACK",
    DestTrack = "P_DESTTRACK",
    Envelope = "P_ENV",
}
TRACKFX_SHOW = { HideChain = 0, ShowChain = 1, HideFloating = 2, ShowFloating = 3 }


function debug(msg)
    if (DEBUG) then
        reaper.ShowConsoleMsg(msg .. "\n")
    end
end

local function open_instrument(track, instrumentIndex)
    reaper.TrackFX_Show(track, instrumentIndex, TRACKFX_SHOW.ShowFloating)
end

local function search_instruments(track)
    local trackIndex = reaper.CSurf_TrackToID(track, false)
    local _, trackName = reaper.GetTrackName(track)
    local trackDesc = trackIndex .. ". " .. trackName
    debug("Searching track " .. trackDesc)
    local instrumentIndex = reaper.TrackFX_GetInstrument(track)
    if instrumentIndex ~= -1 then
        debug("Track " .. trackDesc .. " has instrument!")
        return { { Track = track, InstrumentIndex = instrumentIndex } }
    else
        debug("Track " .. trackDesc .. " has no instrument")
    end

    local trackSends = reaper.GetTrackNumSends(track, ROUTE_CATEGORY.Send)
    local midiSendFound = false
    local dependantInstruments = {}
    for sendIndex = 0, trackSends - 1, 1 do
        local midiFlags = reaper.GetTrackSendInfo_Value(track, ROUTE_CATEGORY.Send, sendIndex, ROUTE_PARAM_NAME.MidiFlags)
        if midiFlags then
            midiSendFound = true
            local target = reaper.GetTrackSendInfo_Value(track, ROUTE_CATEGORY.Send, sendIndex, ROUTE_PARAM_NAME.DestTrack)
            local dependantInstrumentsOfSend = search_instruments(target)
            for _, instrument in pairs(dependantInstrumentsOfSend) do
                table.insert(dependantInstruments, instrument)
            end
        end
    end

    if not midiSendFound then
        debug("Track " .. trackDesc .. " does not have MIDI sends")
    end

    return dependantInstruments
end

local selectedTrack = reaper.GetSelectedTrack(0, 0)

local instruments = search_instruments(selectedTrack)

for _, instrument in pairs(instruments) do
    open_instrument(instrument.Track, instrument.InstrumentIndex)
end