public void RegisterEvent(BaseTemporalConductorEvent eventToRegister) { if (!_registeredEvents.Contains(eventToRegister)) { _registeredEvents.Add(eventToRegister); } }
private void Update() { double[] audioSamples = samplerInstance.GetSamples(); double[] currentFFTOutput = samplerInstance.GetFFTOutputBins(ref audioSamples); if (currentFFTOutput == null || currentFFTOutput.Length == 0) { return; } if (_currentFFTOutput == null || _currentFFTOutput.Length == 0 || _currentFFTOutput.Length != currentFFTOutput.Length) { _currentFFTOutput = new double[currentFFTOutput.Length]; } for (int i = 0; i < _currentFFTOutput.Length; ++i) { _currentFFTOutput [i] = currentFFTOutput [i]; } AudioSampler.NormalizeFFTOutput(ref _currentFFTOutput, AudioSampler.Instance.ClipFrequency); for (int i = 0; i < _currentFFTOutput.Length; ++i) { if (_currentFFTOutput [i] < _debugMinEnergy) { _debugMinEnergy = _currentFFTOutput [i]; } else if (_currentFFTOutput [i] > _debugMaxEnergy) { _debugMaxEnergy = _currentFFTOutput [i]; } } for (int i = 0; i < _registeredEvents.Count; ++i) { BaseTemporalConductorEvent temporalEvent = _registeredEvents[i]; //remove destroyed Events if (temporalEvent.Type == BaseTemporalConductorEvent.EventType.None) { _registeredEvents.RemoveAt(i); --i; continue; } float energy = (float)RetrieveEnergyInRange(ref _currentFFTOutput, temporalEvent.FrequencyRange, 44100); float prevEnergy = (float)RetrieveEnergyInRange(ref _prevFFTOutput, temporalEvent.FrequencyRange, 44100); float delta = energy - prevEnergy; switch (temporalEvent.Type) { case BaseTemporalConductorEvent.EventType.Stream: { temporalEvent.Invoke(energy, delta); } break; case BaseTemporalConductorEvent.EventType.Beat: { BeatEvent beatEvent = (BeatEvent)temporalEvent; beatEvent.UpdateBeatEvent(energy); float minNormalizedDelta = beatEvent.MinNormalizedDelta; if (minNormalizedDelta <= 0) { break; } float traversalVal = ((1 - beatEvent.AverageEnergy) * minNormalizedDelta); bool isBeat = delta > traversalVal; //if delta is greater than the specified threshold, invoke event if (isBeat) { temporalEvent.Invoke(energy, delta); } } break; } } }