Piano: Factor wave rendering to its own function
This commit is contained in:
parent
bc65971df6
commit
6cf4468506
Notes:
sideshowbarker
2024-07-19 10:40:39 +09:00
Author: https://github.com/willmcpherson2 Commit: https://github.com/SerenityOS/serenity/commit/6cf44685064 Pull-request: https://github.com/SerenityOS/serenity/pull/915
2 changed files with 39 additions and 35 deletions
|
@ -20,41 +20,7 @@ void PianoWidget::paint_event(GPaintEvent& event)
|
|||
|
||||
painter.fill_rect(event.rect(), Color::Black);
|
||||
|
||||
auto* samples = m_front_buffer;
|
||||
Color wave_color;
|
||||
switch (m_wave_type) {
|
||||
case WaveType::Sine:
|
||||
wave_color = Color(255, 192, 0);
|
||||
break;
|
||||
case WaveType::Saw:
|
||||
wave_color = Color(240, 100, 128);
|
||||
break;
|
||||
case WaveType::Square:
|
||||
wave_color = Color(128, 160, 255);
|
||||
break;
|
||||
case WaveType::Triangle:
|
||||
wave_color = Color(35, 171, 35);
|
||||
break;
|
||||
case WaveType::Noise:
|
||||
wave_color = Color(197, 214, 225);
|
||||
break;
|
||||
}
|
||||
|
||||
int prev_x = 0;
|
||||
int prev_y = m_height / 2;
|
||||
for (int x = 0; x < m_sample_count; ++x) {
|
||||
double val = samples[x].left;
|
||||
val /= 32768;
|
||||
val *= m_height;
|
||||
int y = ((m_height / 8) - 8) + val;
|
||||
if (x == 0)
|
||||
painter.set_pixel({ x, y }, wave_color);
|
||||
else
|
||||
painter.draw_line({ prev_x, prev_y }, { x, y }, wave_color);
|
||||
prev_x = x;
|
||||
prev_y = y;
|
||||
}
|
||||
|
||||
render_wave(painter);
|
||||
render_piano(painter);
|
||||
render_knobs(painter);
|
||||
render_roll(painter);
|
||||
|
@ -336,6 +302,43 @@ void PianoWidget::mousemove_event(GMouseEvent& event)
|
|||
update();
|
||||
}
|
||||
|
||||
void PianoWidget::render_wave(GPainter& painter)
|
||||
{
|
||||
Color wave_color;
|
||||
switch (m_wave_type) {
|
||||
case WaveType::Sine:
|
||||
wave_color = Color(255, 192, 0);
|
||||
break;
|
||||
case WaveType::Saw:
|
||||
wave_color = Color(240, 100, 128);
|
||||
break;
|
||||
case WaveType::Square:
|
||||
wave_color = Color(128, 160, 255);
|
||||
break;
|
||||
case WaveType::Triangle:
|
||||
wave_color = Color(35, 171, 35);
|
||||
break;
|
||||
case WaveType::Noise:
|
||||
wave_color = Color(197, 214, 225);
|
||||
break;
|
||||
}
|
||||
|
||||
int prev_x = 0;
|
||||
int prev_y = m_height / 2;
|
||||
for (int x = 0; x < m_sample_count; ++x) {
|
||||
double val = m_front_buffer[x].left;
|
||||
val /= 32768;
|
||||
val *= m_height;
|
||||
int y = ((m_height / 8) - 8) + val;
|
||||
if (x == 0)
|
||||
painter.set_pixel({ x, y }, wave_color);
|
||||
else
|
||||
painter.draw_line({ prev_x, prev_y }, { x, y }, wave_color);
|
||||
prev_x = x;
|
||||
prev_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
static int white_key_width = 22;
|
||||
static int white_key_height = 60;
|
||||
static int black_key_width = 16;
|
||||
|
|
|
@ -38,6 +38,7 @@ private:
|
|||
Rect define_roll_note_rect(int column, int row) const;
|
||||
RollNote* find_roll_note_for_relative_position(int x, int y);
|
||||
|
||||
void render_wave(GPainter&);
|
||||
void render_piano_key(GPainter&, int index, PianoKey, const StringView&);
|
||||
void render_piano(GPainter&);
|
||||
void render_knobs(GPainter&);
|
||||
|
|
Loading…
Add table
Reference in a new issue