Each touch on the sensor controls the pitch and volume of an oscillator.
Position and size for each touch are then mapped to frequency and amplitude of their corresponding oscillator. Changes in frequency and amplitude are smoothed using low pass filters to avoid artifacts.
 
#include <cmath>
#include <libraries/Trill/Trill.h>
#include <libraries/OnePole/OnePole.h>
#include <libraries/Oscillator/Oscillator.h>
 
#define NUM_TOUCH 5 
 
 
float gTouchLocation[NUM_TOUCH] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
float gTouchSize[NUM_TOUCH] = { 0.0, 0.0, 0.0, 0.0, 0.0 };
int gNumActiveTouches = 0;
 
unsigned int gTaskSleepTime = 12000; 
 
OnePole freqFilt[NUM_TOUCH], ampFilt[NUM_TOUCH];
 
float gCutOffFreq = 5, gCutOffAmp = 15;
float gFreqRange[2] = { 200.0, 1500.0 };
float gAmplitudeRange[2] = { 0.0, 1.0 } ;
 
void loop(void*)
{
        {
                
                touchSensor.readI2C();
                gNumActiveTouches = touchSensor.getNumTouches();
                for(unsigned int i = 0; i <  gNumActiveTouches; i++) {
                        gTouchLocation[i] = touchSensor.touchLocation(i);
                        gTouchSize[i] = touchSensor.touchSize(i);
                }
                
                for(unsigned int i = gNumActiveTouches; i < NUM_TOUCH; i++) {
                        gTouchLocation[i] = 0.0;
                        gTouchSize[i] = 0.0;
                }
                usleep(gTaskSleepTime);
        }
}
 
{
        
                fprintf(stderr, "Unable to initialise Trill Bar\n");
                return false;
        }
        touchSensor.printDetails();
 
        
 
        
        for(unsigned int i = 0; i < NUM_TOUCH; i++) {
                
                
        }
 
        return true;
}
 
{
        for(
unsigned int n = 0; n < context->
audioFrames; n++) {
 
                float out = 0.0;
                
                for(unsigned int i = 0; i < NUM_TOUCH; i++) {
                        float frequency, amplitude;
                        frequency = 
map(gTouchLocation[i], 0, 1, gFreqRange[0], gFreqRange[1]);
                        
                        
                        amplitude = 
map(gTouchSize[i], 0, 1, gAmplitudeRange[0], gAmplitudeRange[1]);
                        amplitude = ampFilt[i].process(amplitude);
 
                        out += (1.f/NUM_TOUCH) * amplitude * osc[i].process(frequency);
                }
                
                }
        }
}
 
{}
Definition Oscillator.h:3
A class to use the Trill family of capacitive sensors. http://bela.io/trill.
Definition Trill.h:14
@ BAR
Trill Bar
Definition Trill.h:34
AuxiliaryTask Bela_runAuxiliaryTask(void(*callback)(void *), int priority=0, void *arg=nullptr)
Create and start an AuxiliaryTask.
int Bela_stopRequested()
Check whether the program should stop.
static void audioWrite(BelaContext *context, int frame, int channel, float value)
Write an audio output, specifying the frame number (when to write) and the channel.
Definition Bela.h:1469
void render(BelaContext *context, void *userData)
User-defined callback function to process audio and sensor data.
Definition render.cpp:68
bool setup(BelaContext *context, void *userData)
User-defined initialisation function which runs before audio rendering begins.
Definition render.cpp:51
void cleanup(BelaContext *context, void *userData)
User-defined cleanup function which runs when the program finishes.
Definition render.cpp:96
static float map(float x, float in_min, float in_max, float out_min, float out_max)
Linearly rescale a number from one range of values to another.
Definition Utilities.h:71
Structure holding audio and sensor settings and pointers to I/O data buffers.
Definition Bela.h:231
const uint32_t audioOutChannels
The number of audio output channels.
Definition Bela.h:326
const uint32_t audioFrames
The number of audio frames per block.
Definition Bela.h:322
const float audioSampleRate
The audio sample rate in Hz (currently always 44100.0).
Definition Bela.h:328