Skip to content


Curve formula

0. linear, from 0 to 1

f(x)=x with x=(CCval/127)

1. bipolar, from -1 to 1 (useful for things such as tuning and panning, used by CC10 panning by default)

f(x)=2*x-1 with x=(CCval/127)

2. linear inverted, from 1 to 0

f(x)=1-x with x=(CCval/127)

3. bipolar inverted, from 1 to -1

f(x)=1-2*x with x=(CCval/127)

4. concave (used for CC7 volume tracking and amp_veltrack)

f(x)=x*x with x=(CCval/127)

5. Xfin power curve

Crossfading formula. It's like a typical pan formula for the right channel.

ARIA's exact formula is f(x)=pow(x, 0.5) with x=(CCval/127)

Another candidate will be sin(0.5*pi*x), for the pan formula already existing in Sfizz.

6. Xfout power curve

It's the opposite of Xfin power curve.

f(x)=pow(1-x, 0.5), with x=(CCval/127)

Alternative cos(0.5*pi*x)

Curve numbers

When a <curve> element without an explicit curve_index is met, it takes the next available index starting from 1.

Most times, software will reserve 6 slots for predefined curves. This will make the first user curve be 7, and it's a good idea to follow this as a convention.


<curve> v000=0 v64=0.1 v127=1.0 // the curve at index 7
<curve> v000=0 v64=0.1 v127=0.2 // the curve at index 8

Explicit curve index

ARIA opcode curve_index permits to specify the explicit index.

It can't seem to mix curves which are explicitly indexed and those which aren't.

Explicitly-indexed curves after implicitly-indexed ones seem to be discarded by the loader, and vice-versa.


Both software are using linear interpolation to evaluate between the defined values. (verified)


  • In ARIA, the curve values are not bounded.
  • In Cakewalk, the curve values are clamped in the domain [-1:+1].