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.
 
 
BALibrary/inc/Tuner.h

124 lines
4.2 KiB

/*
* Company: Blackaddr Audio
* Effect Name: Tuner
* Description: A basic chromatic tuner with silent-tuning option. Best used alone in a dedicated tuner preset for quick access.
*
* This file was auto-generated by Aviate Audio Effect Creator for the Multiverse.
*/
#pragma once
#include <Audio.h>
#include <arm_math.h>
#include "Aviate/AudioEffectWrapper.h"
//!s - START_USER_INCLUDES - put your #includes below this line before the matching END
//!e - END_USER_INCLUDES
namespace BlackaddrAudio_Tuner {
//!s - START_USER_EFFECT_TYPES - put your effect types below this line before the matching END
//!e - END_USER_EFFECT_TYPES
class Tuner : public AudioStream, public Aviate::AudioEffectWrapper {
public:
static constexpr unsigned NUM_INPUTS = 1;
static constexpr unsigned NUM_OUTPUTS = 1;
// List of effect control names
enum {
Bypass_e = 0,
Volume_e = 1,
TunerSilent_e = 2,
TunerCents_e = 3,
TunerNote_e = 4,
NUM_CONTROLS
};
//!s - START_USER_CLASS_TYPES - put your custom class types below this line before the matching END
//!e - END_USER_CLASS_TYPES
Tuner();
//!s - START_USER_CONSTRUCTORS - put your custom constructors below this line before the matching END
//!e - END_USER_CONSTRUCTORS
virtual ~Tuner();
// Standard EFX interface functions - do not change these declaration
virtual void update(); // main audio processing loop function
void mapMidiControl(int parameter, int midiCC, int midiChannel = 0) override;
void processMidi(int channel, int midiCC, int value) override;
void setParam(int paramIndex, float paramValue) override;
float getUserParamValue(int paramIndex, float normalizedParamValue);
const char* getName() override;
const uint8_t* getRblk() override;
// control value set functions, must take floats between 0.0f and 1.0f - do not change these declarations
void volume(float value) override;
void tunersilent(float value);
void tunercents(float value);
void tunernote(float value);
//!s - START_USER_PUBLIC_MEMBERS - put your public members below this line before the matching END
void bypass(bool byp) override;
//!e - END_USER_PUBLIC_MEMBERS
private:
audio_block_t *m_inputQueueArray[1]; // required by AudioStream base class, array size is num inputs
int m_midiConfig[NUM_CONTROLS][2]; // stores the midi parameter mapping
// m_bypass and m_volume are already provided by the base class AudioEffectWrapper
float m_tunersilent = 0.0f;
float m_tunercents = 0.0f;
float m_tunernote = 0.0f;
audio_block_t* m_basicInputCheck(audio_block_t* inputAudioBlock, unsigned outputChannel);
//!s - START_USER_PRIVATE_MEMBERS - put your private members below this line before the matching END
// Tuner
// code excerpts from Teensy Audio Library analyze_notefreq.*
static constexpr unsigned AUDIO_GUITARTUNER_BLOCKS = 24;
uint64_t running_sum;
uint16_t tau_global;
uint64_t yin_buffer[5];
uint64_t rs_buffer[5];
int16_t AudioBuffer[AUDIO_GUITARTUNER_BLOCKS*128] __attribute__ ( ( aligned ( 4 ) ) );
uint8_t yin_idx, state;
float periodicity, yin_threshold, cpu_usage_max, data;
bool next_buffer, first_run;
volatile bool new_output = false, process_buffer;
audio_block_t *blocklist1[AUDIO_GUITARTUNER_BLOCKS];
audio_block_t *blocklist2[AUDIO_GUITARTUNER_BLOCKS];
bool m_initialized = false;
bool m_tunerEnabled = false;
bool m_silentEnabled = false;
unsigned m_skipUpdateCount = 0;
bool m_signalDetect = false;
float m_dcValueSum = 0.0f;
float m_dcValue = 0.0f;
unsigned m_dcValueCount = 0;
bool m_calibrateEnabled = false;
bool m_startupInProgress = true;
static constexpr float m_ALPHA = 0.95f;
static constexpr float m_ONE_MINUS_ALPHA = 1.0f - m_ALPHA;
float m_centsFiltered = 0.0f;
//SysPlatform::ElapsedMillis m_timer;
bool available( void );
float probability( void );
float read( void );
uint16_t estimate( uint64_t *yin, uint64_t *rs, uint16_t head, uint16_t tau );
void process( void );
void tunerReset();
void init( float thresholdIn );
static void copy_buffer(void *destination, const void *source);
//!e - END_USER_PRIVATE_MEMBERS
};
}