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