Bela
Real-time, ultra-low-latency audio and sensor processing system for BeagleBone Black
Loading...
Searching...
No Matches
Trill/square-sound/render.cpp

Trill Square oscillator pad

This example shows how to communicate with the Trill Square sensor using the Trill library. It sonifies the X-Y position and size of the touch via the control of an oscillator.

In this file Trill sensor is scanned in an AuxiliaryTask running in parallel with the audio thread and the horizontal and vertical position and size are stored in global variables.

The vertical position of the touch is mapped to frequency, while the horizontal position maps to left/right panning. Touch size is used to control the overal amplitude of the oscillator.

Changes in frequency, amplitude and panning are smoothed using LP filters to avoid artifacts.

/*
____ _____ _ _
| __ )| ____| | / \
| _ \| _| | | / _ \
| |_) | |___| |___ / ___ \
|____/|_____|_____/_/ \_\
http://bela.io
*/
#include <Bela.h>
#include <cmath>
#include <libraries/Trill/Trill.h>
#include <libraries/OnePole/OnePole.h>
#include <libraries/Oscillator/Oscillator.h>
// Trill object declaration
Trill touchSensor;
// Horizontal and vertical position for Trill sensor
float gTouchPosition[2] = { 0.0 , 0.0 };
// Touch size
float gTouchSize = 0.0;
// Oscillator object declaration
// Range for oscillator frequency mapping
float gFreqRange[2] = { 200.0, 1500.0 };
// One Pole filters objects declaration
OnePole freqFilt, panFilt, ampFilt;
// Default panning values for the sinewave
float gAmpL = 1.0;
float gAmpR = 1.0;
// Sleep time for auxiliary task
unsigned int gTaskSleepTime = 12000; // microseconds
/*
* Function to be run on an auxiliary task that reads data from the Trill sensor.
* Here, a loop is defined so that the task runs recurrently for as long as the
* audio thread is running.
*/
void loop(void*)
{
{
// Read locations from Trill sensor
touchSensor.readI2C();
gTouchSize = touchSensor.compoundTouchSize();
gTouchPosition[0] = touchSensor.compoundTouchHorizontalLocation();
gTouchPosition[1] = touchSensor.compoundTouchLocation();
usleep(gTaskSleepTime);
}
}
bool setup(BelaContext *context, void *userData)
{
// Setup a Trill Square on i2c bus 1, using the default mode and address
if(touchSensor.setup(1, Trill::SQUARE) != 0) {
fprintf(stderr, "Unable to initialise Trill Square\n");
return false;
}
touchSensor.printDetails();
// Set and schedule auxiliary task for reading sensor data from the I2C bus
// Setup low pass filters for smoothing frequency, amplitude and panning
freqFilt.setup(1, context->audioSampleRate); // Cut-off frequency = 1Hz
panFilt.setup(1, context->audioSampleRate); // Cut-off frequency = 1Hz
ampFilt.setup(1, context->audioSampleRate); // Cut-off frequency = 1Hz
// Setup triangle oscillator
osc.setup(context->audioSampleRate, Oscillator::triangle);
return true;
}
void render(BelaContext *context, void *userData)
{
for(unsigned int n = 0; n < context->audioFrames; n++) {
float frequency;
// Map Y-axis to a frequency range
frequency = map(gTouchPosition[1], 0, 1, gFreqRange[0], gFreqRange[1]);
// Smooth frequency using low-pass filter
frequency = freqFilt.process(frequency);
// Smooth panning (given by the X-axis) changes using low-pass filter
float panning = panFilt.process(gTouchPosition[0]);
// Calculate amplitude of left and right channels
gAmpL = 1 - panning;
gAmpR = panning;
// Smooth changes in the amplitude of the oscillator (given by touch
// size) using a low-pass filter
float amplitude = ampFilt.process(gTouchSize);
// Calculate output of the oscillator
float out = amplitude * osc.process(frequency);
// Write oscillator to left and right channels
for(unsigned int channel = 0; channel < context->audioOutChannels; channel++) {
if(channel == 0) {
audioWrite(context, n, channel, gAmpL*out);
} else if (channel == 1) {
audioWrite(context, n, channel, gAmpR*out);
}
}
}
}
void cleanup(BelaContext *context, void *userData)
{}
Main Bela public API.
Definition OnePole.h:12
Definition Oscillator.h:3
A class to use the Trill family of capacitive sensors. http://bela.io/trill.
Definition Trill.h:14
@ SQUARE
Trill Square
Definition Trill.h:35
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