/*
【cutcode.h】
Unison3.hの修正版です。
名称は変更している為やり方がフェアではありませんが、Ver.2.0.0としてリリースすることにしました。


【修正履歴】
Ver.2.0.0(2020.3 更新)=>ファイル名を変更し、全体的に修正をしました。
Ver.1.2.1(2019.4 更新)=>軽微な修正をしました。
Ver.1.2.0(2016.3 更新)=>軽微な調整をしました。
Ver.1.1.0(2013.8 更新)=>サクラ標準のもの(unison.h)以外の部分を"+から-"に変更しました。
Ver.1.0.0(2013.4 更新)=>Unison2.hのパワーアップ版です。


【概要】
本定義ファイルは"先にメインメロディーを作ってからコードを後付け"する方の為のツールです。
最初からコードで打ち込まれている方にはお薦めできません。
尚、コード名は打ち込み時に手間とならない様に略称(なるべく4文字以内)とさせております。
書き方は綺麗ではありませんので予めご容赦ください。


【なんちゃって解説】
・サクラmmlでは、変数や関数の名前は大文字から始まります。
・本定義ファイルで使用する関数は以下の通りです。

Function 関数名(引数の型 変数名=初期値, 引数の型 変数名=初期値...){
    Sub{(mml)}
}

ここでは以下の処理が必要となります。
①音階で返す(c,d,e,f,g,a,b,+,-)・・・Str name(=Value)
②音階を計算する(1度,2度...)・・・Int name(=Value)
③同時に音を鳴らす(コード)・・・Sub{(mml)}
※SubはタイムポインタをSubの前に戻すコマンドです。
更に、重ねる音を法則に従ってずらしていくので、音階をコントロールする為のKeyコマンドも使います。

これらを合わせると、コードを自動で鳴らしてもらうには(書き方はさておき…)、

Function P5(Str S, Int Val){
        Sub{Key(Val) S; Key(Val-5)}S;
}

という形になります。
使う音の数の分、タイムポインタを戻していかないといけない為、音数が多くなるほどSubの使用数が多くなります。


【その他】
本定義ファイルはご自由にお使いいただいて問題御座いません。
著作権は放棄していませんので、本ファイルの自作発言や有償配布等はご遠慮下さい。
無償で配布する場合は、作者にご一報いただけると幸いです。

作者:屍翠龍司(かばねすいりゅう つかさ)
HP:https://kabanesuiryutsukaSa.web.fc2.com/
*/

//Key初期化用
Function KZ(Str S){
	Key(0) S;
}

//2音コード
//Perfect 5th(0,7)
Function P5(Str S, Int Val){
    Sub{Key(Val) S; Key(Val-7)} S;
}

//3音コード
//Maj(0,4,7)
Function Maj(Str S, Int Val){
    Sub{ 
        Sub{Key(Val) S; Key(Val-3)} S; 
        Key(Val-7)} S;
}

//min(0,3,7)
Function Min(Str S, Int Val){
    Sub{ 
        Sub{Key(Val) S; Key(Val-4)} S;
        Key(Val-7)} S;
}

//Sus4(0,3,7)
Function Su4(Str S, Int Val){
    Sub{
        Sub{Key(Val) S; Key(Val-5)} S; 
        Key(Val-7)} S;
}

//Sus2(0,2,7)
Function Su2(Str S, Int Val){
    Sub{
        Sub{Key(Val) S; Key(Val-5)} S;
        Key(Val-7)} S;
}

//Dim(0,3,6)
Function Dim(Str S, Int Val){
    Sub{
        Sub{Key(Val) S; Key(Val-3)} S;
        Key(Val-6)} S;
}

//Aug(0,4,8)
Function Aug(Str S, Int Val){
        Sub{
            Sub{Key(Val) S; Key(Val-4)} S;
            Key(Val-8)} S;
}

//4音コード
//7th(0,4,7,10)
Function Th7(Str S, Int Val){
    Sub{
        Sub{
            Sub{Key(Val) S; Key(Val-3)} S;
                Key(Val-6)} S;
            Key(Val-10)} S;
}

//Maj7(0,4,7,11)
Function Ma7(Str S, Int Val){
    Sub{
        Sub{
            Sub{Key(Val) S; Key(Val-4)} S;
                Key(Val-7)} S;
            Key(Val-11)} S;
}

//min7(0,3,7,10)
Function Mi7(Str S, Int Val){
    Sub{
        Sub{
            Sub{Key(Val) S; Key(Val-3)} S;
                Key(Val-7)} S;
            Key(Val-10)} S;
}

//min Maj7(0,3,7,11)
Function MM7(Str S, Int Val){
    Sub{
        Sub{
            Sub{Key(Val) S; Key(Val-4)} S; 
                Key(Val-8)} S; 
            Key(Val-11)} S;
}

//Dim7(0,3,6,9)
Function Di7(Str S, Int Val){
    Sub{
        Sub{ 
            Sub{Key(Val) S; Key(Val-3)} S;
                Key(Val-6)} S; 
            Key(Val-9)} S;
}

