ArrayArrayArrayArrayArrayArrayArrayArray
Statistics: Posted by Wiskow — 01 Jan 2010, 06:49 Statistics: Posted by ethnix73 — 18 Oct 2009, 12:13 CODE: Statistics: Posted by amiga909 — 18 Oct 2009, 11:02 Statistics: Posted by Clearscreen — 20 Aug 2009, 00:11 Statistics: Posted by ethnix73 — 19 Aug 2009, 17:49 Statistics: Posted by amiga909 — 19 Aug 2009, 09:48
It is important that you drag and drop your MIDI file so you get the right module and things will stay in sync.
]]>
Il will test your script , as it might be really usefull
]]>
i've been messing around with a script solution. my goal was to achieve the same behavior as in phrazor. didnt quite get there ![]()

it works ok under some circumstances. to do's:
- proper sync if slave roll's start bar is not 0 and slave bar length is different than master bar length.
- meaningful sync with non-integer bar lengths ratios
- also sync on reverse mode
- many things more!
however, i've quit working on it cause things might change with usine v5. also i am not sure if manipulating ppq streams with a midi script is a goof idea (tests did not show sync or cpu issues thu)?
if any1 interested, here the code.(*/////////////////////////////////////////////////////// MEP_rollSync - midi script for sensomusic usine // version: 2009-10-03 0.1; author: amiga909<<<WHAT>>>syncs 2 piano rolls with different lengths <<<HOW>>>- both rolls in [loop mode]- master bar length may not be shorter than slave- master must start at the first bar (start pos = 0)<<INPUT>> *bypass if ON: output PPQ is not adjustedend pos.masterconnect to 1st piano roll module outletppQpos.master connect to 1st piano roll module outletstart pos.slave1connect to 2nd piano roll module outletend pos.slave1connect to 2nd piano roll module outlet<<OUTPUT>>ppQpos.slave1connect to 2nd piano roll module inletend pos.slave1connect to 2nd piano roll module inlet//////////////////////////////////////////////////////*)//////////////////////////// roll sync// what: resets and/or freezes a slaved piano roll// master + slave concurrently play their first bar as soon as possible/////////////////////////// parameters declarationVAR pIn, pOut, pBypass, //pOutStop,pMasterBarLength, pSlave1BarStart, pSlave1BarLength : tParameter; VAR masterBar, slave1Bar, slave1Offset, intervalSlave1: INTEGER;VAR ppqIn: DOUBLE;// init PROCEDURE init;BEGINpBypass := createParam('*bypass', ptButton); pMasterBarLength := createParam('end pos.master', ptDataFader);pIn := createParam('ppQpos.master', ptDataField); pSlave1BarStart := createParam('start pos.slave1', ptDataFader); pSlave1BarLength := createParam('end pos.slave1', ptDataFader); pOut := createParam('ppQpos.slave1', ptDataField); setValue(pMasterBarLength, 4);setValue(pBypass, 0);setValue(pSlave1BarStart,0);setValue(pMasterBarLength,2); setIsInput(pOut,FALSE);setIsOutput(pIn,FALSE);setIsOutput(pBypass,FALSE);setIsOutput(pSlave1BarLength ,FALSE);setIsOutput(pSlave1BarStart ,FALSE);setIsOutput(pMasterBarLength ,FALSE);END;//////////////////////////////// main//////////////////////////////beginIF ((getValue(pBypass) = 0)) THEN BEGINmasterBar := TRUNC(getValue(pMasterBarLength));slave1Offset := TRUNC(getValue(pSlave1BarStart));slave1Bar := TRUNC(getValue(pSlave1BarLength));// interval: 0: slave same length; -: slave is longer; +: slave is shorterintervalSlave1 := masterBar - (slave1Bar - slave1Offset);IF (slave1Offset = 0) THEN BEGIN // CASE 1: DONEIF (intervalSlave1 > 0) THEN BEGIN// init PPQ varppqIn := getValue(pIn);IF (ppqIn > slave1Bar) THEN BEGINppqIn := ppqIn - (TRUNC(ppqIn / slave1Bar) * slave1Bar);setValue(pOut, ppqIn);ENDELSE BEGINsetValue(pOut, ppqIn);END; ENDELSE IF (intervalSlave1 = 0) THEN BEGIN // CASE 2: DONE setValue(pOut, getValue(pIn));ENDELSE BEGIN // (intervalSlave1 < 0)// CASE 3: DONE // master is never shorter than slave!//setValue(pSlave1BarLengthOut, masterBar); END;ENDELSE BEGIN //(slave1Offset > 0)IF (intervalSlave1 > 0) THEN BEGIN// CASE 4: ppqIn := getValue(pIn);IF (ppqIn < slave1Offset) THEN BEGINppqIn := ppqIn + (TRUNC(ppqIn / slave1Bar) * slave1Bar);setValue(pOut, ppqIn);ENDELSE BEGINsetValue(pOut, ppqIn);END;ENDELSE IF (intervalSlave1 = 0) THEN BEGIN // CASE 5: DONEsetValue(pOut, (getValue(pIn) + slave1Offset));ENDELSE BEGIN // (intervalSlave1 < 0)// CASE 6: DONE //setValue(pSlave1BarLengthOut, (masterBar + slave1Offset)); END;END;ENDELSE BEGIN setValue(pOut, getValue(pIn));END; end.
]]>
]]>
The get bus module gets the ppq position from a master piano roll.
In the A<B and A>B modules, B is set to same as your piano roll inlet "end position".
In this example, the master piano roll have got a lenght of 64. In the mapper module, i remap values from 32 to 64, to 0 to 32...
]]>
i've tried to do a midi looper with dynamic bar lengths and never could achieve good timing.
havent retried for a while thu. havent got a solution.. just some loud thinking here ![]()
what u could do of course, clearscreen is to keep all tracks active and use a midi bypass (flow control works also for midi streams).
thorny it gets if i change the loop ranges while playing, apply reverse or whatever (further, even worse when i wanted to realtime record).
maybe the easiest and most common way (as in many hardware seqs) could be to force every piano roll to wait until the longest piano roll (like a master track) has reached its first bar. then again u could use quantized triggers too..
however there should be a more dynamic way (= when rolls are turned off, or loop range is changed) to ensure the constraint all rolls should meet at the first bar as fast as possible?
for inspiration u coould check (sadly discontinued) Phrazor vst which does midi clip muting/unmuting very nicely.
]]>
Statistics: Posted by Clearscreen — 19 Aug 2009, 03:23
Statistics: Posted by Wiskow — 01 Jan 2010, 06:49
Statistics: Posted by ethnix73 — 18 Oct 2009, 12:13

