Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
units.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <au/au.hh>
7#include <fmt/format.h>
8
9namespace zrythm::units
10{
11
12// Define base dimensions for sample and tick
13// Using unique indices based on Unix epoch timestamps for uniqueness
14struct SampleBaseDim : au::base_dim::BaseDimension<1737814550>
15{
16}; // 2025-01-25 13:05:50 UTC
17struct TickBaseDim : au::base_dim::BaseDimension<1737814551>
18{
19}; // 2025-01-25 13:05:51 UTC
20
21// Define sample unit with its own dimension
22struct Sample : au::UnitImpl<au::Dimension<SampleBaseDim>>
23{
24 static constexpr const char label[] = "sample";
25};
26constexpr auto sample = au::SingularNameFor<Sample>{};
27constexpr auto samples = au::QuantityMaker<Sample>{};
28
29// Define sample quantity types
30using sample_t = au::QuantityI64<Sample>;
31using sample_u32_t = au::QuantityU32<Sample>;
32using sample_u64_t = au::QuantityU64<Sample>;
33using precise_sample_t = au::QuantityD<Sample>;
34
35// Define tick unit with its own dimension
36struct Tick : au::UnitImpl<au::Dimension<TickBaseDim>>
37{
38 static constexpr const char label[] = "tick";
39};
40constexpr auto tick = au::SingularNameFor<Tick>{};
41constexpr auto ticks = au::QuantityMaker<Tick>{};
42
43// Define tick quantity types
44using tick_t = au::QuantityI64<Tick>;
45using precise_tick_t = au::QuantityD<Tick>;
46
47// Define PPQ constant (960 ticks per quarter note)
48constexpr tick_t PPQ = ticks (960);
49
50// Define quarter_note unit as 960 ticks using unit expression
51struct QuarterNote : decltype (Tick{} * au::mag<960> ())
52{
53 static constexpr const char label[] = "quarterNote";
54};
55constexpr auto quarter_note = au::SingularNameFor<QuarterNote>{};
56constexpr auto quarter_notes = au::QuantityMaker<QuarterNote>{};
57
58// Define sample rate as a compound unit (samples per second)
59using SampleRate = decltype (Sample{} / au::Seconds{});
60constexpr auto sample_rate = samples / au::second;
61using sample_rate_t = au::QuantityI<SampleRate>;
62using precise_sample_rate_t = au::QuantityD<SampleRate>;
63
64// Define precise second using Au's built-in seconds
65constexpr auto seconds = au::seconds;
66using precise_second_t = au::QuantityD<au::Seconds>;
67} // namespace zrythm::units
68
69// Formatter for Au quantities
70template <typename U, typename R>
71struct fmt::formatter<::au::Quantity<U, R>>
72 : ::au::QuantityFormatter<U, R, ::fmt::formatter>
73{
74};