//------------------------------------------------------------------------------
// CyclicControlChange.h
//------------------------------------------------------------------------------
// ノートオンに関係なくコントロールチェンジを変化させる関数のセット
//------------------------------------------------------------------------------
FUNCTION DivRound(INT Value, INT Div){
RESULT = (Value * 10 / Div + 5) / 10;
}
//------------------------------------------------------------------------------
// 関数本体
//------------------------------------------------------------------------------
//
// 【書式】
// CyclicControlChange({コントロールチェンジ[V,EP,P,p,p%,M,CHO]),効果時間(小節), 変化周期(),開始値,中間値1,中間値2,終端値)
//
// ex) パンポットを回す
// TR(1)CH(1) Voice(30) CyclicControlChange({P},4,!8,63,127,63,0) c1^1^1^1
//
//------------------------------------------------------------------------------
FUNCTION CyclicControlChange(STR ControlChange, INT NoteLength, INT Cycle, INT StartValue, INT IntermediateValue1, INT IntermediateValue2, INT EndValue){
INT Div4 = Cycle / 4;
STR Ret = "[" + DivRound(NoteLength * (!1), Cycle);
Ret = Ret + ControlChange + ".T(" + StartValue + "," + IntermediateValue1 + "," + Div4 + ")r" + !(Div4);
Ret = Ret + ControlChange + ".T(" + IntermediateValue1 + "," + IntermediateValue2 + "," + Div4 + ")r" + !(Div4);
Ret = Ret + ControlChange + ".T(" + IntermediateValue2 + "," + EndValue + "," + Div4 + ")r" + !(Div4);
Ret = Ret + ControlChange + ".T(" + EndValue + "," + StartValue + "," + Div4 + ")r" + !(Div4);
Ret = Ret + "]";
Sub{Ret};
}
//------------------------------------------------------------------------------
// すぐに使える関数サンプル
//------------------------------------------------------------------------------
//
// 【書式】
// [各エフェクト名](効果時間(小節))
//
// ex) エフェクト hoge をかける
// TR(1)CH(1) @(30) hoge(4) c1^1^1^1
//
//------------------------------------------------------------------------------
// オートパン
//------------------------------------------------------------------------------
FUNCTION AutoPan2 (INT NoteLength = 1){CyclicControlChange({P},NoteLength,!2,63,127,63,0)}
FUNCTION AutoPan4 (INT NoteLength = 1){CyclicControlChange({P},NoteLength,!4,63,127,63,0)}
FUNCTION AutoPan8 (INT NoteLength = 1){CyclicControlChange({P},NoteLength,!8,63,127,63,0)}
FUNCTION AutoPan8M(INT NoteLength = 1){CyclicControlChange({P},NoteLength,!8,63,103,63,24)}
FUNCTION AutoPanL (INT NoteLength = 1){CyclicControlChange({P},NoteLength,!8,31,63,31,0)}
FUNCTION AutoPanR (INT NoteLength = 1){CyclicControlChange({P},NoteLength,!8,95,127,95,63)}
//------------------------------------------------------------------------------
// トレモロ
//------------------------------------------------------------------------------
FUNCTION Tremolo4 (INT NoteLength = 1){CyclicControlChange({V},NoteLength,!4,127,127,99,99)}
FUNCTION Tremolo8 (INT NoteLength = 1){CyclicControlChange({V},NoteLength,!8,127,127,99,99)}
FUNCTION Tremolo16(INT NoteLength = 1){CyclicControlChange({V},NoteLength,!16,127,127,99,99)}
FUNCTION TremoloEX(INT NoteLength = 1){CyclicControlChange({V},NoteLength,!8,99,107,127,107)}
//------------------------------------------------------------------------------
// 特殊
// 2 つのチャネルを使用して、音色特性が時間変化していくように見せかける
// ex)Overdriven ⇔ Distoriton の変化
// TR(1)CH(1) @(30) TransformA(4) c1^1^1^1
// TR(2)CH(2) @(31) TransformB(4) c1^1^1^1
//------------------------------------------------------------------------------
FUNCTION TransformA(INT NoteLength = 1){CyclicControlChange({EP},NoteLength,!1^1^1^1,127,87,47,87)}
FUNCTION TransformB(INT NoteLength = 1){CyclicControlChange({EP},NoteLength,!1^1^1^1,47,87,127,87)}
//------------------------------------------------------------------------------
// フランジャー(原音 1 、遅延波 1 で 計 2 チャネル使用。ベンド使用不可)
// ex)
// TR(1)CH(1) @(31) c1^1^1^1
// TR(2)CH(2) @(31) Flanger(4) c1^1^1^1
//------------------------------------------------------------------------------
FUNCTION Flanger(INT NoteLength = 1, INT Ratio = 1){CyclicControlChange({p%},NoteLength,!(Ratio),0,767,0,-767)}
//------------------------------------------------------------------------------
// リセット命令
//------------------------------------------------------------------------------
FUNCTION ResetEffect(INT Pan = 63, INT Vol = 127, Exp = 127){P(Pan) V(Vol) EP(Exp) p%(0)}
//------------------------------------------------------------------------------