~s-cecilio/lenmus/v5.3

« back to all changes in this revision

Viewing changes to include/lenmus_scale.h

  • Committer: cecilios
  • Date: 2007-05-19 11:39:03 UTC
  • Revision ID: svn-v4:2587a929-2f0e-0410-ae78-fe6f687d5efe:trunk:236

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//---------------------------------------------------------------------------------------
2
 
//    LenMus Phonascus: The teacher of music
3
 
//    Copyright (c) 2002-2012 LenMus project
4
 
//
5
 
//    This program is free software; you can redistribute it and/or modify it under the
6
 
//    terms of the GNU General Public License as published by the Free Software Foundation,
7
 
//    either version 3 of the License, or (at your option) any later version.
8
 
//
9
 
//    This program is distributed in the hope that it will be useful, but WITHOUT ANY
10
 
//    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11
 
//    PARTICULAR PURPOSE.  See the GNU General Public License for more details.
12
 
//
13
 
//    You should have received a copy of the GNU General Public License along with this
14
 
//    program. If not, see <http://www.gnu.org/licenses/>.
15
 
//
16
 
//    For any comment, suggestion or feature request, please contact the manager of
17
 
//    the project at cecilios@users.sourceforge.net
18
 
//
19
 
//---------------------------------------------------------------------------------------
20
 
 
21
 
#ifndef __LENMUS_SCALE_H__        //to avoid nested includes
22
 
#define __LENMUS_SCALE_H__
23
 
 
24
 
//lenmus
25
 
#include "lenmus_standard_header.h"
26
 
 
27
 
//wxString
28
 
#include <wx/wxprec.h>
29
 
#include <wx/wx.h>
30
 
 
31
 
//lomse
32
 
#include <lomse_pitch.h>
33
 
using namespace lomse;
34
 
 
35
 
 
36
 
namespace lenmus
37
 
{
38
 
 
39
 
//---------------------------------------------------------------------------------------
40
 
// enum to classify scales
41
 
//
42
 
//    Major scales            Type
43
 
//    ---------------------   ----
44
 
//    Natural                 I
45
 
//    Harmonic                II
46
 
//    Type III                III
47
 
//    Mixolydian              IV
48
 
//
49
 
//    Minor scales            Type
50
 
//    ---------------------   ----
51
 
//    Natural
52
 
//    Melodic
53
 
//    Dorian
54
 
//    Harmonic
55
 
//
56
 
//    Medievals modes         Mode    Gregorian modes
57
 
//    ---------------------   ----    --------------------------
58
 
//    Protus      aut�ntico   I       Dorico          Dorian (Re)
59
 
//                plagal      II      Hipod�rico
60
 
//    Deuterus    aut�ntico   III     Frigio          Phrygian (Mi)
61
 
//                plagal      IV      Hipofrigio
62
 
//    Tritus      aut�ntico   V       Lidio           Lydian (Fa)
63
 
//                plagal      VI      Hipolidio
64
 
//    Tetrardus   aut�ntico   VII     Mixolidio       Mixolydian (Sol)
65
 
//                plagal      VIII    Hipomixolidio
66
 
//
67
 
//    Modes introduced in 1547:
68
 
//
69
 
//                aut�ntico   IX      Eolio           Aeolian (La = minor natural)
70
 
//                plagal      X       Hipoeolio
71
 
//                aut�ntico   XI      J�nico          Ionian (Do = major natural)
72
 
//                plagal      XII     Hipoj�nico
73
 
//
74
 
//    Later introduced modes (rarely used):
75
 
//
76
 
//                            XIII    Locrio          Locrian (Si)
77
 
//                            XIV     Hipolocrio
78
 
//
79
 
enum EScaleType
80
 
{
81
 
    // Major scales
82
 
    est_MajorNatural = 0,
83
 
    est_MajorTypeII,
84
 
    est_MajorTypeIII,
85
 
    est_MajorTypeIV,
86
 
    est_LastMajor = est_MajorTypeIV,
87
 
 
88
 
    // Minor scales
89
 
    est_MinorNatural,
90
 
    est_MinorDorian,
91
 
    est_MinorHarmonic,
92
 
    est_MinorMelodic,
93
 
    est_LastMinor = est_MinorMelodic,
94
 
 
95
 
    // From here, scales without mode
96
 
    est_EndOfModalScales = est_LastMinor,
97
 
 
98
 
    // Gregorian modes
99
 
    est_GreekIonian,
100
 
    est_GreekDorian,
101
 
    est_GreekPhrygian,
102
 
    est_GreekLydian,
103
 
    est_GreekMixolydian,
104
 
    est_GreekAeolian,
105
 
    est_GreekLocrian,
106
 
    est_LastGreek = est_GreekLocrian,
107
 
 
108
 
    // Other scales
109
 
    est_PentatonicMinor,
110
 
    est_PentatonicMajor,
111
 
    est_Blues,
112
 
        //Start of non-tonal scales
113
 
    est_StartNonTonal,
114
 
    est_WholeTones = est_StartNonTonal,
115
 
    est_Chromatic,
116
 
    est_LastOther = est_Chromatic,
117
 
 
118
 
    //last element, to signal End Of Table
119
 
    est_Max
120
 
};
121
 
 
122
 
 
123
 
//---------------------------------------------------------------------------------------
124
 
//a scale is a sequence of up 13 notes (12 chromatic notes plus repetition of first one).
125
 
 
126
 
#define     k_notes_in_scale    13     //Change this for more notes in a scale
127
 
 
128
 
class Scale
129
 
{
130
 
protected:
131
 
    EScaleType    m_nType;
132
 
    EKeySignature   m_nKey;
133
 
    FPitch          m_fpNote[k_notes_in_scale];     //the scale
134
 
 
135
 
public:
136
 
    //build a scale from root note and type
137
 
    Scale(FPitch fpRootNote, EScaleType nScaleType, EKeySignature nKey = k_key_C);
138
 
    ~Scale();
139
 
 
140
 
    inline EScaleType get_scale_type() { return m_nType; }
141
 
    inline wxString get_name() { return type_to_name( m_nType ); }
142
 
    int get_num_notes();
143
 
    string rel_ldp_name_for_note(int i);
144
 
    string abs_ldp_name_for_note(int i);
145
 
    inline FPitch get_note(int i) { return m_fpNote[i]; }
146
 
 
147
 
    //static methods
148
 
    static wxString type_to_name(EScaleType nType);
149
 
    static bool is_major(EScaleType nType);
150
 
    static bool is_minor(EScaleType nType);
151
 
    static bool is_gregorian(EScaleType nType);
152
 
    static bool is_tonal(EScaleType nScaleType) { return nScaleType < est_StartNonTonal; }
153
 
    static EScaleType short_name_to_type(const wxString& sName);
154
 
 
155
 
};
156
 
 
157
 
 
158
 
}   //namespace lenmus
159
 
 
160
 
#endif  // __LENMUS_SCALE_H__