MusicSpectrum  1.0.0
Referência da Classe Spectrum3D

#include <spectrum3D.hpp>

Membros Públicos

void viewWaveform ()
 Visualiza a forma de onda do sinal de áudio. Mais...
 
void viewWaveformFFT ()
 Visualiza a forma de onda com aplicação da FFT no sinal de áudio. Mais...
 
void getWhellDelta (int w_delta)
 
void run (std::function< void(std::vector< Float_Complex >, std::size_t)> handlePlot)
 
 Spectrum3D (std::shared_ptr< sf::RenderWindow > win, std::shared_ptr< HUD > hud, std::shared_ptr< FFT< sf::Int16 >> fft)
 

Atributos Protegidos

const glm::mat4 view_default_mat
 

Membros Privados

void clear ()
 Limpa a tela. Mais...
 
void initOpenGL ()
 
void handleMouse ()
 Trata o movimento do mouse. Mais...
 
void setupBuffers (GLuint &vao, GLuint &vbo, GLuint &ebo)
 
void bindAndDraw (GLuint vao, GLuint vbo, GLuint ebo, std::vector< glm::vec3 > &vertices, std::vector< GLuint > &indices, GLenum mode)
 

Atributos Privados

std::shared_ptr< sf::RenderWindow > window
 
std::shared_ptr< HUDhud_ptr
 
std::shared_ptr< FFT< sf::Int16 > > fft_ptr
 
std::shared_ptr< Planeplane_ptr
 
std::shared_ptr< MobiusStripmobius_ptr
 
std::shared_ptr< Timertimer_ptr
 
std::unique_ptr< Samplesample_ptr
 
glm::mat4 proj_mat
 
glm::mat4 view_wave_mat
 
glm::mat4 view_wff_mat
 
int whell_delta
 
GLuint vao_wave
 
GLuint vbo_wave
 
GLuint ebo_wave
 
std::shared_ptr< Shadershader_wave_ptr
 
GLuint vao_fft
 
GLuint vbo_fft
 
GLuint ebo_fft
 
std::shared_ptr< Shadershader_wfft_ptr
 

Descrição detalhada

Esta classe renderiza a forma de onda e a FFT de um sinal de áudio.

A classe Spectrum3D utiliza bibliotecas externas como SFML, GLM e OpenGL para realizar a renderização gráfica da forma de onda e da FFT de um sinal de áudio fornecido. Ela também interage com outras classes como HUD, Spectrum e FFT para auxiliar na exibição e processamento dos dados.

Construtores e Destrutores

◆ Spectrum3D()

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

Construtor da classe Spectrum3D.

  • 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  plane_ptr(std::make_shared<Plane>(20.0f, 20.0f, 20)),
15  mobius_ptr(std::make_shared<MobiusStrip>(8.0f, 6.0f, 10)),
16  timer_ptr(std::make_shared<Timer>()),
17  sample_ptr(std::make_unique<Sample>(hud)),
18  proj_mat(
19  glm::perspective(glm::radians(60.0f), 4.0f / 3.0f, 0.1f, 100.0f)),
21 
22  glewExperimental = GL_TRUE;
23  GLenum error = glewInit();
24  if (error != GLEW_OK) {
25  throw std::runtime_error(
26  std::string("Error: ") +
27  reinterpret_cast<const char *>(glewGetErrorString(error)));
28  }
29 
30  if (!window->setActive()) {
31  throw std::runtime_error("Failed to set window to active");
32  }
33 
34  initOpenGL();
35 }
std::shared_ptr< MobiusStrip > mobius_ptr
Definition: spectrum3D.hpp:35
void initOpenGL()
Definition: setup.cpp:15
std::unique_ptr< Sample > sample_ptr
Definition: spectrum3D.hpp:38
glm::mat4 view_wave_mat
Definition: spectrum3D.hpp:41
glm::mat4 proj_mat
Definition: spectrum3D.hpp:40
std::shared_ptr< HUD > hud_ptr
Definition: spectrum3D.hpp:31
std::shared_ptr< Plane > plane_ptr
Definition: spectrum3D.hpp:34
glm::mat4 view_wff_mat
Definition: spectrum3D.hpp:42
std::shared_ptr< FFT< sf::Int16 > > fft_ptr
Definition: spectrum3D.hpp:32
std::shared_ptr< Timer > timer_ptr
Definition: spectrum3D.hpp:37
std::shared_ptr< sf::RenderWindow > window
Definition: spectrum3D.hpp:30
const glm::mat4 view_default_mat
Definition: spectrum3D.hpp:24

Funções membros

◆ bindAndDraw()

