# How can you invert an F-Curve

Basically I have a lamp moving on the Z axis according to a sound baked, then unbaked F-Curve, the problem is it's moving the exact opposite way I need it to, and so I believe I need to invert the F-Curve in someway.

Bake to a prop, find the ramge. map to [0, 1]

In the code in

https://blender.stackexchange.com/a/39241/15543

I show how to get the minimum and maximum value of an fcurve. The range of the fcurve. (It is generally always the case that the minimum is 0 for baked fcurves). The range is A = max - min . This can also be done pretty much by eye, picking the maximum and minimum points and noting the values in graph editor..

For sound drivers, (which is very much on back-burner, there is an aubio version for 2.8 coming which bakes up to 10x quicker in my preliminary tests) I used these for control points on an fcurve envelope modifier to map the range to [0, 1] With the unit range, the curve can be amplified with a generator modifier, or a via a variable with A * fcurve.evaluate() the inverse is A * (1 - fcurve.evaluate(frame))

The last image of https://blender.stackexchange.com/a/39241/15543 shows a baked sound and its inverse as the amplitude is changed.

Here is a section of that image showing the envelope modifier.

action frame range 1 to 44, fcurve has max 0.3 something, mapped to [0, 1] with envelope

Here is some code from sound drivers to add an envelope modifier. The min and max of the fcurve is the default min and max of the modifer. The envelope control points are added at each end of fcurve and map range to range [0, 1].

        action # the action
fcurve # an fcurve from that action
_min # calculated min of fcurve
_max # calculated max of fcurve

mods = [m for m in fcurve.modifiers if m.type == 'ENVELOPE']
# remove mods (shouldn't be any)
for m in mods:
fcurve.modifiers.remove(m)
m = fcurve.modifiers.new(type='ENVELOPE')
m.default_min = _min
m.default_max = _max
# add a control point at start end
for f in action.frame_range: