Some basic header-only C++ classes that can be used for Audio Processing provided as Arduino and cmake C++ Library:
- We provide different "Audio Sources" and "Audio Sinks" (see next section)
- Support for different Encoders and Decoders for MP3, AAC, WAV, FLAC, etc for EncodedAudioStream
- Different Sound Generators (e.g. to generate a sine tone) for GeneratedSoundStream
- Support for Sound Effects with different Effect Implementations (e.g. Boost, Distortion, Echo, Reverb...) for AudioEffectStream
- Different Buffer Implementations for QueueStream
- Different Converters for ConverterStream
- Different Filters for FilteredStream
- Musical Notes (with frequencies of notes)
- A Repeating Timer (e.g. for sampling audio data using exact times) for TimerCallbackAudioStream
- Desktop Integration: Building of Arduino Audio Sketches to be run on Linux, Windows and OS/X
This functionality provides the glue which makes different audio processing components and libraries work together.
We also provide plenty of examples that demonstrate how to implement the different scenarios. The design philosophy is based on the Arduino conventions: we use the begin()
and end()
methods to start and stop the processing and we propagate the use of Streams. We all know the Arduino Streams: We usually use them to write out print messages and sometimes we use them to read the output from Serial devices. The same thing applies to “Audio Streams”: You can read audio data from “Audio Sources” and you write them to “Audio Sinks”.
As “Audio Sources” we will have e.g.:
- Digital Microphones – I2SStream
- Analog Microphones – AnalogAudioStream
- Files on the Internet – URLStream
- Streaming Internet Radios - ICYStream
- Generated Sound – GeneratedSoundStream
- Encoded Audio - EncodedAudioStream
- Mobile Phone A2DP Bluetooth – A2DPStream
- Binary Data in Flash Memory – MemoryStream
- Audio generated by STK Framwork - STKStream
- Desktop Integration - PortAudioStream MiniAudioStream StdioStream
- A Timer based Source - TimerCallbackAudioStream
- ESP32 Lyrat/AudioKit - AudioKitStream
- Input using FIR, IIR Filters - FilteredStream
- Tensorflow Lite - TfLiteAudioStream
- Converting Streams
- Communication - ESPNowStream, UDPStream
- Any other Arduino Classes implementing Streams: SD, Ethernet etc
As “Audio Sinks” we will have e.g:
- external DAC – I2SStream
- Analog output e.g. to an Amplifier – AnalogAudioStream
- Output using PWM – PWMAudioOutput
- Output to SPDIF/TOSLINK - SPDIFOutput
- Encoded Audio - EncodedAudioStream
- Bluetooth Speakers – A2DPStream
- Serial to display the data as CSV – CsvOutput
- Serial to display the data as hex dump - HexDumpOutput
- Encoding and Decoding of Audio EncodedAudioStream
- Desktop Integration - PortAudioStream MiniAudioStream StdioStream
- ID3 Metadata for MP3 - MetaDataID3
- A Timer based Sink - TimerCallbackAudioStream
- ESP32 Lyrat/AudioKit - AudioKitStream
- VS1053 Codec Module - VS1053Stream
- Callback integration e.g. with ESP8266Audio AudioOutputWithCallback
- Output using FIR, IRR Filters - FilteredStream
- Determine the Volume - VolumeOutput
- Split the Output to different Destinations - MultiOutput
- 3 Band Equilizer - Equilizer3Bands
- LED Strip/Matrix - LEDOutput, LEDOutputUnoR4
- FFT - AudioRealFFT, AudioKissFFT and others
- Tensorflow Lite - TfLiteAudioStream
- Converting Streams
- Communication - ESPNowStream, UDPStream
- Multiuser-Webserver for PCM Output - AudioWAVServerEx
- Any other Arduino Classes implementing Streams: SD, Ethernet etc
Here is an simple example which streams a file from the Flash Memory and writes it to I2S:
#include "AudioTools.h"
#include "StarWars30.h"
uint8_t channels = 2;
uint16_t sample_rate = 22050;
MemoryStream music(StarWars30_raw, StarWars30_raw_len);
I2SStream i2s; // Output to I2S
StreamCopy copier(i2s, music); // copies sound into i2s
void setup(){
Serial.begin(115200);
auto config = i2s.defaultConfig(TX_MODE);
config.sample_rate = sample_rate;
config.channels = channels;
config.bits_per_sample = 16;
i2s.begin(config);
}
void loop(){
copier.copy();
}
Each stream has it's own configuration object that should be passed to the begin method. The defaultConfig() method is providing a default proposal which will usually "just work". Please consult the class documentation for the available configuration parameters. You can also easily adapt any provided examples: If you e.g. replace the I2SStream with the AnalogAudioStream class, you will get analog instead of digital output.
I suggest you continue to read the more detailed introduction.
Further examples can be found in the Wiki.
Dependent on the example you might need to install some addional libaries
The library also provides a versatile AudioPlayer. Further information can be found in the Wiki
The application uses a built in logger (see AudioLogger.h and AudioConfig.h). You can e.g. deactivate the logging by changing USE_AUDIO_LOGGING to false in the AudioConfig.h:
#define USE_AUDIO_LOGGING false
#define LOG_LEVEL AudioLogger::Warning
#define LOG_STREAM Serial
Per default we use the log level warning and the logging output is going to Serial. You can also change this in your sketch by calling AudioLogger begin with the output stream and the log level e.g:
AudioLogger::instance().begin(Serial, AudioLogger::Debug);
Get some inspiration from projects that were using this library or share your projects with the community.
Please use this before you raise any issue or start a discussion!
- Read the Tutorial in the Wiki
- Check the Class Documentation by Topic.
- Find your class in All Classes Alphabetically
- You also might find further information in one of my Blogs
I spent a lot of time to provide a comprehensive and complete documentation. So please read the documentation first and check the issues and discussions before posting any new ones on Github.
Open issues only for bugs and if it is not a bug, use a discussion: Provide enough information about
- the selected scenario/sketch
- what exactly you are trying to do
- your hardware
- your software version (from the Boards Manager) and library versions
- what exactly your problem is
to enable others to understand and reproduce your issue.
Finally, don't send me any e-mails or post questions on my personal website!
Please note that discussions and issues which have already been answered before or where the answer can be found in the documentation may get deleted w/o reply.
You can download the library as zip and call include Library -> zip library. Or you can git clone this project into the Arduino libraries folder e.g. with
cd ~/Documents/Arduino/libraries
git clone https://github.com/pschatzmann/arduino-audio-tools.git
I recommend to use git because you can easily update to the latest version just by executing the git pull
command in the project folder.
If you want to use the library in PlatformIO, you can find a detailed description in the Wiki.
This software is totally free, but you can make me happy by rewarding me with a treat