//6(0,4,7,9)
Function Th6(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-2)} S; 
                Key(Val-5)} S; 
            Key(Val-9)} S;
}

//min6(0,3,7,9)
Function Mi6(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-2)} S; 
                Key(Val-6)} S; 
        Key(Val-9)} S;
}

//add9(0,2,4,7)
Function Ad9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-3)} S; 
            Key(Val-5)} S; 
        Key(Val-7)} S;
}

//min add9(0,2,3,7)
Function Ma9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-4)} S; 
            Key(Val-5)} S; 
        Key(Val-7)} S;
}

//6 SuS4(0,5,7,9)
Function S46(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-2)} S; 
            Key(Val-4)} S; 
        Key(Val-9)} S;
}

//7th Sus4(0,5,7,10)
Function S47(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-3)} S;
            Key(Val-5)} S; 
        Key(Val-10)} S;
}

//Maj7th SuS4(0,5,7,11)
Function M7S(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{Key(Val) S; Key(Val-4)} S; 
            Key(Val-6)} S; 
        Key(Val-11)} S;
}

//5音コード
//9(0,2,4,7,10)
Function Th9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-3)} S; 
                Key(Val-6)} S;
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//min9(0,2,3,7,10)
Function Mi9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-3)} S; 
                Key(Val-7)} S;
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//Maj9(0,2,4,7,11)
Function Mj9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-4)} S; 
                Key(Val-7)} S;
            Key(Val-9)} S; 
        Key(Val-11)} S;
}

//min Maj9(0,2,3,7,11)
Function MM9(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-4)} S; 
                Key(Val-8)} S;
            Key(Val-9)} S; 
        Key(Val-11)} S;
}

//min 6 add9(0,2,3,7,9)
Function M69(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-2)} S; 
                Key(Val-6)} S;
            Key(Val-7)} S;
        Key(Val-9)} S;
}

//7th add9(0,4,5,7,10)
Function A97(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-3)} S;
                Key(Val-5)} S;
            Key(Val-6)} S; 
        Key(Val-10)} S;
}

//9 SuS4(0,2,5,7,10)
Function S49(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{
                Sub{Key(Val) S; Key(Val-3)} S; 
                Key(Val-5)} S;
            Key(Val-6)} S; 
        Key(Val-10)} S;
}

//Maj9 SuS4(0,2,5,7,11)
Function M9S(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{Key(Val) S; Key(Val-3)} S; 
                Key(Val-5)} S;
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//6音コード
//11(0,2,4,5,7,10)
Function T11(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ 
                    Sub{Key(Val) S; Key(Val-3)} S; 
                    Key(Val-5)} S;
                Key(Val-6)} S; 
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//min11(0,2,3,5,7,10)
Function M11(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ Sub{Key(Val) S; Key(Val-3)} S; 
                    Key(Val-5)} S;
                Key(Val-7)} S; 
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//Maj11(0,2,4,5,7,11)
Function Mj11(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{
                    Sub{Key(Val) S; Key(Val-4)} S; 
                    Key(Val-6)} S;
                Key(Val-7)} S; 
            Key(Val-9)} S; 
        Key(Val-11)} S;
}

//min Maj11(0,2,3,5,7,11)
Function MM11(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ 
                    Sub{Key(Val) S; Key(Val-4)} S; 
                    Key(Val-6)} S;
                Key(Val-8)} S;
            Key(Val-9)} S;
        Key(Val-11)} S;
}

//13(0,2,4,7,9,10)
Function T13(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ Sub{Key(Val) S; Key(Val-1)} S; 
                    Key(Val-3)} S;
                Key(Val-6)} S; 
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//min13(0,2,3,7,9,10)
Function Mi13(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ 
                    Sub{Key(Val) S; Key(Val-1)} S;
                    Key(Val-3)} S;
               Key(Val-7)} S; 
            Key(Val-8)} S; 
        Key(Val-10)} S;
}

//Maj13(0,2,4,7,9,11)
Function Ma13(Str S, Int Val){
    Sub{
        Sub{ 
            Sub{ 
                Sub{ 
                    Sub{Key(Val) S; Key(Val-2)} S; 
                    Key(Val-4)} S;
                Key(Val-7)} S; 
            Key(Val-9)} S; 
        Key(Val-11)} S;
}

//min Maj13(0,2,3,7,9,11)
Function MM13(Str S, Int Val){
    Sub{ 
        Sub{ 
            Sub{ 
                Sub{ 
                    Sub{Key(Val) S; Key(Val-2)} S; 
                    Key(Val-4)} S;
                Key(Val-8)} S; 
            Key(Val-9)} S; 
        Key(Val-11)} S;
}

//おまけ
//OctaVe(0,12)
Function Oct(Str S, Int Val){
    Sub{Key(Val) S; Key(Val-12)} S;
}

//Perfect 5th & OctaVe(0,7,12)
Function P5O(Str S, Int Val){
    Sub{ 
        Sub{Key(Val) S; Key(Val-5)} S; 
        Key(Val-12)} S;
}

//End