1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:57:45 +00:00

Piano: Add track Volume and improve QOL

This patch implements a couple of enhancements to the synthesizer
engine:

* Each track has a volume control.
* The input and tooltips for all controls are improved.
* The noise channel is pitched, which allows for basic drum synthesis.
This commit is contained in:
kleines Filmröllchen 2021-04-21 20:32:21 +02:00 committed by Andreas Kling
parent 418bc484e4
commit d77e7e99e4
5 changed files with 87 additions and 39 deletions

View file

@ -1,6 +1,7 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2019-2020, William McPherson <willmcpherson2@gmail.com>
* Copyright (c) 2021, kleines Filmröllchen <malu.bertsch@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -25,6 +26,7 @@ public:
const Vector<Audio::Frame>& recorded_sample() const { return m_recorded_sample; }
const SinglyLinkedList<RollNote>& roll_notes(int note) const { return m_roll_notes[note]; }
int wave() const { return m_wave; }
int volume() const { return m_volume; }
int attack() const { return m_attack; }
int decay() const { return m_decay; }
int sustain() const { return m_sustain; }
@ -38,6 +40,7 @@ public:
void set_roll_note(int note, u32 on_sample, u32 off_sample);
void set_wave(int wave);
void set_wave(Direction);
void set_volume(int volume);
void set_attack(int attack);
void set_decay(int decay);
void set_sustain(int sustain);
@ -49,7 +52,7 @@ private:
Audio::Frame saw(size_t note);
Audio::Frame square(size_t note);
Audio::Frame triangle(size_t note);
Audio::Frame noise() const;
Audio::Frame noise(size_t note);
Audio::Frame recorded_sample(size_t note);
void sync_roll(int note);
@ -62,9 +65,12 @@ private:
u8 m_note_on[note_count] { 0 };
double m_power[note_count] { 0 };
double m_pos[note_count]; // Initialized lazily.
// Synths may use this to keep track of the last wave position
double m_last_w[note_count] { 0 };
Envelope m_envelope[note_count] { Done };
int m_wave { first_wave };
int m_volume;
int m_attack;
double m_attack_step;
int m_decay;