Since there's no built-in MAXScript function to remove controller once you add it to a parameter, here's a function to do that for you. Big thanks to Larry Minton for revealing how to handle ParamBlock2 PB2Values.
fn removeController subAnim = if isKindOf subAnim ::SubAnim and isController subAnim.controller do
(
local originalValue = subAnim.value
local REFMSG_CONTROLREF_CHANGE = 0xFA
if isKindOf subAnim.parent ParamBlock2 then
(
local iGlobal = (dotNetClass "Autodesk.Max.GlobalInterface").Instance
local pBlockNET = iGlobal.Animatable.GetAnimByHandle (getHandleByAnim subAnim.parent)
local pValNET = pBlockNET.GetPB2Value (pBlockNET.IndexToId (subAnim.index - 1)) 0
pValNET.Flags = bit.or pValNET.Flags 0x40 -- set the flag on the PB2Value which controls if the parameter is animated - this effectively removes the controller
)
else
(
local ctrl = subAnim.controller
local parent = subAnim.parent
local index = for i = 1 to refs.getNumRefs parent where refs.getReference parent i == ctrl do exit with i
refs.replaceReference parent index undefined
)
if classOf subAnim.value == classOf originalValue do subAnim.value = originalValue
notifyDependents subAnim.parent msg:REFMSG_CONTROLREF_CHANGE
)