Line data Source code
1 : #pragma once
2 :
3 : #include <atomic>
4 :
5 : #include "audio/engine/i_metronome.h"
6 : #include "common.h"
7 :
8 : namespace Amplitron {
9 :
10 : class Metronome : public IMetronome {
11 : public:
12 : Metronome();
13 1629 : ~Metronome() override = default;
14 :
15 : void set_enabled(bool enabled) override;
16 : bool is_enabled() const override;
17 : void toggle() override;
18 :
19 : void set_bpm(int bpm) override;
20 : int get_bpm() const override;
21 :
22 : void set_volume(float volume) override;
23 : float get_volume() const override;
24 :
25 : void set_sample_rate(int sample_rate) override;
26 : void reset() override;
27 :
28 : // Generate next click sample
29 : float next_sample() override;
30 :
31 : private:
32 : void update_timing();
33 :
34 : std::atomic<bool> enabled_{false};
35 : std::atomic<int> bpm_{120};
36 : std::atomic<float> volume_{0.5f};
37 : std::atomic<int> sample_rate_{48000};
38 :
39 : // Audio thread states
40 : bool metronome_enabled_ = false;
41 : int metronome_bpm_ = 120;
42 : float metronome_volume_ = 0.5f;
43 :
44 : float metronome_volume_smoothed_ = 0.0f;
45 : float metronome_volume_smooth_alpha_ = 0.05f;
46 : float metronome_bpm_smoothed_ = 120.0f;
47 : float metronome_bpm_smooth_alpha_ = 0.05f;
48 :
49 : double metronome_samples_per_beat_ = 0.0;
50 : double metronome_sample_counter_ = 0.0;
51 : int metronome_click_samples_total_ = 0;
52 : int metronome_click_samples_remaining_ = 0;
53 : float metronome_click_phase_ = 0.0f;
54 : float metronome_click_phase_inc_ = 0.0f;
55 : float metronome_click_env_ = 0.0f;
56 : float metronome_click_decay_ = 0.0f;
57 : };
58 :
59 : } // namespace Amplitron
|