Yeah. Not bad! 
I thought I’d have a go at writing a chord-transposition handler which takes a named interval instead of a semitone shift. This just does one chord at a time:
on transposeChord(originalChord, interval, direction)
set baseWidths to {0, 2, 4, 5, 7, 9, 11} -- Widths of perfect and major intervals in semitones.
set allEnharmonics to {{"B#", "C", "Dbb"}, {"Bx", "C#", "Db"}, {"Cx", "D", "Ebb"}, {"D#", "Eb", "Fbb"}, {"Dx", "E", "Fb"}, {"E#", "F", "Gbb"}, {"Ex", "F#", "Gb"}, {"Fx", "G", "Abb"}, {"G#", "Ab"}, {"Gx", "A", "Bbb"}, {"A#", "Bb", "Cbb"}, {"Ax", "B", "Cb"}}
-- Parse the chord parameter for note and chord type.
if ((count originalChord) is 1) or ((character -1 of originalChord is in "x#b") and (originalChord does not contain "/")) then
set {originalNote, chordType} to {originalChord, ""}
else
set i to 2
repeat while (character i of originalChord is in "x#b")
set i to i + 1
end repeat
set {originalNote, chordType} to {text 1 thru (i - 1) of originalChord, text i thru -1 of originalChord}
end if
-- Recursively deal with any slash in the chord type.
set i to (offset of "/" in chordType)
if (i > 0) then set chordType to text 1 thru i of chordType & transposeChord(text (i + 1) thru -1 of chordType, interval, direction)
-- Parse the interval parameter for quality and number.
set {intervalQuality, intervalNumber} to words of interval
-- Get the interval number as a number from 1 to 7.
if (intervalNumber is in "unison octave") then
set intervalNumber to 1
else if (((count intervalNumber) > 2) and (text -2 thru -1 of intervalNumber is in "st nd rd th ve va")) then
set intervalNumber to text 1 thru -3 of intervalNumber
end if
set intervalNumber to (intervalNumber - 1) mod 7 + 1
-- Get the transposition distance in semitones.
set semitoneShift to item intervalNumber of baseWidths
if (intervalQuality begins with "aug") then
set semitoneShift to semitoneShift + 1
else if (intervalQuality begins with "min") then
set semitoneShift to semitoneShift - 1
else if (intervalQuality begins with "dim") then
if ((intervalNumber is 1) or (intervalNumber is 4) or (intervalNumber is 5)) then
set semitoneShift to semitoneShift - 1
else
set semitoneShift to semitoneShift - 2
end if
end if
-- If the interval direction is down, invert the number and semitone values.
if (direction is "down") then
set intervalNumber to (9 - intervalNumber)
set semitoneShift to (12 - semitoneShift)
end if
-- Get the index of the enharmonic group containing the original note.
set i to 1
repeat until (item i of allEnharmonics contains originalNote)
set i to i + 1
end repeat
-- Get the enharmonic group which is the relevant number of semitones away from it.
set targetEnharmonics to item ((i + semitoneShift + 11) mod 12 + 1) of allEnharmonics
-- Calculate the index in this second group of the note with the required letter.
set j to ((id of character 1 of originalNote) + intervalNumber - (id of character 1 of beginning of targetEnharmonics) + 6) mod 7 + 1
-- In extreme cases, the transposed note may be a triple sharp or flat. Rationalise it.
if (j > (count targetEnharmonics)) then
if (originalNote ends with "b") then
set j to -1
else
set j to 1
end if
end if
-- Return the full transposed chord.
return (item j of targetEnharmonics) & chordType
end transposeChord
set l to {}
repeat with thisChord in {"Csus4", "Dbdim", "B", "C#", "Bb/A"}
set end of l to transposeChord(thisChord, "major 3rd", "up")
end repeat
l --> {"Esus4", "Fdim", "D#", "E#", "D/C#"}
Edit: 1. Fixed a bug which caused an error in some situations. 2. Combined the calculation of the transposed note letter and the matching of it in the target enharmonic group into a single, reduced calculation. 3. Notional triple sharps and flats are now rationalised as simpler enharmonics instead of just being returned as ‘false’.