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.
93 lines
4.0 KiB
93 lines
4.0 KiB
|
|
/*
|
|
AudioEffectMine
|
|
|
|
Created: Chip Audette, December 2016
|
|
Purpose; Here is the skeleton of a audio processing algorithm that will
|
|
(hopefully) make it easier for people to start making their own
|
|
algorithm.
|
|
|
|
This processes a single stream fo audio data (ie, it is mono)
|
|
|
|
MIT License. use at your own risk.
|
|
*/
|
|
|
|
#include <arm_math.h> //ARM DSP extensions. https://www.keil.com/pack/doc/CMSIS/DSP/html/index.html
|
|
#include <AudioStream_F32.h>
|
|
|
|
class AudioEffectMine_F32 : public AudioStream_F32
|
|
{
|
|
public:
|
|
//constructor
|
|
AudioEffectMine_F32(void) : AudioStream_F32(1, inputQueueArray_f32) {
|
|
//do any setup activities here
|
|
};
|
|
|
|
//here's the method that is called automatically by the Teensy Audio Library
|
|
void update(void) {
|
|
//Serial.println("AudioEffectMine_F32: doing update()"); //for debugging.
|
|
audio_block_f32_t *audio_block;
|
|
audio_block = AudioStream_F32::receiveWritable_f32();
|
|
if (!audio_block) return;
|
|
|
|
//do your work
|
|
applyMyAlgorithm(audio_block);
|
|
|
|
///transmit the block and release memory
|
|
AudioStream_F32::transmit(audio_block);
|
|
AudioStream_F32::release(audio_block);
|
|
}
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
|
|
// Here is where you can add your algorithm.
|
|
// This function gets called block-wise...which is usually hard-coded to every 128 samples
|
|
void applyMyAlgorithm(audio_block_f32_t *audio_block) {
|
|
|
|
//Add whatever you'd like here. I'm going to show a couple of examples below.
|
|
//you can delete all of these examples. They're just to illustrate.
|
|
//More examples of fast (DSP accelerated) operations are at: https://github.com/chipaudette/OpenAudio/blob/master/Docs/Programming%20Algorithms/Using%20DSP%20Exentions.md
|
|
|
|
// //apply a fixed gain...the whole block is processed with this one command
|
|
//float32_t gain = 2.0; %here's 6 dB of gain
|
|
//arm_scale_f32(audio_block->data, gain, audio_block->data, audio_block->length); //uses ARM DSP for speed!
|
|
|
|
// //compute the power of each sample...the whole block is processed with this one command
|
|
// audio_block_f32_t *audio_pow_block = AudioStream_F32::allocate_f32();
|
|
// arm_mult_f32(audio_block->data, audio_block->data, audio_pow_block->data, audio_block->length);
|
|
|
|
// //loop over each sample and do something on a point-by-point basis (when it cannot be done as a block)
|
|
//for (int i=0; i < audio_block->length; i++) {
|
|
// //as a boring example, let's add the user_parameter value to every sample. yes, this
|
|
// //addition operation could have been done with a DSP-accelerated function, but I'm
|
|
// //simply trying to illustrate how to loop on your audio samples.
|
|
// audio_block->data[i] = audio_block->data[i] + user_parameter;
|
|
//}
|
|
|
|
// //clean up...if you allocated any memory in the lines above
|
|
//Audiostream_F32::release(audio_pow_block);
|
|
|
|
// return your processed audio by putting it back into audio_block->data
|
|
|
|
} //end of applyMyAlgorithms
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
// Call this method in your main program if you want to set the value of your user parameter.
|
|
// The user parameter can be used in your algorithm above. The user_parameter variable was
|
|
// created in the "private:" section of this class, which appears a little later in this file.
|
|
// Feel free to create more user parameters (and to use better names for your variables)
|
|
// for use in this class.
|
|
float32_t setUserParameter(float val) {
|
|
return user_parameter = val;
|
|
}
|
|
|
|
private:
|
|
//state-related variables
|
|
audio_block_f32_t *inputQueueArray_f32[1]; //memory pointer for the input to this module
|
|
|
|
//this value can be set from the outside (such as from the potentiometer) to control
|
|
//a parameter within your algorithm
|
|
float32_t user_parameter = 0.0;
|
|
|
|
}; //end class definition for AudioEffectMine_F32
|
|
|
|
|