数式での翻訳 |
---|
ピッチの\(4\)つ組全体の集合 \[ \textrm{HaiChi} = \textrm{Pitch}^4 \] の元を配置と呼び、写像 \[ \begin{align} \textrm{HaiChi} \times \{0,1,2,3\} & \to \textrm{Pitch} \\
((P_0,P_1,P_2,P_3),i) & \mapsto P_i \end{align} \] を\(\textrm{GetPitch}\)と置きます。
\(P\)を配置とします。\(\textrm{GetPitch}(P,0)\)を\(P\)のバス、\(\textrm{GetPitch}(P,1)\)を\(P\)のテナー、\(\textrm{GetPitch}(P,2)\)を\(P\)のアルト、\(\textrm{GetPitch}(P,3)\)を\(P\)のソプラノと呼びます。音名の集合 \[ \{\textrm{GetOnMei}(\textrm{GetPitch}(P,i)) \mid i \in {0,1,2,3}\} \] を\(P\)の音名集合と呼び、その要素数を\(\textrm{GetNumberOfOnMei}(P) \in \{1,2,3,4\}\)と置きます。\(\textrm{GetNumberOfOnMei}(P) = 3\)の時\(P\)を\(3\)和音の配置と呼び、\(\textrm{GetNumberOfOnMei}(P) = 4\)の時\(P\)を\(4\)和音の配置と呼びます。また\(3\)和音または\(4\)和音である同値類\(N\)が\(P\)の音名集合と同一視される時、\(P\)を\(N\)の配置と呼び、\(N\)を\(P\)の和音と呼びます。そのような\(N\)は一意ですので、\(P\)の和音は存在すれば特定の\(3\)和音または\(4\)和音を指す用語となります。
\(P\)が非交叉であるとは \[ \textrm{GetPitch}(P,0) \leq \textrm{GetPitch}(P,1) \leq \textrm{GetPitch}(P,2) \leq \textrm{GetPitch}(P,3) \] を満たすということで、\(P\)が自然な音域に属するとは \[ \begin{align} \textrm{GetNoteNumber}(\textrm{Mi}2) && \leq \textrm{GetNoteNumber}(\textrm{GetPitch}(P,0)) & \leq & \textrm{GetNoteNumber}(\textrm{Fa}4) \\
\textrm{GetNoteNumber}(\textrm{La}2) && \leq \textrm{GetNoteNumber}(\textrm{GetPitch}(P,1)) & \leq & \textrm{GetNoteNumber}(\textrm{La}4) \\
\textrm{GetNoteNumber}(\textrm{Fa}3) && \leq \textrm{GetNoteNumber}(\textrm{GetPitch}(P,2)) & \leq & \textrm{GetNoteNumber}(\textrm{Fa}5) \\
\textrm{GetNoteNumber}(\textrm{Ti}3) && \leq \textrm{GetNoteNumber}(\textrm{GetPitch}(P,3)) & \leq & \textrm{GetNoteNumber}(\textrm{Do}6) \end{align} \] を満たすということで、\(P\)が自然な音度域に属するとは、 \[ \begin{align} \textrm{GetDosuu}(\textrm{GetPitch}(P,0),\textrm{GetPitch}(P,1)) & \leq 12 \\
\textrm{GetDosuu}(\textrm{GetPitch}(P,1),\textrm{GetPitch}(P,2)) & \leq 8 \\
\textrm{GetDosuu}(\textrm{GetPitch}(P,2),\textrm{GetPitch}(P,3)) & \leq 8 \end{align} \] を満たすということです。
これらを満たすだけだと配置と協和音や七の和音との間に深い関係が特になさそうですが、後の記事で「協和音の配置」や「七の和音の配置」という概念を導入していきます。その際にC++での実装で様々な共通の関数を用いますので、今回は上記で導入した関数や関係以外にもいくつかの追加の関数をC++で実装しておきます。
C++での宣言 |
---|
配置のクラスおよび関係する関数たちを以下のように宣言します。
class HaiChi
{
private:
Pitch m_sop;
Pitch m_alt;
Pitch m_ten;
Pitch m_bas;
public:
inline HaiChi( const OnMei& bas_onmei , const Octave& bas_octave , const OnMei& ten_onmei , const Octave& ten_octave , const OnMei& alt_onmei , const Octave& alt_octave , const OnMei& sop_onmei , const Octave& sop_octave ) noexcept;
inline bool IsNaturallyOrdered() const noexcept;
uint GetNumberOfOnMei() const noexcept;
static bool CheckValidKaiMei( const Chou& N , const KaiMei& n ) noexcept;
static inline bool CheckHasDoubleDaiSanOn( const uint& bas_num , const uint& ten_num , const uint& alt_num , const uint& sop_num ) noexcept;
static inline bool CheckHasDaiGoOn( const uint& bas_num , const uint& ten_num , const uint& alt_num , const uint& sop_num ) noexcept;
inline string Display() const noexcept;
inline const Pitch& GetPitch( const int& i ) const noexcept;
private:
static inline const NoteNumber& NoteNumberOfDo6() noexcept;
static inline const NoteNumber& NoteNumberOfTi3() noexcept;
static inline const NoteNumber& NoteNumberOfFa5() noexcept;
static inline const NoteNumber& NoteNumberOfFa3() noexcept;
static inline const NoteNumber& NoteNumberOfLa4() noexcept;
static inline const NoteNumber& NoteNumberOfLa2() noexcept;
static inline const NoteNumber& NoteNumberOfFa4() noexcept;
static inline const NoteNumber& NoteNumberOfMi2() noexcept;
inline bool HasNaturalOnDo() const noexcept;
};
bool operator==( const HaiChi& C1 , const HaiChi& C2 ) noexcept;
inline bool operator!=( const HaiChi& C1 , const HaiChi& C2 ) noexcept;
C++での定義 |
---|
実際の実装例についてはこちらをご覧下さい。実装においては以下の仕様を要請します。
inline HaiChi::HaiChi( const OnMei& bas_onmei , const Octave& bas_octave , const OnMei& ten_onmei , const Octave& ten_octave , const OnMei& alt_onmei , const Octave& alt_octave , const OnMei& sop_onmei , const Octave& sop_octave ) noexcept
はメンバ初期化子m_sop( sop_onmei , sop_octave )
,m_alt( alt_onmei , alt_octave )
,m_ten( ten_onmei , ten_octave )
,m_bas( bas_onmei , bas_octave )
で定める。inline bool HaiChi::IsNaturallyOrdered() const noexcept
はreturn CheckOrderedWithinRange( m_bas.GetNoteNumber() , m_ten.GetNoteNumber() , m_alt.GetNoteNumber() , m_sop.GetNoteNumber() ) && HasNaturalOnDo();
で定める。uint HaiChi::GetNumberOfOnMei() const noexcept
はメンバ変数からconst OnMei& Pitch::GetOnMei() const noexcept
を呼び出して得られるconst OnMei
への参照のうちbool operator==( const OnMei& N1 , const OnMei& N2)
に関して相違なるものの個数を返す。bool HaiChi::CheckValidKaiMei( const Chou& N , const KaiMei& n ) const noexcept
はN.GetOnKai() == ChouOnKai()
の時にreturn true;
と定め、N.GetOnKai() == WaSeiTekiTanOnKai()
の時にreturn n == KaiMei::V()
と定め、N.GetOnKai() == ShiZenTanOnKai()
の時にreturn n != KaiMei::V()
と定める。inline bool HaiChi::CheckHasDoubleDaiSanOn( const uint& bas_num , const uint& ten_num , const uint& alt_num , const uint& sop_num ) const noexcept
はreturn ( bas_num * ten_num * alt_num * sop_num ) % 9 == 0;
で定める。inline bool HaiChi::CheckHasDaiGoOn( const uint& bas_num , const uint& ten_num , const uint& alt_num , const uint& sop_num ) const noexcept
はreturn ( bas_num * ten_num * alt_num * sop_num ) % 5 == 0;
で定める。inline string HaiChi::Display() const noexcept
はreturn "(" + m_bas.Display() + "," + m_ten.Display() + "," + m_alt.Display() + "," + m_sop.Display() + ")";
で定める。inline const Pitch& HaiChi::GetPitch( const int& i ) const noexcept
は1+i
番目のメンバ変数への参照返しで定める。static inline bool HaiChi::CheckOrderedWithInRange( const NoteNumber& bas , const NoteNumber& ten , const NoteNumber& alt , const NoteNumber& sop ) noexcept
はbas <= ten
かつten <= alt
かつalt <= sop
かつNoteNumberOfTi3() <= sop
かつsop <= NoteNumberOfDo6()
かつNoteNumberOfFa3() <= alt
かつalt <= NoteNumberOfFa5()
かつNoteNumberOfLa2() <= ten
かつten <= NoteNumberOfLa4()
かつNoteNumberOfMi2() <= bas
かつbas <= NoteNumberOfFa4()
を戻り値とする。static inline const NoteNumber& HaiChi::NoteNumberOfDo6() noexcept
~static inline const NoteNumber& HaiChi::NoteNumberOfMi2() noexcept
は関数名の語尾\(3\)文字の最初の\(2\)文字と関数名が等しいconst KanOn& (*)()
型の関数をN
と置き、最後の\(1\)文字をm
と置いた時、Pitch( N() , n ).GetNum()
と等しいようなconst NoteNumber
型の静的局所変数への参照返しと定める。inline bool HaiChi::HasNaturalOnDo() const noexcept
はOnDo( m_bas , m_ten ).GetDoSuu() <= 12かつ
OnDo( m_ten , m_alt ).GetDoSuu() <= 8
かつOnDo( m_alt , m_sop ).GetDoSuu() <= 8
を戻り値とする。- クラス
HaiChi
に対する等号演算子は自然なものである。