CODE:
(*/////////////////////////////////////////////////////// MEP_rollSync - midi script for sensomusic usine // version: 2009-10-03 0.1; author: amiga909<<<WHAT>>>syncs 2 piano rolls with different lengths <<<HOW>>>- both rolls in [loop mode]- master bar length may not be shorter than slave- master must start at the first bar (start pos = 0)<<INPUT>> *bypass if ON: output PPQ is not adjustedend pos.masterconnect to 1st piano roll module outletppQpos.master connect to 1st piano roll module outletstart pos.slave1connect to 2nd piano roll module outletend pos.slave1connect to 2nd piano roll module outlet<<OUTPUT>>ppQpos.slave1connect to 2nd piano roll module inletend pos.slave1connect to 2nd piano roll module inlet//////////////////////////////////////////////////////*)//////////////////////////// roll sync// what: resets and/or freezes a slaved piano roll// master + slave concurrently play their first bar as soon as possible/////////////////////////// parameters declarationVAR pIn, pOut, pBypass, //pOutStop,pMasterBarLength, pSlave1BarStart, pSlave1BarLength : tParameter; VAR masterBar, slave1Bar, slave1Offset, intervalSlave1: INTEGER;VAR ppqIn: DOUBLE;// init PROCEDURE init;BEGINpBypass := createParam('*bypass', ptButton); pMasterBarLength := createParam('end pos.master', ptDataFader);pIn := createParam('ppQpos.master', ptDataField); pSlave1BarStart := createParam('start pos.slave1', ptDataFader); pSlave1BarLength := createParam('end pos.slave1', ptDataFader); pOut := createParam('ppQpos.slave1', ptDataField); setValue(pMasterBarLength, 4);setValue(pBypass, 0);setValue(pSlave1BarStart,0);setValue(pMasterBarLength,2); setIsInput(pOut,FALSE);setIsOutput(pIn,FALSE);setIsOutput(pBypass,FALSE);setIsOutput(pSlave1BarLength ,FALSE);setIsOutput(pSlave1BarStart ,FALSE);setIsOutput(pMasterBarLength ,FALSE);END;//////////////////////////////// main//////////////////////////////beginIF ((getValue(pBypass) = 0)) THEN BEGINmasterBar := TRUNC(getValue(pMasterBarLength));slave1Offset := TRUNC(getValue(pSlave1BarStart));slave1Bar := TRUNC(getValue(pSlave1BarLength));// interval: 0: slave same length; -: slave is longer; +: slave is shorterintervalSlave1 := masterBar - (slave1Bar - slave1Offset);IF (slave1Offset = 0) THEN BEGIN // CASE 1: DONEIF (intervalSlave1 > 0) THEN BEGIN// init PPQ varppqIn := getValue(pIn);IF (ppqIn > slave1Bar) THEN BEGINppqIn := ppqIn - (TRUNC(ppqIn / slave1Bar) * slave1Bar);setValue(pOut, ppqIn);ENDELSE BEGINsetValue(pOut, ppqIn);END; ENDELSE IF (intervalSlave1 = 0) THEN BEGIN // CASE 2: DONE setValue(pOut, getValue(pIn));ENDELSE BEGIN // (intervalSlave1 < 0)// CASE 3: DONE // master is never shorter than slave!//setValue(pSlave1BarLengthOut, masterBar); END;ENDELSE BEGIN //(slave1Offset > 0)IF (intervalSlave1 > 0) THEN BEGIN// CASE 4: ppqIn := getValue(pIn);IF (ppqIn < slave1Offset) THEN BEGINppqIn := ppqIn + (TRUNC(ppqIn / slave1Bar) * slave1Bar);setValue(pOut, ppqIn);ENDELSE BEGINsetValue(pOut, ppqIn);END;ENDELSE IF (intervalSlave1 = 0) THEN BEGIN // CASE 5: DONEsetValue(pOut, (getValue(pIn) + slave1Offset));ENDELSE BEGIN // (intervalSlave1 < 0)// CASE 6: DONE //setValue(pSlave1BarLengthOut, (masterBar + slave1Offset)); END;END;ENDELSE BEGIN setValue(pOut, getValue(pIn));END; end.Statistics: Posted by amiga909 — 18 Oct 2009, 11:02
Statistics: Posted by Clearscreen — 20 Aug 2009, 00:11

Statistics: Posted by ethnix73 — 19 Aug 2009, 17:49
Statistics: Posted by amiga909 — 19 Aug 2009, 09:48
Statistics: Posted by Clearscreen — 19 Aug 2009, 03:23