ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
Statistics: Posted by bsork — 31 Mar 2009, 11:38 Statistics: Posted by amiga909 — 31 Mar 2009, 10:47 CODE: Statistics: Posted by bsork — 31 Mar 2009, 10:03
I don't think the script belongs in the add-ons section as long as the effiency and the ease of use is bad compared to a relatively simple module-based patch, but thanks for the nice words anyway. I think there are plenty of other scripts in the distro and the add-ons that are better examples of eg using MIDI data as indexex to arrays, or a boolean or three to avoid unneccessary executions.
]]>
maybe i'll do a test like gurulogic to compare CPU and RAM usage of the brute-force and the clever way when i get home.
though the script isnt more efficient, i might use it, cause its more elegant, flexible and well arranged than the module version for my taste.
post as addon?
]]>
By using arrays, at least the code is smaller even if the results CPU-wise aren't much better than coding it the "hard way". Anyway, when doing MIDI scripts of various types, using the MIDI values themselves (channel, CC no, note no, etc) as indexes to arrays is often a good idea IMO. Depends on what the script is doing, of course.VAR pIn : Tparameter;TYPE outArr = ARRAY of Tparameter;VAR pOut : outArr;VAR tmp : tMidi;VAR inLen, min, max, i, x : INTEGER;VAR outLen : ARRAY OF INTEGER;VAR updLen : BOOLEAN;PROCEDURE init;BEGIN pIn := CreateParam('midi in', ptMidi); SetIsOutput(pIn, FALSE); SetArrayLength(pOut, 16); SetArrayLength(outlen, 16); FOR i := 0 TO 15 DO BEGIN pOut[i] := CreateParam('midi ch ' + IntToStr(i + 1), ptMidi); SetIsInput(pOut[i], FALSE); END; min := 16; max := 0; updLen := FALSE;END;PROCEDURE SetMinMax(y : integer);BEGIN IF (y < min) THEN min := y; IF (y > max) THEN max := y;END;// mainBEGIN IF (updLen) THEN BEGIN FOR i := min TO max DO BEGIN IF (OutLen[i] > 0) THEN BEGIN SetLength(pOut[i], 0); OutLen[i] := 0; END; END; min := 16; max := 0; updLen := FALSE; END; inLen := GetLength(pIn); IF (inlen > 0) THEN BEGIN FOR i := 0 TO (inLen - 1) DO BEGIN GetMidiArrayValue(pIn, i, tmp); IF (tmp.msg <= 239) THEN BEGIN x := tmp.channel - 1; SetMidiArrayValue(pOut[x], OutLen[x], tmp); OutLen[x] := OutLen[x] + 1; SetMinMax(x); updLen := TRUE; END; END; IF (updLen) THEN BEGIN FOR i := min TO max DO BEGIN IF (OutLen[i] > 0) THEN BEGIN SetLength(pOut[i], OutLen[i]); END; END; END; END;END.
]]>
Statistics: Posted by amiga909 — 30 Mar 2009, 23:06
Statistics: Posted by 23fx23 — 30 Mar 2009, 22:36
Statistics: Posted by bsork — 30 Mar 2009, 22:25
Statistics: Posted by amiga909 — 30 Mar 2009, 13:09
Statistics: Posted by bsork — 30 Mar 2009, 09:19
Statistics: Posted by amiga909 — 30 Mar 2009, 00:35
Statistics: Posted by 23fx23 — 30 Mar 2009, 00:09




