数式での翻訳 |
---|
\(\textrm{DoSuu} = \mathbb{N} \setminus \{0\}\)と置き、\(\textrm{DoSuu}\)の元を度数と呼びます。\(\textrm{DoSuu}\)を記号の集合とする長さ\(1\)の文字列を、その唯一の成分である度数と同一視します。音度の接頭辞と度数と文字列\(\textrm{Do}\)の文字列としての結合で与えられる文字列を、音度の接頭辞と度数と文字\(\textrm{Do}\)の\(3\)つ組と同一視します。音度の接頭辞と度数と文字列\(\textrm{Do}\)の\(3\)つ組全体の集合 \[ \textrm{OnDo} = \textrm{SetTouJiOfOnDo} \times \textrm{DoSuu} \times \{\textrm{Do}\} \] に属する文字列を音度と呼びます。例えば文字列\(\textrm{KanZen}3\textrm{Do}\)は\(3\)つ組\((\textrm{KanZen},3,\textrm{Do})\)と同一視され、\(\textrm{Kanzen}\)は音度の接頭辞、\(3\)は度数であることからこれは音度となります。一方で文字列\(\textrm{Chou}0\textrm{Do}\)は\(0\)が度数でないことから音度ではありません。ちなみに音度の第\(3\)成分である文字列\(\textrm{Do}\)は幹音でもありますが、だからといって何か意味があるわけではありません。
第\(1\)射影と第\(2\)射影 \[ \begin{align} \textrm{OnDo} & \to \textrm{SetTouJiOfOnDo} \\
\textrm{OnDo} & \to \textrm{DoSuu} \end{align} \] をそれぞれ\(\textrm{GetSetTouJi}\)と\(\textrm{GetDoSuu}\)と置きます。
ピッチ\(P_1\)と\(P_2\)に対し、音度\(\Delta_{P_1,P_2}\)を以下のように定めます:
- \(D_1 = \textrm{Represent}(\textrm{GetNum}(\textrm{GetKanOn}(\textrm{GetOnMei}(P_1)))) + 7 \cdot \textrm{GetOctave}(P_1) \in \mathbb{Z}\)と置く。
- \(D_2 = \textrm{Represent}(\textrm{GetNum}(\textrm{GetKanOn}(\textrm{GetOnMei}(P_2)))) + 7 \cdot \textrm{GetOctave}(P_2) \in \mathbb{Z}\)と置く。
- \(D_1 \leq D_2\)ならば、\(s = 1 \in \{-1,1\}\)と置く。
- \(D_1 \gneq D_2\)ならば、\(s = -1 \in \{-1,1\}\)と置く。
- \(d = \textrm{GetNoteNumber}(P_2) - \textrm{GetNoteNumber}(P_1) \in \mathbb{Z}\)と置く。
- \(D = s(D_2-D_1) \in \textrm{ZeroIndexedDoSuu}\)と置く。
- \((D,sd)\)に対応する音度の接頭辞を\(S\)と置く。
- \(\Delta_{P_1,P_2} = (S,(D+1)+7 \mathbb{Z},\textrm{Do})\)である。
この\(\Delta_{P_1,P_2}\)を\(P_1\)と\(P_2\)の音度と呼びます。
音度\(\Delta\)が最低音における制限付き協和音程であるおよび協和音程であるという関係を以下のように定めます:
- \(S = \textrm{GetSetTouJi}(\Delta) \in \textrm{SetTouJiOfOnDo}\)と置き、\(n = \textrm{GetDoSuu}(\Delta) \in \textrm{DoSuu}\)と置く。
- 法\(7\)において\(n \equiv 0,2\)ならば、\(\Delta\)は最低音における制限付き協和音程でも協和音程でもない。
- 法\(7\)において\(n \equiv 1,5\)ならば、\(\Delta\)が最低音における制限付き協和音程であることと協和音程であることは、\(S\)が\(\textrm{KanZen}\)であることと同値である。
- 法\(7\)において\(n \equiv 3,6\)ならば、\(\Delta\)が最低音における制限付き協和音程であることと協和音程であることは、\(S\)が\(\textrm{Chou}\)または\(\textrm{Tan}\)であることと同値である。
- 法\(7\)において\(n \equiv 4\)ならば、\(\Delta\)は最低音における制限付き協和音程でなく、\(\Delta\)が協和音程であることは\(S\)が\(\textrm{KanZen}\)であることと同値である。
C++での宣言 |
---|
音度のクラスおよび関係する関数たちを以下のように宣言します。
using DoSuu = uint;
class OnDo
{
private:
const SetTouJiOfOnDo& m_settouji;
const DoSuu m_dosuu;
const KaiMei m_dosuu_mod;
public:
inline OnDo( const Pitch& P1 , const Pitch& P2 ) noexcept;
bool CheckKyouWaOnTei() const noexcept;
bool CheckKyouWaOnTeiBottom() const noexcept;
inline const SetTouJiOfOnDo& GetSetTouJi() const noexcept;
inline const DoSuu& GetDoSuu() const noexcept;
inline const KaiMei& GetDoSuuMod() const noexcept;
inline string Display() const noexcept;
private:
inline OnDo( const int& D , const int& d ) noexcept;
inline OnDo( const int& D , const int& d , const int& sign ) noexcept;
inline OnDo( const ZeroIndexedDoSuu& D , const PitchDifference& d ) noexcept;
inline static int PitchToAbsoluteDoSuu( const Pitch& P ) noexcept;
inline static int ComputeSignedZeroIndexedDoSuu( const Pitch& P1 , const Pitch& P2 ) noexcept;
inline static int ComputeSignedPitchDifference( const Pitch& P1 , const Pitch& P2 ) noexcept;
};
inline bool operator==( const OnDo& D1 , const OnDo& D2 ) noexcept;
inline bool operator!=( const OnDo& D1 , const OnDo& D2 ) noexcept;
C++での定義 |
---|
実際の実装例についてはこちらをご覧下さい。実装においては以下の仕様を要請します。
inline OnDo::OnDo( const Pitch& P1 , const Pitch& P2 ) noexcept
は委譲コンストラクタOnDo( ComputeSignedZeroIndexedDoSuu( P1 , P2 ) , ComputeSignedPitchDifference( P1 , P2 ) )
で定める。inline OnDo::OnDo( const int& D , const int& d ) noexcept
は委譲コンストラクタOnDo( D , d , D >= 0 ? 1 : -1 )
で定める。inline OnDo::OnDo( const int& D , const int& d , const int& sign ) noexcept
は委譲コンストラクタOnDo( (uint)( sign * D ) , sign * d )
で定める。inline OnDo::OnDo::OnDo( const ZeroIndexedDoSuu& D , const PitchDifference& d ) noexcept
はメンバ初期化子m_settouji( SetTouJiOfOnDo::Compute( D , d ) )
,m_dosuu( D + 1 )
,m_dosuu_mod( m_dosuu )
で定める。bool OnDo::CheckKyouWaOnTei() const noexcept
はCheckKyouWaOnTeiBottom()
ならばreturn true
と定め、そうでないならば( m_dosuu_mod == 4 ) && ( m_settouji == SetTouJiOfOnDo::KanZen() )
と定める。-
` bool OnDo::CheckKyouWaOnTeiBottom() const noexcept は
m_dosuu_mod == 1または
m_dosuu_mod == 5ならば
return m_settouji == SetTouJiOfOnDo::KanZen()と定め、
m_dosuu_mod == 3または
m_dosuu_mod == 6ならば
return ( m_settouji == SetTouJiOfOnDo::Chou() )( m_settouji == SetTouJiOfOnDo::Tan() ) と定め、それ以外ならば
return false`と定める。 inline const SetTouJiOfOnDo& OnDo::GetSetTouJi() const noexcept
はreturn m_settouji
で定める。inline const DoSuu& OnDo::GetDoSuu() const noexcept
はreturn m_dosuu
で定める。inline const KaiMei& OnDo::GetDoSuuMod() const noexcept
はreturn m_dosuu_mod
で定める。inline string OnDo::Display() const noexcept
はreturn m_settouji.Get() + to_string( m_dosuu ) + "Do"
で定める。inline int OnDo::PitchToAbsoluteDoSuu( const Pitch& P ) noexcept
はreturn ( ( ( P.GetOnMei() ).GetKanOn() ).GetNum() ).Represent() + P.GetOctave() * 7
で定める。inline int OnDo::ComputeSignedZeroIndexedDoSuu( const Pitch& P1 , const Pitch& P2 ) noexcept
はreturn PitchToAbsoluteDoSuu( P2 ) - PitchToAbsoluteDoSuu( P1 )
で定める。inline int OnDo::ComputeSignedPitchDifference( const Pitch& P1 , const Pitch& P2 ) noexcept
はreturn P2.GetNoteNumber() - P1.GetNoteNumber()
で定める。- クラス
OnDo
に対する等号演算子は自然なものである。