void OnAudioFilterRead(float[] data, int channels) { Debug.Log(data.Length); if (SourceSignal == null) { return; } if (m_outputBuffer == null || m_outputBuffer.Length != data.Length / channels) { m_outputBuffer = new float[data.Length / channels]; } var fft = new NWaves.Transforms.Dct2(m_grainSizeFFT, data.Length); int dataLen = data.Length; double starttime = AudioSettings.dspTime; fft.Inverse(m_grains[grainOffset].weights, m_outputBuffer); for (int i = 0; i < dataLen - 2; i += 2) { data[i] = m_outputBuffer[i / 2]; data[i + 1] = m_outputBuffer[i / 2 + 1]; } }
private void CollectGrains() { m_grains = new List <FrequencyGrain>(); int numsamples = SourceSignal.Length; int grainSizeSamples = (int)(AudioSettings.outputSampleRate * grainSizeMS / 1000f); int numGrains = numsamples / grainSizeSamples - 1; m_grainSizeFFT = 2; while (m_grainSizeFFT < grainSizeSamples) { m_grainSizeFFT *= 2; } Debug.Log($"numsamples {numsamples}"); Debug.Log($"grainSizeSamples {grainSizeSamples}"); Debug.Log($"grainSizeFFT {m_grainSizeFFT}"); Debug.Log($"numGrains {numGrains}"); var fft = new NWaves.Transforms.Dct2(m_grainSizeFFT, m_grainSizeFFT); float[] source = new float[m_grainSizeFFT]; for (int i = 0; i < numsamples - m_grainSizeFFT; i += grainSizeSamples) { var grain = new FrequencyGrain(); grain.Start = i; grain.Length = grainSizeSamples; grain.samples = new float[m_grainSizeFFT]; grain.weights = new float[m_grainSizeFFT]; for (int j = 0; j < m_grainSizeFFT; j++) { grain.samples[j] = SourceSignal.Samples[j + i]; } fft.Direct(grain.samples, grain.weights); m_grains.Add(grain); } }