csound-expression-1.0.4: library to make electronic music

Safe HaskellSafe-Inferred

Csound.LowLevel

Contents

Description

Functions to make your own opcodes. You can find a lot of examples in source code (see directory Csound/Opcode)

Synopsis

Types

data Rate Source

The Csound rates.

Constructors

Xr 
Ar 
Kr 
Ir 
Sr 
Fr 

type E = Fix RatedExpSource

The inner representation of csound expressions.

Handy shortcuts

is :: Int -> [Rate]Source

ks :: Int -> [Rate]Source

as :: Int -> [Rate]Source

Standard opcodes

Example:

 oscil :: Sig -> Sig -> Tab -> Sig 
 oscil = opc3 "oscil" [
     (a, [x, x, i, i]),
     (k, [k, k, i, i])]

type Spec1 = [(Rate, [Rate])]Source

opcs :: (Val a, Val b) => Name -> Spec1 -> [a] -> bSource

opc0 :: Val a => Name -> Spec1 -> aSource

opc1 :: (Val a, Val b) => Name -> Spec1 -> a -> bSource

opc2 :: (Val a1, Val a2, Val b) => Name -> Spec1 -> a1 -> a2 -> bSource

opc3 :: (Val a1, Val a2, Val a3, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> bSource

opc4 :: (Val a1, Val a2, Val a3, Val a4, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> bSource

opc5 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> bSource

opc6 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> bSource

opc7 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> bSource

opc8 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val a8, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> bSource

opc9 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val a8, Val a9, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> bSource

opc10 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val a8, Val a9, Val a10, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> bSource

opc11 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val a8, Val a9, Val a10, Val a11, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> a11 -> bSource

opc12 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, Val a8, Val a9, Val a10, Val a11, Val a12, Val b) => Name -> Spec1 -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> a8 -> a9 -> a10 -> a11 -> a12 -> bSource

Multiple outputs

Examples:

 pan2 :: Sig -> Sig -> (Sig, Sig)
 pan2 = mopc2 "pan2" ([a, a], [a, x, i])

When you don't want to specify precise number of outputs:

 soundin :: CsdTuple a => S -> a
 soundin = mopc1 "soundin" (repeat a, s : is 4)

type Specs = ([Rate], [Rate])Source

mopcs :: (Val a, CsdTuple b) => Name -> Specs -> [a] -> bSource

mopc0 :: CsdTuple a => Name -> Specs -> aSource

mopc1 :: (Val a, CsdTuple b) => Name -> Specs -> a -> bSource

mopc2 :: (Val a1, Val a2, CsdTuple b) => Name -> Specs -> a1 -> a2 -> bSource

mopc3 :: (Val a1, Val a2, Val a3, CsdTuple b) => Name -> Specs -> a1 -> a2 -> a3 -> bSource

mopc4 :: (Val a1, Val a2, Val a3, Val a4, CsdTuple b) => Name -> Specs -> a1 -> a2 -> a3 -> a4 -> bSource

mopc5 :: (Val a1, Val a2, Val a3, Val a4, Val a5, CsdTuple b) => Name -> Specs -> a1 -> a2 -> a3 -> a4 -> a5 -> bSource

mopc6 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, CsdTuple b) => Name -> Specs -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> bSource

mopc7 :: (Val a1, Val a2, Val a3, Val a4, Val a5, Val a6, Val a7, CsdTuple b) => Name -> Specs -> a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> bSource

Side effects

Examples:

 delayr :: D -> SE Sig
 delayr a1 = se $ opc1 "delayr" [(a, [i])] a1
 
 delayw :: Sig -> SE ()
 delayw a1 = se_ $ opc1 "delayw" [(x, [a])] a1

Functions that produce no values (procedures) should return value of the type Xr.

When standard functions are not enough

Sometimes Csound opcodes take too many parameters. If you want to use them, you can always use functions that are defined on lists (opcs or mopcs). But in this case you have to convert all arguments to the same type E:

For example:

 oscil :: Sig -> Sig -> Tab -> Sig 
 oscil a1 a2 a3 = opcs "oscil" signature [toE a1, toE a2, toE a3]
    where signature = [
            (a, [x, x, i, i]),
            (k, [k, k, i, i])]

toE :: Val a => a -> ESource

Converts a value to the private representation.

se :: Val a => E -> SE aSource

se_ :: E -> SE ()Source