Example #1
0
        /// <summary>
        /// The pitch was detected - add the record
        /// </summary>
        /// <param name="pitch"></param>
        private void AddPitchRecord(float pitch)
        {
            var midiNote  = 0;
            var midiCents = 0;

            PitchDsp.PitchToMidiNote(pitch, out midiNote, out midiCents);

            var record = new PitchRecord();

            record.RecordIndex = m_curPitchIndex;
            record.Pitch       = pitch;
            record.MidiNote    = midiNote;
            record.MidiCents   = midiCents;

            m_curPitchRecord = record;

            if (m_recordPitchRecords)
            {
                if (m_pitchRecordHistorySize > 0 && m_pitchRecords.Count >= m_pitchRecordHistorySize)
                {
                    m_pitchRecords.RemoveAt(0);
                }

                m_pitchRecords.Add(record);
            }

            if (this.PitchDetected != null)
            {
                this.PitchDetected(this, record);
            }
        }
Example #2
0
        /// <summary>
        /// Setup
        /// </summary>
        private void Setup()
        {
            if (m_sampleRate < 1.0f)
            {
                return;
            }

            m_dsp = new PitchDsp(m_sampleRate, kMinFreq, kMaxFreq, m_detectLevelThreshold);

            m_iirFilterLoLo            = new IIRFilter();
            m_iirFilterLoLo.Proto      = IIRFilter.ProtoType.Butterworth;
            m_iirFilterLoLo.Type       = IIRFilter.FilterType.HP;
            m_iirFilterLoLo.Order      = 5;
            m_iirFilterLoLo.FreqLow    = 45.0f;
            m_iirFilterLoLo.SampleRate = (float)m_sampleRate;

            m_iirFilterLoHi            = new IIRFilter();
            m_iirFilterLoHi.Proto      = IIRFilter.ProtoType.Butterworth;
            m_iirFilterLoHi.Type       = IIRFilter.FilterType.LP;
            m_iirFilterLoHi.Order      = 5;
            m_iirFilterLoHi.FreqHigh   = 280.0f;
            m_iirFilterLoHi.SampleRate = (float)m_sampleRate;

            m_iirFilterHiLo            = new IIRFilter();
            m_iirFilterHiLo.Proto      = IIRFilter.ProtoType.Butterworth;
            m_iirFilterHiLo.Type       = IIRFilter.FilterType.HP;
            m_iirFilterHiLo.Order      = 5;
            m_iirFilterHiLo.FreqLow    = 45.0f;
            m_iirFilterHiLo.SampleRate = (float)m_sampleRate;

            m_iirFilterHiHi            = new IIRFilter();
            m_iirFilterHiHi.Proto      = IIRFilter.ProtoType.Butterworth;
            m_iirFilterHiHi.Type       = IIRFilter.FilterType.LP;
            m_iirFilterHiHi.Order      = 5;
            m_iirFilterHiHi.FreqHigh   = 1500.0f;
            m_iirFilterHiHi.SampleRate = (float)m_sampleRate;

            m_detectOverlapSamples = (int)(kDetectOverlapSec * m_sampleRate);
            m_maxOverlapDiff       = kMaxOctaveSecRate * kDetectOverlapSec;

            m_pitchBufSize         = (int)(((1.0f / (float)kMinFreq) * 2.0f + ((kAvgCount - 1) * kAvgOffset)) * m_sampleRate) + 16;
            m_pitchBufLo           = new float[m_pitchBufSize + m_detectOverlapSamples];
            m_pitchBufHi           = new float[m_pitchBufSize + m_detectOverlapSamples];
            m_samplesPerPitchBlock = (int)Math.Round(m_sampleRate / m_pitchRecordsPerSecond);

            m_circularBufferLo = new CircularBuffer <float>((int)(kCircularBufSaveTime * m_sampleRate + 0.5f) + 10000);
            m_circularBufferHi = new CircularBuffer <float>((int)(kCircularBufSaveTime * m_sampleRate + 0.5f) + 10000);
        }
Example #3
0
        /// <summary>
        /// Write data into the buffer
        /// </summary>
        /// <param name="m_pInBuffer"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public int WriteBuffer(T[] m_pInBuffer, int count)
        {
            count = Math.Min(count, m_bufSize);

            var startPos   = m_availBuf != m_bufSize ? m_availBuf : m_begBufOffset;
            var pass1Count = Math.Min(count, m_bufSize - startPos);
            var pass2Count = count - pass1Count;

            PitchDsp.CopyBuffer(m_pInBuffer, 0, m_buffer, startPos, pass1Count);

            if (pass2Count > 0)
            {
                PitchDsp.CopyBuffer(m_pInBuffer, pass1Count, m_buffer, 0, pass2Count);
            }

            if (pass2Count == 0)
            {
                // did not wrap around
                if (m_availBuf != m_bufSize)
                {
                    m_availBuf += count;   // have never wrapped around
                }
                else
                {
                    m_begBufOffset += count;
                    m_startPos     += count;
                }
            }
            else
            {
                // wrapped around
                if (m_availBuf != m_bufSize)
                {
                    m_startPos += pass2Count;  // first time wrap-around
                }
                else
                {
                    m_startPos += count;
                }

                m_begBufOffset = pass2Count;
                m_availBuf     = m_bufSize;
            }

            return(count);
        }
Example #4
0
        private void CalibrateLowPitch()
        {
            MicrophoneManager.Instance.StartRecording();
            m_GetPitchCoroutine = StartCoroutine(GetPitchAverage((value) =>
            {
                int midiNote, cents;
                bool isMidiNote = PitchDsp.PitchToMidiNote(m_CalibratedLowPitch, out midiNote, out cents);

                if (float.IsNaN(value) || !isMidiNote || value > m_CalibratedHighPitch)
                {
                    WarningManager.Instance.ShowWarning("Please try to hum in a deeper voice.");
                    ResetCalibration(LowPitchDuration);
                    return;
                }
                m_CalibratedLowPitch = value;
                CalibratedLowNote    = midiNote;

                ResetCalibration(LowPitchDuration, LowPitchVisualization);
                CheckForCalibrationTest();
            }, m_LowPitchReference, m_HighPitchReference, LowPitchDuration));
        }
Example #5
0
        /// <summary>
        /// Read from the buffer
        /// </summary>
        /// <param name="outBuffer"></param>
        /// <param name="startRead"></param>
        /// <param name="readCount"></param>
        /// <returns></returns>
        public bool ReadBuffer(T[] outBuffer, long startRead, int readCount)
        {
            var endRead  = (int)(startRead + readCount);
            var endAvail = (int)(m_startPos + m_availBuf);

            if (startRead < m_startPos || endRead > endAvail)
            {
                return(false);
            }

            var startReadPos  = (int)(((startRead - m_startPos) + m_begBufOffset) % m_bufSize);
            var block1Samples = Math.Min(readCount, m_bufSize - startReadPos);
            var block2Samples = readCount - block1Samples;

            PitchDsp.CopyBuffer(m_buffer, startReadPos, outBuffer, 0, block1Samples);

            if (block2Samples > 0)
            {
                PitchDsp.CopyBuffer(m_buffer, 0, outBuffer, block1Samples, block2Samples);
            }

            return(true);
        }