From b6e62c66545d84101e3f82d065862f75509f2d1e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 28 Sep 2016 10:47:10 -0500 Subject: move mode/scale/key definitions out of push2 code and into libardour; Aeolian is the same as Minor --- libs/ardour/ardour/mode.h | 76 +++++++++++ libs/ardour/enums.cc | 41 ++++++ libs/ardour/mode.cc | 337 ++++++++++++++++++++++++++++++++++++++++++++++ libs/ardour/wscript | 1 + 4 files changed, 455 insertions(+) create mode 100644 libs/ardour/ardour/mode.h create mode 100644 libs/ardour/mode.cc (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/mode.h b/libs/ardour/ardour/mode.h new file mode 100644 index 0000000000..7f1d5e0b86 --- /dev/null +++ b/libs/ardour/ardour/mode.h @@ -0,0 +1,76 @@ +/* + Copyright (C) 1999-2016 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __ardour_mode_h__ +#define __ardour_mode_h__ + +#include + +class MusicalMode +{ + public: + enum Type { + Dorian, + IonianMajor, + AeolianMinor, + HarmonicMinor, + MelodicMinorAscending, + MelodicMinorDescending, + Phrygian, + Lydian, + Mixolydian, + Locrian, + PentatonicMajor, + PentatonicMinor, + Chromatic, + BluesScale, + NeapolitanMinor, + NeapolitanMajor, + Oriental, + DoubleHarmonic, + Enigmatic, + Hirajoshi, + HungarianMinor, + HungarianMajor, + Kumoi, + Iwato, + Hindu, + Spanish8Tone, + Pelog, + HungarianGypsy, + Overtone, + LeadingWholeTone, + Arabian, + Balinese, + Gypsy, + Mohammedan, + Javanese, + Persian, + Algerian + }; + + MusicalMode (Type t); + ~MusicalMode (); + + std::vector steps; + + private: + static void fill (MusicalMode&, Type); +}; + +#endif /* __ardour_mode_h__ */ diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index be468c2534..ad5dc5e6a7 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -31,6 +31,7 @@ #include "ardour/io.h" #include "ardour/location.h" #include "ardour/midi_model.h" +#include "ardour/mode.h" #include "ardour/mute_master.h" #include "ardour/presentation_info.h" #include "ardour/session.h" @@ -134,6 +135,7 @@ setup_enum_writer () BufferingPreset _BufferingPreset; AutoReturnTarget _AutoReturnTarget; PresentationInfo::Flag _PresentationInfo_Flag; + MusicalMode::Type mode; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -715,6 +717,45 @@ setup_enum_writer () REGISTER_CLASS_ENUM (PresentationInfo, Hidden); REGISTER_CLASS_ENUM (PresentationInfo, OrderSet); REGISTER_BITS (_PresentationInfo_Flag); + + REGISTER_CLASS_ENUM (MusicalMode,Dorian); + REGISTER_CLASS_ENUM (MusicalMode, IonianMajor); + REGISTER_CLASS_ENUM (MusicalMode, AeolianMinor); + REGISTER_CLASS_ENUM (MusicalMode, HarmonicMinor); + REGISTER_CLASS_ENUM (MusicalMode, MelodicMinorAscending); + REGISTER_CLASS_ENUM (MusicalMode, MelodicMinorDescending); + REGISTER_CLASS_ENUM (MusicalMode, Phrygian); + REGISTER_CLASS_ENUM (MusicalMode, Lydian); + REGISTER_CLASS_ENUM (MusicalMode, Mixolydian); + REGISTER_CLASS_ENUM (MusicalMode, Locrian); + REGISTER_CLASS_ENUM (MusicalMode, PentatonicMajor); + REGISTER_CLASS_ENUM (MusicalMode, PentatonicMinor); + REGISTER_CLASS_ENUM (MusicalMode, Chromatic); + REGISTER_CLASS_ENUM (MusicalMode, BluesScale); + REGISTER_CLASS_ENUM (MusicalMode, NeapolitanMinor); + REGISTER_CLASS_ENUM (MusicalMode, NeapolitanMajor); + REGISTER_CLASS_ENUM (MusicalMode, Oriental); + REGISTER_CLASS_ENUM (MusicalMode, DoubleHarmonic); + REGISTER_CLASS_ENUM (MusicalMode, Enigmatic); + REGISTER_CLASS_ENUM (MusicalMode, Hirajoshi); + REGISTER_CLASS_ENUM (MusicalMode, HungarianMinor); + REGISTER_CLASS_ENUM (MusicalMode, HungarianMajor); + REGISTER_CLASS_ENUM (MusicalMode, Kumoi); + REGISTER_CLASS_ENUM (MusicalMode, Iwato); + REGISTER_CLASS_ENUM (MusicalMode, Hindu); + REGISTER_CLASS_ENUM (MusicalMode, Spanish8Tone); + REGISTER_CLASS_ENUM (MusicalMode, Pelog); + REGISTER_CLASS_ENUM (MusicalMode, HungarianGypsy); + REGISTER_CLASS_ENUM (MusicalMode, Overtone); + REGISTER_CLASS_ENUM (MusicalMode, LeadingWholeTone); + REGISTER_CLASS_ENUM (MusicalMode, Arabian); + REGISTER_CLASS_ENUM (MusicalMode, Balinese); + REGISTER_CLASS_ENUM (MusicalMode, Gypsy); + REGISTER_CLASS_ENUM (MusicalMode, Mohammedan); + REGISTER_CLASS_ENUM (MusicalMode, Javanese); + REGISTER_CLASS_ENUM (MusicalMode, Persian); + REGISTER_CLASS_ENUM (MusicalMode, Algerian); + REGISTER (mode); } } /* namespace ARDOUR */ diff --git a/libs/ardour/mode.cc b/libs/ardour/mode.cc new file mode 100644 index 0000000000..e3c37df78c --- /dev/null +++ b/libs/ardour/mode.cc @@ -0,0 +1,337 @@ +/* + Copyright (C) 1999-2016 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "ardour/mode.h" + +MusicalMode::MusicalMode (MusicalMode::Type t) +{ + fill (*this, t); +} + +MusicalMode::~MusicalMode() +{ +} + +void +MusicalMode::fill (MusicalMode& m, MusicalMode::Type t) +{ + m.steps.clear (); + + /* scales/modes as distances from root, expressed + in fractional whole tones. + */ + + switch (t) { + case Dorian: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (4.5); + m.steps.push_back (5.5); + break; + case IonianMajor: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.5); + break; + case AeolianMinor: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case HarmonicMinor: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (5.0); + m.steps.push_back (5.5); + break; + case BluesScale: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + m.steps.push_back (5.5); + break; + case MelodicMinorAscending: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.5); + break; + case MelodicMinorDescending: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + break; + case Phrygian: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Lydian: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.5); + break; + case Mixolydian: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + break; + case Locrian: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case PentatonicMajor: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + break; + case PentatonicMinor: + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (5.0); + break; + case Chromatic: + m.steps.push_back (0.5); + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + m.steps.push_back (5.5); + break; + case NeapolitanMinor: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (2.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case NeapolitanMajor: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.5); + break; + case Oriental: + m.steps.push_back (0.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + break; + case DoubleHarmonic: + m.steps.push_back (0.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case Enigmatic: + m.steps.push_back (0.5); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + m.steps.push_back (5.5); + break; + case Hirajoshi: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + break; + case HungarianMinor: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case HungarianMajor: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Kumoi: + m.steps.push_back (0.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + break; + case Iwato: + m.steps.push_back (0.5); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (5.0); + break; + case Hindu: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Spanish8Tone: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Pelog: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (3.5); + m.steps.push_back (5.0); + break; + case HungarianGypsy: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Overtone: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + break; + case LeadingWholeTone: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + m.steps.push_back (5.5); + break; + case Arabian: + m.steps.push_back (1.0); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.0); + break; + case Balinese: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + break; + case Gypsy: + m.steps.push_back (0.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case Mohammedan: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case Javanese: + m.steps.push_back (0.5); + m.steps.push_back (1.5); + m.steps.push_back (2.5); + m.steps.push_back (3.5); + m.steps.push_back (4.5); + m.steps.push_back (5.0); + break; + case Persian: + m.steps.push_back (0.5); + m.steps.push_back (2.0); + m.steps.push_back (2.5); + m.steps.push_back (3.0); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + break; + case Algerian: + m.steps.push_back (1.0); + m.steps.push_back (1.5); + m.steps.push_back (3.0); + m.steps.push_back (3.5); + m.steps.push_back (4.0); + m.steps.push_back (5.5); + m.steps.push_back (6.0); + m.steps.push_back (7.0); + m.steps.push_back (7.5); + m.steps.push_back (8.5); + break; + } +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index a3ec926485..3ca15569ba 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -143,6 +143,7 @@ libardour_sources = [ 'mididm.cc', 'midiport_manager.cc', 'mix.cc', + 'mode.cc', 'monitor_control.cc', 'monitor_processor.cc', 'mtc_slave.cc', -- cgit v1.2.3