' ************************************************************* ' * 'Seven Quaver Evertire' * ' * & * ' * 'Simple Triple Ouxercuse' * ' * by * ' * Godfried-Willem Raes * ' * 1977- rev. 2003/2004/2005 * ' * g_technorobots added 2006 * ' * revised and further debugged 21.11.2006 * ' * 'g_tec.611' * ' ************************************************************* ' The revised version uses the percussion components of the ' M&M robot orchestra. Live musicians can be added optionally. ' ' automats to be used: ' ' ' ' ' - castagnets: ' - turkish music ' ' - shakers ' ' ' - beaters ' in staccato mode ( without blowers...) ' ' - added 15.01.2005 ' added 31.10.2005 ' added 28.02.2006 ' added 20.11.2006 ' added 23.11.2006 ' we could also add Harma in staccato mode. ' 25.08.2003: first coding for M&M orchestra ' may later use Quadrada setup for real time controll ' 27.08.2003: works o.k. ' 02.09.2003: NiDAQ added with Quadrada setup. ' 04.09.2003: Radar added. ' 05.09.2003: surface triggers added to voices. We misuse TaskEX().hIcon as a muting flag ' 5th voice added. ' 06.09.2003: optional parts for and added. ' id: should be extended with different rhythm generators (milonga, tango...) ' 07.09.2003: Note: it is normal that some voices do not mPlay when selected. This is a result of our synchronisation ' requirements. If a player gets out of sync, the others will be incapable to sync. ' Part for Harma added. ' velocity made interactive on moving surface. ' Rotomoton motors implemented ' Flex bending implemented ' unneeded noteoff messages in the mPlay routines removed ' 08.09.2003: crash bug removed from voice 3. ' 09.09.2003: premiere met Emilie De Vlam ' 10.09.2003: So voetje toegevoegd. So.ctrl(64) used as switch ' TO DO: Global harmonic structure (using App.Globton) ' TO DO check flexing ranges for flex with beaters. ' make So - level interactive (or dependent on central position) ' bug on the first run of the voices, they will be out of sync... repaired. ' 20.09.2003: adapted to new implementation of radar interface. ' 12.02.2004: added ' 23.08.2004: minor cleanup op code. ' 21.09.2004: CD recording made. ' 15.01.2005: Llor added. ' 31.10.2005: Vacca added. ' 01.03.2006: Psch added. ' 02.03.2006: code added for techo and algotango versions. ' 03.03.2006: %ID_G_TECHNO constant added in g_kons ' 16.09.2006: adapted to new Belly hardware ' 20.11.2006: Vitello added. ' 21.11.2006: debug session: finally we found the bug that made the code sluggish...: cockpit sliders 0,1 were wrong. ' 23.11.2006: automatic change of patterns implemented and debugged. ' 14.04.2007: start adding support for robot ' 10.05.2007: support added for ' 07.06.2009: upgraded to NiDAQmx V8.8 - tested in \\No o.k. TYPE BarType r0 AS ritmetype ' ritme voice 1 r1 AS ritmetype ' ritme voice 2 n0(%RitmArraySize) AS INTEGER ' notes voice 1 - not required, depends on robot n1(%RitmArraySize) AS INTEGER ' notes voice 2 - id. v0(%RitmArraySize) AS INTEGER ' velo's voice 1 v1(%RitmArraySize) AS INTEGER ' velo's voice 2 END TYPE TYPE Robotorkest_Flags DWORD piece AS DWORD ' selection with button: %ID_SQE or %ID_STO or something else...(g_techno) NrIns AS DWORD ' = %SQE_NrIns naam(50) AS STRING * 20 ' names of the robots used busy(50) AS DWORD ' 0 or 1,2,3,4,5 - number of the voice they are playing ln(50) AS BYTE ' midi code for the low note hn(50) AS BYTE ' midi code for the high note END TYPE '%SQE_Flag = 1 ' if defined, taskswitches will reset instrumentation ' else, instrumentation can be kept. '%QRadar_screen = 0 ' same code as in Quadrada - moved to DLL 19.09.2003 '%VU_Task = 1 %SQE_Ctrl = 32 ' playing tasks: %SQE1 = 48 ' player 1 a %SQE1b = %SQE1 + 1 ' player 1 b %SQE2 = %SQE1 + 2 ' player 2 a %SQE2b = %SQE2 + 1 ' player 2 b %SQE3 = %SQE2 + 2 ' player 3 a %SQE3b = %SQE3 + 1 ' player 3 b %SQE4 = %SQE3 + 2 ' player 4 a %SQE4b = %SQE4 + 1 ' player 4 b %SQE5 = %SQE4 + 2 ' player 5 a %SQE5b = %SQE5 + 1 ' player 5 b %SQE_So = %SQE5 + 2 ' fundament voor %SQE_Brd = %SQE_So + 1 ' additional notes for Bourdonola %SQE_Harma = %SQE_So + 2 ' additional notes for Harma %SQE_Checksum = 7 * 24 %STO_Checksum = 3 * 48 %SQE_NrIns = 21 ' was 14 before adding Llor ' number of robots used in the orchestra (0 = Off) ' was 15 before adding Vacca ' was 16 before adding Psch ' was 17 before adding vitello ' was 18 befor adding snar ' was 19 before adding xy ' was 20 before adding casta2 DECLARE FUNCTION Init_SQE_STO () AS LONG DECLARE SUB SQE_Lookup () DECLARE SUB STO_Lookup () DECLARE SUB SQE_Ctrl () ' global control for playing the piece. DECLARE SUB SQE_Tempo_Slider () ' tempo slider control - onderste in cockpit. DECLARE SUB SQE_Repeats_Slider () ' bovenste slider in cockpit - added 21.11.2006 DECLARE SUB SQE_Sfakt_Slider () ' surface calculation faktor controll in cockpit. DECLARE SUB SQE_Ctrl_Slider0 () DECLARE SUB SQE_Ctrl_Slider1 () DECLARE SUB SQE_Ctrl_Slider2 () DECLARE SUB SQE_Ctrl_Slider3 () DECLARE SUB SQE_Ctrl_Slider4 () DECLARE SUB SQE_Ctrl_UD0 () DECLARE SUB SQE_Ctrl_UD1 () DECLARE SUB SQE_Ctrl_UD2 () DECLARE SUB SQE_Ctrl_UD3 () DECLARE SUB SQE_Ctrl_UD4 () DECLARE SUB SQE_Play1 () DECLARE SUB SQE_Play1b () DECLARE SUB SQE_Play1_Stop () DECLARE SUB SQE_Play2 () DECLARE SUB SQE_Play2b () DECLARE SUB SQE_Play2_Stop () DECLARE SUB SQE_Play3 () DECLARE SUB SQE_Play3b () DECLARE SUB SQE_Play3_Stop () DECLARE SUB SQE_Play4 () DECLARE SUB SQE_Play4b () DECLARE SUB SQE_Play4_Stop () DECLARE SUB SQE_Play5 () DECLARE SUB SQE_Play5b () DECLARE SUB SQE_Play5_Stop () DECLARE SUB SQE_So () ' DECLARE SUB SQE_So_Stop () DECLARE SUB SQE_Brd () ' DECLARE SUB SQE_Brd_Stop () DECLARE SUB SQE_Harma () ' DECLARE SUB SQE_Harma_Stop () DECLARE FUNCTION STO_SQE_Orkestrator (BYVAL voice AS BYTE) AS DWORD ' returns index of robot to mPlay the voice DECLARE SUB SQE_STO_Patches () DECLARE SUB SQE_STO_ReMapCockpitButtons () DECLARE SUB SQE_STO_ButnSWHandler () DECLARE SUB SQE_STO_ButnOSHandler () DECLARE FUNCTION SQE_Sync (BYVAL tasknr AS DWORD) AS DWORD ' returns %True or %False DECLARE FUNCTION SQE_GetBar (BYVAL tasknr AS DWORD) AS DWORD ' returns a fresh exclusive barnumber DECLARE SUB g_techno_lookup () ' 02.03.2006 DECLARE FUNCTION Calibrate_E_Series_dummy (BYVAL a%, BYVAL b&, BYVAL c&, BYVAL d#) AS INTEGER GLOBAL Maat() AS Bartype GLOBAL Orkest AS Robotorkest_Flags GLOBAL pr() AS RadarType PTR GLOBAL SQE_Repeats AS LONG ' 21.11.2006 FUNCTION Init_SQE_STO () AS LONG LOCAL i AS DWORD LOCAL j AS DWORD LOCAL p AS DWORD LOCAL m AS ASCIIZ * 40 DIM pr(4) AS GLOBAL RadarType PTR DIM Maat(12) AS GLOBAL BarType ' we have 13 bars in SQE and STO LOCAL cptr AS DWORD SELECT CASE App.id CASE %ID_SQE_STO, %ID_SQE, %ID_STO , %ID_G_TECHNO ' o.k. - also for g_techno we start up with this id for now CASE ELSE MSGBOX "Initialisation error: wrong app.id",,FUNCNAME$ EXIT FUNCTION END SELECT IF ISFALSE DAQparams.id THEN MSGBOX "You must select a DAQ device for this composition",, FUNCNAME$ FUNCTION = %False EXIT FUNCTION ELSE DAQparams.mode = %DAQ_NI FOR i = 0 TO 4 'p = GetRadarPointer (i) ' in g_nih.dll cptr = GetProcAddress(gh.gnh, "GETRADARPOINTER") CALL DWORD cptr USING GetRadarPointer(i) TO p pr(i) = p ' set noise level: @pr(i).noise = 3 '@pr(i).dt = 32 ' integration window, in number of samples. (determines responsiveness) ' with the zerocross procedure, it sets the number of below noise samples before a global zero input is ' returned: @pr(i).dt = 4 @pr(i).sfakt = 1 'was 2 in Quadrada ' divisor for surface value in dll. @pr(i).dta = 15 ' integration time for slow amplitudes used for position determination with %Zerocross algo ' set params for data acquisition & math: ' @pr(i).params can be: %SIGNCHANGE, %DFT, %ZeroCross, %DFT ,%IsolWave, %ISOLPERIOD @pr(i).params = %ZEROCROSS ' new version 28.03.2003 @pr(i).setup = %SQUARE NEXT i Daqparams.channel = %DAQ_RADAR 'Radar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_Daq(%false) END IF Orkest.NrIns = %SQE_NrIns ' do not change the numbering of the robots here! Orkest.naam(0) = "off" ' we use the number constants in the playing tasks. Orkest.naam(1) = "piano" Orkest.naam(2) = "casta" ' uses casta1 Orkest.naam(3) = "piperola" Orkest.naam(4) = "troms" Orkest.naam(5) = "rotomoton" Orkest.naam(6) = "thunderwood" Orkest.naam(7) = "tubi" Orkest.naam(8) = "vibi" Orkest.naam(9) = "belly" Orkest.naam(10) = "springers" Orkest.naam(11) = "dripper" Orkest.naam(12) = "flex" Orkest.naam(13) = "klung" Orkest.naam(14) = "puff" ' added 12.02.2004 Orkest.naam(15) = "llor" ' added 15.02.2005 Orkest.naam(16) = "vacca" ' added 31.10.2005 Orkest.naam(17) = "psch" ' added 28.02.2006 Orkest.naam(18) = "vitello" ' added 20.11.2006 Orkest.naam(19) = "snar" ' added 23.11.2006 Orkest.naam(20) = "xy " ' added 14.04.2007 Orkest.naam(21) = "cas2" ' added 10.05.2007 - casta2 SQE_STO_Patches SQE_STO_ReMapCockpitButtons ' called from menu. Task(%Radar_VU_Task).naam = "" ' 1 Task(%Radar_VU_Task).cPtr = GetProcAddress(gh.gnh,"RADAR_II_VU") ' in g_nih.dll Task(%Radar_VU_Task).freq = 16 Task(%Radar_VU_Task).flags = %DLL_TASK Task(%Radar_VU_Task).patch = 4 '%False ' used to display different param displays. Task(%Radar_Display_Task).naam = "" ' 2 Task(%Radar_Display_Task).cPtr = GetProcAddress(gh.gnh,"RADAR_DISPLAY") ' now in g_nih.dll Task(%Radar_Display_Task).freq = 16 Task(%Radar_Display_Task).flags = %DLL_TASK Task(%Radar_Display_Task).patch = %False ' used to switch between place and wave display Task(%SQE_Ctrl).cPtr = CODEPTR(SQE_Ctrl) Task(%SQE_Ctrl).channel = 0 Task(%SQE_Ctrl).naam = "SQE-STO" ' seven quaver evertire or simple triple ouxercuse Task(%SQE_Ctrl).freq = 10 Task(%SQE1).cPtr = CODEPTR(SQE_Play1) Task(%SQE1).channel = 0 Task(%SQE1).naam = "play_1a" Task(%SQE1).flags = %False TaskEX(%SQE1).stopCptr = CODEPTR(SQE_Play1_Stop) TaskEX(%SQE1).hIcon = %False ' used as a muting switch Task(%SQE1).freq = 100 Task(%SQE1b).cPtr = CODEPTR(SQE_Play1b) Task(%SQE1b).channel = 0 Task(%SQE1b).naam = "play_1b" Task(%SQE1b).flags = %HIDDEN_Task Task(%SQE1b).freq = 100 Task(%SQE1b).level = %False Task(%SQE2).cPtr = CODEPTR(SQE_Play2) Task(%SQE2).channel = 0 Task(%SQE2).naam = "play_2a" TaskEX(%SQE2).stopCptr = CODEPTR(SQE_Play2_Stop) Task(%SQE2).flags = %False Task(%SQE2).freq = 100 TaskEX(%SQE2).hIcon = %False Task(%SQE2b).cPtr = CODEPTR(SQE_Play2b) Task(%SQE2b).channel = 0 Task(%SQE2b).naam = "play_2b" Task(%SQE2b).flags = %HIDDEN_TASK Task(%SQE2b).freq = 100 Task(%SQE2b).level = %False Task(%SQE3).cPtr = CODEPTR(SQE_Play3) Task(%SQE3).channel = 0 Task(%SQE3).naam = "play_3a" TaskEX(%SQE3).stopCptr = CODEPTR(SQE_Play3_Stop) Task(%SQE3).flags = %False Task(%SQE3).freq = 100 TaskEX(%SQE3).hIcon = %False Task(%SQE3b).cPtr = CODEPTR(SQE_Play3b) Task(%SQE3b).channel = 0 Task(%SQE3b).naam = "play_3b" Task(%SQE3b).flags = %HIDDEN_TASK Task(%SQE3b).freq = 100 Task(%SQE3b).level = %False Task(%SQE4).cPtr = CODEPTR(SQE_Play4) Task(%SQE4).channel = 0 Task(%SQE4).naam = "play_4a" TaskEX(%SQE4).stopCptr = CODEPTR(SQE_Play4_Stop) Task(%SQE4).flags = %False Task(%SQE4).freq = 100 TaskEX(%SQE4).hIcon = %False Task(%SQE4b).cPtr = CODEPTR(SQE_Play4b) Task(%SQE4b).channel = 0 Task(%SQE4b).naam = "play_4b" Task(%SQE4b).flags = %HIDDEN_TASK Task(%SQE4b).freq = 100 Task(%SQE4b).level = %False Task(%SQE5).cPtr = CODEPTR(SQE_Play5) Task(%SQE5).channel = 0 Task(%SQE5).naam = "play_5a" TaskEX(%SQE5).stopCptr = CODEPTR(SQE_Play5_Stop) Task(%SQE5).flags = %False Task(%SQE5).freq = 100 TaskEX(%SQE5).hIcon = %False Task(%SQE5b).cPtr = CODEPTR(SQE_Play5b) Task(%SQE5b).channel = 0 Task(%SQE5b).naam = "play_5b" Task(%SQE5b).flags = %HIDDEN_TASK Task(%SQE5b).freq = 100 Task(%SQE5b).level = %False Task(%SQE_So).naam = "" Task(%SQE_So).cptr = CODEPTR(SQE_So) Task(%SQE_So).freq = 4 Task(%SQE_So).flags = %False TaskEX(%SQE_So).stopCptr = CODEPTR(SQE_So_Stop) Task(%SQE_Brd).naam = "Bour" Task(%SQE_Brd).cptr = CODEPTR(SQE_Brd) Task(%SQE_Brd).freq = 4 Task(%SQE_Brd).flags = %False TaskEX(%SQE_Brd).stopCptr = CODEPTR(SQE_Brd_Stop) Task(%SQE_Harma).naam = "Harma" Task(%SQE_Harma).cptr = CODEPTR(SQE_Harma) Task(%SQE_Harma).freq = 4 Task(%SQE_Harma).flags = %False TaskEX(%SQE_Harma).stopCptr = CODEPTR(SQE_Harma_Stop) ' switch off the flag for auto-patching: BIT RESET App.AutoFlags, 0 ' RESETs bit 0 (%AUTOPATCH) ' this suppresses automatic sending of program-change msg's SELECT CASE App.id CASE %ID_SQE_STO, %ID_SQE m = "" Sqe_Lookup ' read the bars to be played - now done with buttons in cockpit. ' we do the call here such that as a default, we start up with SQE unless the app.id was ' more specific. CASE %ID_SQE m = "" Sqe_lookup CASE %ID_STO m = "" Sto_lookup CASE %ID_G_TECHNO m = "" g_techno_lookup CASE ELSE m = "" g_techno_lookup END SELECT So.Har(1).vel = STRING$(128,0) So.Ctrl(1) = %False InstrumPlay So ' initialisation SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' add labels to the sliders in the cockpit: SetDlgItemText gh.Cockpit,%GMT_TEXT_SLIDER0, "Repeats" & CHR$(0) SetDlgItemText gh.CockPit,%GMT_TEXT_SLIDER1, "Tempo" & CHR$(0) Slider(0).cptr = CODEPTR(SQE_Repeats_Slider) Slider(0).minval = 1 Slider(0).maxval = 127 ' rescaled in callback SQE_Repeats = 5 Slider(0).value = SQE_Repeats * 10 App.Tempo = 24 Slider(1).cptr = CODEPTR(SQE_Tempo_Slider) Slider(1).minval = 0 ' tempo Slider(1).maxval = 127 Slider(1).value = App.tempo SendMessage Slider(1).h, %TBM_SETPOS,%True, App.Tempo DAQparams.samplingrate(0) = 128 SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(0),3) '+ "S/s" SetDlgItemText gh.Cockpit, %GMT_TITLE, m SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr ' new 20.09.2003: create a GUI user controll window for all relevant radar params: Create_Radar_Control_Task (BYVAL pr(0), Slider(),UDCtrl()) ' in g_main.inc !!! (g_lib.dll) FUNCTION = %True END FUNCTION SUB SQE_Repeats_Slider () ' cockpit slider 0 callback - rescaled 1-12 ' sets global variable Sqe_Repeats = MAX(MIN(Slider(0).value/10, 12),1) END SUB SUB g_techno_lookup () '02.03.2006 - written in Macerata, Italia 'premiered 22.11.2006 g_tech.611 REDIM maat(12) AS GLOBAL Bartype LOCAL i AS DWORD LOCAL j AS DWORD LOCAL s AS SINGLE LOCAL highnote AS BYTE LOCAL lownote AS BYTE highnote = 60 lownote = 55 FOR j = 0 TO 12 s= GetRitme (Maat(j).r0 , %Tango, 0.96) ' the %Tango parameter should become variable s= GetRitme (Maat(j).r1, %Tango, 0.96) Maat(j).v0(0) = 127 ' beat Maat(j).n0(0) = highnote IF Maat(j).v1(0) > 0 THEN Maat(j).v1(0) = 127 Maat(j).n1(0) = lownote ELSE Maat(j).v1(0)= %False END IF i = 1 DO IF Maat(j).r0.pattern(i) > 0 THEN Maat(j).v0(i) = 48 'velo ELSEIF Maat(i).r0.pattern(i) <0 THEN Maat(j).v0(i) = %False ELSE EXIT DO END IF Maat(j).n0(i) = Highnote INCR i LOOP UNTIL Maat(j).r0.pattern(i) = 0 i = 1 DO IF Maat(j).r1.pattern(i) > 0 THEN Maat(j).v1(i) = 48 'velo ELSEIF Maat(i).r1.pattern(i) <0 THEN Maat(j).v1(i) = %False ELSE EXIT DO END IF Maat(j).n1(i) = Lownote INCR i LOOP UNTIL Maat(j).r1.pattern(i) = 0 NEXT j END SUB SUB Sto_lookup () ' simple triple ouxercuse ' (player can be identical than for seven quaver evertire) ' the Maat() array has the same size! LOCAL i AS DWORD LOCAL j AS DWORD LOCAL highnote AS INTEGER LOCAL lownote AS INTEGER LOCAL beat AS INTEGER LOCAL accent AS INTEGER LOCAL velo AS INTEGER LOCAL checksum AS DWORD REDIM Maat(12) AS GLOBAL Bartype ' done on init. highnote = 60 lownote = 55 beat = 127 '64 ' begin van elke maat accent = 84 '32 ' op elke tijd velo = 48 '16 'maat 1 j = 0 Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 24 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = -24 Maat(j).r0.pattern(5) = 24 Maat(j).r0.pattern(6) = %False Maat(j).r1.pattern(0) = 36 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 36 Maat(j).r1.pattern(2) = -24 Maat(j).r1.pattern(3) = 24 Maat(j).r1.pattern(4) = - 24 Maat(j).r1.pattern(5) = %False ' end i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ 'maat 2 j = 1 Maat(j).r0.pattern(0) = -24 Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = -24 Maat(j).r0.pattern(3) = 24 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 12 Maat(j).r0.pattern(7) = 12 Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = 24 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = 24 Maat(j).r1.pattern(3) = -24 Maat(j).r1.pattern(4) = - 48 Maat(j).r1.pattern(5) = %False ' end i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ 'maat 3 j = 2 Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = 12 Maat(j).r0.pattern(3) = 24 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 24 : Maat(j).v0(6) = accent Maat(j).r0.pattern(7) = 12 Maat(j).r0.pattern(8) = 12 Maat(j).r0.pattern(9) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -48 Maat(j).r1.pattern(2) = -48 Maat(j).r1.pattern(3) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ 'maat 4 j = 3 Maat(j).r0.pattern(0) = 12 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 12 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 24 Maat(j).r0.pattern(6) = 12 : Maat(j).v0(6) = accent Maat(j).r0.pattern(7) = 12 Maat(j).r0.pattern(8) = 24 Maat(j).r0.pattern(9) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -48 Maat(j).r1.pattern(2) = -48 Maat(j).r1.pattern(3) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ 'maat 5 j = 4 Maat(j).r0.pattern(0) = 12 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = -24 Maat(j).r0.pattern(2) = 12 Maat(j).r0.pattern(3) = -24 Maat(j).r0.pattern(4) = 24 Maat(j).r0.pattern(5) = -12 Maat(j).r0.pattern(6) = 24 Maat(j).r0.pattern(7) = -12 Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = -12 Maat(j).r1.pattern(1) = 24 Maat(j).r1.pattern(2) = -12 Maat(j).r1.pattern(3) = 24 : Maat(j).v1(3) = accent Maat(j).r1.pattern(4) = -24 Maat(j).r1.pattern(5) = 12 : Maat(j).v1(5) = accent Maat(j).r1.pattern(6) = -24 Maat(j).r1.pattern(7) = 12 Maat(j).r1.pattern(8) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 6 j = 5 Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 18 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 18 Maat(j).r0.pattern(5) = 18 Maat(j).r0.pattern(6) = 18 Maat(j).r0.pattern(7) = %False Maat(j).r1.pattern(0) = 36 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 36 Maat(j).r1.pattern(2) = 24 : Maat(j).v1(2) = accent Maat(j).r1.pattern(3) = 24 Maat(j).r1.pattern(4) = 24 Maat(j).r1.pattern(5) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 7 j = 6 Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = 24 : Maat(j).v0(2) = accent Maat(j).r0.pattern(3) = 24 Maat(j).r0.pattern(4) = 24 : Maat(j).v0(4) = accent Maat(j).r0.pattern(5) = 24 Maat(j).r0.pattern(6) = %False Maat(j).r0.pattern(7) = %False Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = 32 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 32 Maat(j).r1.pattern(2) = 32 Maat(j).r1.pattern(3) = -48 Maat(j).r1.pattern(4) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 8 j = 7 Maat(j).r0.pattern(0) = -24 Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = -12 Maat(j).r0.pattern(3) = 24 Maat(j).r0.pattern(4) = -12 Maat(j).r0.pattern(5) = 24 : Maat(j).v0(5) = accent Maat(j).r0.pattern(6) = -24 Maat(j).r0.pattern(7) = %False Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = 24 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = 12 : Maat(j).v1(2) = accent Maat(j).r1.pattern(3) = -24 Maat(j).r1.pattern(4) = 12 Maat(j).r1.pattern(5) = -24 Maat(j).r1.pattern(6) = 24 Maat(j).r1.pattern(7) = %False Maat(j).r1.pattern(8) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 9 j = 8 Maat(j).r0.pattern(0) = 48 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 48 Maat(j).r0.pattern(2) = 48 Maat(j).r0.pattern(3) = %False Maat(j).r1.pattern(0) = 48 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 48 Maat(j).r1.pattern(2) = 48 Maat(j).r1.pattern(3) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 10 j = 9 Maat(j).r0.pattern(0) = 72 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 72 : Maat(j).v0(1) = accent Maat(j).r0.pattern(2) = %False Maat(j).r1.pattern(0) = 72 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -72 Maat(j).r1.pattern(2) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 11 j = 10 Maat(j).r0.pattern(0) = -24 Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = -12 Maat(j).r0.pattern(3) = 24 Maat(j).r0.pattern(4) = -24 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = -12 Maat(j).r0.pattern(7) = 24 Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = 24 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -12 Maat(j).r1.pattern(2) = 12 Maat(j).r1.pattern(3) = -24 Maat(j).r1.pattern(4) = 24 : Maat(j).v1(4) = accent Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = 12 Maat(j).r1.pattern(7) = -24 Maat(j).r1.pattern(8) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 12: j = 11 Maat(j).r0.pattern(0) = 48 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 : Maat(j).v0(1) = accent Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 12 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 12 Maat(j).r0.pattern(7) = %False Maat(j).r0.pattern(8) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = -24 Maat(j).r1.pattern(3) = -12 Maat(j).r1.pattern(4) = -12 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = %False Maat(j).r1.pattern(8) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 13 j = 12 Maat(j).r0.pattern(0) = 12 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = 12 Maat(j).r0.pattern(3) = 12 Maat(j).r0.pattern(4) = 16 : Maat(j).v0(4) = accent Maat(j).r0.pattern(5) = 16 Maat(j).r0.pattern(6) = 16 Maat(j).r0.pattern(7) = 12 : Maat(j).v0(7) = accent Maat(j).r0.pattern(8) = 12 Maat(j).r0.pattern(9) = 24 Maat(j).r0.pattern(10) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -48 Maat(j).r1.pattern(2) = -48 Maat(j).r1.pattern(3) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %STO_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' afsluitend: FOR i = 0 TO UBOUND(Maat) Maat(i).r0.minduur = 0.001 Maat(i).r1.minduur = 0.001 j = %False DO IF Maat(i).r0.pattern(j) > 0 THEN IF Maat(i).v0(j) = %False THEN Maat(i).v0(j) = velo END IF INCR j LOOP UNTIL ISFALSE Maat(i).r0.pattern(j) j = %False DO IF Maat(i).r1.pattern(j) > 0 THEN IF Maat(i).v1(j) = %False THEN Maat(i).v1(j) = velo END IF INCR j LOOP UNTIL ISFALSE Maat(i).r1.pattern(j) NEXT i END SUB SUB SQE_Ctrl () STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC SQE_Tempo AS SINGLE LOCAL tempofaktor AS SINGLE ' freq on init set to 10Hz IF ISFALSE Task(%SQE_Ctrl).tog THEN SQE_Tempo = 35 DIM TaskParamLabels(0 TO 9) AS ASCIIZ * 8 TaskParamLabels(0) = "trig1" ' set the minimum moving surface value to trigger the voice TaskParamLabels(1) = "trig2" TaskParamLabels(2) = "trig3" TaskParamLabels(3) = "trig4" TaskParamLabels(4) = "trig5" TaskParamLabels(5) = "v1" ' UD0 use for orchestration of voice 1 TaskParamLabels(6) = "v2" ' UD1 id. voice 2 TaskParamLabels(7) = "v3" ' UD2 voice 3 TaskParamLabels(8) = "v4" ' UD3 voice 4 TaskParamLabels(9) = "v5" ' UD4 IF ISFALSE Task(%SQE_Ctrl).hParam THEN MakeTaskParameterDialog %SQE_Ctrl,5,Slider(),5,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%SQE_Ctrl).SliderNumbers(0) Slider(slnr).minval = 0 Slider(slnr).maxval = 100 Slider(slnr).value = 0 Slider(slnr).cptr = CODEPTR(SQE_CTRL_Slider0) Slider(slnr+1).cptr = CODEPTR(SQE_Ctrl_Slider1) Slider(slnr+1).minval = 0 Slider(slnr+1).maxval = 100 Slider(slnr+1).value = 0 Slider(slnr+2).cptr = CODEPTR(SQE_Ctrl_Slider2) Slider(slnr+2).minval = 0 Slider(slnr+2).maxval = 100 Slider(slnr+2).value = 0 Slider(slnr+3).cptr = CODEPTR(SQE_Ctrl_Slider3) Slider(slnr+3).minval = 0 Slider(slnr+3).maxval = 100 Slider(slnr+3).value = 0 Slider(slnr+4).cptr = CODEPTR(SQE_Ctrl_Slider4) Slider(slnr+4).minval = 0 Slider(slnr+4).maxval = 100 Slider(slnr+4).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value SendMessage Slider(Slnr+4).h, %TBM_SETPOS,%True, Slider(Slnr+4).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%SQE_Ctrl).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(SQE_Ctrl_UD0) UDctrl(udnr).value = 0 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = %SQE_NrIns UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(SQE_Ctrl_UD1) UDctrl(udnr+1).value = 0 UDctrl(udnr+1).minval = 0 UDctrl(udnr+1).maxval = %SQE_NrIns UDctrl(udnr+2).cptr = CODEPTR(SQE_Ctrl_UD2) UDctrl(udnr+2).value = 0 UDctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = %SQE_NrIns UDctrl(udnr+3).cptr = CODEPTR(SQE_Ctrl_UD3) UDctrl(udnr+3).value = 0 UDctrl(udnr+3).minval = 0 UDctrl(udnr+3).maxval = %SQE_NrIns UDctrl(udnr+4).cptr = CODEPTR(SQE_Ctrl_UD4) UDctrl(udnr+4).value = 0 UDctrl(udnr+4).minval = 0 UDctrl(udnr+4).maxval = %SQE_NrIns END IF Task(%SQE_Ctrl).tog = %True EXIT SUB END IF ' from here we steer all parameters for the piece. Cockpit slider!!! tempofaktor = (Slider(1).value + 1) / 64! ' 1/64 - 2 (center position = 1) tempofaktor = MAX(0.1, tempofaktor) ' 0.1 - 2 IF tempofaktor > 1 THEN tempofaktor = 1 + ((tempofaktor - 1) * 3!) ' 1 - 4 END IF ' so now tempofaktor ranges from 0.1 via unity to 4 ' radar input... IF @pr(4).vf > %False THEN ' 25.09.2003: we can remap the values as : ' tf = (@pr(4).vf ^ 1.125) * 0.5946 ' rescales within 0-64 traject ' with this condition the tempo will freeze on complete standstill of the mover ' Sqe_Tempo = ((Sqe_Tempo * 15) + (@pr(4).vf * 4)) / 16 ' check scaling: if @pr(4).v ranges between 0 and 76 this ' should be O.K. ' In principle vf resolves up to maximum 64 Hz. ' @pr(4).v = slow body movement velocity ' @pr(4).vf = doppler based absolute fastspeed ' @pr(4).s = surface ' or, simplifying the equation: Sqe_Tempo = ((Sqe_Tempo * 15) + ((@pr(4).vf^1.125)* 2.3784)) / 16 END IF App.tempo = Sqe_Tempo * tempofaktor ' interactive muting of parts: ' piano-so corner = @pr(2).s ' sax-vibi corner = @pr(3).s ' klung-thunderwood corner = @pr(1).s ' flex-tubi corner = @pr(0).s ' now we map each vector on a musical voice (not to an instrument) IF @pr(0).s =< Slider(slnr).value THEN TaskEX(%SQE1).hIcon = %False ELSE TaskEX(%SQE1).hIcon = %True END IF IF @pr(1).s =< Slider(slnr+1).value THEN TaskEX(%SQE2).hIcon = %False ELSE TaskEX(%SQE2).hIcon = %True END IF IF @pr(2).s =< Slider(slnr+2).value THEN TaskEX(%SQE3).hIcon = %False ELSE TaskEX(%SQE3).hIcon = %True END IF IF @pr(3).s =< Slider(slnr+3).value THEN TaskEX(%SQE4).hIcon = %False ELSE TaskEX(%SQE4).hIcon = %True END IF IF @pr(4).s =< Slider(slnr+4).value THEN TaskEX(%SQE5).hIcon = %False ELSE TaskEX(%SQE5).hIcon = %True END IF IF App.Tempo < 4 THEN App.Tempo = 4 ' was 12.5 IF App.Tempo > 224 THEN App.Tempo = 224 SetDlgItemText gh.Cockpit, %GMT_TEXT_TEMPO, FORMAT$(App.Tempo,"###") SetDlgItemText gh.Cockpit, %GMT_MSG1, " pr(4).vf=" & FORMAT$(@pr(4).vf,"###") & " body=" & FORMAT$(@pr(4).s,"###") END SUB SUB SQE_Tempo_Slider () ' cockpit slider - no good! contradicts interaction ' now works as a tempo reset controller 'IF Slider(1).value <> Sqe_Tempo THEN ' Sqe_Tempo = Slider(1).value ' sets global variable 'END IF ' no longer used as such. Now controls the tempo scaling factor. END SUB SUB SQE_Ctrl_Slider0 () ' sets the minimum trigger level to mPlay voice 1 STATIC slnr AS DWORD slnr = TaskEX(%SQE_Ctrl).SliderNumbers(0) END SUB SUB SQE_Ctrl_Slider1 () STATIC slnr AS DWORD slnr = TaskEX(%SQE_Ctrl).SliderNumbers(1) END SUB SUB SQE_Ctrl_Slider2 () STATIC slnr AS DWORD slnr = TaskEX(%SQE_Ctrl).SliderNumbers(2) END SUB SUB SQE_Ctrl_Slider3 () STATIC slnr AS DWORD slnr = TaskEX(%SQE_Ctrl).SliderNumbers(3) END SUB SUB SQE_Ctrl_Slider4 () STATIC slnr AS DWORD slnr = TaskEX(%SQE_Ctrl).SliderNumbers(4) END SUB SUB SQE_Ctrl_UD0 () ' callback on parameter UpDowns. : select robot to mPlay voice 1 LOCAL value AS BYTE LOCAL udnr AS DWORD STATIC oldval AS BYTE LOCAL i AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(0) value = UDCtrl(udnr).value IF value THEN ' check whether that instrument is free... IF ISFALSE Orkest.busy(value) THEN SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 16, LEFT$(Orkest.naam(value),4) ELSE DO IF oldval < value THEN INCR value UDctrl(udnr).value = value ELSE DECR value UDctrl(udnr).value = value END IF LOOP UNTIL ISFALSE Orkest.busy(value) SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 16, LEFT$(Orkest.naam(value),4) END IF IF value > 0 THEN Orkest.busy(value) = 1 ' assign to voice 1 ' now free any other instrument assigned to voice 1: FOR i = 1 TO %SQE_NrIns IF i <> value THEN IF Orkest.busy(i) = 1 THEN Orkest.busy(i) = %False END IF NEXT i ELSE SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 16, "Off" ' now free any other instrument assigned to voice 1: FOR i = 1 TO %SQE_NrIns IF Orkest.busy(i) = 1 THEN Orkest.busy(i) = %False NEXT i END IF oldval = value END SUB SUB SQE_Ctrl_UD1 () ' callback on parameter UpDowns. LOCAL value AS BYTE LOCAL udnr AS DWORD STATIC oldval AS BYTE LOCAL i AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(1) value = UDCtrl(udnr).value IF value THEN ' check whether that instrument is free... IF ISFALSE Orkest.busy(value) THEN SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 17, LEFT$(Orkest.naam(value),4) ELSE DO IF oldval < value THEN INCR value UDctrl(udnr).value = value ELSE DECR value UDctrl(udnr).value = value END IF LOOP UNTIL ISFALSE Orkest.busy(value) SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 17, LEFT$(Orkest.naam(value),4) END IF IF value > 0 THEN Orkest.busy(value) = 2 ' assign to voice 2 ' now free any other instrument assigned to voice 2: FOR i = 1 TO %SQE_NrIns IF i <> value THEN IF Orkest.busy(i) = 2 THEN Orkest.busy(i) = %False END IF NEXT i ELSE SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 17, "Off" ' now free any other instrument assigned to voice 2: FOR i = 1 TO %SQE_NrIns IF Orkest.busy(i) = 2 THEN Orkest.busy(i) = %False NEXT i END IF oldval = value END SUB SUB SQE_Ctrl_UD2 () ' callback on parameter UpDowns. LOCAL value AS BYTE LOCAL udnr AS DWORD STATIC oldval AS BYTE LOCAL i AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(2) value = UDCtrl(udnr).value IF value THEN ' check whether that instrument is free... IF ISFALSE Orkest.busy(value) THEN SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 18, LEFT$(Orkest.naam(value),4) ELSE DO IF oldval < value THEN INCR value UDctrl(udnr).value = value ELSE DECR value UDctrl(udnr).value = value END IF LOOP UNTIL ISFALSE Orkest.busy(value) SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 18, LEFT$(Orkest.naam(value),4) END IF IF value > 0 THEN Orkest.busy(value) = 3 ' assign to voice 3 ' now free any other instrument assigned to voice 1: FOR i = 1 TO %SQE_NrIns IF i <> value THEN IF Orkest.busy(i) = 3 THEN Orkest.busy(i) = %False END IF NEXT i ELSE SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 18, "Off" ' now free any other instrument assigned to voice 3: FOR i = 1 TO %SQE_NrIns IF Orkest.busy(i) = 3 THEN Orkest.busy(i) = %False NEXT i END IF oldval = value END SUB SUB SQE_Ctrl_UD3 () ' callback on parameter UpDowns. LOCAL value AS BYTE LOCAL udnr AS DWORD STATIC oldval AS BYTE LOCAL i AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(3) value = UDCtrl(udnr).value IF value THEN ' check whether that instrument is free... IF ISFALSE Orkest.busy(value) THEN SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 19, LEFT$(Orkest.naam(value),4) ELSE DO IF oldval < value THEN INCR value UDctrl(udnr).value = value ELSE DECR value UDctrl(udnr).value = value END IF LOOP UNTIL ISFALSE Orkest.busy(value) SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 19, LEFT$(Orkest.naam(value),4) END IF IF value > 0 THEN Orkest.busy(value) = 4 ' assign to voice 4 ' now free any other instrument assigned to voice 4: FOR i = 1 TO %SQE_NrIns IF i <> value THEN IF Orkest.busy(i) = 4 THEN Orkest.busy(i) = %False END IF NEXT i ELSE SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 19, "Off" ' now free any other instrument assigned to voice 4: FOR i = 1 TO %SQE_NrIns IF Orkest.busy(i) = 4 THEN Orkest.busy(i) = %False NEXT i END IF oldval = value END SUB SUB SQE_Ctrl_UD4 () ' callback on parameter UpDowns. LOCAL value AS BYTE LOCAL udnr AS DWORD STATIC oldval AS BYTE LOCAL i AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(4) value = UDCtrl(udnr).value IF value THEN ' check whether that instrument is free... IF ISFALSE Orkest.busy(value) THEN SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 20, LEFT$(Orkest.naam(value),4) ELSE DO IF oldval < value THEN INCR value UDctrl(udnr).value = value ELSE DECR value UDctrl(udnr).value = value END IF LOOP UNTIL ISFALSE Orkest.busy(value) SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 20, LEFT$(Orkest.naam(value),4) END IF IF value > 0 THEN Orkest.busy(value) = 5 ' assign to voice 5 ' now free any other instrument assigned to voice 5: FOR i = 1 TO %SQE_NrIns IF i <> value THEN IF Orkest.busy(i) = 5 THEN Orkest.busy(i) = %False END IF NEXT i ELSE SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 20, "Off" ' now free any other instrument assigned to voice 4: FOR i = 1 TO %SQE_NrIns IF Orkest.busy(i) = 5 THEN Orkest.busy(i) = %False NEXT i END IF oldval = value END SUB SUB Sqe_lookup () ' seven quaver evertire ' all data entered. (25.08.2003) LOCAL i AS DWORD LOCAL j AS DWORD LOCAL highnote AS INTEGER LOCAL lownote AS INTEGER LOCAL beat AS INTEGER LOCAL accent AS INTEGER LOCAL velo AS INTEGER LOCAL checksum AS DWORD REDIM Maat(12) AS GLOBAL Bartype ' done on init. highnote = 60 lownote = 55 beat = 127 '64 ' begin van elke maat accent = 84 '32 ' op elke tijd velo = 48 '16 'maat 1 j = 0 Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 24 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 24 Maat(j).r0.pattern(5) = 24 : Maat(j).v0(5) = accent Maat(j).r0.pattern(6) = 24 Maat(j).r0.pattern(7) = %False ' end Maat(j).r1.pattern(0) = -24 Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = -24 Maat(j).r1.pattern(3) = 24 : Maat(j).v1(3) = accent Maat(j).r1.pattern(4) = 24 Maat(j).r1.pattern(5) = 24 : Maat(j).v1(5) = accent Maat(j).r1.pattern(6) = 24 Maat(j).r1.pattern(7) = %False ' end i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %SQE_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar" & STR$(j),, FUNCNAME$ ' maat 2 j = 1 ' maatnummer index Maat(j).r0.pattern(0) = 12 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = -12 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = -12 Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = -24 Maat(j).r0.pattern(6) = 12 : Maat(j).v0(6) = accent Maat(j).r0.pattern(7) = -12 Maat(j).r0.pattern(8) = 24 Maat(j).r0.pattern(9) = 24 : Maat(j).v0(9) = accent Maat(j).r0.pattern(10) = %False Maat(j).r1.pattern(0) = -12 Maat(j).r1.pattern(1) = 12 Maat(j).r1.pattern(2) = -24 Maat(j).r1.pattern(3) = 12 : Maat(j).v1(3) = accent Maat(j).r1.pattern(4) = -12 Maat(j).r1.pattern(5) = 24 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = 12 Maat(j).r1.pattern(8) = -24 Maat(j).r1.pattern(9) = 24 : Maat(j).v1(9) = accent Maat(j).r1.pattern(10) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> %SQE_Checksum * 2 THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 3 j = 2 ' maatnummer index Maat(j).r0.pattern(0) = -12 Maat(j).r0.pattern(1) = 24 Maat(j).r0.pattern(2) = -12 Maat(j).r0.pattern(3) = 12 Maat(j).r0.pattern(4) = -24 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 24 : Maat(j).v0(6) = accent Maat(j).r0.pattern(7) = 12 : Maat(j).v0(7) = accent Maat(j).r0.pattern(8) = -24 Maat(j).r0.pattern(9) = 12 Maat(j).r0.pattern(10) = %False Maat(j).r1.pattern(0) = 12 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = 12 Maat(j).r1.pattern(3) = -12 Maat(j).r1.pattern(4) = 24 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = -24 Maat(j).r1.pattern(7) = -12 Maat(j).r1.pattern(8) = 24 Maat(j).r1.pattern(9) = -12 Maat(j).r1.pattern(10) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 4 j = 3 ' maatnummer index Maat(j).r0.pattern(0) = 48 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 24 : Maat(j).v0(1) = accent Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 12 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 12 Maat(j).r0.pattern(7) = 12 Maat(j).r0.pattern(8) = 12 Maat(j).r0.pattern(9) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -24 Maat(j).r1.pattern(2) = -24 Maat(j).r1.pattern(3) = -12 Maat(j).r1.pattern(4) = -12 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = -12 Maat(j).r1.pattern(8) = -12 Maat(j).r1.pattern(9) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 5 j = 4 ' maatnummer index Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = -12 Maat(j).r0.pattern(2) = 12 Maat(j).r0.pattern(3) = -24 Maat(j).r0.pattern(4) = 12 : Maat(j).v0(4) = accent Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = -24 Maat(j).r0.pattern(7) = 12 Maat(j).r0.pattern(8) = -12 Maat(j).r0.pattern(9) = 24 Maat(j).r0.pattern(10) = %False Maat(j).r1.pattern(0) = -24 Maat(j).r1.pattern(1) = 12 Maat(j).r1.pattern(2) = -12 Maat(j).r1.pattern(3) = 24 Maat(j).r1.pattern(4) = -12 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = 24 : Maat(j).v1(6) = accent Maat(j).r1.pattern(7) = -12 Maat(j).r1.pattern(8) = 12 Maat(j).r1.pattern(9) = -24 Maat(j).r1.pattern(10) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 6 j = 5 ' maatnummer index Maat(j).r0.pattern(0) = -12 Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = -24 Maat(j).r0.pattern(3) = 12 Maat(j).r0.pattern(4) = -12 Maat(j).r0.pattern(5) = 24 : Maat(j).v0(5) = accent Maat(j).r0.pattern(6) = 12 : Maat(j).v0(6) = accent Maat(j).r0.pattern(7) = -12 Maat(j).r0.pattern(8) = 24 Maat(j).r0.pattern(9) = -12 Maat(j).r0.pattern(10) = 12 Maat(j).r0.pattern(11) = %False Maat(j).r1.pattern(0) = 12 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = -12 Maat(j).r1.pattern(2) = 24 Maat(j).r1.pattern(3) = -12 Maat(j).r1.pattern(4) = 12 Maat(j).r1.pattern(5) = -24 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = 12 Maat(j).r1.pattern(8) = -24 Maat(j).r1.pattern(9) = 12 Maat(j).r1.pattern(10) = -12 Maat(j).r1.pattern(11) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 7 j = 6 ' maatnummer index Maat(j).r0.pattern(0) = 96 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 72 : Maat(j).v0(1) = accent Maat(j).r0.pattern(2) = %False Maat(j).r1.pattern(0) = -96 Maat(j).r1.pattern(1) = -72 Maat(j).r1.pattern(2) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 8 j = 7 ' maatnummer index Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 72 Maat(j).r0.pattern(2) = 72 : Maat(j).v0(2) = accent Maat(j).r0.pattern(3) = %False Maat(j).r1.pattern(0) = -24 Maat(j).r1.pattern(1) = -72 Maat(j).r1.pattern(2) = -72 Maat(j).r1.pattern(3) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 9 ' attention : this bar has no sync between voices! j = 8 ' maatnummer index Maat(j).r0.pattern(0) = 18 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 18 Maat(j).r0.pattern(2) = 18 Maat(j).r0.pattern(3) = 18 Maat(j).r0.pattern(4) = 16 : Maat(j).v0(4) = accent Maat(j).r0.pattern(5) = 16 Maat(j).r0.pattern(6) = 16 Maat(j).r0.pattern(7) = 24 : Maat(j).v0(7) = accent Maat(j).r0.pattern(8) = 24 Maat(j).r0.pattern(9) = %False Maat(j).r1.pattern(0) = 24 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 24 Maat(j).r1.pattern(2) = 24 Maat(j).r1.pattern(3) = 24 : Maat(j).v1(3) = accent Maat(j).r1.pattern(4) = 24 Maat(j).r1.pattern(5) = 24 : Maat(j).v1(5) = accent Maat(j).r1.pattern(6) = 24 Maat(j).r1.pattern(7) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 10: j = 9 ' maatnummer index Maat(j).r0.pattern(0) = 8 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 8 Maat(j).r0.pattern(2) = 8 Maat(j).r0.pattern(3) = -24 Maat(j).r0.pattern(4) = 8 : Maat(j).v0(4) = accent Maat(j).r0.pattern(5) = 8 Maat(j).r0.pattern(6) = 8 Maat(j).r0.pattern(7) = -24 Maat(j).r0.pattern(8) = 8 : Maat(j).v0(8) = accent Maat(j).r0.pattern(9) = 8 Maat(j).r0.pattern(10) = 8 Maat(j).r0.pattern(11) = 8 Maat(j).r0.pattern(12) = 8 Maat(j).r0.pattern(13) = 8 Maat(j).r0.pattern(14) = -24 Maat(j).r0.pattern(15) = %False Maat(j).r1.pattern(0) = -8 Maat(j).r1.pattern(1) = -8 Maat(j).r1.pattern(2) = -8 Maat(j).r1.pattern(3) = 24 Maat(j).r1.pattern(4) = -8 Maat(j).r1.pattern(5) = -8 Maat(j).r1.pattern(6) = -8 Maat(j).r1.pattern(7) = 24 Maat(j).r1.pattern(8) = -8 Maat(j).r1.pattern(9) = -8 Maat(j).r1.pattern(10) = -8 Maat(j).r1.pattern(11) = -8 Maat(j).r1.pattern(12) = -8 Maat(j).r1.pattern(13) = -8 Maat(j).r1.pattern(14) = 24 Maat(j).r1.pattern(15) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 11: j = 10 ' maatnummer index Maat(j).r0.pattern(0) = 12 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 12 Maat(j).r0.pattern(2) = -8 Maat(j).r0.pattern(3) = -8 Maat(j).r0.pattern(4) = -8 Maat(j).r0.pattern(5) = 12 : Maat(j).v0(5) = accent Maat(j).r0.pattern(6) = 12 Maat(j).r0.pattern(7) = -8 Maat(j).r0.pattern(8) = -8 Maat(j).r0.pattern(9) = -8 Maat(j).r0.pattern(10) = 12 : Maat(j).v0(10) = accent Maat(j).r0.pattern(11) = 12 Maat(j).r0.pattern(12) = 12 Maat(j).r0.pattern(13) = 12 Maat(j).r0.pattern(14) = -8 Maat(j).r0.pattern(15) = -8 Maat(j).r0.pattern(16) = -8 Maat(j).r0.pattern(17) = %False Maat(j).r1.pattern(0) = -12 Maat(j).r1.pattern(1) = -12 Maat(j).r1.pattern(2) = 8 Maat(j).r1.pattern(3) = 8 Maat(j).r1.pattern(4) = 8 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = 8 Maat(j).r1.pattern(8) = 8 Maat(j).r1.pattern(9) = 8 Maat(j).r1.pattern(10) = -12 Maat(j).r1.pattern(11) = -12 Maat(j).r1.pattern(12) = -12 Maat(j).r1.pattern(13) = -12 Maat(j).r1.pattern(14) = 8 : Maat(j).v1(14) = accent Maat(j).r1.pattern(15) = 8 Maat(j).r1.pattern(16) = 8 Maat(j).r1.pattern(17) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_CHecksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 12: j = 11 ' maatnummer index Maat(j).r0.pattern(0) = 48 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = 48 Maat(j).r0.pattern(2) = 48 : Maat(j).v0(2) = accent Maat(j).r0.pattern(3) = 24 Maat(j).r0.pattern(4) = %False Maat(j).r1.pattern(0) = -48 Maat(j).r1.pattern(1) = -48 Maat(j).r1.pattern(2) = -48 Maat(j).r1.pattern(3) = -24 Maat(j).r1.pattern(4) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' maat 13: j = 12 ' maatnummer index - laatste maat. - non-sync! Maat(j).r0.pattern(0) = 24 : Maat(j).v0(0) = beat Maat(j).r0.pattern(1) = -24 Maat(j).r0.pattern(2) = 24 Maat(j).r0.pattern(3) = 12 : Maat(j).v0(3) = accent Maat(j).r0.pattern(4) = 12 Maat(j).r0.pattern(5) = 12 Maat(j).r0.pattern(6) = 12 Maat(j).r0.pattern(7) = 16 Maat(j).r0.pattern(8) = 16 Maat(j).r0.pattern(9) = 16 Maat(j).r0.pattern(10) = %False Maat(j).r1.pattern(0) = 24 : Maat(j).v1(0) = beat Maat(j).r1.pattern(1) = 12 Maat(j).r1.pattern(2) = 36 Maat(j).r1.pattern(3) = -12 Maat(j).r1.pattern(4) = -12 Maat(j).r1.pattern(5) = -12 Maat(j).r1.pattern(6) = -12 Maat(j).r1.pattern(7) = 24 : Maat(j).v1(7) = accent Maat(j).r1.pattern(8) = 24 Maat(j).r1.pattern(9) = %False i = %False checksum = %False DO Maat(j).n0(i) = highnote Maat(j).n1(i) = lownote IF Maat(j).r0.pattern(i) < 0 THEN Maat(j).v0(i) = %False IF Maat(j).r0.pattern(i) = 0 THEN Maat(j).v0(i) = velo IF Maat(j).r1.pattern(i) < 0 THEN Maat(j).v1(i) = %False IF Maat(j).r1.pattern(i) = 0 THEN Maat(j).v1(i) = velo checksum = checksum + ABS(Maat(j).r1.pattern(i)) + ABS(Maat(j).r0.pattern(i)) INCR i LOOP UNTIL ISFALSE Maat(j).r0.pattern(i) IF checksum <> (%SQE_Checksum * 2) THEN MSGBOX "Wrong tickcount in bar " & STR$(j),, FUNCNAME$ ' afsluitend: FOR i = 0 TO UBOUND (Maat) Maat(i).r0.minduur = 0.001 Maat(i).r1.minduur = 0.001 j = %False DO IF Maat(i).r0.pattern(j) > 0 THEN IF Maat(i).v0(j) = %False THEN Maat(i).v0(j) = velo END IF INCR j LOOP UNTIL ISFALSE Maat(i).r0.pattern(j) j = %False DO IF Maat(i).r1.pattern(j) > 0 THEN IF Maat(i).v1(j) = %False THEN Maat(i).v1(j) = velo END IF INCR j LOOP UNTIL ISFALSE Maat(i).r1.pattern(j) NEXT i END SUB SUB SQE_Play1 () ' master player 1 ' plays uppervoice of bar - this is always the main voice. Play1b is slave. STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC starttempo AS SINGLE STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD STATIC repcount AS LONG LOCAL velo AS DWORD IF ISFALSE task(%SQE1).tog THEN Ritmeteller = %False Task(%SQE1).patch = Ritmeteller ' used for sync between players Task(%SQE1).tempo = App.Tempo barcount = SQE_GetBar (%SQE1) Task(%SQE1).pan = barcount Task(%SQE1).freq = 100 robotnr = STO_SQE_Orkestrator (1) IF ISFALSE robotnr THEN Task(%SQE1b).level = %False stoptask %SQE1 EXIT SUB ELSE Task(%SQE1b).level = robotnr END IF Task(%SQE1).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE1).Rit) repcount = %False IF tiks <= 0 THEN EXIT SUB task(%SQE1).tog = %True END IF IF ISFALSE Task(%SQE1).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE1).patch = %False Task(%SQE1).freq = 100 END IF IF ISFALSE Ritmeteller THEN IF ISFALSE SQE_Sync (%SQE1) THEN EXIT SUB ' new 21.11.2006 INCR repcount IF repcount > sqe_repeats THEN 'haal een ander patroon: barcount = SQE_GetBar(%SQE1) Task(%SQE1).pan = barcount Task(%SQE1).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE1).Rit) repcount = 0 ' check for orchestration changes: robotnr = STO_SQE_Orkestrator (1) IF ISFALSE robotnr THEN Task(%SQE1b).level = %False stoptask %SQE1 EXIT SUB ELSE Task(%SQE1b).level = robotnr END IF END IF ' ----- end new ' code snippet for So Foot IF So.ctrl(64) THEN ' ctrl(64) switched with button 10 ' ctrl(6) is switched in the dll IF ISFALSE So.ctrl(6) THEN mPlay So.channel, 48, 64 ELSE mPlay So.channel, 48, 0 ELSE IF So.ctrl(6) THEN mPlay So.channel, 48, 0 END IF END IF Task(%SQE1).tempo = App.Tempo IF ISFALSE Task(%SQE1b).swit THEN Starttask %SQE1b SELECT CASE Task(%SQE1).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano,'' piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE1).channel, Oldnote CASE 15 Release Task(%SQE1).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE1).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v0(Ritmeteller) / 128.0) * @pr(0).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.hn(robotnr) mPlay Task(%SQE1).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE1).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE1).Rit.pattern(Ritmeteller))) Task(%SQE1).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play1b () ' slave player 1 ' plays lowervoice of bar ' always starts together with %SQE1 (slave task) STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL velo AS DWORD IF ISFALSE task(%SQE1b).tog THEN Ritmeteller = %False Task(%SQE1b).tempo = App.Tempo Task(%SQE1b).channel = Task(%SQE1).channel barcount = Task(%SQE1).pan Task(%SQE1b).patch = Ritmeteller Task(%SQE1b).Rit = Maat(barcount).r1 tiks = RitmSigma!(Task(%SQE1b).Rit) IF tiks <= 0 THEN MSGBOX "Error tiks...",, FUNCNAME$ : EXIT SUB robotnr = Task(%SQE1b).level task(%SQE1b).tog = %True END IF IF ISFALSE Task(%SQE1b).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE1b).patch = %False Task(%SQE1b).freq = 100 END IF IF ISFALSE Ritmeteller THEN 'IF ISFALSE SQE_Sync (%SQE1) THEN EXIT SUB IF Task(%SQE1).patch THEN EXIT SUB END IF Task(%SQE1b).tempo = App.Tempo SELECT CASE Task(%SQE1b).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano'', piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE1).channel, Oldnote CASE 15 Release Task(%SQE1).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE1).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v1(Ritmeteller) / 128.0) * @pr(0).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.ln(robotnr) mPlay Task(%SQE1).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE1b).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE1b).Rit.pattern(Ritmeteller))) Task(%SQE1b).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play2 () ' master player 2 ' plays uppervoice of bar - this is always the main voice. Play2b is slave. STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC starttempo AS SINGLE STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD STATIC repcount AS LONG LOCAL velo AS DWORD IF ISFALSE task(%SQE2).tog THEN Ritmeteller = %False Task(%SQE2).patch = Ritmeteller ' used for sync between players Task(%SQE2).tempo = App.Tempo barcount = SQE_GetBar (%SQE2) Task(%SQE2).pan = barcount Task(%SQE2).freq = 100 robotnr = STO_SQE_Orkestrator (2) IF ISFALSE robotnr THEN Task(%SQE2b).level = %False stoptask %SQE2 EXIT SUB ELSE Task(%SQE2b).level = robotnr END IF Task(%SQE2).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE2).Rit) IF tiks <= 0 THEN EXIT SUB repcount = %False task(%SQE2).tog = %True END IF IF ISFALSE Task(%SQE2).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE2).patch = %False Task(%SQE2).freq = 100 END IF IF ISFALSE Ritmeteller THEN IF ISFALSE SQE_Sync (%SQE2) THEN EXIT SUB ' new 21.11.2006 INCR repcount IF repcount > sqe_repeats THEN 'haal een ander patroon: barcount = SQE_GetBar (%SQE2) Task(%SQE2).pan = barcount Task(%SQE2).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE2).Rit) repcount = 0 robotnr = STO_SQE_Orkestrator (2) IF ISFALSE robotnr THEN Task(%SQE2b).level = %False stoptask %SQE2 EXIT SUB ELSE Task(%SQE2b).level = robotnr END IF END IF ' ----- end new END IF Task(%SQE2).tempo = App.Tempo IF ISFALSE Task(%SQE2b).swit THEN Starttask %SQE2b SELECT CASE Task(%SQE2).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano, ''piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE2).channel, Oldnote CASE 15 Release Task(%SQE2).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE2).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v0(Ritmeteller) / 128.0) * @pr(1).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.hn(robotnr) mPlay Task(%SQE2).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE2).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE2).Rit.pattern(Ritmeteller))) Task(%SQE2).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play2b () ' slave player 2 ' plays lowervoice of bar ' always starts together with %SQE2 (slave task) STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL velo AS DWORD IF ISFALSE task(%SQE2b).tog THEN Ritmeteller = %False Task(%SQE2b).tempo = App.Tempo Task(%SQE2b).channel = Task(%SQE2).channel barcount = Task(%SQE2).pan Task(%SQE2b).patch = Ritmeteller Task(%SQE2b).Rit = Maat(barcount).r1 tiks = RitmSigma!(Task(%SQE2b).Rit) IF tiks <= 0 THEN MSGBOX "Error tiks...",, FUNCNAME$ : EXIT SUB robotnr = Task(%SQE2b).level task(%SQE2b).tog = %True END IF IF ISFALSE Task(%SQE2b).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE2b).patch = %False Task(%SQE2b).freq = 100 END IF IF ISFALSE Ritmeteller THEN 'IF ISFALSE SQE_Sync (%SQE2) THEN EXIT SUB IF Task(%SQE2).patch THEN EXIT SUB END IF Task(%SQE2b).tempo = App.Tempo SELECT CASE Task(%SQE2b).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano, ''piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE2).channel, Oldnote END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE2).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v1(Ritmeteller) / 128.0) * @pr(1).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.ln(robotnr) mPlay Task(%SQE2).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE2b).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE2b).Rit.pattern(Ritmeteller))) Task(%SQE2b).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play3 () ' master player 3 ' plays uppervoice of bar - this is always the main voice. Play3b is slave. STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC starttempo AS SINGLE STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD STATIC repcount AS LONG LOCAL velo AS DWORD IF ISFALSE task(%SQE3).tog THEN Ritmeteller = %False Task(%SQE3).patch = Ritmeteller ' used for sync between players Task(%SQE3).tempo = App.Tempo barcount = SQE_GetBar (%SQE3) Task(%SQE3).pan = barcount ' pass value to task 3b Task(%SQE3).freq = 100 robotnr = STO_SQE_Orkestrator (3) IF ISFALSE robotnr THEN Task(%SQE3b).level = %False stoptask %SQE3 EXIT SUB ELSE Task(%SQE3b).level = robotnr END IF Task(%SQE3).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE3).Rit) IF tiks <= 0 THEN EXIT SUB repcount = %False task(%SQE3).tog = %True END IF IF ISFALSE Task(%SQE3).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE3).patch = %False Task(%SQE3).freq = 100 END IF IF ISFALSE Ritmeteller THEN IF ISFALSE SQE_Sync (%SQE3) THEN EXIT SUB ' new 21.11.2006 INCR repcount IF repcount > sqe_repeats THEN 'haal een ander patroon: barcount = SQE_GetBar (%SQE3) Task(%SQE3).pan = barcount Task(%SQE3).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE3).Rit) repcount = 0 robotnr = STO_SQE_Orkestrator (3) IF ISFALSE robotnr THEN Task(%SQE3b).level = %False stoptask %SQE3 EXIT SUB ELSE Task(%SQE3b).level = robotnr END IF END IF ' ----- end new END IF Task(%SQE3).tempo = App.Tempo IF ISFALSE Task(%SQE3b).swit THEN Starttask %SQE3b SELECT CASE Task(%SQE3).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano, ''piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE3).channel, Oldnote CASE 15 Release Task(%SQE3).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE3).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v0(Ritmeteller) / 128.0) * @pr(2).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.hn(robotnr) mPlay Task(%SQE3).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE3).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE3).Rit.pattern(Ritmeteller))) Task(%SQE3).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play3b () ' slave player 3 ' plays lowervoice of bar ' always starts together with %SQE3 (slave task) STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL velo AS DWORD IF ISFALSE task(%SQE3b).tog THEN Ritmeteller = %False Task(%SQE3b).tempo = App.Tempo Task(%SQE3b).channel = Task(%SQE3).channel barcount = Task(%SQE3).pan Task(%SQE3b).patch = Ritmeteller Task(%SQE3b).Rit = Maat(barcount).r1 tiks = RitmSigma!(Task(%SQE3b).Rit) IF tiks <= 0 THEN MSGBOX "Error tiks...",, FUNCNAME$ : EXIT SUB robotnr = Task(%SQE3b).level task(%SQE3b).tog = %True END IF IF ISFALSE Task(%SQE3b).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE3b).patch = %False Task(%SQE3b).freq = 100 END IF IF ISFALSE Ritmeteller THEN 'IF ISFALSE SQE_Sync (%SQE3) THEN EXIT SUB IF Task(%SQE3).patch THEN EXIT SUB END IF Task(%SQE3b).tempo = App.Tempo SELECT CASE Task(%SQE3b).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano,'' piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE3).channel, Oldnote CASE 15 Release Task(%SQE3).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE3).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v1(Ritmeteller) / 128.0) * @pr(2).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.ln(robotnr) mPlay Task(%SQE3).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE3b).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE3b).Rit.pattern(Ritmeteller))) Task(%SQE3b).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play4 () ' master player 4 ' plays uppervoice of bar - this is always the main voice. Play4b is slave. STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC starttempo AS SINGLE STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL repcount AS LONG LOCAL velo AS DWORD IF ISFALSE task(%SQE4).tog THEN Ritmeteller = %False Task(%SQE4).patch = Ritmeteller ' used for sync between players Task(%SQE4).tempo = App.Tempo barcount = SQE_GetBar (%SQE4) Task(%SQE4).pan = barcount Task(%SQE4).freq = 100 robotnr = STO_SQE_Orkestrator (4) IF ISFALSE robotnr THEN Task(%SQE4b).level = %False stoptask %SQE4 EXIT SUB ELSE Task(%SQE4b).level = robotnr END IF Task(%SQE4).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE4).Rit) IF tiks <= 0 THEN EXIT SUB repcount = %False task(%SQE4).tog = %True END IF IF ISFALSE Task(%SQE4).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE4).patch = %False Task(%SQE4).freq = 100 END IF IF ISFALSE Ritmeteller THEN IF ISFALSE SQE_Sync (%SQE4) THEN EXIT SUB ' new 21.11.2006 INCR repcount IF repcount > sqe_repeats THEN 'haal een ander patroon: barcount = SQE_GetBar (%SQE4) Task(%SQE4).pan = barcount Task(%SQE4).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE4).Rit) repcount = 0 robotnr = STO_SQE_Orkestrator (4) IF ISFALSE robotnr THEN Task(%SQE4b).level = %False stoptask %SQE4 EXIT SUB ELSE Task(%SQE4b).level = robotnr END IF END IF ' ----- end new END IF Task(%SQE4).tempo = App.Tempo IF ISFALSE Task(%SQE4b).swit THEN Starttask %SQE4b SELECT CASE Task(%SQE4).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1' ,2,3 ' only for piano '', piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE4).channel, Oldnote CASE 15 Release Task(%SQE4).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE4).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v0(Ritmeteller) / 128.0) * @pr(3).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.hn(robotnr) mPlay Task(%SQE4).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE4).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE4).Rit.pattern(Ritmeteller))) Task(%SQE4).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play4b () ' slave player 4 ' plays lowervoice of bar ' always starts together with %SQE4 (slave task) STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL velo AS DWORD IF ISFALSE task(%SQE4b).tog THEN Ritmeteller = %False Task(%SQE4b).tempo = App.Tempo Task(%SQE4b).channel = Task(%SQE4).channel barcount = Task(%SQE4).pan Task(%SQE4b).patch = Ritmeteller Task(%SQE4b).Rit = Maat(barcount).r1 tiks = RitmSigma!(Task(%SQE4b).Rit) IF tiks <= 0 THEN MSGBOX "Error tiks...",, FUNCNAME$ : EXIT SUB robotnr = Task(%SQE4b).level task(%SQE4b).tog = %True END IF IF ISFALSE Task(%SQE4b).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE4b).patch = %False Task(%SQE4b).freq = 100 END IF IF ISFALSE Ritmeteller THEN 'IF ISFALSE SQE_Sync (%SQE4) THEN EXIT SUB IF Task(%SQE4).patch THEN EXIT SUB END IF Task(%SQE4b).tempo = App.Tempo SELECT CASE Task(%SQE4b).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano '', piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE4).channel, Oldnote CASE 15 Release Task(%SQE4).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE4).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v1(Ritmeteller) / 128.0) * @pr(3).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.ln(robotnr) mPlay Task(%SQE4).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE4b).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE4b).Rit.pattern(Ritmeteller))) Task(%SQE4b).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play5 () ' master player 5 ' plays uppervoice of bar - this is always the main voice. Play5b is slave. STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC starttempo AS SINGLE STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD STATIC repcount AS LONG LOCAL velo AS DWORD IF ISFALSE task(%SQE5).tog THEN Ritmeteller = %False Task(%SQE5).patch = Ritmeteller ' used for sync between players Task(%SQE5).tempo = App.Tempo barcount = SQE_GetBar (%SQE5) Task(%SQE5).pan = barcount Task(%SQE5).freq = 100 robotnr = STO_SQE_Orkestrator (5) IF ISFALSE robotnr THEN Task(%SQE5b).level = %False stoptask %SQE5 EXIT SUB ELSE Task(%SQE5b).level = robotnr END IF Task(%SQE5).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE5).Rit) IF tiks <= 0 THEN EXIT SUB repcount = %False task(%SQE5).tog = %True END IF IF ISFALSE Task(%SQE5).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE5).patch = %False Task(%SQE5).freq = 100 END IF IF ISFALSE Ritmeteller THEN IF ISFALSE SQE_Sync (%SQE5) THEN EXIT SUB ' new 21.11.2006 INCR repcount IF repcount > sqe_repeats THEN 'haal een ander patroon: barcount = SQE_GetBar (%SQE5) Task(%SQE5).pan = barcount Task(%SQE5).Rit = Maat(barcount).r0 tiks = RitmSigma!(Task(%SQE5).Rit) repcount = 0 robotnr = STO_SQE_Orkestrator (5) IF ISFALSE robotnr THEN Task(%SQE5b).level = %False stoptask %SQE5 EXIT SUB ELSE Task(%SQE5b).level = robotnr END IF END IF ' ----- end new END IF Task(%SQE5).tempo = App.Tempo IF ISFALSE Task(%SQE5b).swit THEN Starttask %SQE5b SELECT CASE Task(%SQE5).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano ', piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE5).channel, Oldnote CASE 15 Release Task(%SQE5).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE5).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v0(Ritmeteller) / 128.0) * @pr(4).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.hn(robotnr) mPlay Task(%SQE5).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE5).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE5).Rit.pattern(Ritmeteller))) Task(%SQE5).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play5b () ' slave player 5 ' plays lowervoice of bar ' always starts together with %SQE5 (slave task) STATIC tiks AS SINGLE STATIC Ritmeteller AS DWORD STATIC barcount AS DWORD STATIC oldnote AS INTEGER STATIC robotnr AS DWORD LOCAL velo AS DWORD IF ISFALSE task(%SQE5b).tog THEN Ritmeteller = %False Task(%SQE5b).tempo = App.Tempo Task(%SQE5b).channel = Task(%SQE5).channel barcount = Task(%SQE5).pan Task(%SQE5b).patch = Ritmeteller Task(%SQE5b).Rit = Maat(barcount).r1 tiks = RitmSigma!(Task(%SQE5b).Rit) IF tiks <= 0 THEN MSGBOX "Error tiks...",, FUNCNAME$ : EXIT SUB robotnr = Task(%SQE5b).level task(%SQE5b).tog = %True END IF IF ISFALSE Task(%SQE5b).Rit.pattern(Ritmeteller) THEN Ritmeteller = %False Task(%SQE5b).patch = %False Task(%SQE5b).freq = 100 END IF IF ISFALSE Ritmeteller THEN 'IF ISFALSE SQE_Sync (%SQE5) THEN EXIT SUB IF Task(%SQE5).patch THEN EXIT SUB END IF Task(%SQE5b).tempo = App.Tempo SELECT CASE Task(%SQE5b).Rit.pattern(Ritmeteller) CASE %False MSGBOX "Impossible",, FUNCNAME$ 'Ritmeteller = %False CASE < 0 ' this means we have to mPlay a rest... IF oldnote THEN SELECT CASE robotnr CASE 1 ',2,3 ' only for piano '', piperola, humanola - for vibi?? (=8) NoteOff Task(%SQE5).channel, Oldnote CASE 15 Release Task(%SQE5).channel, Oldnote, 24 END SELECT oldnote = %False END IF CASE > 0 IF TaskEX(%SQE5).hIcon THEN ' sound level will depend on size of moving body velo = (Maat(BarCount).v1(Ritmeteller) / 128.0) * @pr(4).s velo = MIN(velo,127) IF velo THEN oldnote = Orkest.ln(robotnr) mPlay Task(%SQE5).channel, oldnote, velo 'Maat(Barcount).v0(Ritmeteller) END IF END IF END SELECT Task(%SQE5b).freq = (tiks * App.Tempo ) / (60 * ABS(Task(%SQE5b).Rit.pattern(Ritmeteller))) Task(%SQE5b).patch = Ritmeteller INCR Ritmeteller END SUB SUB SQE_Play1_Stop () LOCAL i AS DWORD LOCAL udnr AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(0) 'value = UDCtrl(udnr).value IF Task(%SQE1b).swit THEN stoptask %SQE1b END IF Task(%SQE1).pan = %False ' barcount Task(%SQE1).patch = %False ' ritmeteller Task(%SQE1b).pan = %False ' barcount Task(%SQE1b).patch = %False ' ritmeteller DO IF Orkest.busy(i) = 1 THEN ' here we should also send an all-notes-off... SELECT CASE i CASE 1 'InstrumAllNotesOff Piano MM_Piano_Off ' CASE 2 ' 'InstrumAllNotesOff Humanola ' 'MM_Humanola_Off %MM_Notes ' ' only casta ' CASE 3 ' 'InstrumAllNotesOff Piperola ' 'MM_Piperola_Off %MM_Notes ' ' percussion only, no note off required. ' CASE 4, 5, 6, 7 ' ' troms, rotomoton, thunderwood, tubi CASE 8 'InstrumAllNotesOff Vibi MM_Vibi_Off %MM_Notes ' CASE 9, 10, 11, 12, 13, 14 , 15 , 16 ' ' belly, springers,dripper, flex, klung , puff , Llor , psch END SELECT EXIT DO END IF INCR i LOOP UNTIL i > %SQE_NrIns #IF %DEF(%SQE_Flag) ' we should also free the instrument used. i = %False DO IF Orkest.busy(i) = 1 THEN Orkest.busy(i) = %False UDctrl(udnr).value = %False SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 16, "Off" ' here we should also send an all-notes-off... END IF INCR i LOOP UNTIL i > %SQE_NrIns #ENDIF END SUB SUB SQE_Play2_Stop () LOCAL i AS DWORD LOCAL udnr AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(1) IF Task(%SQE2b).swit THEN stoptask %SQE2b END IF Task(%SQE2).pan = %False Task(%SQE2).patch = %False Task(%SQE2b).pan = %False Task(%SQE2b).patch = %False DO IF Orkest.busy(i) = 2 THEN ' here we should also send an all-notes-off... SELECT CASE i CASE 1 InstrumAllNotesOff Piano ' CASE 2 ' InstrumAllNotesOff Humanola ' CASE 3 ' InstrumAllNotesOff Piperola ' CASE 2,3,4, 5, 6, 7 ' ' troms, rotomoton, thunderwood, tubi CASE 8 InstrumAllNotesOff Vibi ' CASE 9, 10, 11, 12, 13 , 14, 15, 16 ,17 ' ' belly, springers,dripper, flex, klung, puff, llor, vacca , psch END SELECT EXIT DO END IF INCR i LOOP UNTIL i > %SQE_NrIns #IF %DEF(%SQE_Flag) ' we should also free the instrument used. DO IF Orkest.busy(i) = 2 THEN Orkest.busy(i) = %False UDctrl(udnr).value = %False SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 17, "Off" END IF INCR i LOOP UNTIL i > %SQE_NrIns #ENDIF END SUB SUB SQE_Play3_Stop () LOCAL i AS DWORD LOCAL udnr AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(2) IF task(%SQE3b).swit THEN stoptask %SQE3b END IF Task(%SQE3).pan = %False Task(%SQE3).patch = %False Task(%SQE3b).pan = %False Task(%SQE3b).patch = %False DO IF Orkest.busy(i) = 3 THEN ' here we should also send an all-notes-off... SELECT CASE i CASE 1 InstrumAllNotesOff Piano ' CASE 2 ' InstrumAllNotesOff Humanola ' CASE 3 ' InstrumAllNotesOff Piperola ' CASE 2,3,4, 5, 6, 7 ' troms, rotomoton, thunderwood, tubi CASE 8 InstrumAllNotesOff Vibi ' CASE 9, 10, 11, 12, 13, 14 ' ' belly, springers,dripper, flex, klung , puff END SELECT EXIT DO END IF INCR i LOOP UNTIL i > %SQE_NrIns #IF %DEF(%SQE_Flag) ' we should also free the instrument used. DO IF Orkest.busy(i) = 3 THEN Orkest.busy(i) = %False UDctrl(udnr).value = %False SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 18, "Off" END IF INCR i LOOP UNTIL i > %SQE_NrIns #ENDIF END SUB SUB SQE_Play4_Stop () LOCAL i AS DWORD LOCAL udnr AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(3) IF Task(%SQE4b).swit THEN stoptask %SQE4b END IF Task(%SQE4).pan = %False Task(%SQE4).patch = %False Task(%SQE4b).pan = %False Task(%SQE4b).patch = %False DO IF Orkest.busy(i) = 4 THEN ' here we should also send an all-notes-off... SELECT CASE i CASE 1 InstrumAllNotesOff Piano 'CASE 2 ' InstrumAllNotesOff Humanola 'CASE 3 ' InstrumAllNotesOff Piperola 'CASE 2,3,4, 5, 6, 7 ' troms, rotomoton, thunderwood, tubi CASE 8 InstrumAllNotesOff Vibi 'CASE 9, 10, 11, 12, 13, 14 , 15 ' belly, springers,dripper, flex, klung , puff , llor END SELECT EXIT DO END IF INCR i LOOP UNTIL i > %SQE_NrIns #IF %DEF(%SQE_Flag) ' we should also free the instrument used. DO IF Orkest.busy(i) = 4 THEN Orkest.busy(i) = %False UDCtrl(udnr).value = %False SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 19, "Off" END IF INCR i LOOP UNTIL i > %SQE_NrIns #ENDIF END SUB SUB SQE_Play5_Stop () LOCAL i AS DWORD LOCAL udnr AS DWORD udnr = TaskEX(%SQE_Ctrl).UpdownNumbers(4) IF Task(%SQE5b).swit THEN stoptask %SQE5b END IF Task(%SQE5).pan = %False Task(%SQE5).patch = %False Task(%SQE5b).pan = %False Task(%SQE5b).patch = %False DO IF Orkest.busy(i) = 5 THEN ' here we should also send an all-notes-off... SELECT CASE i CASE 1 InstrumAllNotesOff Piano ' CASE 2 ' InstrumAllNotesOff Humanola ' CASE 3 ' InstrumAllNotesOff Piperola ' CASE 2,3,4, 5, 6, 7 ' ' troms, rotomoton, thunderwood, tubi CASE 8 InstrumAllNotesOff Vibi ' CASE 9, 10, 11, 12, 13, 14 , 15 ' ' belly, springers,dripper, flex, klung, puff, llor END SELECT EXIT DO END IF INCR i LOOP UNTIL i > %SQE_NrIns #IF %DEF(%SQE_Flag) ' we should also free the instrument used. i = %False DO IF Orkest.busy(i) = 5 THEN Orkest.busy(i) = %False UDCtrl(udnr).value = %False SetDlgItemText Task(%SQE_Ctrl).hparam, %GMT_TEXT0_ID + 20, "Off" END IF INCR i LOOP UNTIL i > %SQE_NrIns #ENDIF END SUB FUNCTION STO_SQE_Orkestrator (BYVAL voice AS BYTE) AS DWORD ' nog niet volledig af... LOCAL i AS DWORD LOCAL j AS DWORD LOCAL idx AS DWORD LOCAL tasknr AS DWORD FUNCTION = %False ' zoek het instrument toegewezen aan deze stem: DO IF Orkest.busy(i) = voice THEN idx = i: EXIT LOOP INCR i LOOP UNTIL i > %SQE_NrIns IF i > %SQE_NrIns THEN MSGBOX "Error - no instrument selected",, FUNCNAME$ tasknr = %SQE1 + ((voice -1) * 2) ' returns %SQE1, %SQE2... ' the tasks for the lownotes are tasknr + 1 (%SQE1b, %SQE2b...) IF ISFALSE idx THEN EXIT FUNCTION FUNCTION = idx SELECT CASE LEFT$(orkest.naam(idx),4) CASE "snar" ' added 23.11.2006 Task(tasknr).channel = Snar.channel ' = troms.channel Orkest.ln(idx) = 60 + RND(1) * 12 ' normal beaters Orkest.hn(idx) = MIN(73 + RND(1) * 2,74) ' rimshot CASE "trom" Task(tasknr).channel = Troms.channel ' 24-29 bas ' 30-33 ' 34-37 ' 38-40 ' 41-43 ' 44,45 ' 46,47 DO i = RND(1) * 6 SELECT CASE i CASE 0 Orkest.ln(idx) = 24 CASE 1 Orkest.ln(idx) = 30 CASE 2 Orkest.ln(idx) = 34 CASE 3 Orkest.ln(idx) = 38 CASE 4 Orkest.ln(idx) = 41 CASE 5 Orkest.ln(idx) = 44 CASE 6 Orkest.ln(idx) = 46 END SELECT i = RND(1) * 6 SELECT CASE i CASE 0 Orkest.hn(idx) = 24 CASE 1 Orkest.hn(idx) = 30 CASE 2 Orkest.hn(idx) = 34 CASE 3 Orkest.hn(idx) = 38 CASE 4 Orkest.hn(idx) = 41 CASE 5 Orkest.hn(idx) = 44 CASE 6 Orkest.hn(idx) = 46 END SELECT LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) IF orkest.ln(idx) > Orkest.hn(idx) THEN SWAP orkest.ln(idx), orkest.hn(idx) CASE "pipe" Task(tasknr).channel = Piperola.channel DO Orkest.ln(idx) = 120 + (RND(1) *7) Orkest.hn(idx) = 121 + (RND(1) *6) LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) CASE "cast" ' casta mag nu uitgebreid worden Task(tasknr).channel = Casta.channel ' gedaan 28.02.2006 DO Orkest.ln(idx) = 113 + (RND(1) *14) Orkest.hn(idx) = 114 + (RND(1) *7) LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) CASE "cas2" Task(tasknr).channel = Casta2.channel ' 10.05.2007 DO Orkest.ln(idx) = 112 + (RND(1) *7) Orkest.hn(idx) = 120 + (RND(1) *7) LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) CASE "pian" Piano.Har(1).vel = STRING$(128,0) Task(tasknr).channel = Piano.channel i = piano.lowtes + (RND(1) * 24) Orkest.ln(idx) = i ' add these notes to the harstring of the piano: AddNote2Har Piano.Har(1), i,100 i = Orkest.ln(idx) + 1 + (RND(1) * 18) Orkest.hn(idx) = i AddNote2Har Piano.Har(1), i, 100 CASE "vibi" MM_Vibi_On Vibi.Har(1).vel = STRING$(128,0) Task(tasknr).channel = Vibi.channel DO Orkest.ln(idx) = Vibi.lowtes + (RND(1) * 15) Orkest.hn(idx) = Vibi.lowtes + (RND(1) * (Vibi.hightes - Vibi.lowtes)) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) AddNote2Har Vibi.Har(1), Orkest.ln(idx), 100 AddNote2Har Vibi.Har(1), Orkest.hn(idx), 100 CASE "tubi" MM_Tubi_On Tubi.Har(1).vel = STRING$(128,0) Task(tasknr).channel = Tubi.channel DO i = 72 + (RND(1) * 36) Orkest.hn(idx) = i i = 72 + (RND(1) * 36) Orkest.ln(idx) = i LOOP UNTIL Orkest.hn(idx) > Orkest.ln(idx) AddNote2Har Tubi.Har(1), Orkest.hn(idx), 100 AddNote2Har Tubi.Har(1), Orkest.ln(idx), 100 Orkest.ln(idx) = Orkest.ln(idx) - 36 ' always on quartertone row CASE "bell" MM_Belly_On Belly.Har(1).vel = STRING$(128,0) Task(tasknr).channel = Belly.channel DO Orkest.ln(idx) = Belly.lowtes + (RND(1) * 15) Orkest.hn(idx) = Belly.lowtes + (RND(1) * (Belly.hightes - Belly.lowtes)) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) AddNote2Har Belly.Har(1), Orkest.hn(idx), 100 ' this will go wrong without pitch mapping... AddNote2Har Belly.Har(1), Orkest.ln(idx), 100 CASE "flex" ' with saw bending commands. Task(tasknr).channel = Flex.channel ' beaters are note 72 to 79 ' 72,73: Pi saw front, 76,77: e-saw front ' 74,75: Pi saw back, 78,79: e-saw back Orkest.ln(idx) = 72 + (RND(1) * 3) ' one beater on the Pi saw Orkest.hn(idx) = 76 + (RND(1) * 3) ' one beater on the e saw SELECT CASE Orkest.ln(idx) CASE 72,73 ' pi saw front Flex.ctrl(1) = RND(1) * 20 ' 0 = fully stretched ModeMess Flex.channel, 1, Flex.ctrl(1) CASE 74,75 ' Pi saw back 'Flex.ctrl(1) = 90 - (rnd(1) * 20) ' 100= fully bend Flex.ctrl(1) = RND(1) * 30 ModeMess Flex.channel, 1, Flex.ctrl(1) END SELECT SELECT CASE Orkest.hn(idx) CASE 76,77 ' e saw front Flex.ctrl(2) = RND(1) * 20 Modemess Flex.channel, 2, Flex.ctrl(2) CASE 78,79 ' e saw back ' Flex.ctrl(2) = 90 - (RND(1) * 15) Flex.ctrl(2) = RND(1) * 15 Modemess Flex.channel, 2, Flex.ctrl(2) END SELECT CASE "klun" ' notes 48-69 (68 missing) MM_Klung_On Klung.Har(1).vel = STRING$(128,0) Task(tasknr).channel = Klung.channel DO Orkest.ln(idx) = Klung.lowtes + (RND(1) * 15) Orkest.hn(idx) = Klung.lowtes + (RND(1) * (Klung.hightes - Klung.lowtes)) IF Orkest.hn(idx) = 68 THEN ITERATE DO LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) AddNote2Har Klung.Har(1), Orkest.hn(idx), 100 AddNote2Har Klung.Har(1), Orkest.ln(idx), 100 CASE "thun" MM_ThunderWood_ON Task(tasknr).channel = Thunderwood.channel ' notes 1-24 ' 1 = lowblock ' 6 = tenorblock ' 10 = med block ' 13 = high block ' 15 = ratchet ' 17-18 = chimes ' 19,20 = thundersheet ' DO i = RND(1) * 3 SELECT CASE i CASE 0 Orkest.ln(idx) = 1 CASE 1 Orkest.ln(idx) = 6 CASE 2 Orkest.ln(idx) = 10 CASE 3 Orkest.ln(idx) = 13 END SELECT i = RND(1) * 3 SELECT CASE i CASE 0 Orkest.hn(idx) = 1 CASE 1 Orkest.hn(idx) = 6 CASE 2 Orkest.hn(idx) = 10 CASE 3 Orkest.hn(idx) = 13 END SELECT LOOP UNTIL Orkest.hn(idx) > Orkest.ln(idx) CASE "roto" ' pitches change after each call on selected drums. Task(tasknr).channel = Rotomoton.channel ' low drum: 48,49,50 ' 51,52,53 ' 54, 55 ' 56, 57 ' 58, 59 ' lights: 114, 115 DO i = RND(1) * 4 SELECT CASE i CASE 0 Orkest.ln(idx) = 48 CASE 1 Orkest.ln(idx) = 51 CASE 2 Orkest.ln(idx) = 54 CASE 3 Orkest.ln(idx) = 56 CASE 4 Orkest.ln(idx) = 58 END SELECT j = RND(1) * 5 SELECT CASE j CASE 0 Orkest.hn(idx) = 48 CASE 1 Orkest.hn(idx) = 51 CASE 2 Orkest.hn(idx) = 54 CASE 3 Orkest.hn(idx) = 56 CASE 4 Orkest.hn(idx) = 58 CASE 5 Orkest.ln(idx) = 114 ' lights only Orkest.hn(idx) = 115 END SELECT LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) IF orkest.ln(idx) > Orkest.hn(idx) THEN SWAP orkest.ln(idx), orkest.hn(idx) ' move stepping motors: ModeMess Rotomoton.channel,101 + i, RND(1) * 120 IF j < 5 THEN ModeMess Rotomoton.channel,101 + j, RND(1) * 120 END IF CASE "spri" Task(tasknr).channel = Springers.channel ' notes 120-127 ' use shakers only: 124-125 and 126-127, alternating Orkest.ln(idx) = 124 + INT(RND * 3) DO Orkest.hn(idx) = 124 + INT(RND * 3) LOOP WHILE Orkest.hn(idx) = Orkest.ln(idx) CASE "drip" Task(tasknr).channel = Dripper.channel ' listens to any note mod 12. DO Orkest.ln(idx) = 12 + ((RND(1) * 12) MOD 12) Orkest.hn(idx) = 12 + ((RND(1) * 12) MOD 12) LOOP UNTIL Orkest.ln(idx) <> Orkest.hn(idx) CASE "puff" Task(tasknr).channel = Puff.channel ' voorlopig: DO Orkest.ln(idx) = 55 + (RND(1) * 40) Orkest.hn(idx) = 7 + (RND(1) * 40) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx)+ 48 ' map on quartertones CASE "llor" Task(tasknr).channel = Llor.channel DO Orkest.ln(idx) = Llor.lowtes + (RND(1) * 12) Orkest.hn(idx) = Llor.lowtes + (RND(1) * 12) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) CASE "vacc" Task(tasknr).channel = Vacca.channel DO Orkest.ln(idx) = Vacca.lowtes + (RND(1) * 36) Orkest.hn(idx) = Vacca.lowtes + (RND(1) * 47) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) CASE "psch" Task(tasknr).channel = Psch.channel ' added 28.02.2006 DO Orkest.ln(idx) = psch.lowtes + (RND(1) * 12) Orkest.hn(idx) = psch.lowtes + (RND(1) * 12) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) CASE "vite" MM_Vitello_ON ' vitello added 20.11.2006 Task(tasknr).channel = Vitello.channel DO Orkest.ln(idx) = Vitello.lowtes + (RND(1) * 26) Orkest.hn(idx) = Vitello.lowtes + (RND(1) * 31) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) CASE "xy ", "xy" ' added 14.04.2007 MM_Xy_On Task(tasknr).channel = xy.channel DO Orkest.ln(idx) = xy.lowtes + (RND(1) * 53) Orkest.hn(idx) = xy.lowtes + (RND(1) * 53) LOOP UNTIL Orkest.ln(idx) < Orkest.hn(idx) CASE ELSE MSGBOX "Check code!!!",, FUNCNAME$ END SELECT END FUNCTION SUB SQE_STO_Patches () LOCAL retval AS DWORD ' initialize robot musicians and set ports to ensemble. ' new 20.11.2004: Init_MM MM_PanicButtonWindow ' (OPT BYVAL instrum$, BYVAL hParent AS LONG, BYVAL x AS LONG, BYVAL y AS LONG) AS LONG END SUB SUB SQE_STO_ReMapCockpitButtons () LOCAL i AS LONG IF ISFALSE hMidiI(0) THEN ButnSW(0).tag0 = "" ' midi-in must be on for sqt devices END IF ButnSW(1).tag0 = "START" ' start/stop toggle - only used for chrono and general watch... ButnSW(1).tag1 = "STOP" ButnSW(1).cPtr= %False ButnSW(2).tag0 = "" ButnSW(2).cptr = %False ButnSW(3).tag0 = "SQE On" ButnSW(3).tag1 = "SQE off" ButnSW(3).cptr = %False ButnSW(4).tag0 = "STO On" ButnSW(4).tag1 = "STO off" ButnSW(4).cptr = %False ButnSW(5).tag0 = "Tec On" ' new 02.03.2006 - Macerata ButnSW(5).tag1 = "Tec Off" ButnSW(5).cptr = %False ButnSW(6).tag0 = "" ButnSW(6).cptr = %False ButnSW(7).tag0 = "Screen On" ' creates/kills a spectrum display window - used to display waveform ButnSW(7).tag1 = "Screen Off" ' or radar screen ButnSW(8).tag0 = "" ButnSW(8).cptr = %False ButnSW(10).tag0 = "Foot ON" ButnSW(10).tag1 = "FootOFF" ButnSW(10).cptr = %False ButnSW(11).tag0 = "" ButnSW(11).cptr = %False ButnOS(10).tag = "Calib" 'calibrate DAQ card. DAQ task will be switched OFF !!! ButnOS(10).cptr = %False App.butnSWCptr = CODEPTR(SQE_STO_ButnSWHandler) App.butnOSCptr = CODEPTR(SQE_STO_ButnOShandler) END SUB SUB SQE_STO_ButnSWHandler () LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL m AS ASCIIZ * 10 LOCAL cptr AS DWORD STATIC init AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID SELECT CASE ButtonNr CASE 1 ' starts the promil counter. IF ISFALSE init THEN init = %True 'Radar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) END IF SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(0),3) '+ "S/s db" ' appears under freq groupbox in cockpit dialog IF ButnSW(ButtonNr).Flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction IF hMidiI(0) THEN ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) 'SxThread END IF cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%DAQ_DOUBLEBUFFER) ' Radar_DAQ %DAQ_DOUBLEBUFFER SetDlgItemText gh.Cockpit, App.butnSWparam, "STOP" RunTime %True StartTask %Radar_VU_Task ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "CONT" 'Radar_DAQ %False cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) END IF CASE 3 ' SQE IF Task(%SQE1).swit THEN StopTask %SQE1 END IF IF Task(%SQE2).swit THEN StopTask %SQE2 END IF IF Task(%SQE3).swit THEN StopTask %SQE3 END IF IF Task(%SQE4).swit THEN StopTask %SQE4 END IF IF Task(%SQE5).swit THEN StopTask %SQE5 END IF IF ButnSW(ButtonNr).flag THEN SQE_Lookup SetDlgItemText gh.Cockpit, %GMT_TITLE, "" Orkest.piece = %ID_SQE IF ISFALSE Task(%SQE_Ctrl).swit THEN starttask %SQE_Ctrl ELSE SetDlgItemText gh.Cockpit, %GMT_TITLE, "choose piece with button" END IF CASE 4 ' STO IF Task(%SQE1).swit THEN StopTask %SQE1 END IF IF Task(%SQE2).swit THEN StopTask %SQE2 END IF IF Task(%SQE3).swit THEN StopTask %SQE3 END IF IF Task(%SQE4).swit THEN StopTask %SQE4 END IF IF Task(%SQE5).swit THEN StopTask %SQE5 END IF IF ButnSW(ButtonNr).flag THEN STO_Lookup SetDlgItemText gh.Cockpit, %GMT_TITLE, "" Orkest.piece = %ID_STO IF ISFALSE Task(%SQE_Ctrl).swit THEN starttask %SQE_Ctrl ELSE SetDlgItemText gh.Cockpit, %GMT_TITLE, "choose piece with button" END IF CASE 5 ' new button for techno lookup IF Task(%SQE1).swit THEN StopTask %SQE1 END IF IF Task(%SQE2).swit THEN StopTask %SQE2 END IF IF Task(%SQE3).swit THEN StopTask %SQE3 END IF IF Task(%SQE4).swit THEN StopTask %SQE4 END IF IF Task(%SQE5).swit THEN StopTask %SQE5 END IF IF ButnSW(ButtonNr).flag THEN g_techno_Lookup ' parameter to be added: %Tango, %BossaNova, %Techno, %Milonga SetDlgItemText gh.Cockpit, %GMT_TITLE, "" Orkest.piece = %ID_G_TECHNO ' %False ' - this may go wrong. - no id IF ISFALSE Task(%SQE_Ctrl).swit THEN starttask %SQE_Ctrl ELSE SetDlgItemText gh.Cockpit, %GMT_TITLE, "choose piece with button" END IF CASE 10 ' toggles So-voetje IF ButnSW(ButtonNr).flag THEN So.ctrl(64) = %True ELSE So.ctrl(64) = %False END IF END SELECT App.butnSWparam = %False ' reset END SUB SUB SQE_STO_ButnOSHandler () LOCAL stat AS INTEGER LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL cptr AS DWORD LOCAL h AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID SELECT CASE ButtonNr CASE 0 MM_AllOff CASE 10 cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) ' Radar_DAQ %False ' stop DAQ task in dll ' following remmed out: (07.06.2009) ' h = GetModuleHandle("nidaq32.dll") ' cptr = GetProcAddress(h, "CALIBRATE_E_SERIES") ' CALL DWORD cptr USING Calibrate_E_Series_dummy(DAQparams.id, %ND_SELF_CALIBRATE, %ND_NI_DAQ_SW_AREA, 10.0) TO stat ' ' stat = Calibrate_E_Series (DAQparams.id, %ND_SELF_CALIBRATE,%ND_NI_DAQ_SW_AREA,10.0) ' 'i = NIDAQErrorHandler(stat,"Calibration error in STO v SQE",0) ' Radar_DAQ %DAQ_DOUBLEBUFFER ' restart DAQ task in dll cptr = GetPRocAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) END SELECT App.butnOSparam = %False ' reset END SUB SUB SQE_So () ' uses robot STATIC h AS harmtype STATIC n AS INTEGER STATIC j AS DWORD LOCAL velo AS LONG IF ISFALSE Task(%SQE_So).tog THEN App.Globton = -1 So.Ctrl(1) = 127 Controller So.channel, 1, So.ctrl(1) h.vel = STRING$(128,0) Task(%SQE_So).tog = %True END IF ' instruments that have pitched sounds here are: ' piano, vibi, klung, tubi, belly , puff IF ISFALSE j THEN ' sum of their harmonies: ( we use the harstring, since in the playing code we do not ' use the instrumplay function, which would always reset it. Task(0).Har.vel = SumHar$ (Piano.Har(1), Vibi.Har(1)) Task(1).Har.vel = SumHar$ (Tubi.Har(1), Belly.Har(1)) Task(2).Har.vel = SumHar$ (Klung.Har(1),Task(1).har) Task(3).har.vel = SumHar$ (Puff.Har(1), Task(2).har) Task(%SQE_So).Har.vel = SumHar$ (Task(0).Har, Task(3).Har) h.vel = SolveHar$ (Task(%SQE_So).Har, App.Globton, 0.01) n = GetLowestNote (h, 1, 127) IF n > -1 THEN So.Ctrl(1) = 127 Controller So.channel, 1, So.ctrl(1) n = HIBYT(n) DelNote2Har h, n Task(%SQE_Brd).Har.vel = h.vel ' for bourdonola Task(%SQE_Harma).Har.vel = h.vel ' for harma n = 24 + (n MOD 12) velo = MAX(24,110 - @pr(4).s) AddNote2Har So.Har(1), n, velo ' inverse proportional to amount of body InstrumPlay So 'So_Foot So, %False j = %True App.Globton = App.Globton + 5 App.Globton = App.Globton MOD 12 ELSE Task(%SQE_Brd).Har.vel = Task(%SQE_So).Har.vel 'STRING$(128,0) Task(%SQE_Harma).Har.vel = Task(%SQE_So).Har.vel 'STRING$(128,0) So.Ctrl(1) = %False Controller So.channel, 1, So.ctrl(1) n = %False InstrumPlay So 'So_Foot So, 1 j = %False END IF ELSE InstrumPlay So 'So_Foot So, %False j = %False END IF Task(%SQE_So).freq = App.Tempo / 60 END SUB SUB SQE_So_Stop () So.Ctrl(1) = 0 Controller So.channel, 1, So.ctrl(1) 'So_Play So MM_So_Off END SUB SUB SQE_Brd () STATIC j AS DWORD ' bourdonola optional part IF ISFALSE task(%SQE_Brd).tog THEN j = %False IF ISFALSE Task(%SQE_So).swit THEN EXIT SUB task(%SQE_Brd).tog = %TRue END IF IF ISFALSE j THEN Bourdonola.Har(1).vel = Task(%SQE_Brd).Har.vel ' filled in proc. for so IF Bourdonola.Har(1).vel <> STRING$(128,0) THEN InstrumPlay Bourdonola END IF SELECT CASE Orkest.piece CASE %ID_STO 'IF Orkest.piece = %ID_STO THEN Task(%SQE_Brd).freq = (App.Tempo * 2)/ 180 ' STO 2/180 + 1/180 = 1/60 CASE %ID_SQE ' ELSE Task(%SQE_Brd).freq = (App.Tempo * 6)/ 420 ' SQE 6/420 + 1/420 = 1/60 CASE %ID_G_TECHNO ' was ELSE ' can become case %ID_G_TECHNO Task(%SQE_Brd).freq = App.Tempo / 80! ' g-techno 3/240 + 1/240 = 1/60 END SELECT ELSE IF Bourdonola.Har(0).vel <> STRING$(128,0) THEN ' Har(0) = previous harstring InstrumPlay Bourdonola END IF SELECT CASE Orkest.piece CASE %ID_STO 'IF Orkest.piece = %ID_STO THEN Task(%SQE_Brd).freq = App.Tempo / 180 CASE %ID_SQE 'ELSE Task(%SQE_Brd).freq = App.Tempo / 420 CASE %ID_G_TECHNO 'ELSE Task(%SQE_Brd).freq = App.Tempo / 240 END SELECT END IF INCR j IF j > 1 THEN j = %False END SUB SUB SQE_Brd_Stop () MM_Bourdonola_Off %MM_Notes END SUB SUB SQE_Harma () STATIC j AS DWORD IF ISFALSE Task(%SQE_Harma).tog THEN j = %False IF ISFALSE Task(%SQE_So).swit THEN EXIT SUB 'ProgChange Harma.channel, 15 'ModeMess Harma.channel, 7, 100 'Task(%SQE_Harma).channel = Harma.channel MM_Harma_On %MM_Motor OR %MM_Wind Task(%SQE_Harma).tog = %True END IF SELECT CASE j CASE %False ' mPlay nothing. SELECT CASE orkest.piece CASE %ID_STO 'IF orkest.piece = %ID_STO THEN Task(%SQE_Harma).freq = App.Tempo / 180! CASE %ID_SQE ' ELSE Task(%SQE_Harma).freq = (App.Tempo * 3) / 420! CASE %ID_G_TECHNO Task(%SQE_Harma).freq = App.Tempo / 240! END SELECT CASE 1 ' IF Task(%SQE_Brd).swit THEN ' Harma.Har(1).vel = LimitHar(Task(%SQE_Harma).Har, Bourdonola.Hightes- 12, Harma.Hightes) ' new function in g_mus.dll ' ELSE Harma.Har(1).vel = Task(%SQE_Harma).har.vel 'LimitHar(Task(%SQE_Harma).har, Harma.Lowtes, Harma.Hightes) ' END IF IF Harma.Har(1).vel <> STRING$(128,0) THEN InstrumPlay Harma END IF SELECT CASE orkest.piece CASE %ID_STO ' IF Orkest.piece = %ID_STO THEN Task(%SQE_Harma).freq = App.Tempo/ 180! ' STO 1/180 + 1/180 + 1/180 = 1/60 CASE %ID_SQE ' ELSE Task(%SQE_Harma).freq = App.Tempo / 420! ' SQE 3/420 + 3/420 + 1/420 = 1/60 CASE %ID_G_TECHNO Task(%SQE_Harma).freq = App.Tempo / 240! 'techno: 1/240 + 1/240 + 2/240 = 1/60 END SELECT CASE 2 'Harma.Har(1).vel = STRING$(128,0) IF Harma.Har(0).vel <> STRING$(128,0) THEN InstrumPlay Harma END IF SELECT CASE orkest.piece CASE %ID_STO 'IF orkest.piece = %ID_STO THEN Task(%SQE_Harma).freq = App.Tempo / 180! CASE %ID_SQE 'ELSE Task(%SQE_Harma).freq = (App.Tempo * 3) / 420! CASE %ID_G_TECHNO ' techno pieces ' if we use harma at all here... Task(%SQE_Harma).freq = App.tempo / 120! ' = 2/240 END SELECT END SELECT INCR j IF j > 2 THEN j = %False 'Task(%SQE_Harma).freq = Task(%SQE_Harma).freq / 2 ' scale 2 times slower END SUB SUB SQE_Harma_Stop () MM_Harma_Off %MM_Notes OR %MM_Motor END SUB FUNCTION SQE_Sync (BYVAL tasknr AS DWORD) AS DWORD ' returns %True or %False LOCAL i AS DWORD FUNCTION = %True FOR i = %SQE1 TO %SQE5 STEP 2 IF i <> tasknr THEN IF Task(i).swit THEN IF Task(i).patch THEN FUNCTION = %False : EXIT FUNCTION ' patch field used to store ritmeteller END IF END IF NEXT i ' returns true if all other tasks have ritmeteller = %False 'IF ISFALSE rit THEN FUNCTION = %True END FUNCTION FUNCTION SQE_GetBar (BYVAL tasknr AS DWORD) AS DWORD ' returns a new barnumber not played at the time of calling by any other voice. ' all players should mPlay different bars at all times LOCAL i AS DWORD STATIC barcount AS DWORD DO barcount = RND(1) * 12 FOR i = %SQE1 TO %SQE5 STEP 2 IF i <> tasknr THEN 'if Task(i).swit then IF barcount = Task(i).pan THEN ITERATE DO 'end if END IF NEXT i LOOP UNTIL i > %SQE5 FUNCTION = barcount END FUNCTION '[EOF]