void Spectrum3D::bindAndDraw ( GLuint  vao,
GLuint  vbo,
GLuint  ebo,
std::vector< glm::vec3 > &  vertices,
std::vector< GLuint > &  indices,
GLenum  mode 
)
private

Liga o buffer de vértices e o buffer de elementos (EBO) ao VAO especificado, e desenha a geometria utilizando o modo de desenho especificado.

vao: ID do Vertex Array Object (VAO) ao qual os buffers serão ligados. vbo: ID do Vertex Buffer Object (VBO) contendo os vértices a serem desenhados. vertices: Vetor contendo os vértices a serem carregados no VBO. ebo: ID do Element Buffer Object (EBO) contendo os índices de vértices a serem desenhados. indices: Vetor contendo os índices que especificam a ordem dos vértices. mode: Modo de desenho OpenGL (por exemplo, GL_TRIANGLES, GL_LINES, GL_POINTS).

76  {
77  glBindBuffer(GL_ARRAY_BUFFER, vbo);
78  glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(glm::vec3) * vertices.size(),
79  vertices.data());
80 
81  glBindVertexArray(vao);
82 
83  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
84  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * indices.size(),
85  indices.data(), GL_STATIC_DRAW);
86 
87  glDrawElements(mode, indices.size(), GL_UNSIGNED_INT, 0);
88 
89  glBindVertexArray(0);
90 }

◆ clear()

void Spectrum3D::clear ( )
private

Limpa a tela.

4  {
5  glViewport(0, 0, window->getSize().x, window->getSize().y);
6  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
7 }

◆ getWhellDelta()

void Spectrum3D::getWhellDelta ( int  w_delta)

Atualiza o delta do movimento da roda do mouse.

w_delta: Valor do delta do movimento da roda do mouse.

42 { whell_delta = w_delta; }
int whell_delta
Definition: spectrum3D.hpp:45

◆ handleMouse()

void Spectrum3D::handleMouse ( )
private

Trata o movimento do mouse.

93  {
94  std::vector<bool> view_mode = {
95  hud_ptr->option == 5,
96  hud_ptr->option == 6,
97  };
98  static sf::Vector2i prev_pos;
99  static bool first_click = true;
100 
101  if (sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
102  sf::Vector2i curr_pos = sf::Mouse::getPosition();
103  if (first_click) {
104  prev_pos = curr_pos;
105  first_click = false;
106  } else {
107  sf::Vector2i delta = curr_pos - prev_pos;
108  float angle = atan2(delta.y, delta.x);
109 
110  if (view_mode[0]) {
111  view_wff_mat = glm::rotate(view_wff_mat, glm::radians(angle),
112  glm::vec3(1.0f, 1.0f, 0.0f));
113  }
114  if (view_mode[1]) {
115  view_wave_mat = glm::rotate(view_wave_mat, glm::radians(angle),
116  glm::vec3(1.0f, 1.0f, 0.0f));
117  }
118 
119  prev_pos = curr_pos;
120  }
121  } else {
122  first_click = true;
123  }
124 
125  std::vector<float> zoom_factor = {0.5f, 0.5f};
126  if (whell_delta != 0) {
127  std::vector<float> zoom_amount = {
128  1.0f + zoom_factor[0] * abs(whell_delta) / 10.0f,
129  1.0f + zoom_factor[1] * abs(whell_delta) / 10.0f,
130  };
131 
132  if (whell_delta > 0) {
133  if (view_mode[1]) {
134  view_wave_mat =
135  glm::scale(view_wave_mat, glm::vec3(zoom_amount[0]));
136  } else if (view_mode[0]) {
137  view_wff_mat =
138  glm::scale(view_wff_mat, glm::vec3(zoom_amount[1]));
139  }
140  } else if (whell_delta < 0) {
141  if (view_mode[1]) {
142  view_wave_mat =
143  glm::scale(view_wave_mat, glm::vec3(1.0f / zoom_amount[0]));
144  } else if (view_mode[0]) {
145  view_wff_mat =
146  glm::scale(view_wff_mat, glm::vec3(1.0f / zoom_amount[1]));
147  }
148  }
149  whell_delta = 0;
150  }
151 }

◆ initOpenGL()

void Spectrum3D::initOpenGL ( )
private

Realiza a inicialização do OpenGL:

  • Limpa o buffer de tela e define as configurações de profundidade e mistura.
  • Carrega shaders para as formas de onda e FFT.
  • Configura os buffers para desenho das geometrias.
