mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:17:46 +00:00
Piano: Move to LibDSP's Classic synthesizer
Almost all synthesizer code in Piano is removed in favor of the LibDSP reimplementation. This causes some issues that mainly have to do with the way Piano currently handles talking to LibDSP. Additionally, the sampler is gone for now and will be reintroduced with future work.
This commit is contained in:
parent
3ca059da2d
commit
b14a64b3c8
14 changed files with 128 additions and 464 deletions
|
@ -7,7 +7,9 @@
|
|||
|
||||
#include "KnobsWidget.h"
|
||||
#include "MainWidget.h"
|
||||
#include "ProcessorParameterWidget/Slider.h"
|
||||
#include "TrackManager.h"
|
||||
#include <LibDSP/ProcessorParameter.h>
|
||||
#include <LibGUI/BoxLayout.h>
|
||||
#include <LibGUI/Label.h>
|
||||
#include <LibGUI/Slider.h>
|
||||
|
@ -26,11 +28,6 @@ KnobsWidget::KnobsWidget(TrackManager& track_manager, MainWidget& main_widget)
|
|||
|
||||
m_volume_label = m_labels_container->add<GUI::Label>("Volume");
|
||||
m_octave_label = m_labels_container->add<GUI::Label>("Octave");
|
||||
m_wave_label = m_labels_container->add<GUI::Label>("Wave");
|
||||
m_attack_label = m_labels_container->add<GUI::Label>("Attack");
|
||||
m_decay_label = m_labels_container->add<GUI::Label>("Decay");
|
||||
m_sustain_label = m_labels_container->add<GUI::Label>("Sustain");
|
||||
m_release_label = m_labels_container->add<GUI::Label>("Release");
|
||||
|
||||
m_values_container = add<GUI::Widget>();
|
||||
m_values_container->set_layout<GUI::HorizontalBoxLayout>();
|
||||
|
@ -38,11 +35,6 @@ KnobsWidget::KnobsWidget(TrackManager& track_manager, MainWidget& main_widget)
|
|||
|
||||
m_volume_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.current_track().volume()));
|
||||
m_octave_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.octave()));
|
||||
m_wave_value = m_values_container->add<GUI::Label>(wave_strings[m_track_manager.current_track().wave()]);
|
||||
m_attack_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.current_track().attack()));
|
||||
m_decay_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.current_track().decay()));
|
||||
m_sustain_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.current_track().sustain()));
|
||||
m_release_value = m_values_container->add<GUI::Label>(String::number(m_track_manager.current_track().release()));
|
||||
|
||||
m_knobs_container = add<GUI::Widget>();
|
||||
m_knobs_container->set_layout<GUI::HorizontalBoxLayout>();
|
||||
|
@ -74,70 +66,32 @@ KnobsWidget::KnobsWidget(TrackManager& track_manager, MainWidget& main_widget)
|
|||
m_octave_value->set_text(String::number(new_octave));
|
||||
};
|
||||
|
||||
m_wave_knob = m_knobs_container->add<GUI::VerticalSlider>();
|
||||
m_wave_knob->set_tooltip("C: cycle through waveforms");
|
||||
m_wave_knob->set_range(0, last_wave);
|
||||
m_wave_knob->set_value(last_wave - m_track_manager.current_track().wave());
|
||||
m_wave_knob->set_step(1);
|
||||
m_wave_knob->on_change = [this](int value) {
|
||||
int new_wave = last_wave - value;
|
||||
if (m_change_underlying)
|
||||
m_track_manager.current_track().set_wave(new_wave);
|
||||
VERIFY(new_wave == m_track_manager.current_track().wave());
|
||||
m_wave_value->set_text(wave_strings[new_wave]);
|
||||
};
|
||||
|
||||
m_attack_knob = m_knobs_container->add<GUI::VerticalSlider>();
|
||||
m_attack_knob->set_tooltip("Envelope attack in milliseconds");
|
||||
m_attack_knob->set_range(0, attack_max);
|
||||
m_attack_knob->set_value(attack_max - m_track_manager.current_track().attack());
|
||||
m_attack_knob->set_step(25);
|
||||
m_attack_knob->on_change = [this](int value) {
|
||||
int new_attack = attack_max - value;
|
||||
if (m_change_underlying)
|
||||
m_track_manager.current_track().set_attack(new_attack);
|
||||
VERIFY(new_attack == m_track_manager.current_track().attack());
|
||||
m_attack_value->set_text(String::number(new_attack));
|
||||
};
|
||||
|
||||
m_decay_knob = m_knobs_container->add<GUI::VerticalSlider>();
|
||||
m_decay_knob->set_tooltip("Envelope decay in milliseconds");
|
||||
m_decay_knob->set_range(0, decay_max);
|
||||
m_decay_knob->set_value(decay_max - m_track_manager.current_track().decay());
|
||||
m_decay_knob->set_step(25);
|
||||
m_decay_knob->on_change = [this](int value) {
|
||||
int new_decay = decay_max - value;
|
||||
if (m_change_underlying)
|
||||
m_track_manager.current_track().set_decay(new_decay);
|
||||
VERIFY(new_decay == m_track_manager.current_track().decay());
|
||||
m_decay_value->set_text(String::number(new_decay));
|
||||
};
|
||||
|
||||
m_sustain_knob = m_knobs_container->add<GUI::VerticalSlider>();
|
||||
m_sustain_knob->set_tooltip("Envelope sustain level percent");
|
||||
m_sustain_knob->set_range(0, sustain_max);
|
||||
m_sustain_knob->set_value(sustain_max - m_track_manager.current_track().sustain());
|
||||
m_sustain_knob->set_step(25);
|
||||
m_sustain_knob->on_change = [this](int value) {
|
||||
int new_sustain = sustain_max - value;
|
||||
if (m_change_underlying)
|
||||
m_track_manager.current_track().set_sustain(new_sustain);
|
||||
VERIFY(new_sustain == m_track_manager.current_track().sustain());
|
||||
m_sustain_value->set_text(String::number(new_sustain));
|
||||
};
|
||||
|
||||
m_release_knob = m_knobs_container->add<GUI::VerticalSlider>();
|
||||
m_release_knob->set_tooltip("Envelope release in milliseconds");
|
||||
m_release_knob->set_range(0, release_max);
|
||||
m_release_knob->set_value(release_max - m_track_manager.current_track().release());
|
||||
m_release_knob->set_step(25);
|
||||
m_release_knob->on_change = [this](int value) {
|
||||
int new_release = release_max - value;
|
||||
if (m_change_underlying)
|
||||
m_track_manager.current_track().set_release(new_release);
|
||||
VERIFY(new_release == m_track_manager.current_track().release());
|
||||
m_release_value->set_text(String::number(new_release));
|
||||
};
|
||||
for (auto& raw_parameter : m_track_manager.current_track().synth()->parameters()) {
|
||||
// The synth has range and enum parameters
|
||||
switch (raw_parameter.type()) {
|
||||
case LibDSP::ParameterType::Range: {
|
||||
auto& parameter = static_cast<LibDSP::ProcessorRangeParameter&>(raw_parameter);
|
||||
m_synth_values.append(m_values_container->add<GUI::Label>(String::number(static_cast<double>(parameter.value()))));
|
||||
auto& parameter_knob_value = m_synth_values.last();
|
||||
m_synth_labels.append(m_labels_container->add<GUI::Label>(String::formatted("Synth: {}", parameter.name())));
|
||||
m_synth_knobs.append(m_knobs_container->add<ProcessorParameterSlider>(Orientation::Vertical, parameter, parameter_knob_value));
|
||||
break;
|
||||
}
|
||||
case LibDSP::ParameterType::Enum: {
|
||||
// FIXME: We shouldn't do that, but we know the synth and it is nice
|
||||
auto& parameter = static_cast<LibDSP::ProcessorEnumParameter<LibDSP::Synthesizers::Waveform>&>(raw_parameter);
|
||||
// The value is empty for enum parameters
|
||||
m_synth_values.append(m_values_container->add<GUI::Label>(String::empty()));
|
||||
m_synth_labels.append(m_labels_container->add<GUI::Label>(String::formatted("Synth: {}", parameter.name())));
|
||||
auto enum_strings = Vector<String> { "Sine", "Triangle", "Square", "Saw", "Noise" };
|
||||
m_synth_knobs.append(m_knobs_container->add<ProcessorParameterDropdown<LibDSP::Synthesizers::Waveform>>(parameter, move(enum_strings)));
|
||||
m_synth_waveform = static_cast<ProcessorParameterDropdown<LibDSP::Synthesizers::Waveform>&>(m_synth_knobs.last());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& raw_parameter : m_track_manager.current_track().delay()->parameters()) {
|
||||
// FIXME: We shouldn't do that, but we know the effect and it's nice.
|
||||
|
@ -153,10 +107,13 @@ KnobsWidget::~KnobsWidget()
|
|||
{
|
||||
}
|
||||
|
||||
void KnobsWidget::cycle_waveform()
|
||||
{
|
||||
m_synth_waveform->set_selected_index((m_synth_waveform->selected_index() + 1) % m_synth_waveform->model()->row_count());
|
||||
}
|
||||
|
||||
void KnobsWidget::update_knobs()
|
||||
{
|
||||
m_wave_knob->set_value(last_wave - m_track_manager.current_track().wave());
|
||||
|
||||
// FIXME: This is needed because when the slider is changed normally, we
|
||||
// need to change the underlying value, but if the keyboard was used, we
|
||||
// need to change the slider without changing the underlying value.
|
||||
|
@ -164,11 +121,6 @@ void KnobsWidget::update_knobs()
|
|||
|
||||
m_volume_knob->set_value(volume_max - m_track_manager.current_track().volume());
|
||||
m_octave_knob->set_value(octave_max - m_track_manager.octave());
|
||||
m_wave_knob->set_value(last_wave - m_track_manager.current_track().wave());
|
||||
m_attack_knob->set_value(attack_max - m_track_manager.current_track().attack());
|
||||
m_decay_knob->set_value(decay_max - m_track_manager.current_track().decay());
|
||||
m_sustain_knob->set_value(sustain_max - m_track_manager.current_track().sustain());
|
||||
m_release_knob->set_value(release_max - m_track_manager.current_track().release());
|
||||
|
||||
m_change_underlying = true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue