VibroSonics  v1.0.2-mozzi-implementation-309-gf5440e1
Arduino Library for Translating Audio into Vibrations
Loading...
Searching...
No Matches
VibrosonicsAPI.h
Go to the documentation of this file.
1#ifndef VIBROSONICS_API_H
2#define VIBROSONICS_API_H
3
4// standard library includes
5#include <cmath>
6
7// external dependencies
8#include <Arduino.h>
9#include <AudioLab.h>
10#include <AudioPrism.h>
11#include <Fast4ier.h>
12#include <complex>
13#include <cstdint>
14
15// internal
16#include "Grain.h"
17#include "Wave.h"
18
19constexpr int WINDOW_SIZE_BY_2 = WINDOW_SIZE >> 1;
20
27constexpr float FREQ_RES = float(SAMPLE_RATE) / WINDOW_SIZE;
28
34constexpr float FREQ_WIDTH = 1.0 / FREQ_RES;
35
37const int NUM_WINDOWS = 8;
38
40public:
41 // ---- Setup ------------------------------------------------------------------
42
43 void init();
44
45 // --- FFT Input & Storage -----------------------------------------------------
46
47 // we will need more processAudioInput functionality to handle stereo input
48
50 void processAudioInput(float output[]);
51
54
56 void dcRemoval();
57
59 void fftWindowing();
60
62 void complexToMagnitude();
63
65 void noiseFloor(float data[], int dataLength, float threshold);
66
68 void noiseFloorCFAR(float data[], int dataLength, int numRefs,
69 int numGuards, float bias);
70
71 // --- AudioLab Interactions ---------------------------------------------------
72
74 void assignWave(float freq, float amp, int channel);
75
78 void assignWaves(float* freqs, float* amps, int dataLength, int channel);
79
80 // --- Wave Manipulation -------------------------------------------------------
81
83 float getMean(float* data, int dataLength);
84
86 float getMean(complex* data, int dataLength);
87
89 void mapAmplitudes(float* ampData, int dataLength,
90 float minAmpSum = 10000, float smoothFactor = 0.05);
91
94 void mapFrequenciesLinear(float* freqData, int dataLength);
95
98 void mapFrequenciesExponential(float* freqData, int dataLength, float exp);
99
100 // --- Grains -----------------------------------------------------------------
101
103 void updateGrains();
104
107 Grain* createGrainArray(int numGrains, uint8_t channel, WaveType waveType);
108
111 Grain* createDynamicGrain(uint8_t channel, WaveType waveType, FreqEnv freqEnv, AmpEnv ampEnv);
112
114 void triggerGrains(Grain* grains, int numGrains, FreqEnv freqEnv, AmpEnv ampEnv);
115
117 FreqEnv createFreqEnv(float attackFreq, float decayFreq, float sustainFreq, float releaseFreq);
118
120 AmpEnv createAmpEnv(float attackAmp, int attackDuration, float decayAmp, int decayDuration, float sustainAmp, int sustainDuration, float releaseAmp, int releaseDuration, float curve);
121
123 void setGrainFreqEnv(Grain* grains, int numGrains, FreqEnv freqEnv);
124
126 void setGrainAmpEnv(Grain* grains, int numGrains, AmpEnv ampEnv);
127private:
128 // Fast Fourier Transform uses complex numbers
129 float vReal[WINDOW_SIZE];
130 float hamming[WINDOW_SIZE];
131 complex vData[WINDOW_SIZE];
132
133 // --- AudioLab Library --------------------------------------------------------
134
136 int* audioLabInputBuffer = AudioLab.getInputBuffer();
137
138 GrainList grainList;
139};
140
141#endif // VIBROSONICS_API_H
constexpr float FREQ_RES
Frequency range of an FFT bin in Hz.
Definition VibrosonicsAPI.h:27
const int NUM_WINDOWS
Number of previous windows to be stored and used by modules.
Definition VibrosonicsAPI.h:37
constexpr float FREQ_WIDTH
Duration of a window, in seconds.
Definition VibrosonicsAPI.h:34
constexpr int WINDOW_SIZE_BY_2
Definition VibrosonicsAPI.h:19
Definition Grain.h:98
Definition Grain.h:228
Definition VibrosonicsAPI.h:39
float getMean(float *data, int dataLength)
Returns the mean of some float data.
Definition VibrosonicsAPI.cpp:87
AmpEnv createAmpEnv(float attackAmp, int attackDuration, float decayAmp, int decayDuration, float sustainAmp, int sustainDuration, float releaseAmp, int releaseDuration, float curve)
Creates an amplitude envelope for a grain.
Definition VibrosonicsAPI.cpp:412
Grain * createDynamicGrain(uint8_t channel, WaveType waveType, FreqEnv freqEnv, AmpEnv ampEnv)
Creates and returns a single dynamic grain with the specified channel and wave type....
Definition VibrosonicsAPI.cpp:344
void mapFrequenciesLinear(float *freqData, int dataLength)
linearly maps input frequencies from (0 - (1/2)*SAMPLE_RATE) Hz to (0 - 250) Hz, the haptic range.
Definition VibrosonicsAPI.cpp:275
Grain * createGrainArray(int numGrains, uint8_t channel, WaveType waveType)
Creates and returns a static array of grains on desired chanel with specified wave type.
Definition VibrosonicsAPI.cpp:323
void complexToMagnitude()
Computes frequency magnitudes in vReal data.
Definition VibrosonicsAPI.cpp:74
void noiseFloor(float data[], int dataLength, float threshold)
Floors data that is below a certain threshold.
Definition VibrosonicsAPI.cpp:117
void mapAmplitudes(float *ampData, int dataLength, float minAmpSum=10000, float smoothFactor=0.05)
Maps amplitudes in some data to between 0.0-1.0 range.
Definition VibrosonicsAPI.cpp:189
void fftWindowing()
Applies windowing function to vReal data.
Definition VibrosonicsAPI.cpp:63
void assignWaves(float *freqs, float *amps, int dataLength, int channel)
Add waves to a channel from the values in the frequency and amplitude arrays.
Definition VibrosonicsAPI.cpp:249
void init()
Definition VibrosonicsAPI.cpp:9
void triggerGrains(Grain *grains, int numGrains, FreqEnv freqEnv, AmpEnv ampEnv)
Updates an array of numPeaks grains sustain and release windows.
Definition VibrosonicsAPI.cpp:373
void mapFrequenciesExponential(float *freqData, int dataLength, float exp)
Exponentially maps input frequencies from (0 - (1/2)*SAMPLE_RATE) Hz to (0 - 250) Hz,...
Definition VibrosonicsAPI.cpp:303
void updateGrains()
Updates all grains in the globalGrainList.
Definition VibrosonicsAPI.cpp:359
void noiseFloorCFAR(float data[], int dataLength, int numRefs, int numGuards, float bias)
Floors data using the CFAR algorithm.
Definition VibrosonicsAPI.cpp:136
void assignWave(float freq, float amp, int channel)
Add a wave to a channel with specified frequency and amplitude.
Definition VibrosonicsAPI.cpp:233
FreqEnv createFreqEnv(float attackFreq, float decayFreq, float sustainFreq, float releaseFreq)
Creates a frequency envelope for a grain.
Definition VibrosonicsAPI.cpp:392
void processAudioInput(float output[])
Perform fast fourier transform on the AudioLab input buffer.
Definition VibrosonicsAPI.cpp:21
void setGrainFreqEnv(Grain *grains, int numGrains, FreqEnv freqEnv)
Sets the frequency envelope parameters for an array of grains.
Definition VibrosonicsAPI.cpp:425
void computeHammingWindow()
Pre compute hamming windows for FFT operations.
Definition VibrosonicsAPI.cpp:51
void dcRemoval()
Perform DC Removal to reduce noise in vReal.
Definition VibrosonicsAPI.cpp:43
void setGrainAmpEnv(Grain *grains, int numGrains, AmpEnv ampEnv)
Sets the amplitude envelope parameters for an array of grains.
Definition VibrosonicsAPI.cpp:439
Definition Grain.h:70
Definition Grain.h:38