Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
chord_descriptor.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2018-2022 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
9
10#ifndef __SCHEMAS_AUDIO_CHORD_DESCRIPTOR_H__
11#define __SCHEMAS_AUDIO_CHORD_DESCRIPTOR_H__
12
13#include <cstdint>
14
15#include "utils/yaml.h"
16
17typedef enum MusicalNote_v1
18{
19 NOTE_C_v1,
20 NOTE_CS_v1,
21 NOTE_D_v1,
22 NOTE_DS_v1,
23 NOTE_E_v1,
24 NOTE_F_v1,
25 NOTE_FS_v1,
26 NOTE_G_v1,
27 NOTE_GS_v1,
28 NOTE_A_v1,
29 NOTE_AS_v1,
30 NOTE_B_v1,
31} MusicalNote_v1;
32
33static const cyaml_strval_t musical_note_strings_v1[] = {
34 { "C", NOTE_C_v1 },
35 { "C#", NOTE_CS_v1 },
36 { "D", NOTE_D_v1 },
37 { "D#", NOTE_DS_v1 },
38 { "E", NOTE_E_v1 },
39 { "F", NOTE_F_v1 },
40 { "F#", NOTE_FS_v1 },
41 { "G", NOTE_G_v1 },
42 { "G#", NOTE_GS_v1 },
43 { "A", NOTE_A_v1 },
44 { "A#", NOTE_AS_v1 },
45 { "B", NOTE_B_v1 },
46};
47
48typedef enum ChordType_v1
49{
50 CHORD_TYPE_NONE_v1,
51 CHORD_TYPE_MAJ_v1,
52 CHORD_TYPE_MIN_v1,
53 CHORD_TYPE_DIM_v1,
54 CHORD_TYPE_SUS4_v1,
55 CHORD_TYPE_SUS2_v1,
56 CHORD_TYPE_AUG_v1,
57 CHORD_TYPE_CUSTOM_v1,
58 NUM_CHORD_TYPES_v1,
59} ChordType_v1;
60
61static const cyaml_strval_t chord_type_strings_v1[] = {
62 { "Invalid", CHORD_TYPE_NONE_v1 },
63 { "Maj", CHORD_TYPE_MAJ_v1 },
64 { "min", CHORD_TYPE_MIN_v1 },
65 { "dim", CHORD_TYPE_DIM_v1 },
66 { "sus4", CHORD_TYPE_SUS4_v1 },
67 { "sus2", CHORD_TYPE_SUS2_v1 },
68 { "aug", CHORD_TYPE_AUG_v1 },
69 { "custom", CHORD_TYPE_CUSTOM_v1 },
70};
71
72typedef enum ChordAccent_v1
73{
74 CHORD_ACC_NONE_v1,
75 CHORD_ACC_7_v1,
76 CHORD_ACC_j7_v1,
77 CHORD_ACC_b9_v1,
78 CHORD_ACC_9_v1,
79 CHORD_ACC_S9_v1,
80 CHORD_ACC_11_v1,
81 CHORD_ACC_b5_S11_v1,
82 CHORD_ACC_S5_b13_v1,
83 CHORD_ACC_6_13_v1,
84 NUM_CHORD_ACCENTS_v1,
85} ChordAccent_v1;
86
87static const cyaml_strval_t chord_accent_strings_v1[] = {
88 { "None", CHORD_ACC_NONE_v1 },
89 { "7", CHORD_ACC_7_v1 },
90 { "j7", CHORD_ACC_j7_v1 },
91 { "\u266D9", CHORD_ACC_b9_v1 },
92 { "9", CHORD_ACC_9_v1 },
93 { "\u266F9", CHORD_ACC_S9_v1 },
94 { "11", CHORD_ACC_11_v1 },
95 { "\u266D5/\u266F11", CHORD_ACC_b5_S11_v1 },
96 { "\u266F5/\u266D13", CHORD_ACC_S5_b13_v1 },
97 { "6/13", CHORD_ACC_6_13_v1 },
98};
99
100typedef struct ChordDescriptor_v2
101{
102 int schema_version;
103 bool has_bass;
104 MusicalNote_v1 root_note;
105 MusicalNote_v1 bass_note;
106 ChordType_v1 type;
107 ChordAccent_v1 accent;
108 int notes[48];
109 int inversion;
111
112static const cyaml_schema_field_t chord_descriptor_fields_schema_v2[] = {
113 YAML_FIELD_INT (ChordDescriptor_v2, schema_version),
114 YAML_FIELD_INT (ChordDescriptor_v2, has_bass),
115 YAML_FIELD_ENUM (ChordDescriptor_v2, root_note, musical_note_strings_v1),
116 YAML_FIELD_ENUM (ChordDescriptor_v2, bass_note, musical_note_strings_v1),
117 YAML_FIELD_ENUM (ChordDescriptor_v2, type, chord_type_strings_v1),
118 YAML_FIELD_ENUM (ChordDescriptor_v2, accent, chord_accent_strings_v1),
119 CYAML_FIELD_SEQUENCE_FIXED (
120 "notes",
121 CYAML_FLAG_OPTIONAL,
123 notes,
124 &int_schema,
125 36),
126 YAML_FIELD_INT (ChordDescriptor_v2, inversion),
127
128 CYAML_FIELD_END
129};
130
131static const cyaml_schema_value_t chord_descriptor_schema_v2 = {
132 CYAML_VALUE_MAPPING (
133 CYAML_FLAG_POINTER,
135 chord_descriptor_fields_schema_v2),
136};
137
138#endif
YAML utils.