- midi note transpose with wrap around option
- midi note multiply with wrap around option
tkx for the note closer script in the addon section, btw
Code: Select all
//////////////////////////////////////////////////////
// transpose midi note
// 2008-10-24: @bSork, first version
// 2008-10-26: @amiga909, 'wrap around' added
//////////////////////////////////////////////////////
VAR pIn, pOut, pTransp, pWrapAround : tParameter;
TYPE tTransp = ARRAY OF integer;
VAR transp : ARRAY OF tTransp;
VAR tmp : tMidi;
VAR len, transpose, i, tempTransp : integer;
PROCEDURE Init;
BEGIN
pIn := CreateParam('midi in', ptMidi); SetIsOutput(pIn, FALSE);
pOut := CreateParam('midi out', ptMidi); SetIsInput(pOut, FALSE);
pTransp := CreateParam('transpose', ptDataFader); SetIsOutput(pTransp, FALSE);
SetFormat(pTransp, '%.0f'); SetMin(pTransp, -127); SetMax(pTransp, 127);
pWrapAround := CreateParam('wrap around', ptSwitch); SetIsOutput(pWrapAround, FALSE);
SetArrayLength(transp, 16);
FOR i := 0 TO 15 DO // A two-dimensional array; [16 channels][128 transpose values]
SetArrayLength(transp[i], 128);
END;
// expects a noteOn msg with velocity > 0; outputs the transposed note value [0-127]
FUNCTION calcTranspose (t: integer; wrap: single): integer;
BEGIN
IF wrap > 0 THEN BEGIN //
IF t > 127 THEN
result := t - 128
ELSE IF t < 0 THEN
result := t + 128;
END
ELSE BEGIN
IF t > 127 THEN
result:= 127
ELSE IF t < 0 THEN
result:=0
ELSE
result:=t;
END;
END;
// main
BEGIN
len := GetLength(pIn);
IF (len > 0) THEN BEGIN
transpose := trunc(GetValue(pTransp));
SetLength(pOut, len);
FOR i := 0 TO (len - 1) DO BEGIN
GetMidiArrayValue(pIn, i, tmp);
tempTransp := transpose + tmp.data1;
IF (tmp.msg = 144) AND (tmp.data2 > 0) THEN BEGIN // NoteOn
tempTransp:= calcTranspose(tempTransp, GetValue(pWrapAround));
transp[tmp.channel - 1][tmp.data1] := tempTransp;
tmp.data1 := tempTransp;
SetMidiArrayValue(pOut, i, tmp);
END
ELSE IF (tmp.msg = 128) or ((tmp.msg = 144) and (tmp.data2 = 0)) THEN // NoteOff
tmp.data1 := transp[tmp.channel - 1][tmp.data1];
SetMidiArrayValue(pOut, i, tmp);
END;
END
ELSE BEGIN
SetLength(pOut, 0);
END;
END.Code: Select all
//////////////////////////////////////////////////////
// multiply midi note
// 2008-10-24: @bSork, first version of midi transpose
// 2008-10-26: @amiga909, midi multiply
//////////////////////////////////////////////////////
VAR pIn, pOut, pMult, pWrapAround : tParameter;
TYPE tMult = ARRAY OF integer;
VAR mult : ARRAY OF tMult;
VAR tmp : tMidi;
VAR len, i, tempMult : integer;
VAR multiply: double;
PROCEDURE Init;
BEGIN
pIn := CreateParam('midi in', ptMidi); SetIsOutput(pIn, FALSE);
pOut := CreateParam('midi out', ptMidi); SetIsInput(pOut, FALSE);
pMult := CreateParam('multiply', ptDataFader); SetIsOutput(pMult, FALSE);
SetMin(pMult, 0.125); SetMax(pMult, 8); SetDefaultValue(pMult,1);
pWrapAround := CreateParam('wrap around', ptSwitch); SetIsOutput(pWrapAround, FALSE);
SetArrayLength(mult, 16);
FOR i := 0 TO 15 DO // A two-dimensional array; [16 channels][128 multiply values]
SetArrayLength(mult[i], 128);
END;
// expects a noteOn msg with velocity > 0; outputs the multiplyd note value [0-127]
FUNCTION calcMultiply (t: integer; wrap: single): integer;
var tt:integer;
BEGIN
IF wrap > 0 THEN BEGIN
tt:= 128*(trunc(t/128));
IF t > 127 THEN
result := t - tt
ELSE IF t < 0 THEN
result := t + tt;
END
ELSE BEGIN
IF t > 127 THEN
result:= 127
ELSE IF t < 0 THEN
result:=0
ELSE
result:=t;
END;
END;
// main
BEGIN
len := GetLength(pIn);
IF (len > 0) THEN BEGIN
multiply := (GetValue(pMult));
SetLength(pOut, len);
FOR i := 0 TO (len - 1) DO BEGIN
GetMidiArrayValue(pIn, i, tmp);
tempMult := round (multiply * tmp.data1);
IF (tmp.msg = 144) AND (tmp.data2 > 0) THEN BEGIN // NoteOn
tempMult:= calcMultiply(tempMult, GetValue(pWrapAround));
mult[tmp.channel - 1][tmp.data1] := tempMult;
tmp.data1 := tempMult;
SetMidiArrayValue(pOut, i, tmp);
END
ELSE IF (tmp.msg = 128) or ((tmp.msg = 144) and (tmp.data2 = 0)) THEN // NoteOff
tmp.data1 := mult[tmp.channel - 1][tmp.data1];
SetMidiArrayValue(pOut, i, tmp);
END;
END
ELSE BEGIN
SetLength(pOut, 0);
END;
END.


