MusicSpectrum  1.0.0
Referência da Classe Spectrum

#include <spectrum.hpp>

Membros Públicos

void run (std::function< void(std::vector< Float_Complex >, std::size_t)> handlePlot)
 
void viewWaveform ()
 Renderiza a forma de onda do sinal de áudio utilizando linhas. Mais...
 
void viewWaveformFFT ()
 Renderiza a FFT do sinal de áudio utilizando linhas. Mais...
 
void viewWaveformRect ()
 Renderiza a forma de onda do sinal de áudio utilizando retângulo. Mais...
 
void viewWaveformRectFFT ()
 Renderiza a FFT do sinal de áudio utilizando retângulos. Mais...
 
 Spectrum (std::shared_ptr< sf::RenderWindow > win, std::shared_ptr< HUD > hud, std::shared_ptr< FFT< sf::Int16 >> fft)
 

Atributos Privados

std::shared_ptr< sf::RenderWindow > window
 
std::shared_ptr< HUDhud_ptr
 
std::shared_ptr< FFT< sf::Int16 > > fft_ptr
 
std::unique_ptr< Timertimer_ptr
 
std::unique_ptr< Samplesample_ptr
 
float gravity_velocity = 0.001f
 
const float gravity_acceleration = 9.81f
 
sf::Color start_color = sf::Color::Blue
 
sf::Color end_color = sf::Color::Magenta
 
std::vector< sf::RectangleShape > rectangles
 

Descrição detalhada

Esta classe visualiza a forma de onda de um sinal de áudio utilizando retângulos coloridos. Ela também pode renderizar a FFT do sinal.

A classe Spectrum utiliza bibliotecas como SFML e FFT para processar e renderizar a forma de onda do áudio fornecido. Ela interage com outras classes como HUD e Sample para auxiliar na exibição e processamento dos dados.

Construtores e Destrutores

◆ Spectrum()

Spectrum::Spectrum ( std::shared_ptr< sf::RenderWindow >  win,
std::shared_ptr< HUD hud,
std::shared_ptr< FFT< sf::Int16 >>  fft 
)

Construtor da classe Spectrum.

  • win: Ponteiro compartilhado para a janela renderizada pelo SFML.
  • hud: Ponteiro compartilhado para a classe HUD.
  • fft: Ponteiro compartilhado para a classe FFT.
13  : window(win), hud_ptr(hud), fft_ptr(fft),
14  timer_ptr(std::make_unique<Timer>()),
15  sample_ptr(std::make_unique<Sample>(hud)) {}
std::unique_ptr< Timer > timer_ptr
Definition: spectrum.hpp:28
std::shared_ptr< FFT< sf::Int16 > > fft_ptr
Definition: spectrum.hpp:26
std::unique_ptr< Sample > sample_ptr
Definition: spectrum.hpp:29
std::shared_ptr< sf::RenderWindow > window
Definition: spectrum.hpp:24
std::shared_ptr< HUD > hud_ptr
Definition: spectrum.hpp:25

Funções membros

◆ run()

void Spectrum::run ( std::function< void(std::vector< Float_Complex >, std::size_t)>  handlePlot)

Executa o loop principal da aplicação, processando e renderizando a forma de onda ou FFT do sinal de áudio. A função de callback handlePlot é utilizada para tratar os dados do plot (forma de onda ou FFT).

handlePlot: Função callback para processar os dados do plot (forma de onda ou FFT).

27  {
28  sample_ptr->processStereoToMono();
29  std::vector<Float_Complex> spectrum;
30 
31  if (hud_ptr->sound.getStatus() == sf::SoundSource::Playing) {
32  sample_ptr->getSampleBuffer();
33 
34  std::size_t fft_size = 1;
35  while (fft_size < buffer_size) {
36  fft_size *= 2;
37  }
38 
39  spectrum.resize(fft_size, 0);
40 
41  handlePlot(spectrum, fft_size);
42  }
43 
44  std::this_thread::sleep_for(std::chrono::milliseconds(10));
45 }
const size_t buffer_size
Definition: hud.hpp:13

◆ viewWaveform()

void Spectrum::viewWaveform ( )

Renderiza a forma de onda do sinal de áudio utilizando linhas.

4  {
5  sf::VertexArray waveform(sf::LineStrip, buffer_size);
6  float offsetY = HEIGHT / 2.f;
7 
8  for (std::size_t i = 0; i < buffer_size; ++i) {
9  sf::Int16 sample_value = hud_ptr->sample_buffer[i];
10  float normalized_value = static_cast<float>(sample_value) / 32767.f;
11  waveform[i].position = sf::Vector2f(
12  static_cast<float>(i), normalized_value * offsetY + offsetY);
13 
14  float milliseconds = timer_ptr->elapsed() / 1000;
15  float interval = milliseconds / 80.0f;
16 
17  float t = interval + (static_cast<float>(i) / buffer_size);
18  t = t - static_cast<int>(t);
19 
20  sf::Color vertex_color(
21  static_cast<sf::Uint8>(start_color.r * (1 - t) + end_color.r * t),
22  static_cast<sf::Uint8>(start_color.g * (1 - t) + end_color.g * t),
23  static_cast<sf::Uint8>(start_color.b * (1 - t) + end_color.b * t));
24 
25  waveform[i].color = vertex_color;
26  }
27 
28  window->draw(waveform);
29 }
sf::Color start_color
Definition: spectrum.hpp:35
sf::Color end_color
Definition: spectrum.hpp:36
const int HEIGHT
Definition: hud.hpp:10

