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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2009, 23:25   #1
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
Смущение Помощь с BASS, сигналом и выводом графики

Код:
var
  Level: DWORD:
begin
  Level := BASS_ChannelGetLevel(Channel);
end;
Нужно сделать на основе этого визуализацию. Итак есть окружность. Чем сигнал выше, тем радиус больше. Чем сигнал ниже, тем радиус меньше. Тоесть как бы эффект динамика такой . Подскажите, в каком направлении копать или поделитесь вариантом решения этой проблемы. Заранее спасибо.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 21.09.2009, 00:32   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Т.е. в переменной Level у тебя уже готовое значение? Тогда сначала посмотри какой у него примерно диапазон, в лейбел выведи временно например. А потом высчитай коэффициент, чтобы окружность приемлемых размеров получалась, и с помощью Ellipse рисуй, перед отрисовкой затирай предыдущую - FillRect(ClipRect). Буфер используй чтобы не мерцало (затирай в буфере, на видимую канву рисуй буфер целиком). Я так вкратце, если что не ясно, спрашивай.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.09.2009, 08:31   #3
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

вот пример с анализатором в виде полос

Код:
type
  fftdata = array[1..256] of single;
var
  data: fftdata;
  i, n: integer;
  level: cardinal;
  levelL, levelR: byte;
begin
  level := BASS_ChannelGetLevel(chan);
  levelL := loword(level) * 100 div (maxword div 2); 
  levelR := hiword(level) * 100 div (maxword div 2);

  Bass_ChannelGetData(chan, @data, BASS_DATA_FFT512);

  with PaintBox1 do
  begin
    Canvas.FillRect(rect(0, 0, paintbox1.width, paintbox1.height));
    Canvas.Pen.Color := clBlack;
    for i := 1 to 256 do begin
      n := round(data[i] * 100);
      PaintBox1.Canvas.MoveTo(i, 100);
      PaintBox1.Canvas.LineTo(i, 100 - n);
    end;
    Canvas.Rectangle(258, 100, 266, 100 - levelL);
    Canvas.Rectangle(268, 100, 276, 100 - levelR);
  end;
end;

Последний раз редактировалось ZuBy; 21.09.2009 в 08:42.
ZuBy вне форума Ответить с цитированием
Старый 21.09.2009, 08:57   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

вот сделал пример:

Код:
var
  Level: DWORD;
  left, right: Integer;
  PP: Single;
begin
  Level := Bass_ChannelGetLevel(chan);

  left := LOWORD(Level);
  right := HiWord(Level);
  PP := Left / 900;
  PaintBox1.Canvas.Rectangle((120 div 2) - Round(PP), 5, 120 div 2, 10);
  PP := Right / 900;
  PaintBox1.Canvas.Rectangle(120 div 2, 5, (120 div 2) + Round(PP), 10);
ZuBy вне форума Ответить с цитированием
Старый 21.09.2009, 14:08   #5
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Это надо будет переделать под окружность, а не под прямоугольник. Сейчас буду пытаться.
Манжосов Денис :) вне форума Ответить с цитированием
Старый 21.09.2009, 14:21   #6
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Код:
  
  if Bass_ChannelIsActive(Channel) <> BASS_ACTIVE_PLAYING then exit;

  Level := BASS_ChannelGetLevel(Channel);
  l := HiWord(Level);
  PaintBox3.Canvas.FillRect(PaintBox3.Canvas.ClipRect);
  PaintBox3.Canvas.Pen.Color := clWhite;
  l1 := Round(l / (32786 / PaintBox3.Width));
  PaintBox3.Canvas.Ellipse(PaintBox3.Width div 2 - l1 div 2,
                           PaintBox3.Height div 2 - l1 div 2,
                           PaintBox3.Width div 2 + l1 div 2,
                           PaintBox3.height div 2 + l1 div 2);
Рабочий код. Спасибо, mutabor за направление на путь истинный

Последний раз редактировалось Манжосов Денис :); 21.09.2009 в 17:14. Причина: Более полный вариант
Манжосов Денис :) вне форума Ответить с цитированием
Старый 12.01.2011, 14:40   #7
Серего
 
Регистрация: 05.01.2011
Сообщений: 5
По умолчанию

а как с помощью bass узнать частоту звука? чтоб прям посекундно мне частоту писало?
Серего вне форума Ответить с цитированием
Старый 12.01.2011, 15:25   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)зачем некропостим?
2)зачем лезем в чужую тему?
3)в вашей теме вам сказали где смотреть(спектроанализатор).
примеры всего этого есть, нужно лишь не ленится.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bass Dr.Badnezz Мультимедиа в Delphi 3 20.09.2011 20:57
bass.dll larry Общие вопросы C/C++ 1 09.11.2009 13:23
bass.dll Elem Мультимедиа в Delphi 18 19.07.2009 11:04
BASS Визуализация Garacio_cain Мультимедиа в Delphi 2 14.08.2008 00:19
Помощь с выводом в файл FatalX Помощь студентам 1 14.07.2008 19:23