Backbone - Singer Tone
 
Loading...
Searching...
No Matches
Backbone::SingerToneTracker Class Reference

Real-time pitch tracker. Splits input into low/high bands, performs coarse-to-fine pitch detection, and emits records at a target rate. More...

Classes

struct  PitchRecord
 Immutable pitch record. More...
 

Public Member Functions

delegate void PitchDetectedHandler (SingerToneTracker sender, PitchRecord pitchRecord)
 Raised when a pitch record is produced.
 
 SingerToneTracker ()
 Initializes a new tracker. Call SampleRate setter to configure.
 
 Setup ()
 
 if (!m_recordPitchRecords) m_pitchRecords.Clear()
 
 if (value > 0 &&m_pitchRecords.Capacity !=value) m_pitchRecords.Capacity
 
void Reset ()
 Resets internal state and clears filters, buffers, and history. Call this when sample positions are non-consecutive.
 
void ProcessBuffer (float[] inBuffer, int sampleCount=0)
 Processes an input buffer. Emits zero or more PitchDetected events depending on how many detection windows fit between cached and new samples.
 

Public Attributes

event PitchDetectedHandler PitchDetected
 
double SampleRate
 Sample rate in Hz. Reconfigures internal filters and buffers when set.
 
int PitchRecordsPerSecond
 Target number of pitch records per second. Clamped to [1, 100].
 
 set { m_pitchRecordsPerSecond = Math.Max(1, Math.Min(100, value))
 
bool RecordPitchRecords
 Enables or disables history recording. Disabling clears previous records.
 
 m_recordPitchRecords = value
 
int PitchRecordHistorySize
 Maximum number of records to keep in history. 0 means unbounded (not recommended in realtime).
 
IList PitchRecords => m_pitchRecords.AsReadOnly()
 Read-only view of recorded pitch records.
 
PitchRecord CurrentPitchRecord => m_curPitchRecord
 Latest pitch record produced by the tracker.
 
long CurrentPitchSamplePosition => m_curPitchSamplePos
 Absolute sample position of the current detection window start.
 
int DetectSampleOffset => (m_pitchBufSize + m_detectOverlapSamples) / 2
 Estimated latency in samples between input and reported pitch.
 

Static Public Attributes

static float MinDetectFrequency => kMinFreq
 Minimum detectable frequency in Hz.
 
static float MaxDetectFrequency => kMaxFreq
 Maximum detectable frequency in Hz.
 
static double FrequencyStep => Math.Pow(2.0, 1.0 / kOctaveSteps)
 Frequency ratio between adjacent coarse steps (2^(1/96)).
 

Private Member Functions

void Setup ()
 Configures filters, buffers, and timing based on current parameters.
 
void AddPitchRecord (float pitch)
 Adds one pitch record to history and fires the event.
 

Private Attributes

const int kOctaveSteps = 96
 
const int kStepOverlap = 4
 
const float kMinFreq = 50.0f
 
const float kMaxFreq = 1600.0f
 
const int kStartCircular = 40
 
const float kDetectOverlapSec = 0.005f
 
const float kMaxOctaveSecRate = 10.0f
 
const float kAvgOffset = 0.005f
 
const int kAvgCount = 1
 
const float kCircularBufSaveTime = 1.0f
 
SingerToneDSP m_dsp
 
CircularBuffer< float > m_circularBufferLo
 
CircularBuffer< float > m_circularBufferHi
 
double m_sampleRate
 
float m_detectLevelThreshold = 0.01f
 
int m_pitchRecordsPerSecond = 50
 
float[] m_pitchBufLo
 
float[] m_pitchBufHi
 
int m_pitchBufSize
 
int m_samplesPerPitchBlock
 
int m_curPitchIndex
 
long m_curPitchSamplePos
 
int m_detectOverlapSamples
 
float m_maxOverlapDiff
 
bool m_recordPitchRecords
 
int m_pitchRecordHistorySize
 
readonly List< PitchRecordm_pitchRecords = new List<PitchRecord>()
 
PitchRecord m_curPitchRecord = new PitchRecord()
 
IIRFilter m_iirFilterLoLo
 
IIRFilter m_iirFilterLoHi
 
IIRFilter m_iirFilterHiLo
 
IIRFilter m_iirFilterHiHi
 

Detailed Description

Real-time pitch tracker. Splits input into low/high bands, performs coarse-to-fine pitch detection, and emits records at a target rate.

Constructor & Destructor Documentation

◆ SingerToneTracker()

Backbone::SingerToneTracker::SingerToneTracker ( )

Initializes a new tracker. Call SampleRate setter to configure.

Member Function Documentation

◆ AddPitchRecord()

void Backbone::SingerToneTracker::AddPitchRecord ( float pitch)
private

Adds one pitch record to history and fires the event.

◆ if() [1/2]

Backbone::SingerToneTracker::if ( ! m_recordPitchRecords)

◆ if() [2/2]

Backbone::SingerToneTracker::if ( value ,
0 &&m_pitchRecords.Capacity ! = value )

◆ PitchDetectedHandler()

delegate void Backbone::SingerToneTracker::PitchDetectedHandler ( SingerToneTracker sender,
PitchRecord pitchRecord )

Raised when a pitch record is produced.

◆ ProcessBuffer()

void Backbone::SingerToneTracker::ProcessBuffer ( float[] inBuffer,
int sampleCount = 0 )

Processes an input buffer. Emits zero or more PitchDetected events depending on how many detection windows fit between cached and new samples.

Parameters
inBufferMono float PCM samples in [-1, 1].
sampleCountNumber of samples to process. 0 uses the full buffer length.

◆ Reset()

void Backbone::SingerToneTracker::Reset ( )

Resets internal state and clears filters, buffers, and history. Call this when sample positions are non-consecutive.

◆ Setup() [1/2]

Backbone::SingerToneTracker::Setup ( )

◆ Setup() [2/2]

void Backbone::SingerToneTracker::Setup ( )
private

Configures filters, buffers, and timing based on current parameters.

Member Data Documentation

◆ CurrentPitchRecord

PitchRecord Backbone::SingerToneTracker::CurrentPitchRecord => m_curPitchRecord

Latest pitch record produced by the tracker.

◆ CurrentPitchSamplePosition

long Backbone::SingerToneTracker::CurrentPitchSamplePosition => m_curPitchSamplePos

Absolute sample position of the current detection window start.

◆ DetectSampleOffset

int Backbone::SingerToneTracker::DetectSampleOffset => (m_pitchBufSize + m_detectOverlapSamples) / 2

Estimated latency in samples between input and reported pitch.

◆ FrequencyStep

double Backbone::SingerToneTracker::FrequencyStep => Math.Pow(2.0, 1.0 / kOctaveSteps)
static

Frequency ratio between adjacent coarse steps (2^(1/96)).

◆ kAvgCount

const int Backbone::SingerToneTracker::kAvgCount = 1
private

◆ kAvgOffset

const float Backbone::SingerToneTracker::kAvgOffset = 0.005f
private

◆ kCircularBufSaveTime

const float Backbone::SingerToneTracker::kCircularBufSaveTime = 1.0f
private

◆ kDetectOverlapSec

const float Backbone::SingerToneTracker::kDetectOverlapSec = 0.005f
private

◆ kMaxFreq

const float Backbone::SingerToneTracker::kMaxFreq = 1600.0f
private

◆ kMaxOctaveSecRate

const float Backbone::SingerToneTracker::kMaxOctaveSecRate = 10.0f
private

◆ kMinFreq

const float Backbone::SingerToneTracker::kMinFreq = 50.0f
private

◆ kOctaveSteps

const int Backbone::SingerToneTracker::kOctaveSteps = 96
private

◆ kStartCircular

const int Backbone::SingerToneTracker::kStartCircular = 40
private

◆ kStepOverlap

const int Backbone::SingerToneTracker::kStepOverlap = 4
private

◆ m_circularBufferHi

CircularBuffer<float> Backbone::SingerToneTracker::m_circularBufferHi
private

◆ m_circularBufferLo

CircularBuffer<float> Backbone::SingerToneTracker::m_circularBufferLo
private

◆ m_curPitchIndex

int Backbone::SingerToneTracker::m_curPitchIndex
private

◆ m_curPitchRecord

PitchRecord Backbone::SingerToneTracker::m_curPitchRecord = new PitchRecord()
private

◆ m_curPitchSamplePos

long Backbone::SingerToneTracker::m_curPitchSamplePos
private

◆ m_detectLevelThreshold

float Backbone::SingerToneTracker::m_detectLevelThreshold = 0.01f
private

◆ m_detectOverlapSamples

int Backbone::SingerToneTracker::m_detectOverlapSamples
private

◆ m_dsp

SingerToneDSP Backbone::SingerToneTracker::m_dsp
private

◆ m_iirFilterHiHi

IIRFilter Backbone::SingerToneTracker::m_iirFilterHiHi
private

◆ m_iirFilterHiLo

IIRFilter Backbone::SingerToneTracker::m_iirFilterHiLo
private

◆ m_iirFilterLoHi

IIRFilter Backbone::SingerToneTracker::m_iirFilterLoHi
private

◆ m_iirFilterLoLo

IIRFilter Backbone::SingerToneTracker::m_iirFilterLoLo
private

◆ m_maxOverlapDiff

float Backbone::SingerToneTracker::m_maxOverlapDiff
private

◆ m_pitchBufHi

float [] Backbone::SingerToneTracker::m_pitchBufHi
private

◆ m_pitchBufLo

float [] Backbone::SingerToneTracker::m_pitchBufLo
private

◆ m_pitchBufSize

int Backbone::SingerToneTracker::m_pitchBufSize
private

◆ m_pitchRecordHistorySize

int Backbone::SingerToneTracker::m_pitchRecordHistorySize
private

◆ m_pitchRecords

readonly List<PitchRecord> Backbone::SingerToneTracker::m_pitchRecords = new List<PitchRecord>()
private

◆ m_pitchRecordsPerSecond

int Backbone::SingerToneTracker::m_pitchRecordsPerSecond = 50
private

◆ m_recordPitchRecords [1/2]

bool Backbone::SingerToneTracker::m_recordPitchRecords
private

◆ m_recordPitchRecords [2/2]

Backbone::SingerToneTracker::m_recordPitchRecords = value

◆ m_sampleRate

double Backbone::SingerToneTracker::m_sampleRate
private

◆ m_samplesPerPitchBlock

int Backbone::SingerToneTracker::m_samplesPerPitchBlock
private

◆ MaxDetectFrequency

float Backbone::SingerToneTracker::MaxDetectFrequency => kMaxFreq
static

Maximum detectable frequency in Hz.

◆ MinDetectFrequency

float Backbone::SingerToneTracker::MinDetectFrequency => kMinFreq
static

Minimum detectable frequency in Hz.

◆ PitchDetected

event PitchDetectedHandler Backbone::SingerToneTracker::PitchDetected

◆ PitchRecordHistorySize

int Backbone::SingerToneTracker::PitchRecordHistorySize
Initial value:
{
int m_pitchRecordHistorySize
Definition SingerToneTracker.cs:43

Maximum number of records to keep in history. 0 means unbounded (not recommended in realtime).

◆ PitchRecords

IList Backbone::SingerToneTracker::PitchRecords => m_pitchRecords.AsReadOnly()

Read-only view of recorded pitch records.

◆ PitchRecordsPerSecond

int Backbone::SingerToneTracker::PitchRecordsPerSecond
Initial value:
{
int m_pitchRecordsPerSecond
Definition SingerToneTracker.cs:30

Target number of pitch records per second. Clamped to [1, 100].

◆ RecordPitchRecords

bool Backbone::SingerToneTracker::RecordPitchRecords
Initial value:
{
bool m_recordPitchRecords
Definition SingerToneTracker.cs:42

Enables or disables history recording. Disabling clears previous records.

◆ SampleRate

double Backbone::SingerToneTracker::SampleRate
Initial value:
{
{
if (m_sampleRate == value) return;
m_sampleRate = value;
Setup();
}
}
public float DetectLevelThreshold
{
{
var newValue = Math.Max(0.0001f, Math.Min(1.0f, value));
if (m_detectLevelThreshold == newValue) return;
Setup();
}
}
public int SamplesPerPitchBlock => m_samplesPerPitchBlock
set
Definition SingerToneTracker.cs:99
double m_sampleRate
Definition SingerToneTracker.cs:28
float m_detectLevelThreshold
Definition SingerToneTracker.cs:29
int m_samplesPerPitchBlock
Definition SingerToneTracker.cs:35

Sample rate in Hz. Reconfigures internal filters and buffers when set.

◆ set

Backbone::SingerToneTracker::set { m_pitchRecordsPerSecond = Math.Max(1, Math.Min(100, value))

The documentation for this class was generated from the following file: