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 using unique indices based on Unix epoch timestamps
13// for uniqueness
14struct SampleBaseDim : au::base_dim::BaseDimension<1737814550>
15{
16};
17struct TickBaseDim : au::base_dim::BaseDimension<1737814551>
18{
19};
20struct ChannelBaseDim : au::base_dim::BaseDimension<1777738085>
21{
22};
23
24// Define sample unit with its own dimension
25struct Sample : au::UnitImpl<au::Dimension<SampleBaseDim>>
26{
27 static constexpr const char label[] = "sample";
28};
29constexpr auto sample = au::SingularNameFor<Sample>{};
30constexpr auto samples = au::QuantityMaker<Sample>{};
31
32// Define sample quantity types
33using sample_t = au::QuantityI64<Sample>;
34using sample_u32_t = au::QuantityU32<Sample>;
35using sample_u64_t = au::QuantityU64<Sample>;
36using precise_sample_t = au::QuantityD<Sample>;
37
38// Define tick unit with its own dimension
39struct Tick : au::UnitImpl<au::Dimension<TickBaseDim>>
40{
41 static constexpr const char label[] = "tick";
42};
43constexpr auto tick = au::SingularNameFor<Tick>{};
44constexpr auto ticks = au::QuantityMaker<Tick>{};
45
46// Define tick quantity types
47using tick_t = au::QuantityI64<Tick>;
48using precise_tick_t = au::QuantityD<Tick>;
49
50// Define channel count unit with its own dimension
51struct ChannelCount : au::UnitImpl<au::Dimension<ChannelBaseDim>>
52{
53 static constexpr const char label[] = "channel";
54};
55constexpr auto channel = au::SingularNameFor<ChannelCount>{};
56constexpr auto channels = au::QuantityMaker<ChannelCount>{};
57
58// Define channel count quantity types
59using channel_count_t = au::Quantity<ChannelCount, uint8_t>;
60
61// Define PPQ constant (960 ticks per quarter note)
62constexpr tick_t PPQ = ticks (960);
63
64// Define quarter_note unit as 960 ticks using unit expression
65struct QuarterNote : decltype (Tick{} * au::mag<960> ())
66{
67 static constexpr const char label[] = "quarterNote";
68};
69constexpr auto quarter_note = au::SingularNameFor<QuarterNote>{};
70constexpr auto quarter_notes = au::QuantityMaker<QuarterNote>{};
71
72// Define sample rate as a compound unit (samples per second)
73using SampleRate = decltype (Sample{} / au::Seconds{});
74constexpr auto sample_rate = samples / au::second;
75using sample_rate_t = au::QuantityI<SampleRate>;
76using precise_sample_rate_t = au::QuantityD<SampleRate>;
77
78// Define precise second using Au's built-in seconds
79constexpr auto seconds = au::seconds;
80using precise_second_t = au::QuantityD<au::Seconds>;
81} // namespace zrythm::units
82
83// Formatter for Au quantities
84template <typename U, typename R>
85struct fmt::formatter<::au::Quantity<U, R>>
86 : ::au::QuantityFormatter<U, R, ::fmt::formatter>
87{
88};