#include "PitchWrapper.h" #include "Helper.h" Analyzer* Analyzer_Create(unsigned step){ return new Analyzer(44100, "", step); } void Analyzer_Free(Analyzer* analyzer){ if(analyzer) delete analyzer; } void Analyzer_InputFloat(Analyzer* analyzer, float* data, int sampleCt){ if(sampleCt == 0 || !analyzer) return; analyzer->input(data, data + sampleCt); } void Analyzer_InputShort(Analyzer* analyzer, short* data, int sampleCt){ if(sampleCt == 0 || !analyzer) return; float* dataFloat = short2FloatArray(data, sampleCt); analyzer->input(dataFloat, dataFloat + sampleCt); freeFloatArray(dataFloat); } void Analyzer_InputByte(Analyzer* analyzer, char* data, int sampleCt){ if(sampleCt <= 0 || !analyzer) return; float* dataFloat = short2FloatArray(static_cast(static_cast(data)), sampleCt); analyzer->input(dataFloat, dataFloat + sampleCt); freeFloatArray(dataFloat); } void Analyzer_Process(Analyzer* analyzer){ if(!analyzer) return; analyzer->process(); } float Analyzer_GetPeak(Analyzer* analyzer){ if(!analyzer) return -999; return static_cast(analyzer->getPeakRaw()); } double Analyzer_FindNote(Analyzer* analyzer, double minFreq, double maxFreq){ if(!analyzer) return -1; const Tone* tone = analyzer->findTone(minFreq, maxFreq); return (tone == NULL) ? -1 : FreqToNote(tone->freq); } bool Analyzer_OutputFloat(Analyzer* analyzer, float* data, int sampleCt, float rate){ if(!analyzer) return false; return analyzer->output(data, data + sampleCt, rate); } PtAKF* PtAKF_Create(unsigned step){ return new PtAKF(step); } void PtAKF_Free(PtAKF* analyzer){ if(analyzer) delete analyzer; } int PtAKF_GetNumHalfTones(){ return PtAKF::GetNumHalfTones(); } void PtAKF_SetVolumeThreshold(PtAKF* analyzer, float threshold){ if(!analyzer) return; analyzer->SetVolumeThreshold(threshold); } float PtAKF_GetVolumeThreshold(PtAKF* analyzer){ if(!analyzer) return 0.f; return analyzer->GetVolumeThreshold(); } void PtAKF_InputByte(PtAKF* analyzer, char* data, int sampleCt){ if(sampleCt <= 0 || !analyzer) return; //short* dataShort = static_cast(static_cast(data)); float* dataFloat = short2FloatArray(static_cast(static_cast(data)), sampleCt); analyzer->input(dataFloat, dataFloat + sampleCt); freeFloatArray(dataFloat); //analyzer->input(dataShort, dataShort + sampleCt); } int PtAKF_GetNote(PtAKF* analyzer, float* maxVolume, float* weights){ if(!analyzer) return -1; return analyzer->GetNote(maxVolume, weights); } PtDyWa* PtDyWa_Create(unsigned step){ return new PtDyWa(step); } void PtDyWa_Free(PtDyWa* analyzer){ if(analyzer) delete analyzer; } void PtDyWa_SetVolumeTreshold(PtDyWa* analyzer, float threshold){ if(!analyzer) return; analyzer->SetVolumeThreshold(threshold); } float PtDyWa_GetVolumeThreshold(PtDyWa* analyzer){ if(!analyzer) return 0.f; return analyzer->GetVolumeThreshold(); } void PtDyWa_InputByte(PtDyWa* analyzer, char* data, int sampleCt){ if(sampleCt <= 0 || !analyzer) return; float* dataFloat = short2FloatArray(static_cast(static_cast(data)), sampleCt); analyzer->input(dataFloat, dataFloat + sampleCt); freeFloatArray(dataFloat); } double PtDyWa_FindNote(PtDyWa* analyzer, float* maxVolume){ if(!analyzer) return -1; return analyzer->FindNote(maxVolume); } /* namespace Native{ namespace PitchTracking{ //CAnalyzer void CAnalyzer::Input(array^ data){ if(data->Length == 0) return; pin_ptr dataPtr = &data[0]; float* dataPtr2 = dataPtr; m_analyzer->input(dataPtr2, dataPtr2 + data->Length); } void CAnalyzer::Input(array^ data){ if(data->Length == 0) return; pin_ptr dataPtr = &data[0]; float* dataFloat = short2FloatArray(dataPtr, data->Length); m_analyzer->input(dataFloat, dataFloat + data->Length); freeFloatArray(dataFloat); } void CAnalyzer::Input(array^ data){ if(data->Length == 0) return; pin_ptr dataPtr = &data[0]; float* dataFloat = short2FloatArray(static_cast(static_cast(dataPtr)), data->Length / 2); m_analyzer->input(dataFloat, dataFloat + data->Length); freeFloatArray(dataFloat); } void CAnalyzer::Process(){ m_analyzer->process(); } double CAnalyzer::GetPeak(){ return m_analyzer->getPeak(); } array^ CAnalyzer::GetTones(){ Analyzer::tones_t umTones = m_analyzer->getTones(); array^ tones = gcnew array(static_cast(umTones.size())); int i = 0; for(auto it=umTones.begin(); it!=umTones.end(); it++, i++){ tones[i]=ConvertToneToManaged(*it); } return tones; } CTone^ CAnalyzer::FindTone(){ return FindTone(65.0); } CTone^ CAnalyzer::FindTone(double minFreq){ return FindTone(minFreq, 1000.0); } CTone^ CAnalyzer::FindTone(double minFreq, double maxFreq){ const Tone* tone = m_analyzer->findTone(minFreq, maxFreq); return (tone == NULL) ? nullptr : ConvertToneToManaged(tone); } void CAnalyzer::Output(array^ data, float rate){ pin_ptr dataPtr = &data[0]; m_analyzer->output(dataPtr, dataPtr + data->Length, rate); } String^ CAnalyzer::GetId(){ return m_id; } //CPitchTracker void CPitchTracker::Init(double baseToneFrequency, int minHalfTone, int maxHalfTone){ PitchTracker::Init(baseToneFrequency, minHalfTone, maxHalfTone); } void CPitchTracker::DeInit(){ PitchTracker::DeInit(); } int CPitchTracker::GetTone(array^ samples, array^ weights){ if(samples->Length == 0) return -1; pin_ptr dataPtr = &samples[0]; pin_ptr weightsPtr = &weights[0]; double* dataDouble = short2DoubleArray(dataPtr, samples->Length, false); int result = PitchTracker::GetTone(dataDouble, samples->Length, weightsPtr, true); freeDoubleArray(dataDouble); return result; } } } */