15  {
16  clear();
17 
18  glEnable(GL_DEPTH_TEST);
19  glCullFace(GL_BACK);
20  glEnable(GL_BLEND);
21 
22  glMatrixMode(GL_PROJECTION);
23 
25  std::make_shared<Shader>("./assets/shader/WaveSine.shader");
27  std::make_shared<Shader>("./assets/shader/WaveSineFFT.shader");
28 
31 }
GLuint vbo_wave
Definition: spectrum3D.hpp:48
GLuint vbo_fft
Definition: spectrum3D.hpp:53
std::shared_ptr< Shader > shader_wfft_ptr
Definition: spectrum3D.hpp:55
GLuint ebo_fft
Definition: spectrum3D.hpp:54
std::shared_ptr< Shader > shader_wave_ptr
Definition: spectrum3D.hpp:50
GLuint ebo_wave
Definition: spectrum3D.hpp:49
void setupBuffers(GLuint &vao, GLuint &vbo, GLuint &ebo)
Definition: setup.cpp:41
void clear()
Limpa a tela.
Definition: setup.cpp:4
GLuint vao_wave
Definition: spectrum3D.hpp:47
GLuint vao_fft
Definition: spectrum3D.hpp:52

◆ run()

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

Executa o loop principal da aplicação, renderizando a forma de onda ou FFT e chamando a função de callback para tratar os dados do plot.

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

52  {
53  sample_ptr->processStereoToMono();
54  std::vector<Float_Complex> spectrum;
55 
56  if (hud_ptr->sound.getStatus() == sf::SoundSource::Playing) {
57  sample_ptr->getSampleBuffer();
58 
59  std::size_t fft_size = 1;
60  while (fft_size < buffer_size) {
61  fft_size *= 2;
62  }
63 
64  spectrum.resize(fft_size, 0);
65 
66  handlePlot(spectrum, fft_size);
67  }
68  std::this_thread::sleep_for(std::chrono::milliseconds(10));
69 }
const size_t buffer_size
Definition: hud.hpp:13

◆ setupBuffers()

void Spectrum3D::setupBuffers ( GLuint &  vao,
GLuint &  vbo,
GLuint &  ebo 
)
private

Configuração inicial dos buffers: vao: ID do Vertex Array Object (VAO) ao qual os buffers serão ligados. vbo: ID do Vertex Buffer Object (VBO) contendo os vértices a serem desenhados. ebo: ID do Element Buffer Object (EBO) contendo os índices de vértices a serem desenhados.

41  {
42  glGenVertexArrays(1, &vao);
43  glGenBuffers(1, &vbo);
44  glGenBuffers(1, &ebo);
45 
46  glBindVertexArray(vao);
47 
48  glBindBuffer(GL_ARRAY_BUFFER, vbo);
49  glBufferData(GL_ARRAY_BUFFER,
50  sizeof(glm::vec3) * plane_ptr->genVertices().size(), nullptr,
51  GL_DYNAMIC_DRAW);
52 
53  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3),
54  (void *)0);
55  glEnableVertexAttribArray(0);
56 
57  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
58  glBindBuffer(GL_ARRAY_BUFFER, 0);
59  glBindVertexArray(0);
60 }

◆ viewWaveform()

void Spectrum3D::viewWaveform ( )

Visualiza a forma de onda do sinal de áudio.

4  {
5  float time = timer_ptr->elapsed();
6  float red = sin(time) * 0.5f + 0.5f;
7  float green = 0.5f;
8  float blue = cos(time) * 0.5f + 0.5f;
9 
10  shader_wave_ptr->bind();
11  shader_wave_ptr->setUniform4f("uColor", glm::vec4(red, green, blue, 1.0f));
12 
13  glm::mat4 view_mat_wave = view_default_mat;
14 
15  handleMouse();
16 
17  glm::mat4 mvp = proj_mat * view_mat_wave * view_wave_mat;
18 
19  float angle = time * glm::radians(90.0f);
20  glm::mat4 rotationMatrix =
21  glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f));
22 
23  mvp *= rotationMatrix;
24 
25  shader_wave_ptr->setUniformMat4f("uMVP", mvp);
26 
27  std::vector<GLuint> indices = mobius_ptr->genIndices();
28  std::vector<glm::vec3> vertices = mobius_ptr->genVertices();
29 
30  for (std::size_t i = 0; i < vertices.size(); ++i) {
31  sf::Int16 sample_value = hud_ptr->sample_buffer[i % buffer_size];
32  GLfloat amplitude =
33  std::abs(static_cast<float>(sample_value)) / 32767.f;
34  GLfloat t = hud_ptr->sound_buffer.getDuration().asSeconds();
35 
36  GLfloat frequency = (t != 0) ? 1 / t : 1;
37  GLfloat wave_speed = 0.5f;
38  GLfloat phase = wave_speed * t;
39  GLfloat w = 2 * pi * frequency;
40 
41  glm::vec3 &vertex = vertices[i];
42  vertex.y += (4.5f * amplitude) * std::sin(w * (vertex.x + phase));
43  vertex.y += (2.0f * amplitude) * std::cos(w * (vertex.x * phase));
44  }
45 
46  bindAndDraw(vao_wave, vbo_wave, ebo_wave, vertices, indices, GL_LINE_STRIP);
47 
48  shader_wave_ptr->unbind();
49 }
void handleMouse()
Trata o movimento do mouse.
Definition: setup.cpp:93
void bindAndDraw(GLuint vao, GLuint vbo, GLuint ebo, std::vector< glm::vec3 > &vertices, std::vector< GLuint > &indices, GLenum mode)
Definition: setup.cpp:74
const float pi
Definition: fft.hpp:9

