Adding your own Minc functions to einwrap.

Those of you who are interested in creating pieces using some sort of algorithmic control will undoubtedly find it useful to learn how to add your own C functions to the Minc interface.  In the process you will also learn how to add signal processing functions.

1) cd to a good working location
2) tar xvf /u/paul/m325/my_einwrap.tar

you will now have a directory call my_einwrap.

cd my_einwrap

I created a simple example function called gogo.c,  whichsimply returns the sum of its arguments.

+++++++++++++++++++++++++++++++++
double
gogo(float *p, int n_args)
{
        int i;
        double sum;

        for(sum=0,i=0; i<n_args; i++)
            sum+= p[i];

        return(sum);
}
+++++++++++++++++++++++++++++++++

The array of floats, *p contains the arguments listed in parentheses when, in Minc, you say

gogo(1,2,9,y,x/2)

for example.  n_args contains the number of these arguments.

So, for example

einwrap(start=2,dur=9,0,1,gogo(1,2,3,4,start,dur))

would return the value 21 (1+2+3+4+2+9) as the 5th argument to einwrap.

All you have to do now is introduce the name 'gogo' to cmix/einwrap, and add it to the Makefile

To introduce it you would add the following line to the profile.c file.

UG_INTRO("gogo", gogo);

The name in quotes will be recognized by Minc, and call the function not listed in quotes.

All Minc functions must be declared as type double.

Then just add it to the list of OBJS1 in the Makefile

OBJS1 = e.o mySND.o  xaiff.headerinfo.o xaiff.sndloc.o profile.o gogo.o

Now 'make einwrap' will build a cmix/einwrap binary which recognizes the function gogo.

The function e.c contains the main busy work involved in calling nexty.c.  Study that if you want to make  more complicated signal processing changes.  The code should be fairly self-explanatory.   You only need to "introduce" functions in the profile.c function which are going to be used in Minc. (Just in case you want to use strings, consult the code for einwrap() and einwrap_in(), or ask me for help.  There is a 3rd argument to Minc functions, which is a doubles version of the *p array, and must be used to read string arguments.)

Arrays

Minc has no convenient way to use arrays.  The built in method uses the load_array() and get_array() commands.  The first argument of each call is the number (i.e. the name) of the array.  There can be up to 32 different arrays.  The rest of the arguments, up to 2048 of them, are the values of the array.

thus

num = load_array(0,    1,3,9,8.1,4,8)

loads array 0 with the values 1,3,9,etc. and returns the value 6, which is the number of values in the array.

and

val = get_array(0,  2)

returns the value 9, the 2nd value of the array (the third, actually, since the first, 0th,  value is in location 0)).

Thus

num = load_array(0, 1,3,7,6,8,9,11)
for(i=0, i<num; i=i+1)
    einwrap(get_array(0,i),dur,0,1)

will call einwrap 7 times at the starting times listed in the array.

printf

Sometimes it is convenient to generate strings which will be used for programs like einwrap or rt.

Minc has a built in function called str_num()  (for string,num,string,num etc.) which roughly does the job of printf.

It has the form

str_num("string1", num1, "string2", num2, "string3", num3, ......)

thus

str_num("einwrap(", x=23, ",dur=", x, ")")

will result in the string

einwrap(23,dur=23)

being printed out.   Note that it is necessary to print the commas.

I generally will create a minc script containing a bunch of these commands,  run it using a generic cmix program called ctest,  which won't recognize specialized commands such as einwrap(), and grep for the strings.

Thus

ctest < minc.file | grep einwrap > output

will save the results generated in the minc.file, which contain the string einwrap, in a file called output.