Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
metronome.h
1// SPDX-FileCopyrightText: © 2019-2021, 2024-2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/audio_sample_processor.h"
7#include "dsp/tempo_map.h"
8#include "utils/types.h"
9
10#include <QtQmlIntegration>
11
12#include <juce_wrapper.h>
13
14namespace zrythm::dsp
15{
19class Metronome : public QObject, public AudioSampleProcessor
20{
21 Q_OBJECT
22 Q_PROPERTY (float volume READ volume WRITE setVolume NOTIFY volumeChanged)
23 Q_PROPERTY (bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
24 QML_ELEMENT
25 QML_UNCREATABLE ("")
26
27public:
28 Metronome (
29 ProcessorBaseDependencies dependencies,
30 const dsp::TempoMap &tempo_map,
31 juce::AudioSampleBuffer emphasis_sample,
32 juce::AudioSampleBuffer normal_sample,
33 bool initially_enabled = true,
34 float initial_volume = 1.f,
35 QObject * parent = nullptr);
36
37 // ============================================================================
38 // QML Interface
39 // ============================================================================
40
41 float volume () const { return volume_.load (); }
42 void setVolume (float volume)
43 {
44 if (utils::values_equal_for_qproperty_type (volume_.load (), volume))
45 return;
46
47 volume_.store (volume);
48 Q_EMIT volumeChanged (volume);
49 }
50 Q_SIGNAL void volumeChanged (float volume);
51
52 bool enabled () const { return enabled_.load (); }
53 void setEnabled (bool enabled)
54 {
55 if (utils::values_equal_for_qproperty_type (enabled_.load (), enabled))
56 return;
57
58 enabled_.store (enabled);
59 Q_EMIT enabledChanged (enabled);
60 }
61 Q_SIGNAL void enabledChanged (bool enabled);
62
63 // ============================================================================
64
66 EngineProcessTimeInfo time_nfo,
67 const dsp::ITransport &transport) noexcept override;
68
69 void custom_prepare_for_processing (
70 const graph::GraphNode * node,
71 units::sample_rate_t sample_rate,
72 nframes_t max_block_length) override;
73
74private:
83 void find_and_queue_metronome_samples (
84 units::sample_t start_pos,
85 units::sample_t end_pos,
86 units::sample_t loffset);
87
91 void queue_metronome_countin (
92 const EngineProcessTimeInfo &time_nfo,
93 const dsp::ITransport &transport);
94
100 void queue_metronome (
101 bool emphasis,
102 units::sample_t offset,
103 std::source_location loc = std::source_location::current ());
104
105private:
106 const dsp::TempoMap &tempo_map_;
107
109 juce::AudioSampleBuffer emphasis_sample_buffer_;
110
112 juce::AudioSampleBuffer normal_sample_buffer_;
113
117 std::atomic<float> volume_;
118
119 std::atomic_bool enabled_;
120};
121
122} // namespace zrythm::dsp
Interface for transport.
Definition itransport.h:17
void custom_process_block(EngineProcessTimeInfo time_nfo, const dsp::ITransport &transport) noexcept override
Custom processor logic after processing all owned parameters.
Represents a node in a DSP graph.
Definition graph_node.h:129
uint32_t nframes_t
Frame count.
Definition types.h:58
constexpr bool values_equal_for_qproperty_type(const T &a, const T &b)
Helper that checks if 2 values are equal.
Definition qt.h:20
Common struct to pass around during processing to avoid repeating the data in function arguments.
Definition types.h:133