Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
scale.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
12#ifndef __AUDIO_SCALE_H__
13#define __AUDIO_SCALE_H__
14
15#include <stdint.h>
16
18
19#include <glib/gi18n.h>
20
27#define SCALE_SCHEMA_VERSION 2
28
32typedef enum MusicalScaleType
33{
36
37 /* --- popular scales --- */
38
39 SCALE_MAJOR,
40
43
46
47 SCALE_DORIAN,
48 SCALE_PHRYGIAN,
49 SCALE_LYDIAN,
50 SCALE_MIXOLYDIAN,
51
54
55 SCALE_LOCRIAN,
56 SCALE_MELODIC_MINOR,
57 SCALE_HARMONIC_MINOR,
58 SCALE_WHOLE_TONE,
59 SCALE_MAJOR_PENTATONIC,
60 SCALE_MINOR_PENTATONIC,
61 SCALE_OCTATONIC_HALF_WHOLE,
62 SCALE_OCTATONIC_WHOLE_HALF,
63
64 /* --- exotic scales --- */
65
68
69 SCALE_HARMONIC_MAJOR,
70 SCALE_PHRYGIAN_DOMINANT,
71 SCALE_MAJOR_LOCRIAN,
72 SCALE_ALGERIAN,
73 SCALE_AUGMENTED,
74 SCALE_DOUBLE_HARMONIC,
75 SCALE_CHINESE,
76 SCALE_DIMINISHED,
77 SCALE_DOMINANT_DIMINISHED,
78 SCALE_EGYPTIAN,
79 SCALE_EIGHT_TONE_SPANISH,
80 SCALE_ENIGMATIC,
81 SCALE_GEEZ,
82 SCALE_HINDU,
83 SCALE_HIRAJOSHI,
84 SCALE_HUNGARIAN_GYPSY,
85 SCALE_INSEN,
86 SCALE_NEAPOLITAN_MAJOR,
87 SCALE_NEAPOLITAN_MINOR,
88 SCALE_ORIENTAL,
89 SCALE_ROMANIAN_MINOR,
90 SCALE_ALTERED,
91 SCALE_MAQAM,
92 SCALE_YO,
93 SCALE_BEBOP_LOCRIAN,
94 SCALE_BEBOP_DOMINANT,
95 SCALE_BEBOP_MAJOR,
96 SCALE_SUPER_LOCRIAN,
97 SCALE_ENIGMATIC_MINOR,
98 SCALE_COMPOSITE,
99 SCALE_BHAIRAV,
100 SCALE_HUNGARIAN_MINOR,
101 SCALE_PERSIAN,
102 SCALE_IWATO,
103 SCALE_KUMOI,
104 SCALE_PELOG,
105 SCALE_PROMETHEUS,
106 SCALE_PROMETHEUS_NEAPOLITAN,
107 SCALE_PROMETHEUS_LISZT,
108 SCALE_BALINESE,
109 SCALE_RAGATODI,
110 SCALE_JAPANESE1,
111 SCALE_JAPANESE2,
112
113 /* --- TODO unimplemented --- */
114
115 SCALE_BLUES,
116 SCALE_FLAMENCO,
117 SCALE_GYPSY,
118 SCALE_HALF_DIMINISHED,
119 SCALE_IN,
120 SCALE_ISTRIAN,
121 SCALE_LYDIAN_AUGMENTED,
122 SCALE_TRITONE,
123 SCALE_UKRANIAN_DORIAN,
124
125 NUM_SCALES,
127
128static const cyaml_strval_t musical_scale_type_strings[] = {
129 {N_ ("Chromatic"), SCALE_CHROMATIC },
130 { N_ ("Major"), SCALE_MAJOR },
131 { N_ ("Minor"), SCALE_MINOR },
132 { N_ ("Ionian"), SCALE_IONIAN },
133 { N_ ("Dorian"), SCALE_DORIAN },
134 { N_ ("Phrygian"), SCALE_PHRYGIAN },
135 { N_ ("Lydian"), SCALE_LYDIAN },
136 { N_ ("Mixolydian"), SCALE_MIXOLYDIAN },
137 { N_ ("Aeolian"), SCALE_AEOLIAN },
138 { N_ ("Locrian"), SCALE_LOCRIAN },
139 { N_ ("Melodic Minor"), SCALE_MELODIC_MINOR },
140 { N_ ("Harmonic Minor"), SCALE_HARMONIC_MINOR },
141 { N_ ("Whole Tone"), SCALE_WHOLE_TONE },
142 { N_ ("Major Pentatonic"), SCALE_MAJOR_PENTATONIC },
143 { N_ ("Minor Pentatonic"), SCALE_MINOR_PENTATONIC },
144 { N_ ("Octatonic Half Whole"), SCALE_OCTATONIC_HALF_WHOLE },
145 { N_ ("Octatonic Whole Half"), SCALE_OCTATONIC_WHOLE_HALF },
146 { N_ ("Acoustic"), SCALE_ACOUSTIC },
147 { N_ ("Harmonic Major"), SCALE_HARMONIC_MAJOR },
148 { N_ ("Phrygian Dominant"), SCALE_PHRYGIAN_DOMINANT },
149 { N_ ("Major Locrian"), SCALE_MAJOR_LOCRIAN },
150 { N_ ("Algerian"), SCALE_ALGERIAN },
151 { N_ ("Augmented"), SCALE_AUGMENTED },
152 { N_ ("Double Harmonic"), SCALE_DOUBLE_HARMONIC },
153 { N_ ("Chinese"), SCALE_CHINESE },
154 { N_ ("Diminished"), SCALE_DIMINISHED },
155 { N_ ("Dominant Diminished"), SCALE_DOMINANT_DIMINISHED },
156 { N_ ("Egyptian"), SCALE_EGYPTIAN },
157 { N_ ("Eight Tone Spanish"), SCALE_EIGHT_TONE_SPANISH },
158 { N_ ("Enigmatic"), SCALE_ENIGMATIC },
159 { N_ ("Geez"), SCALE_GEEZ },
160 { N_ ("Hindu"), SCALE_HINDU },
161 { N_ ("Hirajoshi"), SCALE_HIRAJOSHI },
162 { N_ ("Hungarian Gypsy"), SCALE_HUNGARIAN_GYPSY },
163 { N_ ("Insen"), SCALE_INSEN },
164 { N_ ("Neapolitan Major"), SCALE_NEAPOLITAN_MAJOR },
165 { N_ ("Neapolitan Minor"), SCALE_NEAPOLITAN_MINOR },
166 { N_ ("Oriental"), SCALE_ORIENTAL },
167 { N_ ("Romanian Minor"), SCALE_ROMANIAN_MINOR },
168 { N_ ("Altered"), SCALE_ALTERED },
169 { N_ ("Maqam"), SCALE_MAQAM },
170 { N_ ("Yo"), SCALE_YO },
171 { N_ ("Bebop Locrian"), SCALE_BEBOP_LOCRIAN },
172 { N_ ("Bebop Dominant"), SCALE_BEBOP_DOMINANT },
173 { N_ ("Bebop Major"), SCALE_BEBOP_MAJOR },
174 { N_ ("Super Locrian"), SCALE_SUPER_LOCRIAN },
175 { N_ ("Enigmatic Minor"), SCALE_ENIGMATIC_MINOR },
176 { N_ ("Composite"), SCALE_COMPOSITE },
177 { N_ ("Bhairav"), SCALE_BHAIRAV },
178 { N_ ("Hungarian Minor"), SCALE_HUNGARIAN_MINOR },
179 { N_ ("Persian"), SCALE_PERSIAN },
180 { N_ ("Iwato"), SCALE_IWATO },
181 { N_ ("Kumoi"), SCALE_KUMOI },
182 { N_ ("Pelog"), SCALE_PELOG },
183 { N_ ("Prometheus"), SCALE_PROMETHEUS },
184 { N_ ("Prometheus Neapolitan"), SCALE_PROMETHEUS_NEAPOLITAN},
185 { N_ ("Prometheus Liszt"), SCALE_PROMETHEUS_LISZT },
186 { N_ ("Balinese"), SCALE_BALINESE },
187 { N_ ("RagaTodi"), SCALE_RAGATODI },
188 { N_ ("Japanese 1"), SCALE_JAPANESE1 },
189 { N_ ("Japanese 2"), SCALE_JAPANESE2 },
190};
191
195typedef struct MusicalScale
196{
197 int schema_version;
198
201
203 MusicalNote root_key;
205
206static const cyaml_schema_field_t musical_scale_fields_schema[] = {
207 YAML_FIELD_INT (MusicalScale, schema_version),
208 YAML_FIELD_ENUM (MusicalScale, type, musical_scale_type_strings),
209 YAML_FIELD_ENUM (MusicalScale, root_key, musical_note_strings),
210
211 CYAML_FIELD_END,
212};
213
214static const cyaml_schema_value_t musical_scale_schema = {
215 YAML_VALUE_PTR (MusicalScale, musical_scale_fields_schema),
216};
217
222musical_scale_new (MusicalScaleType type, MusicalNote root);
223
231const bool *
232musical_scale_get_notes (MusicalScaleType scale_type, bool ascending);
233
245RETURNS_NONNULL
246const ChordType *
248
254
255const char *
256musical_scale_type_to_string (const MusicalScaleType type);
257
263char *
265
270void
271musical_scale_strcpy (MusicalScale * scale, char * buf);
272
276static inline int
277musical_scale_is_equal (MusicalScale * a, MusicalScale * b)
278{
279 return a->type == b->type && a->root_key == b->root_key;
280}
281
286bool
288 const MusicalScale * const scale,
289 const ChordDescriptor * const chord);
290
294int
296 MusicalScale * scale,
297 MusicalNote chord_root,
298 ChordType type,
299 ChordAccent chord_accent);
300
307bool
308musical_scale_contains_note (const MusicalScale * scale, MusicalNote note);
309
315char *
317
321void
323
328#endif
Descriptors for chords.
bool musical_scale_contains_note(const MusicalScale *scale, MusicalNote note)
Returns if the given key is in the given MusicalScale.
bool musical_scale_contains_chord(const MusicalScale *const scale, const ChordDescriptor *const chord)
Returns if all of the chord's notes are in the scale.
char * musical_scale_as_string(MusicalScale *scale)
Returns the scale in human readable string.
char * musical_scale_to_string(const MusicalScale *const self)
Prints the MusicalScale to a string.
ChordAccent
Chord accents.
void musical_scale_strcpy(MusicalScale *scale, char *buf)
Same as above but uses a buffer instead of allocating.
MusicalScale * musical_scale_new(MusicalScaleType type, MusicalNote root)
Creates new scale using type and root note.
RETURNS_NONNULL const ChordType * musical_scale_get_triad_types(MusicalScaleType scale_type, bool ascending)
Returns the triads in the given scale.
void musical_scale_free(MusicalScale *scale)
Frees the MusicalScale.
const bool * musical_scale_get_notes(MusicalScaleType scale_type, bool ascending)
Returns the notes in the given scale.
int musical_scale_is_accent_in_scale(MusicalScale *scale, MusicalNote chord_root, ChordType type, ChordAccent chord_accent)
Returns if the accent is in the scale.
MusicalScale * musical_scale_clone(MusicalScale *src)
Clones the scale.
MusicalScaleType
Scale type (name) eg Aeolian.
Definition scale.h:33
ChordType
Chord type.
@ SCALE_MINOR
Natural minor.
Definition scale.h:42
@ SCALE_AEOLIAN
Natural minor (same as SCALE_MINOR).
Definition scale.h:53
@ SCALE_CHROMATIC
All keys.
Definition scale.h:35
@ SCALE_ACOUSTIC
Lydian dominant.
Definition scale.h:67
@ SCALE_IONIAN
Major (same as SCALE_MAJOR).
Definition scale.h:45
#define YAML_VALUE_PTR(cc, fields_schema)
Schema to be used as a pointer.
Definition yaml.h:202
A ChordDescriptor describes a chord and is not linked to any specific object by itself.
Musical scale descriptor.
Definition scale.h:196
MusicalScaleType type
Identification of the scale (e.g.
Definition scale.h:200
MusicalNote root_key
Root key of the scale.
Definition scale.h:203