LOGO Lazarus
AIMP Визуализация Исходник Спектр

AIMP Визуализация Спектр

Это визуализация-спектр для AIMP, bass_sfx.dll совместимая

Общий вид:



 Скачать OpenSpectrumlazarus2-1-0.zip

Настройка визуализации

Общий вид:

Позволяет создавать и редактировать темы для спектр визуализации.

Запускается либо по клику в правом верхнем углу окна AIMP, либо напрямую из папки с пагином (нужно окрыть папку и запустить)

Конфигурации сохраняются в %APPDATA%

Формат цвета #HTML_CSS цвет

Поддержка полноэкранного режима.

Для входа в полноэкранный режим, нужно в настройках AIMP v3.5 поставить



В AIMP 3.6 на текущий момент настроек нет

Установка

Для AIMP v3.5:

-Скопировать содержимое папки bin в папку с плагинами AIMP

Для AIMP v3.6:

-Чтобы установить визуализацию нужно создать папку (в AIMP/plugins) с именем таким же как DLL внутрь туда эту DLL положить
-Скопировать содержимое папки bin в папку AIMP/plugins/OpenSpectrumLazarus2



Также можно отключить спектр AIMP чтобы не видеть его

Описание алгоритма

Используется алгоритм матрицы спектрального максимума

Сама матрица получена после прогона нескольких mp3-flac файлов различных жанров. За счет этого спектр наиболее точно выравнивается.

Нормализация Спектра:

высота палки[i] := значение полосы[i] / значение матрицы максимума[i]
Исходный спектр состоит из 255 пиков, однако используются только 207 из них

Сжатие спектра:

Так как на экране отображаются только 10-30 пиков вместо двух сотен, то возникает необходимость в сжатии полученного, уже нормализованного спектра

На первом этап сжатия рассчитывается возрастающий шаг того сколько на каждую отображаемую полосу будет приходится полос спектра
procedure SP_CalculateBarConfig(const Theme: TTheme; var BarConfig: TSP_BarConfig);
var i, maxSP, totalSP: integer; stepSP: single;
begin
   if BarConfig.BarCount <> Theme.SPBarCount then begin
      with BarConfig do begin
         BarCount:= Theme.SPBarCount;
// единичный отступ 15%
// нужен для того чтобы "БАСЫ" отображались максимально точно
         Offset:=round( BarCount * 0.15 );
         BarCount:=Theme.SPBarCount;
         maxSP:=Length(vSP_MATRIX)-1;
// длина vSP_MATRIX = 207
         if BarCount<50 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.05 );
         if BarCount<30 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.1 );
         if BarCount<15 then maxSP:= Length(vSP_MATRIX) - trunc( Length(vSP_MATRIX) * 0.2 );
         Step:=0;
         // Рассчет шага
         repeat
           totalSP:=Offset;
           stepSP:=1;
           for i:=1 to BarCount-Offset do begin
              stepSP:= stepSP + Step;
              totalSP:= totalSP + round( stepSP );
           end;
           Step:=Step + 0.01;
         until totalSP>=maxSP;
         Step:=Step - 0.01;
         Step:=abs(Step);
      end; // end with
   end; // end if
end;
Структуры данных:
  TSP_BarConfig = record
    BarCount: integer; // количество отображаемых полос
    Offset: integer; // единичный отступ
    Step: single; // шаг
  end;
Например спектр состоит из 20 полос
Тогда у него будет отступ: 3
Величина шага будет составлять 1.1

Спектр будет охватывать 189 полос из 207

Excel скриншот полученного расчета


На втором этапе уже сжимаем спектр на основе полученной конфигурации TSP_BarConfig
procedure SP_CalculateSpectrum(const Theme: TTheme; var BarConfig: TSP_BarConfig;
  const DATA: TSP_SingleArray;
  var OUTData: TSP_SingleArray
);
var i,z,k: integer; stepSP, hmax: single;
begin
   with BarConfig do begin
      z:=0;
      k:=0;
      for z:=0 to Offset-1 do begin
	  // единичный отступ
        OUTData[k]:=DATA[z];
        inc(k);
      end;
      z:=Offset-1;
      stepSP:=1;
      repeat
        hmax:=0;
        stepSP:=stepSP+Step;
        for i:=z+1 to z+round(stepSP) do begin
			// ищем максимум из диапазона заданного шагом
           hmax:=MAX(DATA[i],hmax);
        end;
		// записываем результат в OUTData
        OUTData[k]:=hmax;
        inc(k);
        z:=z+round(stepSP);
      until k>=BarCount;
   end;
end;