Bass.dll просто спектр данных C # - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь создать игру, основанную на обнаружении ударов и спектра. В настоящее время я застрял на том, что моя функция возвращает не совсем то, что я хочу, потому что массив не полностью назначен. Последний заполненный элемент неправильный, и я не знаю почему.

Размер массива равен 20, и этот код заполняет только 12 или меньше

  float[] rmsData;

    public void spektrsw(int barrcount, bool lefton, out float[] spectrumData)
    {
       spectrumData = new float[barrcount]; 
             //defining array in which will  be spectrum data
        if (isPlaying) //check if sound is playing
        {
            int lenght = (int)Bass.BASS_ChannelSeconds2Bytes(ActiveStreamHandle, 1.0); //gets and sets lenght
            int rmsDataArraySize = Math.Abs(lenght / 4); 
              //calculating FFT data or RMS array size 
            if (rmsData == null || rmsData.Length < rmsDataArraySize)
                 rmsData = new float[rmsDataArraySize]; 
                    //defining new array if old one has lenght smaler

            lenght = Bass.BASS_ChannelGetData(ActiveStreamHandle, rmsData, lenght); //geting lenght FFT data
            rmsDataArraySize = lenght / 4; //calculating FFT data or RMS array size 

            int times = (int)(rmsDataArraySize / (barrcount * 2)) + 1; 
   //calculating how many times loop will continue until the loop will go to next index

            int index = 0; 
   // creating index variable which will point to an element in array

            for (int counter = 0; counter < rmsDataArraySize; counter++)
            {

                if (counter % 2 == 0 || counter == 0) //For left channel
                {
                   if(lefton) //which channel am i analysing
                    spectrumData[index] = spectrumData[index] +  Math.Abs(rmsData[counter]);
                    //adding data to array
                }
                else
                {
                    if (!lefton) //which channel am i analysing
                        spectrumData[index] = spectrumData[index] + Math.Abs(rmsData[counter]);
                    //adding data to array
                }

                if (counter == times) //check to see if index needs to be increased
                {

                    spectrumData[index] = spectrumData[index] / times;
                    //this is for calculating avarege in one bar since
                    //I combined lots of data in one bar

                    spectrumData[index] = spectrumData[index] * 1000f;

                    index++;//increasing index
                    times = times + counter;

                }
            }                
        }          
    }

Вопросы:

  1. Я правильно делаю?
  2. Почему он не возвращает все значения?
  3. Какой самый простой способ получить нужные мне данные?

Спасибо за ваши ответы уже.

И я прошу прощения за мой плохой английский ......

[EDIT]

Я обнаружил, что утверждение if или способ вычисления Times неверен: - (

Так что, если у вас есть лучшая идея, как получить данные из массива 4000 элементов в массив из 20, я был бы рад, если бы вы опубликовали свой совет здесь.

...