ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
Statistics: Posted by woodslanding — 19 Jan 2010, 19:55 CODE: Statistics: Posted by bsork — 19 Jan 2010, 12:05 CODE: Statistics: Posted by bsork — 19 Jan 2010, 01:29 CODE: Statistics: Posted by martignasse — 19 Jan 2010, 01:10 CODE: Statistics: Posted by martignasse — 19 Jan 2010, 01:03 Statistics: Posted by woodslanding — 19 Jan 2010, 00:50 CODE: Statistics: Posted by woodslanding — 19 Jan 2010, 00:47 CODE: Statistics: Posted by woodslanding — 19 Jan 2010, 00:39 Statistics: Posted by woodslanding — 19 Jan 2010, 00:01 Statistics: Posted by woodslanding — 18 Jan 2010, 23:53
I'll study this. I see there is a litte trickery to get the output length set to zero at the beginning....
]]>
Callback is called once for each updated input parameter in a execution before Process is called. Setting the length or value of a parameter can be done from either procedure, but any assignments done in Process will override anything called from Callback.
BTW, I really welcome the new structure: It makes for much cleaner coding. For a small script like yours, there's not much too gain, but with a lot parameters things get a lot simpler when one can fetch all or most of the data in one place, for instance:VAR pMidiIn, pMidiOut, pSwitch, pButton : tParameter;VAR numIn : Integer;VAR switchOn : Boolean;...PROCEDURE Init;BEGIN pMidiIn := CreateParam('midi in', ptMidi); SetIsOutput(pMidiIn, FALSE); pMidiOut := CreateParam('midi out', ptMidi); SetIsInput(pMidiIn, FALSE); pSwitch := CreateParam('switch', ptSwitch); SetIsOutput(pSwitch, FALSE); pButton := CreateParam('switch', ptButton); SetIsOutput(pButton, FALSE); ...END;...PROCEDURE Callback(n : Integer);BEGIN CASE n OF pMidiIn : numIn := trunc(GetValue(n)); pSwitch : switchOn := (GetValue(n) > 0.0); pButton : DoSomeThing; ... END;END;PROCEDURE Process; VAR i : Integer; VAR m : tMidi;BEGIN IF (switchOn) THEN ... FOR i := 0 TO (numIn - 1) THEN DO GetMidiArrayValue(pMidiIn, i, m); ...END;
]]>
It's getting late, so this is probably not the most elegant code, but it works:// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOnsSent, setZeroLength, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptButton); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,24); // set the number of output codes for i := 0 to 23 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin SetLength(outPut,24); // set the number of output codes for i := 0 to 23 do begin noteOff.data1 := i; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; noteOnsSent := TRUE; setZeroLength := FALSE; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 700.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END ELSE IF (noteOnsSent AND NOT setZeroLength) THEN BEGIN setZeroLength := TRUE; END ELSE IF (setZeroLength) THEN BEGIN SetLength(outPut, 0); END; END;END;
]]>
i believe you have to set the length of outpout parameter to 0 at the end of the IF (doChange) block, or the midi message is fired each time Process is executed.BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; SetLength(outPut,48); END;END;
]]>
try
getValue(trigger) = 1
without getting a compile error. What am I doing wrong? Doesn't getValue() return a SINGLE??round(getValue(trigger)) = 1;
hope it help
]]>
getValue(trigger) = 1
without getting a compile error. What am I doing wrong? Doesn't getValue() return a SINGLE??
]]>// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptDataField); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,48); // set the number of output codes for i := 0 to 23 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i + 12; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin //SetLength(outPut,24); // set the number of output codes for i := 24 to 47 do begin noteOff.data1 := i - 12; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;
]]>
I'm not sure why you are checking whether noteoffs are sent. I'll look into that.
EDIT: Actually this version sends one noteOFF, but if I move the noteON method to process, I lose even that one.// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptDataField); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,24); // set the number of output codes for i := 1 to 24 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i + 12; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin SetLength(outPut,24); // set the number of output codes for i := 1 to 24 do begin noteOff.data1 := i - 12; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;
]]>
I'll try it both ways and see what works.....
]]>
The code reads like butter!
I've realized it's not so easy in Delphi when you don't have capitalization to set things apart.....
]]>
CODE:
var onPM : tParameter;var startTime : Single;var doChange, noteOffsSent : Boolean;...PROCEDURE Callback (n : Integer);begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SendVol0AndNoteOns;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 700.0) THEN BEGIN doChange := FALSE; SendVol1; END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;Just a tiny bit of CPU to check the doChange variable in Process. Statistics: Posted by bsork — 18 Jan 2010, 12:00
Statistics: Posted by woodslanding — 18 Jan 2010, 09:57
Statistics: Posted by woodslanding — 19 Jan 2010, 19:55
CODE:
VAR pMidiIn, pMidiOut, pSwitch, pButton : tParameter;VAR numIn : Integer;VAR switchOn : Boolean;...PROCEDURE Init;BEGIN pMidiIn := CreateParam('midi in', ptMidi); SetIsOutput(pMidiIn, FALSE); pMidiOut := CreateParam('midi out', ptMidi); SetIsInput(pMidiIn, FALSE); pSwitch := CreateParam('switch', ptSwitch); SetIsOutput(pSwitch, FALSE); pButton := CreateParam('switch', ptButton); SetIsOutput(pButton, FALSE); ...END;...PROCEDURE Callback(n : Integer);BEGIN CASE n OF pMidiIn : numIn := trunc(GetValue(n)); pSwitch : switchOn := (GetValue(n) > 0.0); pButton : DoSomeThing; ... END;END;PROCEDURE Process; VAR i : Integer; VAR m : tMidi;BEGIN IF (switchOn) THEN ... FOR i := 0 TO (numIn - 1) THEN DO GetMidiArrayValue(pMidiIn, i, m); ...END;Statistics: Posted by bsork — 19 Jan 2010, 12:05
CODE:
// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOnsSent, setZeroLength, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptButton); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,24); // set the number of output codes for i := 0 to 23 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin SetLength(outPut,24); // set the number of output codes for i := 0 to 23 do begin noteOff.data1 := i; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; noteOnsSent := TRUE; setZeroLength := FALSE; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 700.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END ELSE IF (noteOnsSent AND NOT setZeroLength) THEN BEGIN setZeroLength := TRUE; END ELSE IF (setZeroLength) THEN BEGIN SetLength(outPut, 0); END; END;END;Statistics: Posted by bsork — 19 Jan 2010, 01:29
CODE:
BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; SetLength(outPut,48); END;END;Statistics: Posted by martignasse — 19 Jan 2010, 01:10
tryI want to try making this contingent on the value of trigger, but I cannot test for
getValue(trigger) = 1
without getting a compile error. What am I doing wrong? Doesn't getValue() return a SINGLE??
CODE:
round(getValue(trigger)) = 1;Statistics: Posted by martignasse — 19 Jan 2010, 01:03
Statistics: Posted by woodslanding — 19 Jan 2010, 00:50
CODE:
// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptDataField); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,48); // set the number of output codes for i := 0 to 23 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i + 12; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin //SetLength(outPut,24); // set the number of output codes for i := 24 to 47 do begin noteOff.data1 := i - 12; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;Statistics: Posted by woodslanding — 19 Jan 2010, 00:47
CODE:
// resets Mr ray's oscillators on a patch changevar startTime : Single;var doChange, noteOffsSent : Boolean;var i : integer;var noteOn : TMidi;var noteOff : TMidi;var output : Tparameter;var volOut : Tparameter;var trigger : Tparameter;// initialisation : create parametersprocedure init;begin Output := CreateParam('Midi Out',ptMidi); SetIsInput(Output,false); VolOut := CreateParam('Vol Out',ptDataField); SetIsInput(volOut,false); trigger := CreateParam('trig',ptDataField); SetIsOutput(Trigger,false); end;Procedure SendNoteOns;begin SetLength(outPut,24); // set the number of output codes for i := 1 to 24 // loop for all input codes, for polyphonic data (chords) do begin noteOn.data1 := i + 12; noteOn.data2 := 1; noteOn.msg := 144; noteOn.channel := 1; SetMidiArrayValue(output,i,noteOn); // set output value endend;Procedure SendNoteOffs;begin SetLength(outPut,24); // set the number of output codes for i := 1 to 24 do begin noteOff.data1 := i - 12; noteOff.data2 := 0; noteOff.msg := 128; noteOff.channel := 1; SetMidiArrayValue(output,i,noteOff); // set output value end;end;PROCEDURE Callback (n : Integer); // only 1 input, trigger....begin if n = trigger then begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SetValue(volOut, 0); SendNoteOns; end;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 7000.0) THEN BEGIN doChange := FALSE; SetValue(volOut, 1); END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;Statistics: Posted by woodslanding — 19 Jan 2010, 00:39
Statistics: Posted by woodslanding — 19 Jan 2010, 00:01
Statistics: Posted by woodslanding — 18 Jan 2010, 23:53
CODE:
var onPM : tParameter;var startTime : Single;var doChange, noteOffsSent : Boolean;...PROCEDURE Callback (n : Integer);begin startTime := TimeMs; doChange := TRUE; noteOffsSent := FALSE; SendVol0AndNoteOns;end;PROCEDURE Process;BEGIN IF (doChange) THEN BEGIN IF ((TimeMs - startTime) >= 700.0) THEN BEGIN doChange := FALSE; SendVol1; END ELSE IF (((TimeMs - startTime) >= 200.0) AND (NOT noteOffsSent)) THEN BEGIN SendNoteOffs; noteOffsSent := TRUE; END; END;END;Just a tiny bit of CPU to check the doChange variable in Process. Statistics: Posted by bsork — 18 Jan 2010, 12:00
Statistics: Posted by woodslanding — 18 Jan 2010, 09:57