private void Raise_NotesDetected(Note[] notes) { EventHandler<NotesDetectedEventArgs> h = NotesDetected; if (h == null) return; h(this, new NotesDetectedEventArgs(notes)); }
private Feedback GetPitchFeedback(Note goalNote, Note closestNote) { if (goalNote.Semitone == closestNote.Semitone) return new GoodPitchFeedback(); int diff = closestNote.Semitone - goalNote.Semitone; return new BadPitchFeedback(diff); }
private Note FindClosestNote(Note goalNote, IList<Note> playedNotes) { Note closestNote = playedNotes[0]; double minDiff = Math.Abs((closestNote.startTime - goalNote.startTime).TotalSeconds); foreach (Note playedNote in playedNotes) { double diff = Math.Abs((closestNote.startTime - goalNote.startTime).TotalSeconds); if (diff < minDiff) { minDiff = diff; closestNote = playedNote; } } return closestNote; }
public void NoteThread() { while (_detecting) { i++; if (i > 12) i = -12; Note note = new Note() { frequency = 440 + i, startTime = DateTime.Now, endTime = DateTime.Now + TimeSpan.FromSeconds(0.1) }; Raise_NotesDetected(new Note[1] { note }); Thread.Sleep(50); } }
public void NoteThread() { while (_detecting) { if (i > 12) i = 0; //int semitone = i + 48; int semitone = i + 48; i++; //Note randomNote = new Note() { Semitone = semitone, startTime = DateTime.Now, endTime = DateTime.Now + TimeSpan.FromSeconds(0.1) }; //_noteQueue.Enqueue(randomNote); Note note = new Note() { Semitone = semitone, startTime = DateTime.Now, endTime = DateTime.Now + TimeSpan.FromSeconds(0.1) }; //_noteQueue.TryDequeue(out note); Raise_NotesDetected(new Note[1] { note }); Thread.Sleep(200); } }
private void SimpleDetectNotesImproved() { while (!_stopDetecting) { FFTPower fftCalc; if (!_fftSource.FFTQueue.TryPeek(out fftCalc)) continue; if (powerBins == null) powerBins = new double[AudioCapture.AudioCaptureSettings.BufferSize * AudioCapture.AudioCaptureSettings.BufferModifier]; freq = 0; max = 0; index = 0; _relativePower = 0; if (xorPowerBins == null) xorPowerBins = new double[_xorPowerBins.Length]; currentTotalPower = powerBins.Sum(); //Buffer.BlockCopy(_xorPowerBins, 0, xorPowerBins, 0, _xorPowerBins.Length * sizeof(double)); Array.Clear(xorPowerBins, 0, xorPowerBins.Length); for (int i = 0; i < ((_sampleRate / 2) / _step); i++)//(fftCalc.PowerBins.Length / 2); i++) { if ((i == 0) || ((i * _step) < 75)) powerBins[i] = 0; else powerBins[i] = (fftCalc.PowerBins[i] * (1 - xorPowerBins[i])); if (powerBins[i] < _noiseFloor) { powerBins[i] = 0; } _relativePower = powerBins[Math.Max(i - 1, 0)] + powerBins[Math.Max(i + 1, 0)] + powerBins[Math.Max(i, 0)]; if ((max < _relativePower)) { max = _relativePower; index = i; } else if (max > _relativePower) { if (index > 1) { for (int j = index * 2; (j < (((_sampleRate / 2) / _step) - 2)) || (j < index * 6); j = j + index) { //xorPowerBins[j - 2] = 1; xorPowerBins[j - 1] = 1; xorPowerBins[j] = 1; xorPowerBins[j + 1] = 1; //xorPowerBins[j + 2] = 1; } } } //powerBins[i] = powerBins[i] / fftCalc.PowerBins.Max() * 1000; } //_noiseFloor = 0.7 * _lastMax; //freq = DetectFrequency2(powerBins, index); freq = DetectFrequency_Mirrored(fftCalc.PowerBins, index - _subPeaks, index + _subPeaks); //System.Diagnostics.Debug.Write(freq + "\n"); Note[] notes = new Note[1] { new Note() }; notes[0].startTime = DateTime.Now; notes[0].frequency = freq; //Console.WriteLine(notes[0].closestRealNoteFrequency); NoteQueue.Enqueue(notes); //if (NoteQueue.Count > _maxNoteQueueSize) //{ // Note[] dqnotes; // NoteQueue.TryDequeue(out dqnotes); //} } }
private void SimpleDetectNotes() { while (!_stopDetecting) { FFTPower fftCalc; if (!_fftSource.FFTQueue.TryPeek(out fftCalc)) continue; double[] powerBins = new double[AudioCapture.AudioCaptureSettings.BufferSize * AudioCapture.AudioCaptureSettings.BufferModifier]; fftCalc.PowerBins.CopyTo(powerBins, 0); double freq = 0; //Start Note Detection double currentTotalPower = powerBins.Sum(); //if (currentTotalPower < _previousTotalPower) // if our power is less than thy previous power by at least MAX_POWER_DECAY, ignore the rest //{ // freq = 0; //}/ //else //{ double max = 0; int index = 0; for (int i = 0; i < powerBins.Length / 2; i++) { powerBins[i] = powerBins[i] * _xorPowerBins[i]; if (powerBins[i] < _noiseFloor) powerBins[i] = 0; if ((max < powerBins[i]) && (i > 75)) { max = powerBins[i]; index = i; } powerBins[powerBins.Length - 1 - i] = 0; } index = index; max = max; freq = DetectFrequency_Mirrored(powerBins); //} System.Diagnostics.Debug.Write(freq + "\n"); _previousTotalPower = currentTotalPower; Note[] notes = new Note[1] { new Note() }; notes[0].startTime = DateTime.Now; notes[0].frequency = freq; //Console.WriteLine(notes[0].closestRealNoteFrequency); NoteQueue.Enqueue(notes); if (NoteQueue.Count > _maxNoteQueueSize) { Note[] dqnotes; NoteQueue.TryDequeue(out dqnotes); } } }
private void MultiImpulseDetectNotes() { while (!_stopDetecting) { FFTPower fftCalc; if (!_fftSource.FFTQueue.TryPeek(out fftCalc)) continue; if (xorPowerBins == null) xorPowerBins = new double[_xorPowerBins.Length]; if (powerBins == null) powerBins = new double[AudioCapture.AudioCaptureSettings.BufferSize * AudioCapture.AudioCaptureSettings.BufferModifier]; if (freqArray == null) freqArray = new double[6]; if (indexArray == null) indexArray = new int[6]; if (maxArray == null) maxArray = new double[6]; if (_powerBinsDelta == null) _powerBinsDelta = new double[powerBins.Length]; if (_powerBinsOld == null) _powerBinsOld = new double[powerBins.Length]; if (impulseArray == null) impulseArray = new double[6]; _relativePower = 0; Array.Clear(xorPowerBins, 0, xorPowerBins.Length); for (int p = 0; p < 6; p++) { maxArray[p] = 0; freqArray[p] = 0; indexArray[p] = 0; impulseArray[p] = 0; for (int i = (int)(stringFreq[p, 0] / _step); i < (stringFreq[p, 1] / _step); i++) { powerBins[i] = (fftCalc.PowerBins[i] * (1 - xorPowerBins[i])); powerBins[i + 1] = (fftCalc.PowerBins[i + 1] * (1 - xorPowerBins[i + 1])); _powerBinsDelta[i] = (fftCalc.PowerBins[i] - _powerBinsOld[i]) * (1 - xorPowerBins[i]); if (powerBins[i] < _noiseFloor) { powerBins[i] = 0; powerBins[i + 1] = 0; _powerBinsDelta[i] = 0; } _relativePower = powerBins[Math.Max(i - 1, 0)] + powerBins[Math.Max(i + 1, 0)] + powerBins[Math.Max(i, 0)]; if ((maxArray[p] < _relativePower)) { maxArray[p] = _relativePower; indexArray[p] = i; if (_powerBinsDelta[i] > 0) impulseArray[p] = _powerBinsDelta[i]; //xorPowerBins[i - 2] = 1; //xorPowerBins[i - 1] = 1; //xorPowerBins[i] = 1; //xorPowerBins[i + 1] = 1; //xorPowerBins[i + 2] = 1; } else if (maxArray[p] > _relativePower) { if (indexArray[p] > 1) { for (int j = indexArray[p]; (j < (((_sampleRate / 2) / _step) - 2)) && (j < indexArray[p] * 6); j = j + indexArray[p]) { xorPowerBins[j - 2] = 1; xorPowerBins[j - 1] = 1; xorPowerBins[j] = 1; xorPowerBins[j + 1] = 1; xorPowerBins[j + 2] = 1; } } stringFreq[Math.Min((p + 1), 5), 0] = (index * _step); break; } } } for (int j = 0; j < 6; j++) { if (j == 0) _impulseCutoff = _lowImpulseCutoff; else _impulseCutoff = _highImpulseCutoff; if (impulseArray[j] > _lowImpulseCutoff) { Note[] notes = new Note[6]; for (int i = 0; i < 6; i++) { freqArray[i] = DetectFrequency_Mirrored(fftCalc.PowerBins, indexArray[i] - _subPeaks, indexArray[i] + _subPeaks); notes[i] = new Note(); notes[i].startTime = DateTime.Now; notes[i].frequency = freqArray[i]; } Raise_NotesDetected(notes); break; } } Buffer.BlockCopy(fftCalc.PowerBins, 0, _powerBinsOld, 0, _powerBinsOld.Length * sizeof(double)); //NoteQueue.Enqueue(notes); } }
private void MultiDetectNotes() { while (!_stopDetecting) { FFTPower fftCalc; if (!_fftSource.FFTQueue.TryPeek(out fftCalc)) continue; if (xorPowerBins == null) xorPowerBins = new double[_xorPowerBins.Length]; if (powerBins == null) powerBins = new double[AudioCapture.AudioCaptureSettings.BufferSize * AudioCapture.AudioCaptureSettings.BufferModifier]; if (freqArray == null) freqArray = new double[6]; if (indexArray == null) indexArray = new int[6]; if (maxArray == null) maxArray = new double[6]; _relativePower = 0; Array.Clear(xorPowerBins, 0, xorPowerBins.Length); for (int p = 0; p < 6; p++) { maxArray[p] = 0; freqArray[p] = 0; indexArray[p] = 0; for (int i = (int)(stringFreq[p, 0] / _step); i < (stringFreq[p, 1] / _step); i++) { powerBins[i] = (fftCalc.PowerBins[i] * (1 - xorPowerBins[i])); powerBins[i + 1] = (fftCalc.PowerBins[i + 1] * (1 - xorPowerBins[i + 1])); if (powerBins[i] < _noiseFloor) { powerBins[i] = 0; powerBins[i + 1] = 0; } _relativePower = powerBins[Math.Max(i - 1, 0)] + powerBins[Math.Max(i + 1, 0)] + powerBins[Math.Max(i, 0)]; if ((maxArray[p] < _relativePower)) { maxArray[p] = _relativePower; indexArray[p] = i; //xorPowerBins[i - 2] = 1; //xorPowerBins[i - 1] = 1; //xorPowerBins[i] = 1; //xorPowerBins[i + 1] = 1; //xorPowerBins[i + 2] = 1; } else if (maxArray[p] > _relativePower) { if (indexArray[p] > 1) { for (int j = indexArray[p]; (j < (((_sampleRate / 2) / _step) - 2)) && (j < indexArray[p] * 6); j = j + indexArray[p]) { xorPowerBins[j - 2] = 1; xorPowerBins[j - 1] = 1; xorPowerBins[j] = 1; xorPowerBins[j + 1] = 1; xorPowerBins[j + 2] = 1; } } break; } } } Note[] notes = new Note[6]; for (int i = 0; i < 6; i++) { freqArray[i] = DetectFrequency_Mirrored(fftCalc.PowerBins, indexArray[i] - _subPeaks, indexArray[i] + _subPeaks); notes[i] = new Note(); notes[i].startTime = DateTime.Now; notes[i].frequency = freqArray[i]; } Raise_NotesDetected(notes); //NoteQueue.Enqueue(notes); } }
private void ImpulseDetectNotes() { while (!_stopDetecting) { FFTPower fftCalc; if (!_fftSource.FFTQueue.TryPeek(out fftCalc)) continue; if (powerBins == null) powerBins = new double[AudioCapture.AudioCaptureSettings.BufferSize * AudioCapture.AudioCaptureSettings.BufferModifier]; if (_powerBinsDelta == null) _powerBinsDelta = new double[powerBins.Length]; if (_powerBinsOld == null) _powerBinsOld = new double[powerBins.Length]; if (xorPowerBins == null) xorPowerBins = new double[_xorPowerBins.Length]; Array.Clear(xorPowerBins, 0, xorPowerBins.Length); freq = 0; max = 0; index = 0; _relativePower = 0; impulse = 0; for (int i = (int)(stringFreq[0, 0] / _step); i < (stringFreq[5, 1] / _step); i++) { powerBins[i] = (fftCalc.PowerBins[i] * (1 - xorPowerBins[i])); powerBins[i + 1] = (fftCalc.PowerBins[i + 1] * (1 - xorPowerBins[i + 1])); _powerBinsDelta[i] = (fftCalc.PowerBins[i] - _powerBinsOld[i]) * (1 - xorPowerBins[i]); if (powerBins[i] < _noiseFloor) { powerBins[i] = 0; powerBins[i + 1] = 0; _powerBinsDelta[i] = 0; } _relativePower = powerBins[Math.Max(i - 1, 0)] + powerBins[Math.Max(i + 1, 0)] + powerBins[Math.Max(i, 0)]; if ((max < _relativePower)) { max = _relativePower; index = i; if (_powerBinsDelta[i] > 0) impulse = _powerBinsDelta[i]; } else if (max > _relativePower) { if (index > 1) { for (int j = index; (j < (((_sampleRate / 2) / _step) - 2)) && (j < index * 6); j = j + index) { xorPowerBins[j - 2] = 1; xorPowerBins[j - 1] = 1; xorPowerBins[j] = 1; xorPowerBins[j + 1] = 1; xorPowerBins[j + 2] = 1; } } break; } } Buffer.BlockCopy(fftCalc.PowerBins, 0, _powerBinsOld, 0, _powerBinsOld.Length * sizeof(double)); _impulseCutoff = _lowImpulseCutoff; //_impulseCutoff = _highImpulseCutoff; if (impulse> _lowImpulseCutoff) { Note[] notes = new Note[6]; for (int i = 0; i < 6; i++) { freq = DetectFrequency_Mirrored(fftCalc.PowerBins, index - _subPeaks, index + _subPeaks); notes[i] = new Note(); notes[i].startTime = DateTime.Now; notes[i].frequency = freq; } Raise_NotesDetected(notes); } } }
private void RunFreeform(string _chord) { // Fix this too int index; Note[] prevNote = new Note[3]; Note[] curNote; int noteCount = 0; while (_runningChordFreeform) { if (!chordSource.ChordQueue.TryPeek(out curNote)) continue; noteCount = 0; for (int j = 0; j < ChordDictionary.ChordList.Count; j++) { for (int i = 0; i < curNote.Count(); i++) { bool test = (ChordDictionary.ChordList[j].Notes.Where(n => n.ClosestRealNoteFrequency == curNote[i].ClosestRealNoteFrequency).Count() > 0); if (test == true) noteCount++; } if ((noteCount / ChordDictionary.ChordList[j].Notes.Count) >= 0.5) { _chord = ChordDictionary.ChordList[j].CharValue.ToString(); break; } else { _chord = ""; } } if (_chord == "") continue; Application.Current.Dispatcher.Invoke( DispatcherPriority.Render, new Action<string>(updateStaff), _chord); } }
public void SetNote(Note note) { StartTime = note.startTime; EndTime = note.endTime; Frequency = note.frequency; ClosestRealNoteFrequency = note.frequency; }
private Feedback GetTimingFeedback(Note goalNote, Note closestNote) { double diff = (closestNote.startTime - goalNote.startTime).TotalSeconds; double absDiff = Math.Abs(diff); string slowOrFastStr = diff > 0 ? "slow" : "fast"; // user is slow if difference is positive (played after goal note) if (absDiff < _goodTiming) { return new GoodTimingFeedback(diff) { Note = closestNote }; } else if (absDiff < _mediumTiming) { return new MediumTimingFeedback(diff) { Note = closestNote }; } else { return new BadTimingFeedback(diff) { Note = closestNote }; } }