コード例 #1
0
    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];
        }
    }
コード例 #2
0
    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);
        }
    }