VibroSonics  v1.0.2-mozzi-implementation-364-g1751614
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
13// standard libraries
14#include <complex>
15#include <cstdint>
16
17// internal
18#include "Grain.h"
19#include "Wave.h"
20
21constexpr int WINDOW_SIZE_BY_2 = WINDOW_SIZE >> 1;
22
29constexpr float FREQ_RES = (float)SAMPLE_RATE / (float)WINDOW_SIZE;
30
36constexpr float FREQ_WIDTH = 1.0 / FREQ_RES;
37
39public:
40 // ---- Setup ------------------------------------------------------------------
41
42 void init();
43
44 // --- FFT Input & Storage -----------------------------------------------------
45
46 // we will need more processAudioInput functionality to handle stereo input
47
49 void processAudioInput(float* output);
50
53
55 void dcRemoval();
56
58 void fftWindowing();
59
61 void complexToMagnitude();
62
64 float getMean(float* data, int dataLength);
65
67 float getMean(complex* data, int dataLength);
68
70 void noiseFloor(float* data, float threshold);
71
73 void noiseFloorCFAR(float* data, int numRefs, int numGuards, float bias);
74
75 // --- AudioLab Interactions ---------------------------------------------------
76
78 void assignWave(float freq, float amp, int channel);
79
82 void assignWaves(float* freqs, float* amps, int dataLength, int channel);
83
85 bool isAudioLabReady();
86
87 // --- Wave Manipulation -------------------------------------------------------
88
90 void mapAmplitudes(float* ampData, int dataLength, float minAmpSum = 10000,
91 float smoothFactor = 0.05);
92
95 float mapFrequencyByOctaves(float inFreq, float maxFreq);
96
99 float mapFrequencyMIDI(float inFreq, float minFreq, float maxFreq);
100
101 // --- Grains -----------------------------------------------------------------
102
104 void updateGrains();
105
108 Grain* createGrainArray(int numGrains, uint8_t channel, WaveType waveType);
109
112 Grain* createDynamicGrain(uint8_t channel, WaveType waveType, FreqEnv freqEnv, AmpEnv ampEnv, DurEnv durEnv);
113
115 void triggerGrains(Grain* grains, int numGrains, FreqEnv freqEnv, AmpEnv ampEnv, DurEnv durEnv);
116
118 FreqEnv createFreqEnv(float attackFreq, float decayFreq, float sustainFreq, float releaseFreq);
119
121 AmpEnv createAmpEnv(float attackAmp, float decayAmp, float sustainAmp, float releaseAmp);
122
124 DurEnv createDurEnv(int attackDuration, int decayDuration, int sustainDuration, int releaseDuration, float curve);
125
127 void setGrainFreqEnv(Grain* grains, int numGrains, FreqEnv freqEnv);
128
130 void setGrainAmpEnv(Grain* grains, int numGrains, AmpEnv ampEnv);
131
133 void setGrainDurEnv(Grain* grains, int numGrains, DurEnv durEnv);
134
135private:
136 // Fast Fourier Transform uses complex numbers
137 float vReal[WINDOW_SIZE];
138 float hamming[WINDOW_SIZE];
139 complex vData[WINDOW_SIZE];
140
141 // --- AudioLab Library --------------------------------------------------------
142
143 GrainList grainList;
144};
145
146#endif // VIBROSONICS_API_H
constexpr float FREQ_RES
Frequency range of an FFT bin in Hz.
Definition VibrosonicsAPI.h:29
constexpr float FREQ_WIDTH
Duration of a window, in seconds.
Definition VibrosonicsAPI.h:36
constexpr int WINDOW_SIZE_BY_2
Definition VibrosonicsAPI.h:21
Definition Grain.h:112
Definition Grain.h:248
Definition VibrosonicsAPI.h:38
float getMean(float *data, int dataLength)
Returns the mean of some float data.
Definition VibrosonicsAPI.cpp:84
void processAudioInput(float *output)
Perform fast fourier transform on the AudioLab input buffer.
Definition VibrosonicsAPI.cpp:22
float mapFrequencyMIDI(float inFreq, float minFreq, float maxFreq)
Maps a frequency to the haptic range by quantizing it using MIDI values.
Definition VibrosonicsAPI.cpp:273
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:299
Grain * createDynamicGrain(uint8_t channel, WaveType waveType, FreqEnv freqEnv, AmpEnv ampEnv, DurEnv durEnv)
Creates and returns a single dynamic grain with the specified channel and wave type....
Definition VibrosonicsAPI.cpp:321
void complexToMagnitude()
Computes frequency magnitudes in vReal data.
Definition VibrosonicsAPI.cpp:71
void noiseFloorCFAR(float *data, int numRefs, int numGuards, float bias)
Floors data using the CFAR algorithm.
Definition VibrosonicsAPI.cpp:136
void setGrainDurEnv(Grain *grains, int numGrains, DurEnv durEnv)
Sets the duration envelope paramaters for an array of grains.
Definition VibrosonicsAPI.cpp:444
DurEnv createDurEnv(int attackDuration, int decayDuration, int sustainDuration, int releaseDuration, float curve)
Creates a duration envelope for a grain.
Definition VibrosonicsAPI.cpp:403
void triggerGrains(Grain *grains, int numGrains, FreqEnv freqEnv, AmpEnv ampEnv, DurEnv durEnv)
Updates an array of numPeaks grains sustain and release windows.
Definition VibrosonicsAPI.cpp:352
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:60
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:10
bool isAudioLabReady()
Check if a new audio window has been recorded.
Definition VibrosonicsAPI.cpp:454
void updateGrains()
Updates all grains in the globalGrainList.
Definition VibrosonicsAPI.cpp:337
void noiseFloor(float *data, float threshold)
Floors data that is below a certain threshold.
Definition VibrosonicsAPI.cpp:114
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:372
AmpEnv createAmpEnv(float attackAmp, float decayAmp, float sustainAmp, float releaseAmp)
Creates an amplitude envelope for a grain.
Definition VibrosonicsAPI.cpp:387
void setGrainFreqEnv(Grain *grains, int numGrains, FreqEnv freqEnv)
Sets the frequency envelope parameters for an array of grains.
Definition VibrosonicsAPI.cpp:416
void computeHammingWindow()
Pre compute hamming windows for FFT operations.
Definition VibrosonicsAPI.cpp:48
void dcRemoval()
Perform DC Removal to reduce noise in vReal.
Definition VibrosonicsAPI.cpp:40
float mapFrequencyByOctaves(float inFreq, float maxFreq)
Maps a frequency to the haptic range (0-230Hz) by transposing it down by octaves.
Definition VibrosonicsAPI.cpp:258
void setGrainAmpEnv(Grain *grains, int numGrains, AmpEnv ampEnv)
Sets the amplitude envelope parameters for an array of grains.
Definition VibrosonicsAPI.cpp:430
Definition Grain.h:60
Definition Grain.h:88
Definition Grain.h:38