Statistics: Posted by amiga909 — 30 Mar 2009, 00:01
Statistics: Posted by gurulogic — 29 Mar 2009, 23:54
Statistics: Posted by 23fx23 — 29 Mar 2009, 23:25
Statistics: Posted by amiga909 — 29 Mar 2009, 23:14
Statistics: Posted by amiga909 — 29 Mar 2009, 09:39
easy, easy.....its a very easy thingie, done in 10min.
Statistics: Posted by nay-seven — 28 Mar 2009, 09:28
CODE:
(*/////////////////////////////////////////////////////// MEP_splitChn - midi script module for sensomusic usine // version: 2009-03-23 1.0; author: amiga909//// <Description> // splits midi messages by channel // <Parameters> // none// <Ports> // [channel 1-16]: //////////////////////////////////////////////////////*)//////////////////////////////////////////////////////// globals//////////////////////////////////////////////////////VAR pIn, pOut1, pOut2, pOut3, pOut4, pOut5, pOut6, pOut7, pOut8, pOut9, pOut10, pOut11, pOut12, pOut13, pOut14, pOut15, pOut16 : TParameter; VAR tmp : TMidi; VAR len, i, len1, len2, len3, len4, len5, len6, len7, len8, len9, len10, len11, len12, len13, len14, len15, len16 : INTEGER; //////////////////////////////////////////////////////// initialize//////////////////////////////////////////////////////PROCEDURE init; BEGIN pIn := createParam('in', ptMidi); pOut1 := createParam('chn 1', ptMidi); pOut2 := createParam('chn 2', ptMidi); pOut3 := createParam('chn 3', ptMidi); pOut4 := createParam('chn 4', ptMidi); pOut5 := createParam('chn 5', ptMidi); pOut6 := createParam('chn 6', ptMidi); pOut7 := createParam('chn 7', ptMidi); pOut8 := createParam('chn 8', ptMidi); pOut9 := createParam('chn 9', ptMidi); pOut10 := createParam('chn 10', ptMidi); pOut11 := createParam('chn 11', ptMidi); pOut12 := createParam('chn 12', ptMidi); pOut13 := createParam('chn 13', ptMidi); pOut14 := createParam('chn 14', ptMidi); pOut15 := createParam('chn 15', ptMidi); pOut16 := createParam('chn 16', ptMidi); setIsInput(pOut1,FALSE);setIsInput(pOut2,FALSE);setIsInput(pOut3,FALSE);setIsInput(pOut4,FALSE);setIsInput(pOut5,FALSE);setIsInput(pOut6,FALSE);setIsInput(pOut7,FALSE);setIsInput(pOut8,FALSE);setIsInput(pOut9,FALSE);setIsInput(pOut10,FALSE);setIsInput(pOut11,FALSE);setIsInput(pOut12,FALSE);setIsInput(pOut13,FALSE);setIsInput(pOut14,FALSE);setIsInput(pOut15,FALSE);setIsInput(pOut16,FALSE);setIsOutput(pIn,FALSE);END; ////////////////////////////////////////// main//////////////////////////////////////////////////////BEGIN len := getLength(pIn); //writeln('len: '+inttostr(len)); IF len > 0 THEN BEGIN len1 := 0;len2 := 0;len3 := 0;len4 := 0;len5 := 0;len6 := 0;len7 := 0;len8 := 0;len9 := 0;len10 := 0;len11 := 0;len12 := 0;len13 := 0;len14 := 0;len15 := 0;len16 := 0;FOR i := 0 TO (len - 1) DO BEGIN getMidiArrayValue(pIn, i, tmp); IF (tmp.channel = 1) THEN BEGIN setMidiArrayValue(pOut1, len1, tmp); len1 := len1 +1; ENDELSE IF (tmp.channel = 2) THEN BEGIN setMidiArrayValue(pOut2, len2, tmp); len2 := len2 +1; END ELSE IF (tmp.channel = 3) THEN BEGIN setMidiArrayValue(pOut3, len3, tmp); len3 := len3 +1; ENDELSE IF (tmp.channel = 4) THEN BEGIN setMidiArrayValue(pOut4, len4, tmp); len4 := len4 +1; ENDELSE IF (tmp.channel = 5) THEN BEGIN setMidiArrayValue(pOut5, len5, tmp); setLength(pOut5,len5); len5 := len5 +1; ENDELSE IF (tmp.channel = 6) THEN BEGIN setMidiArrayValue(pOut6, len6, tmp); len6 := len6 +1; ENDELSE IF (tmp.channel = 7) THEN BEGIN setMidiArrayValue(pOut7, len7, tmp); len7 := len7 +1; ENDELSE IF (tmp.channel = 8) THEN BEGIN setMidiArrayValue(pOut8, len8, tmp); len8 := len8 +1; ENDELSE IF (tmp.channel = 9) THEN BEGIN setMidiArrayValue(pOut9, len9, tmp); len9 := len9 +1; ENDELSE IF (tmp.channel = 10) THEN BEGIN setMidiArrayValue(pOut10, len10, tmp); len10 := len10 +1; ENDELSE IF (tmp.channel = 11) THEN BEGIN setMidiArrayValue(pOut11, len11, tmp); len11 := len11 +1; ENDELSE IF (tmp.channel = 12) THEN BEGIN setMidiArrayValue(pOut12, len12, tmp); len12 := len12 +1; ENDELSE IF (tmp.channel = 13) THEN BEGIN setMidiArrayValue(pOut13, len13, tmp); len13 := len13 +1; ENDELSE IF (tmp.channel = 14) THEN BEGIN setMidiArrayValue(pOut14, len14, tmp); len14 := len14 +1; ENDELSE IF (tmp.channel = 15) THEN BEGIN setMidiArrayValue(pOut15, len15, tmp); len15 := len15 +1; ENDELSE IF (tmp.channel = 16) THEN BEGIN setMidiArrayValue(pOut16, len16, tmp); len16 := len16 +1; END; setLength(pOut1,len1); setLength(pOut2,len2);setLength(pOut3,len3); setLength(pOut4,len4);setLength(pOut5,len5); setLength(pOut6,len6);setLength(pOut7,len7); setLength(pOut8,len8);setLength(pOut9,len9); setLength(pOut10,len10);setLength(pOut11,len11); setLength(pOut12,len12);setLength(pOut13,len13); setLength(pOut14,len14);setLength(pOut15,len15); setLength(pOut16,len16); END; END ELSE BEGIN setLength(pOut1, 0);setLength(pOut2, 0);setLength(pOut3, 0);setLength(pOut4, 0);setLength(pOut5, 0);setLength(pOut6, 0);setLength(pOut7, 0);setLength(pOut8, 0);setLength(pOut9, 0);setLength(pOut10, 0);setLength(pOut11, 0);setLength(pOut12, 0);setLength(pOut13, 0);setLength(pOut14, 0);setLength(pOut15, 0);setLength(pOut16, 0); END; END.
Statistics: Posted by amiga909 — 28 Mar 2009, 08:52
Statistics: Posted by nay-seven — 28 Mar 2009, 08:34

Statistics: Posted by nay-seven — 27 Mar 2009, 20:27
Statistics: Posted by gurulogic — 27 Mar 2009, 18:17
Statistics: Posted by bsork — 31 Mar 2009, 11:38
Statistics: Posted by amiga909 — 31 Mar 2009, 10:47
CODE:
VAR pIn : Tparameter;TYPE outArr = ARRAY of Tparameter;VAR pOut : outArr;VAR tmp : tMidi;VAR inLen, min, max, i, x : INTEGER;VAR outLen : ARRAY OF INTEGER;VAR updLen : BOOLEAN;PROCEDURE init;BEGIN pIn := CreateParam('midi in', ptMidi); SetIsOutput(pIn, FALSE); SetArrayLength(pOut, 16); SetArrayLength(outlen, 16); FOR i := 0 TO 15 DO BEGIN pOut[i] := CreateParam('midi ch ' + IntToStr(i + 1), ptMidi); SetIsInput(pOut[i], FALSE); END; min := 16; max := 0; updLen := FALSE;END;PROCEDURE SetMinMax(y : integer);BEGIN IF (y < min) THEN min := y; IF (y > max) THEN max := y;END;// mainBEGIN IF (updLen) THEN BEGIN FOR i := min TO max DO BEGIN IF (OutLen[i] > 0) THEN BEGIN SetLength(pOut[i], 0); OutLen[i] := 0; END; END; min := 16; max := 0; updLen := FALSE; END; inLen := GetLength(pIn); IF (inlen > 0) THEN BEGIN FOR i := 0 TO (inLen - 1) DO BEGIN GetMidiArrayValue(pIn, i, tmp); IF (tmp.msg <= 239) THEN BEGIN x := tmp.channel - 1; SetMidiArrayValue(pOut[x], OutLen[x], tmp); OutLen[x] := OutLen[x] + 1; SetMinMax(x); updLen := TRUE; END; END; IF (updLen) THEN BEGIN FOR i := min TO max DO BEGIN IF (OutLen[i] > 0) THEN BEGIN SetLength(pOut[i], OutLen[i]); END; END; END; END;END.By using arrays, at least the code is smaller even if the results CPU-wise aren't much better than coding it the "hard way". Anyway, when doing MIDI scripts of various types, using the MIDI values themselves (channel, CC no, note no, etc) as indexes to arrays is often a good idea IMO. Depends on what the script is doing, of course.Statistics: Posted by bsork — 31 Mar 2009, 10:03
Statistics: Posted by amiga909 — 30 Mar 2009, 23:06
Statistics: Posted by 23fx23 — 30 Mar 2009, 22:36
Statistics: Posted by bsork — 30 Mar 2009, 22:25
Statistics: Posted by amiga909 — 30 Mar 2009, 13:09
Statistics: Posted by bsork — 30 Mar 2009, 09:19
Statistics: Posted by amiga909 — 30 Mar 2009, 00:35
Statistics: Posted by 23fx23 — 30 Mar 2009, 00:09




Statistics: Posted by amiga909 — 30 Mar 2009, 00:01
Statistics: Posted by gurulogic — 29 Mar 2009, 23:54
Statistics: Posted by 23fx23 — 29 Mar 2009, 23:25
Statistics: Posted by amiga909 — 29 Mar 2009, 23:14
Statistics: Posted by amiga909 — 29 Mar 2009, 09:39
easy, easy.....its a very easy thingie, done in 10min.
Statistics: Posted by nay-seven — 28 Mar 2009, 09:28
CODE:
(*/////////////////////////////////////////////////////// MEP_splitChn - midi script module for sensomusic usine // version: 2009-03-23 1.0; author: amiga909//// <Description> // splits midi messages by channel // <Parameters> // none// <Ports> // [channel 1-16]: //////////////////////////////////////////////////////*)//////////////////////////////////////////////////////// globals//////////////////////////////////////////////////////VAR pIn, pOut1, pOut2, pOut3, pOut4, pOut5, pOut6, pOut7, pOut8, pOut9, pOut10, pOut11, pOut12, pOut13, pOut14, pOut15, pOut16 : TParameter; VAR tmp : TMidi; VAR len, i, len1, len2, len3, len4, len5, len6, len7, len8, len9, len10, len11, len12, len13, len14, len15, len16 : INTEGER; //////////////////////////////////////////////////////// initialize//////////////////////////////////////////////////////PROCEDURE init; BEGIN pIn := createParam('in', ptMidi); pOut1 := createParam('chn 1', ptMidi); pOut2 := createParam('chn 2', ptMidi); pOut3 := createParam('chn 3', ptMidi); pOut4 := createParam('chn 4', ptMidi); pOut5 := createParam('chn 5', ptMidi); pOut6 := createParam('chn 6', ptMidi); pOut7 := createParam('chn 7', ptMidi); pOut8 := createParam('chn 8', ptMidi); pOut9 := createParam('chn 9', ptMidi); pOut10 := createParam('chn 10', ptMidi); pOut11 := createParam('chn 11', ptMidi); pOut12 := createParam('chn 12', ptMidi); pOut13 := createParam('chn 13', ptMidi); pOut14 := createParam('chn 14', ptMidi); pOut15 := createParam('chn 15', ptMidi); pOut16 := createParam('chn 16', ptMidi); setIsInput(pOut1,FALSE);setIsInput(pOut2,FALSE);setIsInput(pOut3,FALSE);setIsInput(pOut4,FALSE);setIsInput(pOut5,FALSE);setIsInput(pOut6,FALSE);setIsInput(pOut7,FALSE);setIsInput(pOut8,FALSE);setIsInput(pOut9,FALSE);setIsInput(pOut10,FALSE);setIsInput(pOut11,FALSE);setIsInput(pOut12,FALSE);setIsInput(pOut13,FALSE);setIsInput(pOut14,FALSE);setIsInput(pOut15,FALSE);setIsInput(pOut16,FALSE);setIsOutput(pIn,FALSE);END; ////////////////////////////////////////// main//////////////////////////////////////////////////////BEGIN len := getLength(pIn); //writeln('len: '+inttostr(len)); IF len > 0 THEN BEGIN len1 := 0;len2 := 0;len3 := 0;len4 := 0;len5 := 0;len6 := 0;len7 := 0;len8 := 0;len9 := 0;len10 := 0;len11 := 0;len12 := 0;len13 := 0;len14 := 0;len15 := 0;len16 := 0;FOR i := 0 TO (len - 1) DO BEGIN getMidiArrayValue(pIn, i, tmp); IF (tmp.channel = 1) THEN BEGIN setMidiArrayValue(pOut1, len1, tmp); len1 := len1 +1; ENDELSE IF (tmp.channel = 2) THEN BEGIN setMidiArrayValue(pOut2, len2, tmp); len2 := len2 +1; END ELSE IF (tmp.channel = 3) THEN BEGIN setMidiArrayValue(pOut3, len3, tmp); len3 := len3 +1; ENDELSE IF (tmp.channel = 4) THEN BEGIN setMidiArrayValue(pOut4, len4, tmp); len4 := len4 +1; ENDELSE IF (tmp.channel = 5) THEN BEGIN setMidiArrayValue(pOut5, len5, tmp); setLength(pOut5,len5); len5 := len5 +1; ENDELSE IF (tmp.channel = 6) THEN BEGIN setMidiArrayValue(pOut6, len6, tmp); len6 := len6 +1; ENDELSE IF (tmp.channel = 7) THEN BEGIN setMidiArrayValue(pOut7, len7, tmp); len7 := len7 +1; ENDELSE IF (tmp.channel = 8) THEN BEGIN setMidiArrayValue(pOut8, len8, tmp); len8 := len8 +1; ENDELSE IF (tmp.channel = 9) THEN BEGIN setMidiArrayValue(pOut9, len9, tmp); len9 := len9 +1; ENDELSE IF (tmp.channel = 10) THEN BEGIN setMidiArrayValue(pOut10, len10, tmp); len10 := len10 +1; ENDELSE IF (tmp.channel = 11) THEN BEGIN setMidiArrayValue(pOut11, len11, tmp); len11 := len11 +1; ENDELSE IF (tmp.channel = 12) THEN BEGIN setMidiArrayValue(pOut12, len12, tmp); len12 := len12 +1; ENDELSE IF (tmp.channel = 13) THEN BEGIN setMidiArrayValue(pOut13, len13, tmp); len13 := len13 +1; ENDELSE IF (tmp.channel = 14) THEN BEGIN setMidiArrayValue(pOut14, len14, tmp); len14 := len14 +1; ENDELSE IF (tmp.channel = 15) THEN BEGIN setMidiArrayValue(pOut15, len15, tmp); len15 := len15 +1; ENDELSE IF (tmp.channel = 16) THEN BEGIN setMidiArrayValue(pOut16, len16, tmp); len16 := len16 +1; END; setLength(pOut1,len1); setLength(pOut2,len2);setLength(pOut3,len3); setLength(pOut4,len4);setLength(pOut5,len5); setLength(pOut6,len6);setLength(pOut7,len7); setLength(pOut8,len8);setLength(pOut9,len9); setLength(pOut10,len10);setLength(pOut11,len11); setLength(pOut12,len12);setLength(pOut13,len13); setLength(pOut14,len14);setLength(pOut15,len15); setLength(pOut16,len16); END; END ELSE BEGIN setLength(pOut1, 0);setLength(pOut2, 0);setLength(pOut3, 0);setLength(pOut4, 0);setLength(pOut5, 0);setLength(pOut6, 0);setLength(pOut7, 0);setLength(pOut8, 0);setLength(pOut9, 0);setLength(pOut10, 0);setLength(pOut11, 0);setLength(pOut12, 0);setLength(pOut13, 0);setLength(pOut14, 0);setLength(pOut15, 0);setLength(pOut16, 0); END; END.
Statistics: Posted by amiga909 — 28 Mar 2009, 08:52
Statistics: Posted by nay-seven — 28 Mar 2009, 08:34

Statistics: Posted by nay-seven — 27 Mar 2009, 20:27
Statistics: Posted by gurulogic — 27 Mar 2009, 18:17