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.valuelocal REFMSG_CONTROLREF_CHANGE = 0xFAif isKindOf subAnim.parent ParamBlock2 then(local iGlobal = (dotNetClass "Autodesk.Max.GlobalInterface").Instancelocal pBlockNET = iGlobal.Animatable.GetAnimByHandle (getHandleByAnim subAnim.parent)local pValNET = pBlockNET.GetPB2Value (pBlockNET.IndexToId (subAnim.index - 1)) 0pValNET.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.controllerlocal parent = subAnim.parentlocal index = for i = 1 to refs.getNumRefs parent where refs.getReference parent i == ctrl do exit with irefs.replaceReference parent index undefined)if classOf subAnim.value == classOf originalValue do subAnim.value = originalValuenotifyDependents subAnim.parent msg:REFMSG_CONTROLREF_CHANGE)

