Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2016, 13:35   #11
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от DenProx Посмотреть сообщение
Не нравится то, что если добавить коэффициент для развертки по оси Х (т.е. растянуть на все поле), то получается такая ерунда:

Вложение 81397

Делаю так:

Код:
  kX := Image1.Width / length(wavebufL);

  ht := Image1.Height div 2;
  for i:=0 to length(wavebufL)-1 do
  begin
    fBufferBitmap.Canvas.Pen.Color := clLime;
    fBufferBitmap.Canvas.MoveTo(i,ht-trunc(((wavebufL[i])/(65535))*ht));
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/(65535))*ht));
 end;
Судя по картинке начало линии в старом месте:
fBufferBitmap.Canvas.MoveTo(i,ht-trunc(((wavebufL[i])/(65535))*ht));
Здесь видимо проблема...
netpolice вне форума Ответить с цитированием
Старый 05.05.2016, 13:47   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Код:
 fBufferBitmap.Canvas.MoveTo(i,ht-
Тут ошибка. Тут тоже надо масштабировать.
Код:
 fBufferBitmap.Canvas.MoveTo(round(i*kX),ht-
Объекты - это программные машин состояний они запоминают значения переменных и помнят их до тех пор пока их не изменят. Поэтому нет надобности каждый раз менять цвет в цикле. Выносим из цикла. MoveTo тоже достаточно сделать 1 раз. Метод линии после окончания сохраняет конечную точку в Canvas.PenPos. И будет продолжать рисовать уже от неё.

Код:
  
  fBufferBitmap.Canvas.Pen.Color := clLime; 
  fBufferBitmap.Canvas.MoveTo(0, ht-trunc(((wavebufL[0])/(65535))*ht));
  for i:=0 to length(wavebufL)-1 do
  begin
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/(65535))*ht));
 end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 05.05.2016 в 13:53.
Pavia вне форума Ответить с цитированием
Старый 05.05.2016, 14:19   #13
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Pavia да, то что надо!) Правда это решило проблему только с отрисовкой ...

Вот текущий результат:

111.jpg

Но он совсем не похож, на тот, что в первом посте. (Аудио файл один и тот же)

Т.е. данные я все таки беру неправильные.
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 14:29   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну добавьте сглаживание/интерполяцию + отзеркальте...
p51x вне форума Ответить с цитированием
Старый 05.05.2016, 14:35   #15
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Возможно что я в принципе неправильно данные беру из wav файла.

Код:
  if BASS_ChannelIsActive(strs) = BASS_ACTIVE_PLAYING then
  begin
    BASS_ChannelGetData(strs, @WaveOscil, BASS_DATA_FFT512 or BASS_DATA_FFT_INDIVIDUAL);
  end;

  SetLength(ArrWaveL,256);
  SetLength(ArrWaveR,256);

  for j := 0 to Length(ArrWaveL)-1 do
  begin
      L := SmallInt(LOword(WaveOscil[j][0]));
      R := SmallInt(HIword(WaveOscil[j][1]));

        wavebufL[j] := abs(L);
        wavebufR[j] := abs(R);
  end;
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 14:57   #16
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Взял другую процедуру. Эффект от нее получше, но есть над чем поработать.

Код:
procedure TForm1.ScanPeaks;
var
  cpos,level : DWord;
  peak : array[0..1] of DWORD;
  position : DWORD;
  counter : integer;

begin
  cpos := 0;
  peak[0] := 0;
  peak[1] := 0;
  counter := 0;

  while not fKillscan do
  begin
    level := BASS_ChannelGetLevel(fDecoder); // scan peaks

    if (peak[0]<LOWORD(level)) then
      peak[0]:=LOWORD(level); // set left peak

		if (peak[1]<HIWORD(level)) then
      peak[1]:=HIWORD(level); // set right peak

    if BASS_ChannelIsActive(fDecoder) <> BASS_ACTIVE_PLAYING then
    begin
      position := cardinal(-1); // reached the end
		end else
      position := BASS_ChannelGetPosition(fDecoder,BASS_POS_BYTE) div fBPP ;

    if position > cpos then
    begin
      inc(counter);
      if counter <= length(wavebufL)-1 then
      begin
        wavebufL[counter] := peak[0];
        wavebufR[counter] := peak[1];
      end;

      if (position >= DWORD(Image1.Width)) then
        fKillscan:=true;

        cpos := position;
     end;
    peak[0] := 0;
    peak[1] := 0;
  end;  
end;
Она работает более правильно! Но в ней есть один недостаток - слишком мало отчетов.

Например если применить эту процедуру к проверочному wav файлу, результат будет следующий:

111.jpg

Форма огибающей уже напоминает образец.
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 15:01   #17
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Кстати говоря. Раньше уже встречался с таким артефактом, но не помню как с ним бороться. Как избавиться от линии ?

Рисую так сейчас:

Код:
procedure TForm1.Draw_Spectrum;
var
  i,ht : integer;
begin
  //load background
  fBufferBitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+'\img\fon2.bmp');

  kX := Image1.Width / length(wavebufL);
  //draw peaks
  ht := Image1.Height div 2;

  fBufferBitmap.Canvas.Pen.Color := clLime;
  fBufferBitmap.Canvas.MoveTo(0,ht-trunc(((wavebufL[0])/(65535))*ht));
  fBufferBitmap.Canvas.MoveTo(0,ht-trunc(((wavebufR[0]*-1)/(65535))*ht));

  for i:=0 to length(wavebufL) do
  begin
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/65535)*ht));
  end;

  for i:=0 to length(wavebufR) do
  begin
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufR[i+1]*-1)/65535)*ht));
  end;
end;
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 15:21   #18
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

По поводу линии.
Код:
  fBufferBitmap.Canvas.MoveTo(0,ht-trunc(((wavebufL[0])/(65535))*ht));
  for i:=0 to length(wavebufL) do
    begin
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufL[i+1])/65535)*ht));
    end;

  fBufferBitmap.Canvas.MoveTo(0,ht-trunc(((wavebufR[0]*-1)/(65535))*ht));

  for i:=0 to length(wavebufR) do
    begin
    fBufferBitmap.Canvas.LineTo(round(i*kX),ht-trunc(((wavebufR[i+1]*-1)/65535)*ht));
    end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 05.05.2016, 15:26   #19
DenProx
Форумчанин
 
Аватар для DenProx
 
Регистрация: 23.11.2009
Сообщений: 191
По умолчанию

Pavia ага, спасибо!)

Вот такой результат получился:

111.jpg


Оригинал:

spektr.jpg
Чаще всего, у большенства людей, поиск Истины заканчивается набором слова в Гугле
DenProx вне форума Ответить с цитированием
Старый 05.05.2016, 17:40   #20
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А для чего вам ЦОС? Хоби, учёба, работа?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка WAV файла Karateka Общие вопросы Delphi 11 12.07.2014 22:03
Создание Wav-файла DelhiProgramer Мультимедиа в Delphi 1 13.08.2012 14:14
декомпиляция Wav файла DzetaHunter Общие вопросы Delphi 3 14.01.2011 13:17
Анализ Wav файла lacost Общие вопросы по Java, Java SE, Kotlin 4 17.12.2010 12:09
Воспроизведение WAV файла komp324 Общие вопросы Delphi 1 24.06.2008 12:43