◆ viewWaveformFFT()

void Spectrum::viewWaveformFFT ( )

Renderiza a FFT do sinal de áudio utilizando linhas.

32  {
33  sf::VertexArray waveform(sf::LineStrip, buffer_size);
34  float centerY = HEIGHT - 10.f;
35 
36  for (std::size_t i = 0; i < buffer_size; ++i) {
37  float amplitude = std::abs(hud_ptr->sample_buffer[i]) / 32767.f;
38  float offsetY = amplitude * HEIGHT;
39  waveform[i].position =
40  sf::Vector2f(static_cast<float>(i), centerY - offsetY);
41 
42  float t = static_cast<float>(i) / buffer_size;
43  sf::Color vertex_color(
44  static_cast<sf::Uint8>(start_color.r * (1 - t) + end_color.r * t),
45  static_cast<sf::Uint8>(start_color.g * (1 - t) + end_color.g * t),
46  static_cast<sf::Uint8>(start_color.b * (1 - t) + end_color.b * t));
47 
48  waveform[i].color = vertex_color;
49  }
50 
51  window->draw(waveform);
52 }

◆ viewWaveformRect()

void Spectrum::viewWaveformRect ( )

Renderiza a forma de onda do sinal de áudio utilizando retângulo.

4  {
5  float rect_width = 3.0f;
6  float rect_spacing = 1.f;
7  float offsetY = HEIGHT / 2.f;
8 
9  for (std::size_t i = 0; i < buffer_size - 1; i += 5) {
10  sf::Int16 sample_value = hud_ptr->sample_buffer[i];
11  float normalized_value = static_cast<float>(sample_value) / 32767.f;
12 
13  float rect_height = normalized_value * 150;
14 
15  float t = static_cast<float>(i * 4) / buffer_size;
16  t = t * t * (3.0f - 2.0f * t);
17  sf::Color vertex_color(
18  static_cast<sf::Uint8>(start_color.r * (1 - t) + end_color.r * t),
19  static_cast<sf::Uint8>(start_color.g * (1 - t) + end_color.g * t),
20  static_cast<sf::Uint8>(start_color.b * (1 - t) + end_color.b * t));
21 
22  sf::RectangleShape rectangle(sf::Vector2f(rect_width, rect_height));
23  rectangle.setFillColor(vertex_color);
24 
25  rectangle.setPosition(static_cast<float>(i) *
26  (rect_width + rect_spacing),
27  offsetY - rect_height);
28  window->draw(rectangle);
29  }
30 }

◆ viewWaveformRectFFT()

void Spectrum::viewWaveformRectFFT ( )

Renderiza a FFT do sinal de áudio utilizando retângulos.

33  {
34  float rect_width = 3.f;
35  float centerY = HEIGHT - 10.f;
36  static std::vector<float> prev_amplitudes(buffer_size, 0.0f);
37 
38  for (std::size_t j = 0; j < buffer_size - 1; j += 6) {
39  float amplitude = std::abs(hud_ptr->sample_buffer[j]) / 32767.f;
40  float rect_height = amplitude * HEIGHT;
41 
42  sf::RectangleShape rectangle(sf::Vector2f(rect_width, rect_height));
43 
44  float t = static_cast<float>(j * 3) / buffer_size;
45  t = t * t * (3.0f - 2.0f * t);
46  sf::Color vertex_color(
47  static_cast<sf::Uint8>(start_color.r * (1 - t) + end_color.r * t),
48  static_cast<sf::Uint8>(start_color.g * (1 - t) + end_color.g * t),
49  static_cast<sf::Uint8>(start_color.b * (1 - t) + end_color.b * t));
50 
51  rectangle.setFillColor(vertex_color);
52  sf::Vector2f position(j * rect_width, centerY - rect_height);
53  rectangle.setPosition(position);
54 
55  window->draw(rectangle);
56 
57  sf::RectangleShape gravity_rect(sf::Vector2f(10.f, 5.f));
58  gravity_rect.setFillColor(vertex_color);
59  sf::Vector2f rect_pos = sf::Vector2f(
60  position.x + (rect_width - 10.f) / 2, position.y - 5.f);
61 
63  rect_pos.y += gravity_velocity;
64 
65  if (rect_pos.y > centerY - 5.f) {
66  rect_pos.y = centerY - 5.f;
68  }
69 
70  gravity_rect.setPosition(rect_pos);
71 
72  window->draw(gravity_rect);
73  }
74 }
const float gravity_acceleration
Definition: spectrum.hpp:33
float gravity_velocity
Definition: spectrum.hpp:32

Atributos

◆ end_color

sf::Color Spectrum::end_color = sf::Color::Magenta
private

◆ fft_ptr

std::shared_ptr<FFT<sf::Int16> > Spectrum::fft_ptr
private

◆ gravity_acceleration

const float Spectrum::gravity_acceleration = 9.81f
private

◆ gravity_velocity

float Spectrum::gravity_velocity = 0.001f
private

◆ hud_ptr

std::shared_ptr<HUD> Spectrum::hud_ptr
private

◆ rectangles

std::vector<sf::RectangleShape> Spectrum::rectangles
private

◆ sample_ptr

std::unique_ptr<Sample> Spectrum::sample_ptr
private

◆ start_color

sf::Color Spectrum::start_color = sf::Color::Blue
private

◆ timer_ptr

std::unique_ptr<Timer> Spectrum::timer_ptr
private

◆ window

std::shared_ptr<sf::RenderWindow> Spectrum::window
private

A documentação para essa classe foi gerada a partir dos seguintes arquivos: