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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2009, 14:55   #1
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
Вопрос Работа со спектром.

привет всем. Вот разбираю bassplayer и столкнулся с проблемой спектра. Нужно чтоб высота спектра была гдето 300 пикселей а тут вообще маленькая. Вот код спектра который я нашёл в bassplayer(я немного значения поменял):

Код:
procedure TForm1.DisplayFFTBand(Sender: TObject; Bands: TBandOut);
var
   tmpRect, BarRect : TRect;
   j : integer;
begin

 
   BitBlt(GaugeTempBMP.Canvas.Handle, // handle to destination device context
          GaugeRect.Left,	// x-coordinate of destination rectangle's upper-left corner
          GaugeRect.Top,	// y-coordinate of destination rectangle's upper-left corner
          GaugeTempBMP.Width,	
          GaugeTempBMP.Height,	
          BasicBMP.Canvas.Handle, 
          GaugeRect.Left,	 corner
          GaugeRect.Top,	corner
          SRCCOPY);            
 // Substituted Canvas.CopyRect with BitBlt for speed up
 // GaugeTempBMP.Canvas.CopyRect(GaugeRect, BasicBMP.Canvas, GaugeRect);

 // Draw spectrum image to GaugeTempBMP
   for j := 1 to HBlockCount do
   begin
      if Bands[j-1] > VLimit then
         Bands[j-1] := VLimit;

      if Bands[j-1] > 0 then
      begin
     // Copy partial image of DisplayBar to GaugeTempBMP
        BarRect.Left := 0;
        BarRect.Right := BlockWidth;
        BarRect.Top := VLimit - Bands[j-1];
        if BarRect.Top < 0 then
           BarRect.Top := 0;
        BarRect.Bottom := DisplayBar.Height;

        tmpRect.Left := (BlockWidth + HBlockGap) * (j - 1) + 2;
        tmpRect.Right := tmpRect.Left + BlockWidth;
        tmpRect.Top := BarRect.Top;
        tmpRect.Bottom := BarRect.Bottom;

        BitBlt(GaugeTempBMP.Canvas.Handle,
               tmpRect.Left,
               tmpRect.Top,
               BlockWidth,
               tmpRect.Bottom - tmpRect.Top + 1,
               DisplayBar.Canvas.Handle,
               BarRect.Left,
               BarRect.Top,
               SRCCOPY);
      end;

      if Bands[j-1] >= trunc(PeakValue[j]) then
      begin
         PeakValue[j] := Bands[j-1] + 0.01;  // 0.01 : to compensate round off
         PassedCounter[j] := 0;
      end else if Bands[j-1] < trunc(PeakValue[j]) then
      begin
         if trunc(PeakValue[j]) > 0 then
         begin
            with GaugeTempBMP.Canvas do
            begin
            // Draw peak line
               Pen.Color := TColor(RGB(192, 192, 192));   // color for peak line
               MoveTo((BlockWidth + HBlockGap) * (j - 1) + 2, VLimit - trunc(PeakValue[j]));
               LineTo((BlockWidth + HBlockGap) * (j - 1) + 2 + BlockWidth, VLimit - trunc(PeakValue[j]));
            end;

      // Followings are to show simillar spectrum image to WINAMP's
      //  - Put delay time before lowering peak line
      //  - Accerate lowering speed according to the time elapsed
            if PassedCounter[j] >= 8 then
                PeakValue[j] := PeakValue[j] - 0.3 * (PassedCounter[j] - 8);

            if PeakValue[j] < 0 then
               PeakValue[j] := 0
            else
               inc(PassedCounter[j]);
         end;
      end;

   end;

 // Copy GaugeTempBMP's image to GaugePaintBox
   BitBlt(GaugePaintBox.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          GaugeTempBMP.Width,
          GaugeTempBMP.Height,
          GaugeTempBMP.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          SRCCOPY);
Подскажите пожалуйста как :
1.увеличить размер спектра
2. как сделать так чтоб при растягивании формы вверх спектр тоже расстягивался.
3. как сделать чтоб спектр двигался быстрее.
Спасибо.
blackstersl вне форума Ответить с цитированием
Старый 29.04.2009, 14:56   #2
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

