/*

                ---------------------------------
                〜そんな彼はコンピュータ作曲家〜
                Ver.09999999999999129387918724094
                ---------------------------------
                
                /~~~~~~~~~~~/
                | .     .   | 〜♪
                |    v      |
               / ~~~~~~~~~~~/          written in 2010
              /============/           by spark.K
             /============/            last modified in 2011/01/27

　Ｅ　　　　く　改　ど　　　　ん　｜　｜　を　じ　　　　て　ま　曲　　　
　ｎ　　　　い　造　ん　作　　で　ド　の　リ　め　伴　　い　す　名　こ
　ｄ　　　　け　も　ど　曲　　い　に　生　ズ　定　奏　　る　。　や　れ
　　　　　　ど　自　ん　の　　る　含　成　ム　義　や　　と　　　｀　は
　Ｏ　　　　。　由　使　参　　だ　ま　は　に　し　ド　　思　と　作　自
　ｆ　　　　　　で　っ　考　　け　れ　｀　用　て　ラ　　い　り　者　動
　　　　　　　　す　て　に　　。　る　か　い　あ　ム　　ま　あ　も　作
　説　　　　　　。　も　な　　∪　音　な　ま　る　パ　　す　え　ラ　曲
　明　　　　　　ソ　構　る　　　　を　り　す　リ　｜　　。　ず　ン　シ
　　　　　　　　｜　い　と　　　　ラ　適　。　ズ　ト　　　　｀　ダ　ス
　　　　　　　　ス　ま　思　　　　ン　当　　　ム　は　　　　曲　ム　テ
　　　　　　　　が　せ　っ　　　　ダ　で　メ　パ　｀　　　　に　に　ム
　　　　　　　　読　ん　た　　　　ム　す　ロ　タ　あ　　　　は　生　で
　　　　　　　　み　し　ら　　　　に　∩　デ　｜　ら　　　　な　成　す
　　　　　　　　に　｀　｀　　　　選　コ　ィ　ン　か　　　　っ　し　。

                ホームページ　→　http://user.freespace.jp/sparkk/
                MIDI素材はじめました。4ヶ月前に。
*/

Int WithCHORD=Random(3);
Int NUM;
Array Normal = ({rrrrrrrr},{-+-+-+-+},{+-+-+-+-},{-++-++-+},{--+--+--},
{+---+---},{++-+++-+},{--+---+-},{---+---+},{-+++-+++},{+--+--++},
{-+-Div{++}-+-Div{++}},{+++++-++},{+------+},{+---+--+},{-------+},
{++------},{+++r+^^^},{++r+^^^^},{Div{++}Div{++}rrrrrr},{+r+r+r++},
{rr+^r+r+},{+r+r+rStretch{+++}^})
Array Three = ({---+--},{------},{+--+--},{-++-++},{-+++--},{-+--+-},
{++--++},{+-+-++},{+^++++})

Array Ptn = Normal;
Int MAX=SizeOf(Ptn);

// 曲の長さ（というか繰り返し）
Int LLL = 4 * RandomSelect(1,2,2,4);

TR(1) CH(10) @(RandomSelect(1,17,25,26)) p(Random(128))
Tempo=RandomSelect(60,92,112,120,138)
UseKeyShift(off)

