Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.08.2012, 14:31
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Гистограмма WAV файла

Здравствуйте! Помогите разобраться! Как по звуковым ординатам построить гистограмму WAV? В сети ничего не нашел. Кто может разъяснить что-нибудь по этому поводу. Что из себя представляют ординаты? Как построить по ним график в Delphi?
Ответить с цитированием
  #2  
Старый 27.08.2012, 14:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Здравствуйте! Помогите разобраться! Как по звуковым ординатам построить гистограмму WAV? В сети ничего не нашел. Кто может разъяснить что-нибудь по этому поводу. Что из себя представляют ординаты? Как построить по ним график в Delphi?
Я не знаю, что такое "звуковые ординаты", но в математике "ординатой" называется координата по оси Y. Координата по оси X называется "абсцисса", а в трёхмерном пространстве координата по оси Z называется "аппликата".
Ответить с цитированием
  #3  
Старый 27.08.2012, 14:46
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

>offtop Ну, немного ТС и прав - ведь для построения гистограммы нужны значения амплитуды звука, а она, как правило, является параметром по оси Y-ординат.
А для построения гистограммы очень просто - читаешь файл, снимаешь значения, производишь квантирование (шаг гистограммы), и рисуешь на канве прямоугольниками.
Ответить с цитированием
  #4  
Старый 27.08.2012, 15:12
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от YVitaliy
>offtop Ну, немного ТС и прав - ведь для построения гистограммы нужны значения амплитуды звука, а она, как правило, является параметром по оси Y-ординат.
А для построения гистограммы очень просто - читаешь файл, снимаешь значения, производишь квантирование (шаг гистограммы), и рисуешь на канве прямоугольниками.
Значения амплитуды звука считываются, об этом poli-smen знает. Они содержатся в том массиве WavInfo.Samples[I - 1, J - 1], если я не ошибаюсь. А теперь можно по-подробнее про то, как связать график и значения массива. И можно ли его построить в Bar chart?
Ответить с цитированием
  #5  
Старый 27.08.2012, 15:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

В этом массиве значения в попугаях. В свое время разбирался, так и не понял откуда начинается минимум и заканчивается максимум.
Если кто поянит - буду благодарен
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 27.08.2012, 15:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да, строй его в TChart
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 27.08.2012, 15:27
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от NumLock
да, строй его в TChart
Может хоть кто нибудь объяснит как примерно это сделать?
Ответить с цитированием
  #8  
Старый 27.08.2012, 15:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

"c:\Program Files\Borland\Delphi7\Demos\TeeChart\teedemo.dpr"
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 27.08.2012, 15:43
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Я не знаю, что такое "звуковые ординаты", но в математике "ординатой" называется координата по оси Y. Координата по оси X называется "абсцисса", а в трёхмерном пространстве координата по оси Z называется "аппликата".
Может вы подробнее расскажите как осуществить задуманное? Вы же полностью знаете ты программу-читалку wav. Как связать данные и передать их для построения графика?
Ответить с цитированием
  #10  
Старый 27.08.2012, 16:51
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Может вы подробнее расскажите как осуществить задуманное? Вы же полностью знаете ты программу-читалку wav. Как связать данные и передать их для построения графика?
С TChart не работал - не подскажу. А вот если рисовать на канве, то вот так можно рисовать гистограму:
Код:
var
  WavInfo: TWavInfo;
  KX, KY: Extended;
  i, X, Y, DY, Chanel: Integer;
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;

  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);

    Canvas.MoveTo(X, DY);
    Canvas.LineTo(X, Y);
  end;
end;
В этом примере рисуется прямо на форме, но можно переделать и на TPaintBox, на TBitmap и т.п.

А вот так можно рисовать обычную волну:
Код:
var
  WavInfo: TWavInfo;
  KX, KY: Extended;
  i, X, Y, DY, Chanel: Integer;
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;

  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);

    if i = Low(WavInfo.Samples)
      then Canvas.MoveTo(X, Y)
      else Canvas.LineTo(X, Y);
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (27.08.2012)
  #11  
Старый 27.08.2012, 16:56
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
С TChart не работал - не подскажу. А вот если рисовать на канве, то вот так можно рисовать гистограму:
Код:
var
  WavInfo: TWavInfo;
  KX, KY: Extended;
  i, X, Y, DY, Chanel: Integer;
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;

  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);

    Canvas.MoveTo(X, DY);
    Canvas.LineTo(X, Y);
  end;
end;
В этом примере рисуется прямо на форме, но можно переделать и на TPaintBox, на TBitmap и т.п.

А вот так можно рисовать обычную волну:
Код:
var
  WavInfo: TWavInfo;
  KX, KY: Extended;
  i, X, Y, DY, Chanel: Integer;
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;

  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);

    if i = Low(WavInfo.Samples)
      then Canvas.MoveTo(X, Y)
      else Canvas.LineTo(X, Y);
  end;
end;
Класс! Какой полезный код. спасибо!!!!!!
Ответить с цитированием
  #12  
Старый 27.08.2012, 17:30
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

А как задать расположение канвы на форме?, да еще и на определенном PageControl1?
Ответить с цитированием
  #13  
Старый 27.08.2012, 17:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
А как задать расположение канвы на форме?, да еще и на определенном PageControl1?
Используй для этого компонент TPaintBox.
Ответить с цитированием
  #14  
Старый 27.08.2012, 17:50
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Используй для этого компонент TPaintBox.
Чего-то оно не рисуется...
Код:
procedure TForm1.Button_WAVgraphClick(Sender: TObject);
var
  WavInfo: TWavInfo;
  KX, KY: Extended;
  i, X, Y, DY, Chanel: Integer;
begin
  with PaintBox1, canvas do
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;

  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);

    PaintBox1.Canvas.MoveTo(X, DY);
    PaintBox1.Canvas.LineTo(X, Y);
  end;
end;
end;
Ответить с цитированием
  #15  
Старый 27.08.2012, 18:17
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Код:
with PaintBox1, canvas do
begin
  KX := 1; // Коэффициент пропорциональности по абсциссе
  KY := 0.01; // Коэффициент пропорциональности по ординате
  DY := Height div 2; // Смещение по ординате
  Chanel := 0; // Номер рисуемого канала
  Repaint;
 
  for i := Low(WavInfo.Samples) to High(WavInfo.Samples) do
  begin
    X := Trunc(KX * i);
    Y := Trunc(KY * Smallint(WavInfo.Samples[i, Chanel]) + DY);
 
    PaintBox1.Canvas.MoveTo(X, DY);
    PaintBox1.Canvas.LineTo(X, Y);
  end;
end;
with PaintBox1, canvas нужно не "запятая", а "точка" и зачем использовать with, если потом все равно обращение?
Код:
PaintBox1.Canvas.MoveTo(X, DY);
    PaintBox1.Canvas.LineTo(X, Y)
сам PaintBox1 должен лежать (или создаваясь динамически, быть дочерним по отношению)
Цитата:
на определенном PageControl1

рисовать (выводить рисунок) в событии PaintBox1.OnPaint
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter