/* ■Quiet City Awaking  作成:ひかり( = さくらもどき )  :-------------------------------------------------------------------------------: ::: 霞がかった静寂の都市。朝日が差し込むと、世界が動き出します。 :::  :-------------------------------------------------------------------------------: 詳細 【推奨環境】ヘッドホン 【推奨音源】MP3 ,TWM2 , MSGS 【無断転用】可 【 編曲 】可 【ジャンル】Easy Listening 作成環境 【 OS 】WindoowsXP HomeEdition 【 音源 】TWM2,MSGS 【出力環境】MDR-CD100 (ヘッドホン) UA-101 (オーディオI/O) ◆MEMO DLありがとうございます。 霞がかったような、淡い水色の色彩と浮遊感を感じていただければ・・・と思います。 テーマとしてはこの間つくったLapis Lazuliと同じ『夜明け』です。 Lapisとは対照的に静かで綺麗な四ツ打ちっていう感じにしてみました。 最後に、ソースコードについて。 汚すぎ、コンパイル掛かり過ぎ、 あとから読むときに死ぬんだろうなーという予想がプンプンしますw */ 曲名{"Quiet City Awaking"} 作者{"SakuraModki As ひかり"} ResetGS 拍子4,4 テンポ( 131 ) 調#() System.vMax=110 CH(11) SysEx$ = f0,41,10,42,12,{40,1a,15,02},f7; Key= -5 Int I=1 //[16 TR=I CCMute=on I++] /* MP3作成用にCCを削ぎ落とす */ //=================================================================================================== //=================================================================================================== //=================================================================================================== //_汎用関数の定義 //=================================================================================================== //=================================================================================================== //=================================================================================================== Str PD={r32 y64,0 r32 y64,127 r-16} Str PF={r32 y64,0 r-32} Function L1(int){Result=(!1 * int)} //数小節分の長さを返す Function R1(int){[(int)r*1]} //数小節分の休符 Function X(int){Sub{[(int)r-1]? } } //数小節戻ってから再生(デバッグ用) //=================================================================================================== //=================================================================================================== //=================================================================================================== //_文字操作関数群 :: 行単位での処理が可能です //=================================================================================================== //=================================================================================================== //=================================================================================================== Int _EXSTRING_ERROR_TYPE_SUCCESSED = 0 //関数は正常に終了しました Int _EXSTRING_ERROR_TYPE_INVALID_NUMBER = 1 //不正な値が入力されています Int _EXSTRING_ERROR_TYPE_NOT_EXIST = 2 //存在しませんでした Int _EXSTRING_CURRENT_ERROR = 0 ; //--------------------------------------------------------------------------------------------------- //直前の文字列操作のエラーを取得する //--------------------------------------------------------------------------------------------------- Function GetExStrError(){ Result = _EXSTRING_CURRENT_ERROR _EXSTRING_CURRENT_ERROR = _EXSTRING_ERROR_TYPE_SUCCESSED } //--------------------------------------------------------------------------------------------------- //行数を取得する //--------------------------------------------------------------------------------------------------- Function GetMaxLine(Str Data ){ Data = Data+CHR($0D)+CHR($0A)+" "; Int It=0 Int Cnt=0; For(Int It=0 ; It <= SizeOf(Data) ; It++){ IF( ASC( MID(Data , It ,1 ) ) == $0D ){//CRならば改行を加算 IF( ASC( MID(Data , It+1 ,1 ) ) == $0A ){//LFがあればとばす It++ } Cnt++; } } Result = Cnt; } //--------------------------------------------------------------------------------------------------- //n行目を抜き出す。(n=0〜) //--------------------------------------------------------------------------------------------------- Function GetLineByLineNum( Str Data , Int n ){ Data = Data+CHR($0D)+CHR($0A)+""; Int It=0 Int Cnt=0; Str Result_str=""; Str Char; _EXSTRING_CURRENT_ERROR = _EXSTRING_ERROR_TYPE_NOT_EXIST; IF( n < 0){ _EXSTRING_CURRENT_ERROR = _EXSTRING_ERROR_TYPE_INVALID_NUMBER; }Else{ For(Int It=0 ; It < SizeOf(Data) ; It++){ Char = MID( Data , It ,1 ) IF( ASC( Char ) == $0D ){//CRならば改行を加算 IF( ASC( MID(Data , It+1 ,1 ) ) == $0A ){//LFがあればとばす It++ } Cnt++; IF( Cnt > n ){ //n行以上を読んだら終了 _EXSTRING_CURRENT_ERROR = _EXSTRING_ERROR_TYPE_SUCCESSED; Result = Result_str; Exit; } }Else{ IF( Cnt == n ){ IF( Char != "" ){ Result_str = Result_str + Char; } } } } } } //--------------------------------------------------------------------------------------------------- //特定文字を含まない行を削除する //--------------------------------------------------------------------------------------------------- Function DeleteLineNotExistString(Str Data , Str Check ){ Str Result_str=""; Int Count = 0; Str Buf = ""; GetExStrError(); //エラー初期化 While( 1 ){ Buf = GetLineByLineNum( Data , Count ); IF( GetExStrError() != _EXSTRING_ERROR_TYPE_SUCCESSED){ Exit } Count++; If( POS( Check , Buf ) != 0){ IF( Result_str == "" ){ Result_str = Buf; }Else{ Result_str = Result_str + CHR($0D) + CHR($0A) + Buf; } } } _EXSTRING_CURRENT_ERROR = _EXSTRING_ERROR_TYPE_SUCCESSED; Result = Result_str; } //=================================================================================================== //=================================================================================================== //=================================================================================================== //_TrackChange関数 //=================================================================================================== //=================================================================================================== //=================================================================================================== //他のトラックに対して、自分の今いるトラックから別のトラックを操作する //  書込先,情報  ,UseKeyShift Function TRC(Int TTR,Str TSUB,Int UKS=on){ Int BTR=TR; //情報取得と復元ポイント設定 Int BTime=Time Int DUKS=UseKeyShift //UseKeyShiftの保存 TR=TTR; //情報設定と復元ポイント設定 Int DTime=Time; Time=BTime UseKeyShift=UKS //UseKeyShiftを適用 Sub{TSUB};Time=DTime //演奏とトラック初期化 UseKeyShift=DUKS //UseKeyShiftの復元 TR=BTR;Time=BTime //元トラック情報初期化 } //=================================================================================================== //=================================================================================================== //=================================================================================================== //_ドラム用ライブラリ :: //=================================================================================================== //=================================================================================================== //=================================================================================================== //--------------------------------------------------------------------------------------------------- //シーケンサ型記述用関数 //--------------------------------------------------------------------------------------------------- Function DrumPlay(Str Playlist , Str Note ){ Str Buf = Replace( Replace( Playlist, "x" , Note , on ) , "-", "r" , on); Buf; } //--------------------------------------------------------------------------------------------------- //複数記述用 //--------------------------------------------------------------------------------------------------- Function MML_DRUM(Str Drum_Play_data){ Str Data = DeleteLineNotExistString( Drum_Play_data+CHR($0D) , CHR($3A) ); //:を含まない行を削除 Str Cmd = Replace( Data , CHR($3A) , CHR($28) , on ); //:を(へ置換 // Print(Cmd) Int Cnt=0; Str Buf="" Str LastBuf="" Int Flag = 0; Int Er=0; Str Result_Str="" For( Cnt=0; Flag == 0 ; Cnt++){ Buf = GetLineByLineNum( Cmd , Cnt ); // Print(Buf) Er=GetExStrError(); IF(Er != _EXSTRING_ERROR_TYPE_SUCCESSED ){ Flag=1 }Else{ IF( Buf != ""){ Buf = Buf + " " + CHR($29); }Else{ Buf = CHR($29); } IF( LastBuf != ""){ Result_Str = Result_Str + {" Sub "}+ CHR($7b) + LastBuf+ CHR($7d) } LastBuf = Buf } } Result_Str = Result_Str + LastBuf Result = Result_Str } //====================================================================================== // Arpeggiator (09/08/28) //-------------------------------------------------------------------------------------- /* ■アルペジエーター関数仕様 ここまでは必ず入力 | ここからは任意に省略可能 -関数名 Arpeggiator( Code , Len , Paturn , lPaturn , Pmode , Range , Rmode , Phase , Shift) -引数 Code : 構成音 Len : 長さ Paturn : アルペジオパターン lPaturn : ノートの長さのパターン(省略時はその時点でのlを使用する) Pmode : パターンの再生方法(0:Normal 1:Revers) Range : オクターブのシフト幅(省略時は入力されたパターンによる) Rmode : オクターブのシフト方法(0:No 1:Note 2:Paturn 3:Revers Note 4:Revers Paturn) Phase : 位相 Shift : ノートシフト ●解説 -Code 構成音を記述します。 構成音は{a,c,e}のように{ }で括って , で区切ってください。 入力は内部で自動的にソートされるので記述する順番は任意です。 -Len アルペジオを適応する長さを指定します。 この長さにわたってアルペジエーターは実行されます。 動作終了後はLenだけ進んだ位置にTimeが指定されなおします。 パターンとLenがちょうど一致しない場合はLenに収まるように最後のノート短く切ります。 -Paturn アルペジオのノートのパターンを指定します。 パターンは数字で指定します。 0を基準として、数字が大きくなるほど高い音、小さくなるほど低い音になります。 これも和音と同様に{ }で括って , で区切らなくてはいけません。  通常のabcdefgの音符のように`や"の記号を用いて音階を上下することができます。 -lPaturn 省略可能な引数です。 アルペジオのノートの長さのパターンを指定します。 パターンはステップ数で指定します。 !付きのステップ数でも自動的に変換されます。 省略された場合はその時点でのlを使用します。 これも和音と同様に{ }で括って , で区切らなくてはいけません。 例)l8が指定されてこの引数が省略されれば8分音符のアルペジオになる。   {!8,!16}が指定されていれば8分と16分を交互に繰り返すのアルペジオになる。 -Pmode 省略可能な引数です。 パターンの再生方法を指定します。 0:パターンを通常の再生方法で再生します。 1:パターンを上下反転させて再生します。 省略時は0になります。 -Range 省略可能な引数です。 オクターブのシフト幅を決定します。 省略時にはパターンのシフト幅に依存します。 -Rmode 省略可能な引数です。 オクターブの変更方法を選択します。 0:オクターブを変更しません。 1:高いノートほど、高いオクターブで演奏します。 2:パターンの1ループごとに1オクターブを上げます。 3:高いノートほど、低いオクターブで演奏します。 4:パターンの1ループごとに1オクターブを下げます。 省略時には0になります。 -Phase 省略可能な引数です。 アルペジオパターンの位相をずらします。 lPaturnを指定している場合はその位相も同時にずれます。 省略時は0です。 例)パターン{1,2,3}の位相を1ずらすと{2,3,1}となる。 例)パターン{1,2,3}の位相を2ずらすと{3,1,2}となる。 -Shift 省略可能な引数です。 和音とパターンの対応をシフトします。 省略時は0です。 例){c,d,e}に1,2,3が対応している場合 1シフトすると{d,e,`c}に1,2,3が対応する。 例){c,d,e}に1,2,3が対応している場合-1シフトすると{"e,c,d}に1,2,3が対応する。 ■更新履歴  2009/08/28 : 関数実行後に音符の長さの指定がおかしくなる現象に対応  2009/08/27 : 仮公開 */ Function Arpeggiator(Array Argv){ //----------------------------------------- // 変数宣言 //----------------------------------------- Array NoteList=(); Array NoteNumList=(); Array PaturnNumList=(); Array LenNumList=(); Array OctNumList=(); Int Notenum = 0; Int Patunum = 0; Int PaturnMax = -128; Int Default_Len = MML(l); Int Default_Time = Time; Int Len = 0; Int Pmode = Argv(4); //パターンの再生方法(0:Normal 1:Revers) Int Range = Argv(5); //オクターブのシフト幅(省略時は入力されたノート数による) Int Rmode = Argv(6); //オクターブのシフト方法(0:Note 1:Paturn 2:Revers Note 3:Revers Paturn) Int Phase = Argv(7); //位相 Int Shift = Argv(8); //ノートシフト //汎用変数 Int Counter = 0; Int Buf = 0; Int Buf2 = 0; Int Flag = 0; Str Stbuf = ""; Str Stbuf2 = ""; //----------------------------------------- // 0:和音分析 //----------------------------------------- //渡された和音を読み込む Counter = 0 While(Flag == 0){ Flag = 1; Buf = POS( {","} , Argv(0) ); If(Buf != 0){ NoteList( Counter ) = MID( Argv(0) , 0 , Buf ); Stbuf = Argv(0); Argv(0) = MID(Argv(0) , Buf+1 , SizeOf(Stbuf) ); Flag = 0; IF(Counter == 128){ Flag = 1; } }Else{ Flag = 1; NoteList( Counter ) = Argv(0); } Counter++; } Notenum = Counter; Counter = 0; //読み込み完了。 //ノートをノートナンバーへ変換 [(Notenum) Flag = 0; Buf = 0; Stbuf = NoteList(Counter); While( POS({`},Stbuf) != 0){ Stbuf = Replace( Stbuf , {`} , {} , off) Buf++; } While( POS(CHR(34),Stbuf) != 0){ Stbuf = Replace( Stbuf , CHR(34) , {} , off) Buf--; } Stbuf = "NoteNumList(Counter) = NoteNo( "+Stbuf+" );" Stbuf; NoteNumList(Counter) = NoteNumList(Counter) + Buf*12; Counter++; ] IF(CodeMode == 1){ Phase += SizeOf(NoteNumList); } NoteNumList = ArraySortNum( NoteNumList ); //----------------------------------------- // 1:Len //----------------------------------------- IF( Argv(1) != "" ){ Buf = Argv(1); Len = Buf; }Else{ Print("[==関数内不正==]") Print({"[Arrpeggiator]: 第2引数: 引数の省略はできません。"}); Print({"[Arrpeggiator]: コンパイルは中断されます。"}); End; } //----------------------------------------- // 2:アルペジオパターン //----------------------------------------- Counter = 0; Flag = 0; While(Flag == 0){ Buf = POS( {","} , Argv(2) ); If(Buf = 0){ Flag = 1; Stbuf2 = Argv(2); }Else{ Stbuf2 = MID( Argv(2) , 0 , Buf ); } IF( POS({"r"} , Stbuf2) = 0 ){ Buf2 = 0; Stbuf2 = Replace(Stbuf2,{" "},{""},on); While( POS({`},Stbuf2) != 0){ Stbuf2 = Replace( Stbuf2 , {`} , {} , off) Buf2++; } While( POS(CHR(34),Stbuf2) != 0){ Stbuf2 = Replace( Stbuf2 , CHR(34) , {} , off) Buf2--; } PaturnNumList( Counter ) = StrToNum(Stbuf2); OctNumList( Counter ) = Buf2; IF(PaturnMax < PaturnNumList(Counter) ){ PaturnMax = PaturnNumList(Counter); } }Else{ Stbuf2 = Replace(Stbuf2,{" "},{""},on); PaturnNumList( Counter ) = Stbuf2; } Stbuf = Argv(2); Argv(2) = MID(Argv(2) , Buf+1 , SizeOf(Stbuf) ); Counter++; IF(Counter == 128){ Flag = 1; } } If( SizeOf( PaturnNumList ) == 0){ Print("[==関数内不正==]") Print({"[Arrpeggiator]: 第3引数: 引数の省略はできません。もしくは不正です。"}); Print({"[Arrpeggiator]: コンパイルは中断されます。"}); End; } //----------------------------------------- // 3:ノート長パターン //----------------------------------------- IF(Argv(3) != "" ){ Stbuf = "LenNumList = ("+Argv(3)+")"; Stbuf; }Else{ LenNumList(0) = Default_Len; } //----------------------------------------- // 4:Phase(範囲内に収める処理) //----------------------------------------- While(Phase < 0 ){ Phase += Notenum; } While(Phase >= SizeOf(PaturnNumList)){ Phase -= SizeOf(PaturnNumList); } //----------------------------------------- // 5:Range(範囲内に収める処理) //----------------------------------------- IF(Range <=0 ){ Range = PaturnMax; } //----------------------------------------- // Arpeggiate //----------------------------------------- Counter = Phase; Flag = 0; Buf2 = 0; //オクターブの保持 While(Flag == 0){ Buf = Default_Time + Len - Time; //残り時間 IF( Buf <= LenNumList(Counter % SizeOf(LenNumList) ) ){ Flag == 1; l%(Buf); }Else{ l%(LenNumList(Counter % SizeOf(LenNumList))); } //休符かどうか確認。 //数字と文字列を比較できないのでASCIIに変換(数字はすべて文字になる。) IF(ASC( PaturnNumList(Counter) ) <= 57 ){ Stbuf = "Buf = "+PaturnNumList(Counter) + " + "+Shift; Stbuf //Buf=PaturnNumList(Counter)+Shift; IF(Pmode == 1){ Buf =Buf*-1 + PaturnMax; } //発音をノートリストの範囲内に抑える。 While(Buf<0){ Buf+=Notenum } Buf = Buf % Notenum //実際に発音する。 n(NoteNumList(Buf) + 12*Buf2 + 12*OctNumList(Counter) ); }Else{ Stbuf = PaturnNumList(Counter); Stbuf; } Buf=Counter;//オクターブのためにバックアップ //パターンのサイクル Counter++; If(Counter == SizeOf(PaturnNumList)){ Counter = 0; } //オクターブを状態に応じて変更 Switch(Rmode){ Case(0){ Buf2 = 0; } Case(1){ Buf2 = PaturnNumList(Counter); IF(Buf2 >= Range){ Buf2 = Range; } } Case(2){ IF(Counter == 0){ Buf2++; } IF(Buf2 >= Range){ Buf2 = 0 } } Case(3){ Buf2 = Range - PaturnNumList(Counter); IF(Buf2<0){ Buf2=0; } } Case(4){ IF(Counter == 0){ Buf2--; } IF(Buf2 < 0){ Buf2 = Range; } } Default{ Buf2 = 0; } } } //------------------------------------------------------------------- // 初期化 //------------------------------------------------------------------- Time = Default_Time + Len; // l%(Default_Len) // l%を使うと以降のノート長の指定が不正になるらしいのでlを使うために // ステップを!付きに変換している。 Stbuf="" Buf = 1; Buf2 = !1; While(Default_Len > 0){ While( Default_Len / Buf2 > 0 ){ Default_Len -=Buf2 Stbuf = ""+Stbuf+"^"+(Buf)+"" } Buf++; Buf2=!1/Buf } Stbuf=Replace(Stbuf,{"^"},{""},off) Stbuf2 ="l"+Stbuf+ "" Stbuf2 } //アルペジオ種 Str Arp ={0 ,r ,0 ,2 ,r ,0 ,0 ,r ,1 ,0 ,r ,0 ,r ,2 ,r ,0 ,r ,0 ,1 ,r ,0 ,r ,0 ,r ,2 ,0 ,r} Str lArp={!32,!32,!16,!32,!32,!16,!32,!32,!16,!32,!32,!32,!32,!32,!32,!32,!32,!16,!32,!32,!32,!32,!32,!32,!16,!32,!32} Str Arp1={0,`0} Str Arp3={0,1,2} /* 関数定義+駄文で600行とかアホじゃないかと思うw */ //=================================================================================================== //=================================================================================================== //=================================================================================================== //_曲データ //=================================================================================================== //=================================================================================================== //=================================================================================================== //_TR1 Heaven's Piano ======================================================================================================= Str Pv = { v.N(0,110,90 ,80,84 ,90,80,70 ,80,50,70)} //Pv={v100 } Int Upper = 2; Str Pu={" [(Upper)>] "} Str Pd={" [(Upper)<] "} #PianoIntro1_1={ //gをペダルポイント Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 f`c`f`g ^`a^^ f^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 e`c`e`f ^`g^^ e^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.g Pd} PD v80 da`d`e ^`f^^ d^^^ ^^^^ Sub{Pv Pu r.`c.d c^ d^ g.d.c ^^^^ Pd} PD v80 g`d`g`a ^`b^^ g^^^ ^v50t.N(0,5,9)>>g0b0`d^^<< t0 } #PianoIntro1_2={ //------------------------------------------------ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 f`c`f`g ^`a^^ f^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 e`c`e`f ^`g^^ e^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.`c ^bgd Pd} PD v80 da`d`e ^`f^^ d^^^ ^^^^ Sub{Pv Pu r.d. c ^ d^g g^d`c ^bgd Pd} PD v80 cegb `c`d`g`b `c^^^ ^"c^^ } #PianoIntro2_1={ //gをペダルポイント Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 f`c`f`g ^`a^^ f^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 a`e`a`b ^`a^^a^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.g Pd} PD v80 da`d`e ^`f^^ d^^^ ^^^^ Sub{Pv Pu r.`c.d c^ d^ g.d.c ^^^^ Pd} PD v80 g`d`g`a ^`b^^ g^^^ ^v50t.N(0,5,9)>>g0b0`d^^<< t0 } #PianoIntro2_2={ //------------------------------------------------ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 da`d`e ^`f^^ d^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.c g.d.c Pd} PD v80 e`c`e`f ^`g^^ e^^^ ^^^^ Sub{Pv Pu r.g.d c^ d^ g.d.`c ^bgd Pd} PD v80 f`c`f`g ^`a^^ f^^^ ^^^^ Sub{Pv Pu r.d. c ^ d^g g^d`c ^bgd Pd} PD v80 cegb `c`d`g`b `c^^^ ^"c^^ } TR=1 q100 o4 l8 V=127 @1,16 REV=30 CHO=30 //イントロ #PianoIntro1_1 //メインA #PianoIntro1_1 #PianoIntro1_2 #PianoIntro1_1 #PianoIntro1_2 //間奏・換装 R1(8) #PianoIntro1_2 //メインB #PianoIntro2_1 #PianoIntro2_2 #PianoIntro2_1 #PianoIntro2_2 //アウトロ(リフレイン) #PianoIntro2_1 #PianoIntro2_2 //_TR2 Bass============================================================================================= #Bass2={l8 [16 f][16 e] [16 d][16 g] [16 f][16 e] [16 d][16 c] } #Bass1_1={ q100 f1^1e1^1 d1^1g1^1 } #Bass3_1={l16 [f^"f32c32f `ffr"f fr"ff `ffrf] [e^^e `eer"e er"ee `eere] [d^^d `ddr"d dr"dd `ddrd] [g^^g `ggr"g gr"gg `ggrg] } #Bass3_2={l16 [f^"ff `ffr"f fr"ff `ffrf] [e^^e `eer"e er"ee `eere] [d^^d `ddr"d dr"dd `ddrd] [c^^c `ccr"c cr"cc `ccrc] } #BASS4_1={l8 [6 "ff]["ff] [6 "aa]["aa] [6 "dd]["dd] [6 "gg]["aa] } #BASS4_2={l8 [6 "dd]["dd] [6 "ee]["ee] [6 "ff]["ff] [6 "cc]["dd] } TR=2 q100 o3 l8 V=110 @82,8 v90 //イントロ R1(8) //メインA #Bass1_1 q55 #Bass3_2 #Bass3_1 #Bass3_2 //間奏 R1(8) R1(8) //メインB v100 q100 > #BASS4_1 #BASS4_2 #BASS4_1 #BASS4_2 < //_TR3 PAD============================================================================================= #Code={ Sub{> v-10 c."b2 c."b2 "a"b cd v+10<} "" c0 c0 e0g1^1 """a0"a0 c0e1^1 """f0"f0"a0c1^1 """g0"g0"b0d1^1 } #Pad={ EP.T(60,97,L1(4) , 97,60,L1(3),60,127,L1(1) ) #Code } #PadSet={ //イントロ R1(8) //メインA [ #Pad ] [ #Pad ] //間奏 [ #Pad ] //メインB [ #Pad ] [ #Pad ] } TR=3 q100 o6 l1 @51 v40 REV=127 V=127 #PadSet //_TR4 BASS BOOSTER============================================================================================= #Under1_1={ f1^1e1^1 d1^1g1^1 } #Under1_2={ f1^1e1^1 d1^1c1^1 } #Under2_1={ f1^1a1^1 d1^1g1^1 } #Under2_2={ d1^1e1^1 f1^1c1^1 } TR=4 q100 o3 l1 @80 v60 V=127 REV=0 R1(8) #Under1_1 #Under1_2 #Under1_1 #Under1_2 #Under1_1 #Under1_2 #Under2_1 #Under2_2 #Under2_1 #Under2_2 //_TR5 みょん============================================================================================= #SynAlp1_1={ Arpeggiator( { "f,f,a,`c} , !1^1 , Arp,lArp) Arpeggiator( { "e,e,g,`d} , !1^1 , Arp,lArp) Arpeggiator( { "d,d,f,`c} , !1^1 , Arp,lArp) Arpeggiator( { "g,g,b,`f} , !1^1 , Arp,lArp) } #SynAlp1_2={ Arpeggiator( { "f,f,a,`e} , !1^1 , Arp,lArp) Arpeggiator( { "e,e,g,`d} , !1^1 , Arp,lArp) Arpeggiator( { "d,d,f,`c} , !1^1 , Arp,lArp) Arpeggiator( { "c,c,e, b} , !1^1 , Arp,lArp) } #SynAlp2_1={ Arpeggiator( { "f,f,a,`c} , !1^1 , Arp,lArp) Arpeggiator( { "a,a,`c,`e}, !1^1 , Arp,lArp) Arpeggiator( { "d,d,f,`c} , !1^1 , Arp,lArp) Arpeggiator( { "g,g,b,`f} , !1^1 , Arp,lArp) } #SynAlp2_2={ Arpeggiator( { "d,d,f, a} , !1^1 , Arp,lArp) Arpeggiator( { "e,e,g,`d} , !1^1 , Arp,lArp) Arpeggiator( { "f,f,a,`c} , !1^1 , Arp,lArp) Arpeggiator( { "c,c,e, b} , !1^1 , Arp,lArp) } TR=5 @39 q40 o5 V=127 v30 REV=120 CHO=30 //イントロ R1(8) //メインA #SynAlp1_1 #SynAlp1_2 #SynAlp1_1 #SynAlp1_2 //間奏 R1(8) R1(8) //メインB #SynAlp2_1 #SynAlp2_2 #SynAlp2_1 #SynAlp2_2 //アウトロ //_TR6 Mellody Piano============================================================================================= #Mellody={ PD c^^^ ^^^^ g.f.e e.f.c PD c^^^ ^^""b16"e16"b16e16 g.f.e e.f.c PD c^^^ ^^""a16"d16"a16d16 g.f.e e.f.`c PD `c^^^ ^^"c16"g16c16g16 `c.b.g e.d.c } TR=6 q100 o7 l8 V=127 v100 REV=20 @1 //イントロ R1(8) //メインA R1(8) R1(8) Sub{ r-2 "g-32,,60 "g2-32} #Mellody #Mellody //間奏 #Mellody #Mellody //メインB #Mellody #Mellody #Mellody #Mellody //_TR7 すーぱーそー============================================================================================= #SuperSaw1_1={ [3 "f c g"f c g"f g][ "f c a]"f b //F :face g [3 "e"b`c"e "b`c"e`c][ "e"b b]"b g //E :egbd f [3 "d"a`c"d "a`c"d`c][ "d"a`c]"d`d //D :dfac e [ "g"b g"g:"b g"g g] [ "b b"g b:"g"b b"g][ "g"bb]"g`c //G :------ } #SuperSaw1_2={ [3 "f c`c"f c`c"f`c][ "f c`d]"f`d //F :face g [3 "e"b`c"e "b`c"e`c][ "e"b`d]"e`d //E :egbd f [3 "d"a`c"d "a`c"d`c][ "d"a`d]"d`e //D :dfac e [ "c"g g"c:"g g"c g] [ "g b"c b:"c"g b"c][ "c"g`c]"c`d //C :cegb d } #SuperSaw2_1={ [3 "f c g"f c g"f g][ "f c a]"f b //F [3 "a"b`c"a "b`c"a`c][ "a"b b]"a g //A [3 "d"a`c"d "a`c"d`c][ "d"a`c]"d`d //D [ "g"b g"g:"b g"g g] [ "b b"g b:"g"b b"g][ "g"bb]"g`c//G } #SuperSaw2_2={ [3 "d c`c"d c`c"d`c][ "d c`d]"d`d //D [3 "e"b`c"e "b`c"e`c][ "e"b`d]"e`d //E [3 "f"a`c"d "a`c"f`c][ "f"a`d]"f`e //F [ "c"g g"c:"g g"c g] [ "g b"c b:"c"g b"c][ "c"g`c]"c`d //C } TR=7 q60 o6 l16 V=127 @82,90,1 v50 REV=20 //イントロ R1(8) //メインA R1(8) R1(8) //R1(8) R1(8) //R1(8) EP.T(0,127,L1(8)) #SuperSaw1_2 R1(8) V.T(0,127,L1(8)) #SuperSaw1_2 //間奏 #SuperSaw1_1 #SuperSaw1_2 //メインB #SuperSaw2_1 #SuperSaw2_2 #SuperSaw2_1 #SuperSaw2_2 //_TR8 すーぱーそー2============================================================================================= #SYNTH1={ l8 q100 g^^g ^c^"b ^"g"bg ^c"bc g^gg ^`c^b ^`cbg ^c"bc g^^c ^"bcd g.f.e e.f.c g^gg ^`c^b ^`cbg ^c"bc } /* PD c^^^ ^^^^ g.f.e e.f.c PD c^^^ ^^""b16"e16"b16e16 g.f.e e.f.c PD c^^^ ^^""a16"d16"a16d16 g.f.e e.f.`c PD `c^^^ ^^"c16"g16c16g16 `c.b.g e.d.c */ #SYNTH1={ l8 q100 g^^g ^c^"b "g."b.g c."b.c g^gg ^`c^b `c.b.g c."b.c g^^c ^"bcd g.f.e e.f.c g^gg ^`c^b `c.b.g c."b.c } #SYNTH2={ l16 q20 grrr rrg^ ^^c^ ^^"b^ ^^"g^ "b^g^ ^^c^ "b^c^ g^^^ g^g^ ^^`c^ ^^b^ ^^`c^ b^g^ ^^c^ "b^c^ //g^^g ^c^"b ^"g"bg ^c"bc //g^gg ^`c^b ^`cbg ^c"bc //g^^c ^"bcd g.f.e e.f.c //g^gg ^`c^b ^`cbg ^c"bc } #SYNTH = { Sub{>#SYNTH1<} #SYNTH1 } TR=8 q100 o6 l8 V=127 @82,90,1 v80 REV=20 //イントロ R1(8) //メインA R1(8) R1(8) R1(8) R1(8) //間奏 R1(8) R1(8) //メロB V.T(0,127,L1(8)) #SYNTH #SYNTH #SYNTH #SYNTH Sub{r V.T(127,0,!1)} g^^^ ^^^^ //_DrumTrack and SideChainComp============================================================================================= //サイドチェーンの種類 Str SideChain1="EP.T(64,127,!8.)" //柔らかいアタックのコンプ Str SideChain2="EP.T(0,0,!16,0,127,!16)" //完全に音の消えるホールドの長い鋭いコンプ Str SideChain3="EP.T(0,127,!16)" //完全に音の消えるホールドの短い鋭いコンプ Str SideChain4="EP.T(0,127,!32)" //さらに鋭いコンプ //サイドチェーンのアサイン Str Add="" Add = Add + {" TRC( 3 , SideChain2 ) "} //パッドにサイドチェーンをアサイン Add = Add + {" TRC( 4 , SideChain3 ) "} //低音 にサイドチェーンをアサイン //各ノートへの関数のアサイン Function KICK (Str Playlist ){DrumPlay( Playlist , Add+"c") } //Kick Asigned "SideChainComp." Function KICK2(Str Playlist ){DrumPlay( Playlist , "c") } //Kick unAsigned Function CLAP (Str Playlist ){DrumPlay( Playlist , "d+")} Function STICK(Str Playlist ){DrumPlay( Playlist , "a") } Function EXP (Str Playlist ){DrumPlay( Playlist , "`e")} //別チャンネルにアサインする場合は予め文字列を作っておくと楽。もしくは関数を作るべし。 Str _Hat = "v(Hatvel) o3 f+" Str _OHH = "v(Hatvel) o3 a+" Function OHH (Str Playlist ){Int Hatvel; DrumPlay( Playlist ," Hatvel=MML(v) TRC(11,_OHH) "+"r") } Function HAT1(Str Playlist ){Int Hatvel; DrumPlay( Playlist , " Hatvel=MML(v) TRC(11,_Hat) "+"r") } Function HAT2(Str Playlist ){ DrumPlay( Playlist , "g+") } Function RIDE(Str Playlist ){ DrumPlay( Playlist , "`d+") } //シーケンサ型記述法 :: FL Studioのリズムシーケンサ入力が便利だったので作りました // リズムをより視覚的に作れるかと思います。 // でも、入力支援のリズムボックスで作っても良かったような気がしてる(笑 //------------------------------------------------------------------------------------------------------- /* このバスドラ(KICK2)にはサウドチェーンが付いてません。 基本的なリズムはお決まりの4つ打ちバス+偶数拍のクラップ、裏打ちのハットです。 */ Str Drum0_1 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 HAT2 :v80 --x- --x- --x- --x- --x- --x- --x- --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK2:v120 x--- x--- x--- x--- x--- x--- x--- x-x- "}) Str Drum0_2 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 HAT2 :v80 --x- --x- --x- --x- --x- --x- -x-x --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK2:v100 x--- x--- x--- x--- x--- x--x -x-x x-x- "}) //------------------------------------------------------------------------------------------------------- /* サイドチェーンの付いたバスドラ(KICK)を投入。 */ Str Drum1_1 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 HAT2 :v80 --x- --x- --x- --x- --x- --x- --x- --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK :v120 x--- x--- x--- x--- x--- x--- x--- x-x- "}) Str Drum1_2 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 HAT2 :v80 --x- --x- --x- --x- --x- --x- -x-x --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK :v100 x--- x--- x--- x--- x--- x--x -x-x x-x- "}) //------------------------------------------------------------------------------------------------------- /* @27,90のHAT1(f+)の音はキツいので、CH11をつかって@1の音を使ってます。 隙間を縫うようにハットで間を詰めます。 */ Str Drum2_1 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 OHH :v30 x--- x--- x--- x--- x--- x--- x--- x--- HAT1 :v30 ---x -x-x -x-- x--x -x-x -x-x --x- -x-x HAT2 :v80 --x- --x- --x- --x- --x- --x- --x- --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK :v120 x--- x--- x--- x--- x--- x--- x--- x-x- "}) Str Drum2_2 = MML_DRUM({" // vol 1 2 3 4 5 6 7 8 OHH :v30 x--- x--- x--- x--- x--- x--- x--- x--- HAT1 :v30 ---x -x-x -x-- x--x -x-x -x-x --x- -x-x HAT2 :v80 --x- --x- --x- --x- --x- --x- -x-x --x- STICK:v50 ---- x--- ---- x--- ---- x--- ---- x--- CLAP :v50 ---- x--- ---- x--- ---- x--- ---- x--- EXP :v10 ---- x--- ---- x--- ---- x--- ---- x--- KICK :v100 x--- x--- x--- x--- x--- x--x -x-x x-x- "}) //------------------------------------------------------------------------------------------------------- //今まで通りの小ネタ Int Cnt; Str EP0 = {EP=0} //音量ON Str EP127 = {EP=127} //音量OFF Str AllOff = { Cnt=1 MetaText={"AllExpression:Off"} [16 TRC(Cnt , EP0 )Cnt++]} Str AllOn = { Cnt=1 MetaText={"AllExpression:On"} [16 TRC(Cnt , EP127 )Cnt++] } Str SnareFill = {" Sub{[8 r-1]v30 [7 [8 [e16]v+1]][ [[ AllOn c0e32 AllOff r32] r]AllOn c0e AllOff r AllOn ] }"} //_DrumPlay============================================================================================= UseKeyShift=off 調-() TR=11 o3 l16 q40 V=100 @1 //TRCを使って書き込むためのトラック TR=10 o3 l16 q40 V=100 @27,90 /* intro */ R1(8) /* メインA */ MetaText={"All start , DrumAsign:off"} [3 Drum0_1 ] Drum0_2 MetaText={"DrumAsign : on"} [3 Drum1_1 ] Drum1_2 /* 間奏 */ [3 Drum2_1 ] Drum2_2 MetaText={"Drum:off"} R1(8) /* 換装 */ R1(8);MetaText={"Drum:Snare"} R1(8);SnareFill; Sub{v127 `c+0`e TRC(11,"o3v127`e")} /* メインB */ [3 Drum1_1 ] Drum1_2 [3 Drum1_1 ] Drum1_2 Sub{v80 `c+0`e } [3 Drum2_1 ] Drum2_2 [3 Drum2_1 ] Drum2_2 ;SnareFill; Sub{v127 `c+0`e TRC(11,"o3v127`e")} //_TR16 Bird============================================================================================= #BirdAlp={ Arpeggiator( { f,a,`c} , !1^1 , Arp) Arpeggiator( { e,g,`d} , !1^1 , Arp) Arpeggiator( { d,f,`c} , !1^1 , Arp) Arpeggiator( { g,b,`f} , !1^1 , Arp) } TR=16 @124 o5 l4. v10 REV=127 V=127 CHO=127 v.N(10,15,7, 9,15,10,12) Sub{o5 l4. #BirdAlp } Sub{o4 l5. #BirdAlp } I=0 [TR=I r1^1 I++]