NUM=Random(MAX);
Sub{
#a = Replace(Ptn(NUM),{+},{n46},on)
#a = Replace(#a,{-},{n42},on)
l16 [(LLL) #a ]
}

NUM=Random(MAX)
#a = Replace(Ptn(NUM),{+},{n40},on)
#a = Replace(#a,{-},{r},on)
l16 [(LLL) #a ]

Int BASSVOICE; Int RND = Random(10000);
If(RND>3000){BASSVOICE=Random(33,40)}Else{
If(RND>1000){BASSVOICE=Random(1,31)}Else{BASSVOICE=Random(49,72)}}
UseKeyShift(on)
TR(2) @(BASSVOICE) l16

Int BASSNOTE = Random(24,48);
NUM=Random(MAX)
Sub{
#a = Replace(Ptn(NUM),{+},{n}+BASSNOTE,on)
#a = Replace(#a,{-},{^},on)
[(LLL) o3#a ]
}

NUM=Random(MAX)
#a = Replace(Ptn(NUM),{+},{n}+(BASSNOTE+Random(2,12)),on)
#a = Replace(#a,{-},{^},on)
[(LLL) #a ]







Int CHORDNOTE;
Int UPDOWNOCT=1;
Array MIN=(0,3,7);
Array MAJ=(0,4,7);
Array SUS4=(0,5,7);
Array MIN7=(0,3,7,10);
Array MAJ7=(0,4,7,11);
Array SSUS4=(0,5,7,10);
Array USECHORD;
If(Random(100)>50){USECHORD=MIN}Else{
If(Random(100)>60){USECHORD=MAJ}Else{
If(Random(100)>70){USECHORD=SUS4}Else{
If(Random(100)>60){USECHORD=MIN7}Else{
If(Random(100)>50){USECHORD=MAJ7}Else{
USECHORD=SSUS4}}}}}

CHORDNOTE=BASSNOTE+(Random(1,3)*12);
TR(3) @(Random(1,31)) q96 l16
If(Random(10000)>3000){NUM=Random(MAX)}
If(WithCHORD>=1 && Random(10)>=2){
    #x={'}
    For(Int I=0;I<SizeOf(USECHORD);I++){
        #x = #x + {n}+(CHORDNOTE+USECHORD(I)+(UPDOWNOCT*Random(2)*12));
    }
    #x = #x + {'}
    #a = Replace(Ptn(NUM),{+},#x,on)
    #a = Replace(#a,{-},{^},on)
    
    [(LLL) #a ]
}

CHORDNOTE=BASSNOTE+(Random(1,3)*12);
TR(13) @(Random(1,31)) q96 l16
If(Random(10000)>3000){NUM=Random(MAX)}
If(WithCHORD>=1 && Random(10)>=5){
    #x={'}
    For(Int I=0;I<SizeOf(USECHORD);I++){
        #x = #x + {n}+(CHORDNOTE+USECHORD(I)+(UPDOWNOCT*Random(2)*12));
    }
    #x = #x + {'}
    #a = Replace(Ptn(NUM),{+},#x,on)
    #a = Replace(#a,{-},{^},on)
    
    [(LLL) #a ]
}

Array MELOVOICEARR = (Random(1,31),Random(47,113))
Int MELOVOICE = RandomSelect(MELOVOICEARR)
CHORDNOTE=BASSNOTE+(Random(1,3)*12);
TR(15)v127 @(MELOVOICE) q96 l16
NUM=Random(MAX)
#melo={}
For(Int L=0;L<LLL;L++){
    If(L>=(LLL/2) && Random(100)>=75){
        NUM=Random(MAX)Print("" + L + " : phrase changed")
    }
    #a={}
    #a=Ptn(NUM)
    For(Int I=0;I<SizeOf(Ptn);I++){
        #x = {n}+(CHORDNOTE+USECHORD(Random(SizeOf(USECHORD)))+(UPDOWNOCT*Random(2)*12));
        #a = Replace(#a,{+},#x,off)
        #a = Replace(#a,{-},{^},off)
    }
    #melo=#melo+#a
} #melo
Print(#melo)
//Solo=1,15

Function NameM()
{
    Str S = {};
    Array Char = ({"ア"}, {"イ"}, {"ウ"}, {"エ"}, {"オ"},
    {"カ"}, {"キ"}, {"ク"}, {"ケ"}, {"コ"},
    {"サ"}, {"シ"}, {"ス"}, {"セ"}, {"ソ"},
    {"タ"}, {"チ"}, {"ツ"}, {"テ"}, {"ト"},
    {"ナ"}, {"ニ"}, {"ヌ"}, {"ネ"}, {"ノ"},
    {"ハ"}, {"ヒ"}, {"フ"}, {"ヘ"}, {"ホ"},
    {"マ"}, {"ミ"}, {"ム"}, {"メ"}, {"モ"},
    {"ラ"}, {"リ"}, {"ル"}, {"レ"}, {"ロ"},
    {"ヤ"}, {"ユ"}, {"ヨ"}, {"ャ"}, {"ュ"}, {"ョ"}, {"ッ"},
    {"ワ"}, {"ヲ"}, {"ン"})
    
    For(Int X=0;X<Random(2,6);X++){S = S + Char(Random(SizeOf(Char)))}
    Result=S
}

Function LyricM()
{
    Array Who = ({"私"}, {"俺"}, {"拙者"}, {"あんた"}, {"あなた"}, {"君"},
    {"彼"}, {"彼等"}, {"彼女"}, {"中の人"}, {"宇宙人"})
    Array Tenioha = ({"は"}, {"が"},  {"の"},  {"を"},  {"へ"},  {"に"}, {"も"},
    {"と"}, {"って"}, {"か"})
    Array Verb = ({"食べた"}, {"食べる"}, {"持ってきた"}, {"持ってくる"},
    {"見た"}, {"見る"}, {"聞いた"}, {"聞く"},
    {"触った"}, {"触る"}, {"つまんだ"}, {"つまむ"},
    {"投げた"}, {"投げる"}, {"電子レンジでチンした"}, {"解凍した"},
    {"揚げた"}, {"揚げる"}, {"噛む"}, {"噛んだ"},
    {"歌った"}, {"歌う"}, {"描いた"}, {"描く"},
    {"感じた"}, {"感じる"}, {"見つめる"}, {"見つめた"},
    {"頬張った"}, {"敬遠した"}, {"敬遠する"}, {"立ち上げる"},
    {"立ち上げた"}, {"USB接続した"}, {"コピーした"}, {"マウスでゴミ箱に捨てた"},
    {"口に入れた"}, {"リモコン操作する"}, {"何か書く"}, {"AND演算した"},
    {"OR演算した"}, {"二次キャッシュメモリに保存した"}, {"二次元に閉じ込めた"},
    {"不気味な笑い"}, {"記憶にございません"}, {"シュレッダーにかけた"}, {"眺めた"}, {"眺める"})
    Array Kantan = ({"！"}, {"？"}, {"！？"}, {""},  {"、"},  {"。"},
    {"(^^;)"}, {"(^^)"}, {"<^^>"}, {"[^^]"}, {"(._.)"}, {"(^0^)"}, {"(・∀・)"})
    Int WhoI = Random(SizeOf(Who));
    Int TeniohaI = Random(SizeOf(Tenioha) - 1);
    Int WhomI = Random(SizeOf(Who));
    Int Tenioha2I = Random(SizeOf(Tenioha));
    Int VerbI = Random(SizeOf(Verb))
    Int Verb2I = Random(SizeOf(Verb))
    Int Verb3I = Random(SizeOf(Verb))
    Int KantanI = Random(SizeOf(Kantan))

    Int Temp;   
    Int Pat = Random(6)
    Str Buf = {}
    If(Pat==0){Buf=Who(WhoI)+Tenioha(TeniohaI)+Who(WhomI)+Tenioha(TeniohaI2)+Verb(VerbI)}
    If(Pat==1){Buf=Verb(VerbI)+Who(WhoI)+Tenioha(TeniohaI)+Verb(Verb2I)}
    If(Pat==2){Buf=Verb(VerbI)+Who(WhoI)+Tenioha(TeniohaI)+Who(WhomI)+Tenioha(Tenioha2I)}
    If(Pat==3){Buf=Verb(VerbI)+NameM()+Tenioha(TeniohaI)+Who(WhomI)+Tenioha(Tenioha2I)}
    If(Pat==4){Buf=NameM()+Tenioha(TeniohaI)+Who(WhomI)+Tenioha(TeniohaI2)+Verb(VerbI)}
    If(Pat==5){
        For(Int C=0;C<Random(2,12);C++){
            Temp=Random(6)
            If(Temp==0){Buf=Buf+Who(Random(SizeOf(Who)))}
            If(Temp==1){Buf=Buf+Tenioha(Random(SizeOf(Tenioha)))}
            If(Temp==2){Buf=Buf+Verb(Random(SizeOf(Verb)))}
            If(Temp==3){Buf=Buf+Kantan(Random(SizeOf(Kantan)))}
            If(Temp==4){Buf=Buf+NameM()}
        }
    }
    //Buf=Buf+Kantan(KantanI)
    Result=Buf
}

TR(0)
Copyright=NameM()
TrackName=LyricM()