powershape — Waveshapes a signal by raising it to a variable exponent.

The *powershape* opcode raises an input signal to a power with pre- and post-scaling of the signal so that the output will be in a predictable range. It also processes negative inputs in a symmetrical way to positive inputs, calculating a dynamic transfer function that is useful for waveshaping.

*ifullscale* -- optional parameter specifying the range of input values from -*ifullscale* to *ifullscale*. Defaults to 1.0 -- you should set this parameter to the maximum expected input value.

*ain* -- the input signal to be shaped.

*aout* -- the output signal.

*kShapeAmount* -- the amount of the shaping effect applied to the input; equal to the power that the input signal is raised.

The *powershape* opcode is very similar to the *pow* unit generators for calculating the mathematical "power of" operation. However, it introduces a couple of twists that can make it much more useful for waveshaping audio-rate signals. The *kShapeAmount* parameter is the exponent to which the input signal is raised.

To avoid discontinuities, the *powershape* opcode treats all input values as positive (by taking their absolute value) but preserves their original sign in the output signal. This allows for smooth shaping of any input signal while varying the exponent over any range. (*powershape* also (hopefully) deals intelligently with discontinuities that could arise when the exponent and input are both zero. Note though that negative exponents will usually cause the signal to exceed the maximum amplitude specified by the ifullscale parameter and should normally be avoided).

The other adaptation involves the *ifullscale* parameter. The input signal is divided by *ifullscale* before being raised to *kShapeAmount* and then multiplied by *ifullscale* before being output. This normalizes the input signal to the interval [-1,1], guaranteeing that the output (before final scaling) will also be within this range for positive shaping amounts and providing a smoothly evolving transfer function while varying the amount of shaping. Values of *kShapeAmount* between (0,1) will make the signal more "convex" while values greater than 1 will make it more "concave". A value of exactly 1.0 will produce no change in the input signal.

Here is an example of the powershape opcode. It uses the file *powershape.csd*.

**Example 779. Example of the powershape opcode.**

See the sections *Real-time Audio* and *Command Line Flags* for more information on using command line flags.

<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in -odac -iadc ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o abs.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> instr 1 imaxamp = 10000 kshapeamt line p5, p3, p6 aosc oscili 1.0, cpspch(p4), 1 aout powershape aosc, kshapeamt adeclick linseg 0.0, 0.01, 1.0, p3 - 0.06, 1.0, 0.05, 0.0 out aout * adeclick * imaxamp endin </CsInstruments> <CsScore> f1 0 32768 10 1 i1 0 1 7.00 0.000001 0.8 i1 + 0.5 7.02 0.01 1.0 i1 + . 7.05 0.5 1.0 i1 + . 7.07 4.0 1.0 i1 + . 7.09 1.0 10.0 i1 + 2 7.06 1.0 25.0 e </CsScore> </CsoundSynthesizer>