◆ viewWaveformFFT()

void Spectrum3D::viewWaveformFFT ( )

Visualiza a forma de onda com aplicação da FFT no sinal de áudio.

52  {
53  float time = timer_ptr->elapsed();
54  float red = sin(time) * 0.5f + 0.5f;
55  float green = cos(time) * 0.5f + 0.5f;
56  float blue = 0.5f;
57 
58  shader_wfft_ptr->bind();
59  shader_wfft_ptr->setUniform4f("uColor", glm::vec4(red, green, blue, 1.0f));
60 
61  glm::mat4 view_mat_fft = view_default_mat;
62 
63  handleMouse();
64 
65  glm::mat4 mvp = proj_mat * view_mat_fft * view_wff_mat;
66 
67  float angle = time * glm::radians(90.0f);
68  glm::mat4 rotationMatrix =
69  glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f));
70 
71  mvp *= rotationMatrix;
72 
73  shader_wfft_ptr->setUniformMat4f("uMVP", mvp);
74 
75  std::vector<GLuint> indices = plane_ptr->genIndices();
76  std::vector<glm::vec3> vertices = plane_ptr->genVertices();
77 
78  for (std::size_t i = 0; i < vertices.size(); ++i) {
79  sf::Int16 sample_value = hud_ptr->sample_buffer[i % buffer_size];
80  GLfloat amplitude =
81  std::abs(static_cast<float>(sample_value)) / 32767.f;
82  GLfloat t = hud_ptr->sound_buffer.getDuration().asSeconds();
83 
84  glm::vec3 &vertex = vertices[i];
85  GLfloat distance = std::sqrt(vertex.x * vertex.x + vertex.z * vertex.z);
86  GLfloat frequency = (t != 0) ? 1 / t : 1;
87 
88  GLfloat current_time = t - distance;
89  GLfloat w = 2 * pi * frequency;
90  vertex.y = (4.5f * amplitude) * std::cos(w + current_time);
91  }
92 
93  bindAndDraw(vao_fft, vbo_fft, ebo_fft, vertices, indices, GL_LINE_STRIP);
94 
95  shader_wfft_ptr->unbind();
96 }

Atributos

◆ ebo_fft

GLuint Spectrum3D::ebo_fft
private

◆ ebo_wave

GLuint Spectrum3D::ebo_wave
private

◆ fft_ptr

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

◆ hud_ptr

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

◆ mobius_ptr

std::shared_ptr<MobiusStrip> Spectrum3D::mobius_ptr
private

◆ plane_ptr

std::shared_ptr<Plane> Spectrum3D::plane_ptr
private

◆ proj_mat

glm::mat4 Spectrum3D::proj_mat
private

◆ sample_ptr

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

◆ shader_wave_ptr

std::shared_ptr<Shader> Spectrum3D::shader_wave_ptr
private

◆ shader_wfft_ptr

std::shared_ptr<Shader> Spectrum3D::shader_wfft_ptr
private

◆ timer_ptr

std::shared_ptr<Timer> Spectrum3D::timer_ptr
private

◆ vao_fft

GLuint Spectrum3D::vao_fft
private

◆ vao_wave

GLuint Spectrum3D::vao_wave
private

◆ vbo_fft

GLuint Spectrum3D::vbo_fft
private

◆ vbo_wave

GLuint Spectrum3D::vbo_wave
private

◆ view_default_mat

const glm::mat4 Spectrum3D::view_default_mat
protected
Valor inicial:
=
glm::lookAt(glm::vec3(0.0f, 3.0f, 12.0f), glm::vec3(0.0f, 1.5f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f))

◆ view_wave_mat

glm::mat4 Spectrum3D::view_wave_mat
private

◆ view_wff_mat

glm::mat4 Spectrum3D::view_wff_mat
private

◆ whell_delta

int Spectrum3D::whell_delta
private

◆ window

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

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