The lifecycle every percussion voice shares. More...
#include <voice.hpp>
Public Member Functions | |
| virtual | ~Voice ()=default |
| Voice ()=default | |
| Voice (const Voice &)=delete | |
| Voice & | operator= (const Voice &)=delete |
| void | prepare (double sample_rate) |
| Fixes the sample rate and clears all state. | |
| void | reset () |
| Silences the voice immediately, without a fade. | |
| void | note_on (float velocity) |
| Starts a hit. velocity is in [0, 1]; values outside are clamped. | |
| void | choke (float fade_ms=4.0f) |
| Fades the voice out over fade_ms and then silences it. | |
| bool | is_active () const |
| Whether the voice still has something to render. | |
| VoiceState | state () const |
| float | velocity () const |
| double | sample_rate () const |
| virtual int | latency_samples () const noexcept |
| Fixed host-rate delay introduced by this voice's selected output quality. | |
| virtual OutputOversampling | output_oversampling () const noexcept |
| Output quality at the generic voice boundary. | |
| virtual void | set_output_oversampling (OutputOversampling) |
| virtual OutputStage * | output_stage () noexcept |
| The terminal saturation and degradation stage, at the generic voice boundary. | |
| const OutputStage * | output_stage () const noexcept |
| void | set_velocity_response (const VelocityResponse &r) |
| const VelocityResponse & | velocity_response () const |
| void | process (float *out, int num_samples) |
| Adds num_samples of this voice's output into out. | |
| void | process_stereo (float *left, float *right, int num_samples) |
| Adds a stereo rendering to left and right. | |
Protected Member Functions | |
| virtual void | on_prepare (double sample_rate)=0 |
| Sizes buffers and fixes coefficients. | |
| virtual void | on_reset ()=0 |
| Clears every piece of state the voice carries, so is_active() becomes false and the next render starts from silence. | |
| virtual void | on_note_on (float velocity)=0 |
| Starts a hit at the given velocity, already clamped to [0, 1]. | |
| virtual bool | on_is_active () const =0 |
| virtual void | render_add (float *out, int num_samples)=0 |
| Adds the voice's output into out. Must add, never assign. | |
| virtual void | render_add_stereo (float *left, float *right, int num_samples) |
| Optional stereo realization. | |
The lifecycle every percussion voice shares.
Three parts of that lifecycle are implemented here rather than left to each voice, because each of them is a correctness rule that is easy to get subtly wrong in a way nobody notices until a specific arrangement exposes it:
A voice implements the four on_* hooks and render_add. It must not override the public methods; they carry the rules above.
RT contract: prepare() may allocate in a derived voice; everything else, including process(), note_on(), and choke(), allocates nothing and takes no locks.
|
virtualdefault |
|
default |
|
delete |
|
inline |
Fades the voice out over fade_ms and then silences it.
Used by choke groups; a shorter fade is more abrupt but never clicks the way an instant cut does.
|
inline |
Whether the voice still has something to render.
A kit uses this to skip voices entirely rather than summing silence.
|
inlinevirtualnoexcept |
Fixed host-rate delay introduced by this voice's selected output quality.
Generic registry consumers can report it without recovering the concrete voice type.
Reimplemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inline |
Starts a hit. velocity is in [0, 1]; values outside are clamped.
|
protectedpure virtual |
Implemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
protectedpure virtual |
Starts a hit at the given velocity, already clamped to [0, 1].
Implemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
protectedpure virtual |
Sizes buffers and fixes coefficients.
The only hook allowed to allocate.
Implemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
protectedpure virtual |
Clears every piece of state the voice carries, so is_active() becomes false and the next render starts from silence.
Implemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inlinevirtualnoexcept |
Output quality at the generic voice boundary.
Kits use this surface to keep every registered path on one latency contract.
Reimplemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inlinenoexcept |
|
inlinevirtualnoexcept |
The terminal saturation and degradation stage, at the generic voice boundary.
A registry consumer reaches it without recovering the concrete voice type, so adding an engine cannot desynchronise a downcast from the engine it was selected for. A voice that ends without one returns nullptr.
Reimplemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inline |
Fixes the sample rate and clears all state.
The only method a derived voice may allocate in.
|
inline |
Adds num_samples of this voice's output into out.
|
inline |
Adds a stereo rendering to left and right.
Voices that do not provide a stereo realization are placed in the centre with half their mono signal in each channel, so summing the two channels reproduces process() exactly. A stereo-capable voice may override render_add_stereo, but the shared choke fade remains here.
|
protectedpure virtual |
Adds the voice's output into out. Must add, never assign.
Implemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inlineprotectedvirtual |
Optional stereo realization.
The default is centre-panned and preserves exact mono-sum equivalence.
Reimplemented in pulp::signal::drum::ClapVoice.
|
inline |
Silences the voice immediately, without a fade.
For transport stops and buffer-size changes, where a click cannot be heard because nothing is playing either side of it.
|
inline |
|
inlinevirtual |
Reimplemented in pulp::signal::drum::ClapVoice, pulp::signal::drum::CymbalVoice, pulp::signal::drum::Fm6DrumVoice, pulp::signal::drum::Fm8DrumVoice, pulp::signal::drum::FmDrumVoice, pulp::signal::drum::HatVoice, pulp::signal::drum::KickVoice, pulp::signal::drum::MembraneVoice, pulp::signal::drum::SnareVoice, pulp::signal::drum::StringVoice, pulp::signal::drum::TomVoice, and pulp::signal::drum::ZapVoice.
|
inline |
|
inline |
|
inline |
|
inline |