///////////////////////////////////////////////////////////////////////////////
// title: "dynamic.h" ver 1.0
// description: 音源ごとに差異ある音量コントロールを変数1つでバランスよくできるインクルードファイル(2015/05/24)
// keywords: SAKURA Function by ななこっち★ @nanakochi123456
// HP: http://nano.daiba.cx/
///////////////////////////////////////////////////////////////////////////////
// Example
// Include(dynamic.h)
// DynamicInit(80*128+127)
// E(127)
// o5cde
// ET(127,0,!2)
// fgab>c
///////////////////////////////////////////////////////////////////////////////
// Function DynamicInit(value)
// ダイナミック値を指定します。
// 値は、(音量幅)×128 + (ベース音量)になります。
// (音量幅、ベース音量共に0~127までとなります)
// 指定しないと、MSGS用の 80*128+127が指定されます。
///////////////////////////////////////////////////////////////////////////////
// Function E (Expression compatible)
// Usage : EW(vol)
// Example :
// o5
// E(100)c VV(127)d E(80)e
///////////////////////////////////////////////////////////////////////////////
// Function VV (Velocity compatible)
// Usage : VV(vol)
// Example :
// o5
// VV(100)c VV(127)d VV(80)e
///////////////////////////////////////////////////////////////////////////////
// Function EW (Expression.onNotewave compatible)
// Usage : EW(vol1, vol2, length, ... ) max 5 parms
// Example :
// EW(127,0,!16)
// o5l8
// cdefgab>c
///////////////////////////////////////////////////////////////////////////////
// Function ET (Expression.onTime compatible)
// Usage : ET(vol1, vol2, length, ... ) max 5 parms
// Example :
// ET(127,0,!1)
// o5l8
// cdefgab>c
///////////////////////////////////////////////////////////////////////////////
Int DYNAMIC=80*128+127
Function DynamicInit(Int value) {
DYNAMIC=value
}
Function Dy(Int value) {
Int D
IF(DYNAMIC=0) {
// for MSGS
D=80*128+127
// for TWM2
IF(TWM2=1) {
D=100*128+110
} ELSE {
// for TiMidity++ Default
IF(TIMIDITY=1) {
D=105*128+120
}
}
} ELSE {
D=DYNAMIC
}
Int Base = 127 - (D % 128)
Int Dynamic = D / 128
Int V
Int V2
V = value - Base
V = 127 - V
V = V * 10 * Dynamic
V = V / 1000
V = 127 - V
IF(V<0) {
V=0
}
IF(V>127) {
V=127
}
Result = V
}
// for verocity
Function VV(value) {
Str MML="v"
MML=MML+(ExpVol(value))
MML
}
Function ExpVol(value) {
RESULT=Dy(value)
}
Function ExpExp(value) {
RESULT=Dy(value)
}
// for expression
Function E(value) {
Expression(ExpExp(value))
}
// for expression.ontime
Function ET(v11, v12, len1, v21, v22, len2, v31, v32, len3, v41, v42, len4, v51, v52, len5) {
Int NowTime;
NowTime = Time;
Expression.onTime(ExpExp(v11), ExpExp(v12), len1)
IF(v21<>0) {
Time=NowTime+len1
Expression.onTime(ExpExp(v21), ExpExp(v22), len2)
IF(v31<>0) {
Time=NowTime+len1+len2
Expression.onTime(ExpExp(v31), ExpExp(v32), len3)
IF(v41<>0) {
Time=NowTime+len1+len2+len3
Expression.onTime(ExpExp(v41), ExpExp(v42), len4)
IF(v51<>0) {
Time=NowTime+len1+len2+len3+len4
Expression.onTime(ExpExp(v51), ExpExp(v52), len5)
}
}
}
}
Time=NowTime
}
// for expression onnotewave
Function EW(v11, v12, len1, v21, v22, len2, v31, v32, len3, v41, v42, len4, v51, v52, len5) {
IF(len5<>0) {
Expression.onNoteWave(ExpExp(v11), ExpExp(v12), len1, ExpExp(v21), ExpExp(v22), len2, ExpExp(v31), ExpExp(v32), len3, ExpExp(v41), ExpExp(v42), len4, ExpExp(v51), ExpExp(v52), len5)
} ELSE {
IF(len4<>0) {
Expression.onNoteWave(ExpExp(v11), ExpExp(v12), len1, ExpExp(v21), ExpExp(v22), len2, ExpExp(v31), ExpExp(v32), len3, ExpExp(v41), ExpExp(v42), len4)
} ELSE {
IF(len3<>0) {
Expression.onNoteWave(ExpExp(v11), ExpExp(v12), len1, ExpExp(v21), ExpExp(v22), len2, ExpExp(v31), ExpExp(v32), len3)
} ELSE {
IF(len2<>0) {
Expression.onNoteWave(ExpExp(v11), ExpExp(v12), len1, ExpExp(v21), ExpExp(v22), len2
)
} ELSE {
IF(len1<>0) {
Expression.onNoteWave(ExpExp(v11), ExpExp(v12), len1)
}
}
}
}
}
}