|
arduino-audio-tools
|
RTTTL (Ring Tone Text Transfer Language) parser and player stream. More...
#include <RTTTLOutput.h>
Public Member Functions | |
| RTTTLOutput ()=default | |
| RTTTLOutput (SoundGenerator< T > &generator) | |
| RTTTLOutput (SoundGenerator< T > &generator, AudioOutput &out) | |
| RTTTLOutput (SoundGenerator< T > &generator, AudioStream &out) | |
| RTTTLOutput (SoundGenerator< T > &generator, Print &out) | |
| virtual void | addNotifyAudioChange (AudioInfoSupport &bi) |
| Adds target to be notified about audio changes. | |
| virtual AudioInfo | audioInfo () override |
| provides the actual input AudioInfo | |
| virtual AudioInfo | audioInfoOut () |
| virtual int | availableForWrite () override |
| virtual bool | begin () |
| bool | begin () override |
| Start the RTTTL stream: we start with parsing the title and defaults. | |
| virtual bool | begin (AudioInfo info) |
| virtual void | clearNotifyAudioChange () |
| Deletes all change notify subscriptions. | |
| virtual void | end () |
| virtual void | flush () |
| int | getDefaultBpm () const |
| int | getDefaultDuration () const |
| int | getDefaultOctave () const |
| const char * | getTitle () |
| virtual bool | isDeletable () |
| If true we need to release the related memory in the destructor. | |
| bool | isNotifyActive () |
| Checks if the automatic AudioInfo update is active. | |
| virtual | operator bool () |
| virtual bool | removeNotifyAudioChange (AudioInfoSupport &bi) |
| Removes a target in order not to be notified about audio changes. | |
| virtual void | setAudioInfo (AudioInfo newInfo) override |
| Defines the input AudioInfo. | |
| void | setGenerator (SoundGenerator< T > &generator) |
| void | setNoteCallback (std::function< void(float freqHz, int durationMs, int midiNote, void *ref)> cb) |
| void | setNotifyActive (bool flag) |
| Deactivate/Reactivate automatic AudioInfo updates: (default is active) | |
| void | setOutput (AudioOutput &out) |
| void | setOutput (AudioStream &out) |
| void | setOutput (Print &out) |
| Defines/Changes the output target (Print) | |
| void | setRamp (uint8_t upPercent=20, uint8_t downPercent=30) |
| Defines the ramp up and down percentages for note playback (default: 20% up, 30% down) | |
| void | setReference (void *ref) |
| Provide reference for callback. | |
| void | setTransposeOctaves (int8_t octaves) |
| size_t | write (const uint8_t *data, size_t len) override |
| Writes RTTTL data to the parser and plays the notes. | |
| virtual size_t | write (uint8_t ch) override |
| virtual void | writeSilence (size_t len) |
Protected Member Functions | |
| int | find_byte (const uint8_t *haystack, size_t haystack_len, uint8_t needle) |
| char | next_char (bool convertToLower=true) |
| void | notifyAudioChange (AudioInfo info) |
| void | parse_defaults () |
| void | parse_notes () |
| int | parse_num () |
| void | parse_title () |
| void | play_note (float freq, int msec, int midi=-1) |
| float | transpose (float frequency, int8_t octaves) |
Protected Attributes | |
| int | _timeout = 10 |
| AudioInfo | cfg |
| bool | is_active = false |
| bool | is_notify_active = true |
| bool | is_start = true |
| char | m_actual = 0 |
| int | m_bpm = 120 |
| int | m_duration = 4 |
| float | m_msec_semi = 750 |
| MusicalNotes | m_notes |
| int | m_octave = 4 |
| char | m_prec = 0 |
| uint8_t | m_ramp_downPercent = 30 |
| uint8_t | m_ramp_upPercent = 20 |
| Str | m_title {40} |
| int8_t | m_tranpose_octaves = 0 |
| std::function< void(float, int, int, void *)> | noteCallback |
| Vector< AudioInfoSupport * > | notify_vector |
| SoundGenerator< T > * | p_generator = nullptr |
| Print * | p_print = nullptr |
| void * | reference = nullptr |
| RingBuffer< uint8_t > | ring_buffer {0} |
| SingleBuffer< uint8_t > | tmp {MAX_SINGLE_CHARS} |
| int | tmpPos = 0 |
RTTTL (Ring Tone Text Transfer Language) parser and player stream.
RTTTLOutput<T> parses RTTTL text provided via its write() method and generates audio by driving a provided SoundGenerator<T>. It writes the generated PCM bytes to a Print-compatible output (typically an AudioStream or AudioOutput that implements Print).
Template parameter T
int16_t).Usage:
setOutput(...) overload to attach an AudioStream, AudioOutput or raw Print target.begin() to reset internal parse state (typically called by the surrounding audio pipeline when starting a stream).write(const uint8_t* data, size_t len). RTTTLOutput will buffer the incoming bytes and parse the title, defaults and notes. Notes are rendered immediately via play_note().RTTTL semantics implemented:
ms_per_whole = 240000.0 / bpm (i.e. 60s * 4 * 1000 ms / bpm). The duration field in RTTTL (1,2,4,8,16,...) divides the whole-note length.Important implementation notes / expectations:
play_note() to generate PCM frames.Print (or derived) pointer; attaching an AudioStream or AudioOutput via setOutput will register for audio format notifications and forward generated bytes to that target.b=0 is parsed, the implementation falls back to a fixed m_msec_semi = 750.0 (legacy/fallback behavior). Consider validating or rejecting b=0 RTTTL if that is undesired.Edge cases & behavior:
write() appends to an internal ring buffer and parsing continues as bytes arrive. The parser expects the standard RTTTL format: "name:defaults:notes" and will parse title and defaults on first write() after begin().Example RTTTL string: "Entertainer:d=4,o=5,b=120:8d6,8d6,8d6"
Public API (selected):
Note callback details:
setNoteCallback(cb) to register a callback that will be invoked for every parsed note or rest. The callback signature is void(float frequencyHz, int durationMs, int midiNote).play_note() before audio generation begins. If you require the callback after playback, you should wrap setNoteCallback and buffer events or change ordering.MusicalNotes helper doesn't expose a toMidi(...) helper, the midiNote may be computed using the standard formula: midi = 12*(octave + 1) + semitoneIndex where semitoneIndex is the note's index within the 12 semitones (C=0, C#=1, ..., B=11).Known limitations:
|
default |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinevirtualinherited |
Adds target to be notified about audio changes.
Reimplemented in CodecNOP, EncodedAudioOutput, EncodedAudioStream, AACDecoderFDK, DecoderBasic, CodecChain, MP3DecoderHelix, MP3DecoderMAD, OggContainerDecoder, RTSPClient< TcpClient, UdpSocket >, Pipeline, and Pipeline::ModifyingStreamAdapter.
provides the actual input AudioInfo
Implements AudioInfoSupport.
Reimplemented in AdapterPrintToAudioOutput, EncodedAudioOutput, and AdapterAudioStreamToAudioOutput.
provides the actual output AudioInfo: this is usually the same as audioInfo() unless we use a transforming stream
Reimplemented in PureDataStream, PWMAudioOutput, ChannelFormatConverterStreamT< T >, ChannelFormatConverterStream, NumberFormatConverterStreamT< TFrom, TTo >, NumberFormatConverterStream, FormatConverterStream, Pipeline, ResampleStream, and ResampleStreamT< TInterpolator >.
Reimplemented from Print.
Reimplemented in AudioESP32ULP, RTSPOutput< Platform >, EncodedAudioOutput, AudioServerEx, AudioSyncWriter, AdapterAudioStreamToAudioOutput, CsvOutput< T >, MemoryOutput, and PWMAudioOutput.
Reimplemented from AudioOutput.
Start the RTTTL stream: we start with parsing the title and defaults.
Reimplemented from AudioOutput.
Reimplemented from AudioOutput.
Deletes all change notify subscriptions.
Reimplemented in RTSPClient< TcpClient, UdpSocket >.
Reimplemented from Print.
Reimplemented in MultiOutput, and HexDumpOutput.
Returns the default bpm parsed from the RTTTL string
Returns the default duration parsed from the RTTTL string
Returns the default octave parsed from the RTTTL string
Returns the parsed title of the RTTTL ringtone
If true we need to release the related memory in the destructor.
Reimplemented in AdapterPrintToAudioOutput, and AdapterAudioStreamToAudioOutput.
Reimplemented in RTSPOutput< Platform >, EncodedAudioOutput, and AdapterAudioStreamToAudioOutput.
|
inlinevirtualinherited |
Removes a target in order not to be notified about audio changes.
Reimplemented in RTSPClient< TcpClient, UdpSocket >.
Defines the input AudioInfo.
Implements AudioInfoSupport.
Reimplemented in ChannelsSelectOutput, AdapterPrintToAudioOutput, MultiOutput, AdapterAudioStreamToAudioOutput, CsvOutput< T >, PWMAudioOutput, and EncodedAudioOutput.
|
inline |
Defines the Generator that is used to generate the sound
|
inline |
Set an optional callback to be invoked for each parsed note/rest. Callback signature: void(float frequencyHz, int durationMs, int midiNote)
Deactivate/Reactivate automatic AudioInfo updates: (default is active)
|
inline |
Defines/Changes the output target (AudioOutput) and register for audio info
|
inline |
Defines/Changes the output target (AudioStream) and register for audio info
Defines/Changes the output target (Print)
Defines the ramp up and down percentages for note playback (default: 20% up, 30% down)
transpose all notes by the specified number of octaves e.g. -2 = 2 octaves down
Writes RTTTL data to the parser and plays the notes.
Implements AudioOutput.
Reimplemented in MetaDataOutput, and MultiOutput.
Writes n 0 values (= silence)
| len |
|
protectedinherited |
|
protectedinherited |
|
protected |
|
protectedinherited |
|
protected |
|
protected |
|
protectedinherited |
|
protectedinherited |