collection of audio DSP plugins
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

3.3 KiB

How to Create a Soundpipe Module

Creating new modules in Soundpipe is a relatively straightforward process.

For this tutorial, we are going to create a gain module called "gain".

Bootstrapping

Soundpipe has a script that automatically creates the necessary template files needed to create a module.

This can be invoked with "make" with the following command:

make bootstrap MODULE_NAME="gain"

Make sure the module name you choose is unique.

If successful, this script will create 4 boiler plate files:

  • modules/gain.c: the main c code.
  • h/gain.h: the header file
  • examples/ex_gain.c: an example file utilizing gain
  • modules/data/gain.lua: metadata for gain, used to create a doc page

A fully implemented module file will have these components:

The Header File

Typically, the only thing here you would need to implement is the data struct (empty by default). However, it is okay to tack on variables to the end of the init function if you need to do things like create delay lines.

typedef struct {
    SPFLOAT gain;
} sp_gain;

The Module File

int sp_gain_init(sp_data *sp, sp_gain *p)
{
    p->gain = 0;
    return SP_OK;
}

int sp_gain_compute(sp_data *sp, sp_gain *p, SPFLOAT *in, SPFLOAT *out)
{
    *out = *in * p->gain;
    return SP_OK;
}

The example

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "soundpipe.h"

typedef struct {
    sp_gain *gain;
    sp_osc *osc;
    sp_ftbl *ft; 
} UserData;

void process(sp_data *sp, void *udata) {
    UserData *ud = udata;
    SPFLOAT osc = 0, gain = 0;
    sp_osc_compute(sp, ud->osc, NULL, &osc);
    sp_gain_compute(sp, ud->gain, &osc, &gain);
    sp->out[0] = gain;
}

int main() {
    srand(1234567);
    UserData ud;
    sp_data *sp;
    sp_create(&sp);

    sp_gain_create(&ud.gain);
    sp_osc_create(&ud.osc);
    sp_ftbl_create(sp, &ud.ft, 2048);

    ud.gain->gain = 0.3;

    sp_gain_init(sp, ud.gain);
    sp_gen_sine(sp, ud.ft);
    sp_osc_init(sp, ud.osc, ud.ft);

    sp->len = 44100 * 5;
    sp_process(sp, &ud, process);

    sp_gain_destroy(&ud.gain);
    sp_ftbl_destroy(&ud.ft);
    sp_osc_destroy(&ud.osc);

    sp_destroy(&sp);
    return 0;
}

Metadata / Documentation

sptbl["gain"] = {

    files = { 
        module = "gain.c",
        header = "gain.h",
        example = "ex_gain.c",
    },
    
    func = {
        create = "sp_gain_create",
        destroy = "sp_gain_destroy",
        init = "sp_gain_init",
        compute = "sp_gain_compute"
    },
    
    params = {
        optional = {
            {
                name = "gain",
                type = "SPFLOAT",
                description = "Sets the gain",
                default = 0
            },
        }
    },
    
    modtype = "module",
    
    description = [[Scale an incoming signal.]], 
    
    ninputs = 1,
    noutputs = 1,
    
    inputs = { 
        {
            name = "input",
            description = "this is the audio input for a made up plugin."
        },
    },
    
    outputs = {
        {
            name = "out",
            description = "Signal output",
        },
    }

}

Adding to Soundpipe

To add your module to Soundpipe, run the following command:

add to config.mk compile

Buffers in Soundpipe

Coming soon!

Using ftables in Soundpipe

Coming soon!

Creating GEN routines in Soundpipe

Coming soon!