вот продожение кода:
Код:
const
// Constants for frequency spectrum visualizzer
 BlockWidth = 13;
   HBlockGap = 1;
   HBlockCount = NumFFTBands;
   VLimit = 50;    // Intensity range : 0 ~ 24
   BackColor = clBlack;
var
   SPS : LongInt;    // sample rate
   NowTracking : boolean;
   BasicBMP : TBitMap;
   GaugeTempBMP : TBitMap;
   DisplayBar: TBitmap;
   GaugeRect : TRect;
   EQGains : TEQGains;
   PeakValue : array[1..NumFFTBands] of single;
   PassedCounter : array[1..NumFFTBands] of integer;

procedure TForm1.CreateBasicImage;
var
   i : integer;
   R, G, B: Integer;
begin
   BasicBMP := TBitMap.Create;
   BasicBMP.Width := (BlockWidth + HBlockGap) * HBlockCount - HBlockGap + 3;
   BasicBMP.Height := vlimit + 1;
   GaugePaintBox.Width := BasicBMP.Width;
   GaugePaintBox.Height := BasicBMP.Height;
   GaugeTempBMP := TBitMap.Create;
   GaugeTempBMP.Width := BasicBMP.Width;
   GaugeTempBMP.Height := BasicBMP.Height;
   GaugeRect.Left := 0;
   GaugeRect.Top := 0;
   GaugeRect.Right := BasicBMP.Width;
   GaugeRect.Bottom := BasicBMP.Height;

   with BasicBMP.Canvas do
   begin
      Brush.Color := BackColor;
      Brush.Style := bsSolid;
      FillRect(Rect(0, 0, BasicBMP.Width, BasicBMP.Height));
      Pen.Color := clBlue;
      Pen.Width := 1;
      Pen.Style := psDot;
      MoveTo(0, 0);
      LineTo(0, BasicBMP.Height);        // Draw Y-axis line
      MoveTo(0, BasicBMP.Height - 1);
      LineTo(BasicBMP.Width, BasicBMP.Height - 1); // Draw X-axis line
   end;

   DisplayBar := TBitmap.Create;
   DisplayBar.PixelFormat := pf32bit;
   DisplayBar.Width := BlockWidth;
   DisplayBar.Height := 300;

   R := 255;
   G := 0;
   B := 0;

   for i := 0 to VLimit - 1 do
   begin
     if i > VLimit / 2 then
        Dec(R, Trunc(256 / VLimit))
     else
        Inc(G, Trunc(768 / VLimit));
     if R < 0 then R := 0;
     if G > 255 then G := 255;
     DisplayBar.Canvas.Brush.Color := TColor(RGB(R, G, B));
     DisplayBar.Canvas.FillRect(Rect(0, i, BlockWidth, i + 1));
   end;


end;

procedure TForm1.ShowBackground;
begin
  BitBlt(GaugePaintBox.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          BasicBMP.Width,
          BasicBMP.Height,
          BasicBMP.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          SRCCOPY);
end;
blackstersl вне форума Ответить с цитированием
Старый 29.04.2009, 23:13   #3
DeDoK
Форумчанин
 
Аватар для DeDoK
 
Регистрация: 05.11.2007
Сообщений: 392
По умолчанию

хм... а чем тебя компонент PaintBox не устраивает? там же и регулируешь. там в демке с визуализацией написано очень понятно.
DeDoK вне форума Ответить с цитированием
Старый 30.04.2009, 16:16   #4
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

я понаходил числа которые мне "как будто" нужны
Код:
BarRect.Left := 0;
        BarRect.Right := BlockWidth;
        BarRect.Top := VLimit - Bands[j-1];
        if BarRect.Top < 0 then
           BarRect.Top := 0;
но он просто увеличил высоту линии. Я бы хотел как в WMP 11, как это осуществить? Спасибо
blackstersl вне форума Ответить с цитированием
Старый 19.10.2009, 17:41   #5
Max_Cohen
Новичок
Джуниор
 
Регистрация: 18.05.2009
Сообщений: 2
Вопрос Я не знаю как решить одну проблему



У меня есть вопрос: А ты откуда взял эти значения?

Можно в теории и примере. Спасибо.

Вот я нашел такой сайт: "http://www.codeproject.com/KB/directx/WM3DSpectrum.aspx". Я ничего не понял

Последний раз редактировалось Max_Cohen; 19.10.2009 в 17:46.
Max_Cohen вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57