'******************************************** '* * '* a microtonal Bb cornet playing robot by * '* dr.Godfried-Willem Raes * '* 2008 - 2009 * '******************************************** ' hardware tests and development code ' this file can also be included in the Bono compilation ' 28.01.2008: debugged gwr. ' 20.11.2008: hardware revision. ' 12.12.2008: Further work on 'Brass Calls' ' 13-14.12.2008: schaafwerk Just Calls for Brass ' 15.12.2008: duration of Just Calls now ca. 6'24". cnt = 677, final tc = 31.76 ' 16.12.2008: duration running on Xi is different, ca.5'30" ' 18.12.2008: Premiere van Just Calls ' 21.12.2008: work on Korn hardware. ' 22.12.2008: test procs. for steppers added. ' 11.01.2009: rechecked. ' 02.05.2009: PIC1 and PIC2 firmware debugged and reprogrammed. ' 23.05.2009: PIC1 (Hor.motor) firmware debugged and improved. ' 31.10.2010: Complete redesign of midihub board and firmware (gwr) ' tweede kolom cockpit: %Korn_scale = 17 ' toonladder test %Korn_test = 18 ' repeated note test %Korn_Qscale = 19 ' kwarttoons toonladder test %Korn_Vibrato = 21 ' pitch bend test %Korn_Tremolo = 22 ' tremolo test ' derde kolom in cockpit: controllers '%Korn_7 = 20 ' ctrl 7 ' volume - niet geimplementeerd op korn!!! %Korn_13 = 32 ' ctrl 13: valve control %Korn_17 = 33 ' ctrl 17 ' attack amplitude %Korn_18 = 34 ' ctrl 18 ' attack time %Korn_20 = 35 ' ctrl 20 ' main tuning to diapason %Korn_Hormove = 36 ' ctrl 21 %Korn_Vermove = 37 ' ctrl 22 %Korn_25 = 38 ' ctrl 25 ' valve velo controller %Korn_lites = 39 %Korn_LR = 40 ' left right movement horizontal in steps %Korn_UD = 41 ' up down movement in steps %Korn_31 = 42 'horizontal motor speed controller 31.10.2010 %Korn_90 = 43 'PIR sensor automation %Korn_100 = 44 'midi output control %Korn_67 = 45 'calibrate left %Korn_68 = 46 'calibrate right %Korn_69 = 47 'calibrate center %Korn_70 = 48 'complete calibration procedure H + V ' vierde kolom cockpit %Korn_Calls = 59 '60 - not yet a piece!!! %Korn_Moves = 60 '61 - just a demo %Brass_Calls = 63 ' koperkwartet met optioneel slagwerk in just intonation. %Braca_TC = 62 ' hidden task for above piece. (Tubi, Vibi, Harma) %Braca_End = 61 ' hidden task - ending TYPE BrasCal_Type DWORD n(0 TO 3) AS CUR v(0 TO 3) AS BYTE oldn(0 TO 3) AS CUR tc AS CUR rest AS LONG cnt AS LONG tonerow(64) AS CUR unisons AS DWORD fifths AS DWORD thirds AS DWORD END TYPE GLOBAL BraCa AS BrasCal_Type DECLARE FUNCTION Init_Korn () AS LONG DECLARE SUB Korn_Scale () DECLARE SUB Korn_Scale_UD0 () DECLARE SUB Korn_Scale_UD1 () DECLARE SUB Korn_Scale_UD2 () DECLARE SUB Korn_Hormove () DECLARE SUB Korn_SL21 () DECLARE SUB Korn_Vermove () DECLARE SUB Korn_SL22 () DECLARE SUB Korn_Vibrato () DECLARE SUB Korn_Tremolo () DECLARE SUB Korn_13 () ' valves DECLARE SUB Korn_13_UD0 () DECLARE SUB Korn_18 () DECLARE SUB Korn_SL18 () DECLARE SUB Korn_20 () ' tuning DECLARE SUB Korn_SL20 () DECLARE SUB Korn_25 () ' valve velo DECLARE SUB Korn_lites () DECLARE SUB Korn_Lites_UD () DECLARE SUB Korn_Test () DECLARE SUB Korn_UD0 () DECLARE SUB Korn_UD1 () DECLARE SUB Korn_UD2 () DECLARE SUB Korn_Calls () ' gwr demo stukje DECLARE FUNCTION Korn_MotPosCal () AS LONG ' callback for one shot ctrl.70 DECLARE SUB Korn_Moves () DECLARE SUB Korn_Qscale () ' quartertone scale test DECLARE SUB Korn_LR () DECLARE SUB Korn_UD () DECLARE SUB Korn_31 () DECLARE SUB Korn_90 () DECLARE SUB Korn_100 () DECLARE SUB Korn_67 () DECLARE SUB Korn_68 () DECLARE SUB Korn_69 () DECLARE SUB Korn_70 () ' procedures for Calls for Brass: DECLARE SUB Brass_Calls () DECLARE SUB Brass_Calls_Start () DECLARE SUB Brass_Calls_Stop () DECLARE SUB Brass_Calls_Tc () DECLARE SUB Brass_Calls_End () ' ------------------------------- DECLARE SUB Korn_Fingerings DECLARE CALLBACK FUNCTION CB_Korn_Fingerings FUNCTION Init_Korn () AS LONG LOCAL retval AS LONG LOCAL m AS ASCIIZ * 30 ' GetInstrumentParams Korn, %IDM_Korn ' retval = SetRobotPort (Korn, Inifilename, hMidiO()) Task(%Korn_Scale).naam = "Scale" Task(%Korn_Scale).cptr = CODEPTR(Korn_Scale) Task(%Korn_Scale).freq = 2 Task(%Korn_Scale).flags = %False Task(%Korn_Test).naam = "Test" Task(%korn_Test).cptr = CODEPTR(Korn_Test) Task(%Korn_Test).freq = 4 Task(%Korn_Test).flags = %False Task(%Korn_QScale).naam = "QScale" Task(%Korn_QScale).cptr = CODEPTR(Korn_QScale) Task(%Korn_QScale).freq = 2.5 Task(%Korn_QScale).flags = %False Task(%Korn_Hormove).naam = "HorMov" Task(%Korn_Hormove).cptr = CODEPTR(Korn_Hormove) Task(%Korn_Hormove).freq = 2 Task(%Korn_Hormove).flags = %False Task(%Korn_Vermove).naam = "VerMov" Task(%Korn_Vermove).cptr = CODEPTR(Korn_Vermove) Task(%Korn_Vermove).freq = 2 Task(%Korn_Vermove).flags = %False Task(%Korn_LR).naam = "Mot:L-R" Task(%Korn_LR).cptr = CODEPTR(Korn_LR) Task(%Korn_LR).freq = 1 Task(%Korn_LR).flags = %False Task(%Korn_UD).naam = "Mot:U-D" Task(%Korn_UD).cptr = CODEPTR(Korn_UD) Task(%Korn_UD).freq = 1 Task(%Korn_UD).flags = %False Task(%Korn_Lites).naam = "lites" Task(%Korn_Lites).cptr = CODEPTR(Korn_Lites) Task(%Korn_Lites).freq = 2 Task(%Korn_Lites).flags = %False Task(%Korn_13).naam = "V_C13" ' fingerings Task(%Korn_13).cptr = CODEPTR(Korn_13) Task(%Korn_13).freq = 10 Task(%Korn_13).flags = %False Task(%Korn_17).naam = "Aa_C17" Task(%Korn_17).cptr = CODEPTR(Korn_17) Task(%Korn_17).freq = 10 Task(%Korn_17).flags = %False Task(%Korn_tremolo).naam = "Tremolo" ' amplitude modulation Task(%Korn_tremolo).cptr = CODEPTR(Korn_Tremolo) Task(%Korn_tremolo).freq = 16 Task(%Korn_tremolo).flags = %False Task(%Korn_18).naam = "At_C18" Task(%Korn_18).cptr = CODEPTR(Korn_18) Task(%Korn_18).freq = 10 Task(%Korn_18).flags = %False Task(%Korn_20).naam = "Tun_C20" ' tuning controller Task(%Korn_20).cptr = CODEPTR(Korn_20) Task(%Korn_20).freq = 10 Task(%Korn_20).flags = %False ' Task(%Korn_Valve_sx).naam = "ValveSysx" ' as yet to be implemented on PIC2 ' Task(%Korn_Valve_sx).freq = .33 ' Task(%Korn_Valve_sx).cptr = CODEPTR(Korn_Valve_Sysx) 'in m_robots.inc Task(%Korn_25).naam = "Valv_C25" ' valve velocity controller Task(%Korn_25).freq = 8 Task(%Korn_25).cptr = CODEPTR(Korn_25) Task(%Korn_vibrato).naam = "Vibrato" ' frequency modulation Task(%Korn_vibrato).freq = 12 Task(%Korn_vibrato).cptr = CODEPTR(Korn_Vibrato) Task(%Korn_Calls).naam = "Calls" ' demo Task(%Korn_Calls).freq = 24 Task(%Korn_Calls).cptr = CODEPTR(Korn_Calls) Task(%Korn_Moves).naam = "Moves" Task(%Korn_Moves).freq = 4 Task(%Korn_Moves).cptr= CODEPTR(Korn_Moves) ' koperkwartet: Task(%Brass_Calls).naam = "BrasCall" Task(%Brass_Calls).freq = 1 Task(%Brass_Calls).cptr = CODEPTR(Brass_Calls) Task(%Brass_Calls).flags = %False TaskEX(%Brass_Calls).startcptr = CODEPTR(Brass_Calls_Start) TaskEX(%Brass_Calls).stopcptr= CODEPTR(Brass_Calls_Stop) Task(%BraCa_Tc).naam = "BraCaTc" Task(%BraCa_Tc).freq = 2 Task(%BraCa_Tc).cptr = CODEPTR(Brass_Calls_Tc) Task(%BraCa_Tc).flags = %False ' should become hidden task Task(%BraCa_End).naam = "BraCEnd" Task(%BraCa_End).freq = 1 Task(%BraCa_End).cptr = CODEPTR(Brass_Calls_End) Task(%BraCa_End).flags = %False ' should become hidden task Task(%Korn_31).naam = "Mo-speed" Task(%Korn_31).freq = 4 Task(%Korn_31).cptr= CODEPTR(Korn_31) Task(%Korn_90).naam = "C90-PIR" Task(%Korn_90).freq = 4 Task(%Korn_90).cptr= CODEPTR(Korn_90) Task(%Korn_100).naam = "C100" Task(%Korn_100).freq = 4 Task(%Korn_100).cptr= CODEPTR(Korn_100) Task(%Korn_67).naam = "C67-left" Task(%Korn_67).freq = 1 Task(%Korn_67).cptr= CODEPTR(Korn_67) Task(%Korn_68).naam = "C68-right" Task(%Korn_68).freq = 1 Task(%Korn_68).cptr= CODEPTR(Korn_68) Task(%Korn_69).naam = "C69-mid" Task(%Korn_69).freq = 4 Task(%Korn_69).cptr= CODEPTR(Korn_69) Task(%Korn_70).naam = "C70-cal" Task(%Korn_70).freq = 4 Task(%Korn_70).cptr= CODEPTR(Korn_70) ' ButnSw(7).tag0 = "Valves" ' ButnSw(7).tag1 = "Valves" ' ButnSw(7).cptr = CODEPTR(Korn_Valves) ButnOs(9).tag = "fingers" ButnOs(9).cptr = CODEPTR(Korn_Fingerings) ButnOS(10).tag = "Korn Off" ButnOS(10).cptr = CODEPTR(MM_Korn_Off) ' calibration button for motors - ctrl.70 ButnOS(11).tag = "MotPos" ButnOS(11).cptr = CODEPTR(Korn_MotPosCal) ' m = " test & debug" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr SetDlgItemText gh.Cockpit, %GMT_MSG1, "test and evaluation procs" SetDlgItemText gh.Cockpit, %GMT_MSG2, "for our Korn robot" MM_Korn_On FUNCTION = %True END FUNCTION SUB Korn_Scale () LOCAL i AS DWORD STATIC onoff AS DWORD STATIC cnt AS LONG STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC udnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_Scale).tog THEN IF ISFALSE Task(%Korn_Scale).hParam THEN DIM TaskParamLabels(4) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" TaskParamLabels(2)="step" TaskParamLabels(3)= "hilim" TaskParamLabels(4)="lowlim" MakeTaskParameterDialog %Korn_Scale,2, Slider(),3,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_Scale).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 36 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value IF udnr = %False THEN udnr = TaskEX(%Korn_Scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_Scale_UD0) ' step size UDctrl(udnr).value = 1 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 12 UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(Korn_Scale_UD1) ' high note limit UDctrl(udnr+1).value = 96 'Korn.hightes UDctrl(udnr+1).minval = 52 'Korn.lowtes UDctrl(udnr+1).maxval = 96 'Korn.Hightes UDctrl(udnr+2).cptr = CODEPTR(Korn_Scale_UD2) ' low note limit UDctrl(udnr+2).value = 52 UDctrl(udnr+2).minval = 52 'Korn.lowtes '0 UDctrl(udnr+2).maxval = 96 'Korn.Hightes '72 END IF END IF 'Controller Korn.channel, 66, 127 ' niet nodig... 26.01.2006 gwr - not implemented. Task(%Korn_Scale).tog = %True cnt = Korn.Lowtes EXIT SUB END IF IF ISFALSE onoff THEN IF n THEN NoteOff Korn.channel, n n = %False onoff = %True ELSE n = cnt Play Korn.channel, n, Slider(slnr).value 'Slider(slnr).value -(cnt * 2) cnt = cnt + UDCtrl(udnr).value IF cnt > UDctrl(udnr+1).value THEN cnt = UDctrl(udnr+2).value onoff = %False END IF Task(%Korn_Scale).freq = MAX(0.25,Slider(slnr+1).value / 8) END SUB SUB Korn_Scale_UD0 () ' callback on parameter UpDowns step size LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 12 THEN UDctrl(udnr).value = 12 : value = 12 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Korn_Scale_UD1 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpDownNumbers(1) noot = UDCtrl(udnr).value IF noot < UDctrl(udnr+1).value THEN UDctrl(udnr).value = UDctrl(udnr+1).value : noot = UDctrl(udnr+1).value ' IF noot > Korn.HighTes THEN UDctrl(udnr).value = Korn.HighTes : noot = Korn.hightes SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Korn_Scale_UD2 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpDownNumbers(2) noot = UDCtrl(udnr).value ' IF noot < Korn.lowtes THEN UDctrl(udnr).value = Korn.lowtes : noot = Korn.lowtes IF noot > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr-1).value SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 18, "Lo=" & STR$(noot) END SUB SUB Korn_QScale () ' quartertone scale test. STATIC onoff AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_Qscale).tog THEN IF ISFALSE Task(%Korn_QScale).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" MakeTaskParameterDialog %Korn_QScale,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_QScale).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Controller Korn.channel, 17, 84 Korn.ctrl(17) = 84 Controller Korn.channel, 18, 104 Korn.ctrl(18) = 104 Slider(slnr+1).value = 30 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF Controller Korn.channel, 66, 127 ' niet nodig... 26.01.2008 gwr Task(%Korn_QScale).tog = %True n = Korn.Lowtes END IF IF ISFALSE onoff THEN Bend Korn.channel, 0, 64 ' if this is required there is a bug in the pic firmware. ' as of 23.11.2008 we do have this bug however!!! Play Korn.channel, n, Slider(slnr).value onoff = %True ELSE Play Korn.channel, n, Slider(slnr).value Bend Korn.channel, 0, 127 ' or, 64 + 50 = 114 if a step corresponded to a cent, as we first wanted. ' this coding conforms to the PIC implementation and was tested ' to be correct 24.11.2008 - gwr. onoff = %False INCR n END IF IF n > Korn.hightes THEN n= Korn.lowtes Task(%Korn_QScale).freq = MAX(0.25,Slider(slnr+1).value / 4) END SUB SUB Korn_Hormove () ' controller 21 test ' implemented 02.05.2008. ' recoded in PIC1 02.05.2009 ' calibration happens on PIC level after ctrl 21 = 0 and ctrl 21 = 127. ' Give the motor enough time to complete the movements however! ' After these commands have been performed, 64 will correspond to a full center position STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_Hormove).tog THEN IF ISFALSE Task(%Korn_Hormove).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Hor" MakeTaskParameterDialog %Korn_hormove,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_hormove).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL21) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_Hormove).freq = 10 Task(%Korn_Hormove).tog = %TRue END IF Task(%Korn_Hormove).freq = 0.5 END SUB SUB Korn_SL21 () ' slider callback - horizontal movement STATIC slnr AS DWORD slnr = TaskEX(%Korn_Hormove).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(21) THEN Korn.ctrl(21) = Slider(slnr).value Controller Korn.channel, 21, Korn.ctrl(21) END IF END SUB SUB Korn_LR () ' periodic horizontal movement STATIC cnt AS LONG STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL amplitude AS LONG IF ISFALSE Task(%Korn_LR).tog THEN IF ISFALSE Task(%Korn_LR).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Ampli" MakeTaskParameterDialog %Korn_LR,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_LR).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF RESET cnt Task(%Korn_LR).freq = 0.5 'Slider(slnr).value / 20 ' range = 0.05 - 6.35Hz Task(%Korn_LR).tog = %True END IF 'Task(%Korn_LR).freq = MAX(Slider(slnr).value / 20, 0.05) amplitude = Slider(slnr).value / 2 IF ISFALSE cnt MOD 2 THEN Controller Korn.channel, 21, 64 + amplitude ELSE Controller Korn.channel, 21, 64 - amplitude END IF INCR cnt END SUB SUB Korn_UD () ' periodic vertical movement - ctrl 22 ' hardware en firmware test STATIC cnt AS LONG STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL amplitude AS LONG IF ISFALSE Task(%Korn_UD).tog THEN IF ISFALSE Task(%Korn_UD).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Ampli" MakeTaskParameterDialog %Korn_UD,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_UD).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF RESET cnt Task(%Korn_UD).freq = 0.2 'Slider(slnr).value / 20 ' range = 0.05 - 6.35Hz Task(%Korn_UD).tog = %True END IF amplitude = Slider(slnr).value / 2 IF ISFALSE cnt MOD 2 THEN Controller Korn.channel, 22, 64 + amplitude ELSE Controller Korn.channel, 22, 64 - amplitude END IF INCR cnt END SUB SUB Korn_Vermove () ' controller 22 test - vertical movement STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_Vermove).tog THEN IF ISFALSE Task(%Korn_Vermove).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Ver" MakeTaskParameterDialog %Korn_Vermove,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_Vermove).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL22) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_Vermove).freq = 10 Task(%Korn_VERmove).tog = %TRue END IF Task(%Korn_Vermove).freq = 0.5 END SUB SUB Korn_SL22 () ' slider callback - vertical movement STATIC slnr AS DWORD slnr = TaskEX(%Korn_Vermove).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(22) THEN Korn.ctrl(22) = Slider(slnr).value Controller Korn.channel, 22, Korn.ctrl(22) END IF END SUB SUB Korn_Vibrato () ' vibrato test met de pitchbend STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Korn_vibrato).tog THEN IF ISFALSE Task(%Korn_vibrato).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" ' pitch deviation MakeTaskParameterDialog %Korn_vibrato,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_vibrato).SliderNumbers(0) Slider(slnr).value = 63 Task(%Korn_vibrato).freq = 64/4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' geen vibrato SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF cnt = %False Task(%Korn_vibrato).tog = %True END IF ' not very good code yet! we should do it much more gradually IF slider(slnr).value THEN Task(%Korn_vibrato).freq = slider(slnr).value / 4 ' max 32Hz IF ISFALSE cnt MOD 2 THEN bend Korn.channel, 0, 63 + (slider(slnr+1).value/ 2) ELSE bend Korn.channel, 0, 64 - (slider(slnr+1).value /2) END IF INCR cnt ELSE Bend Korn.channel, 0, 64 ' reset stoptask %Korn_Vibrato END IF END SUB SUB Korn_17 () ' controller 17 test ' This controls the maximum amplitude of the attack STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_17).tog THEN IF ISFALSE Task(%Korn_17).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C17" MakeTaskParameterDialog %Korn_17,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_17).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL17) Slider(slnr).value = 86 Korn.ctrl(17) = 86 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_17).freq = 10 Task(%Korn_17).tog = %TRue END IF Task(%Korn_17).freq = 0.5 END SUB SUB Korn_SL17 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_17).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(17) THEN Korn.ctrl(17) = Slider(slnr).value Controller Korn.channel, 17, Korn.ctrl(17) END IF END SUB SUB Korn_18 () ' controller 18 test - this sets the duration of the attack pulse ' ds pic board. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_18).tog THEN IF ISFALSE Task(%Korn_18).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C18" MakeTaskParameterDialog %Korn_18,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_18).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Korn_sl18) Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_18).freq = 0.4 Task(%Korn_18).tog = %TRue END IF END SUB SUB Korn_SL18 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_18).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(18) THEN Korn.ctrl(18) = Slider(slnr).value Controller Korn.channel, 18, Korn.ctrl(18) END IF END SUB SUB Korn_Tremolo () ' controller 17 test for tremolo - DS pic controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Korn_tremolo).tog THEN IF ISFALSE Task(%Korn_tremolo).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" MakeTaskParameterDialog %Korn_tremolo,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_tremolo).SliderNumbers(0) Slider(slnr).value = 8 Slider(slnr+1).value = 20 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value END IF cnt = %False Task(%Korn_Tremolo).tog = %True END IF IF Slider(slnr).value THEN Task(%Korn_Tremolo).freq = Slider(slnr).value ELSE EXIT SUB END IF IF Slider(slnr+1).value THEN IF cnt MOD 2 THEN Controller Korn.channel, 17, Korn.ctrl(17) ELSE Controller Korn.channel, 17, Korn.ctrl(17) * (Slider(slnr+1).value / 127) END IF INCR cnt END IF END SUB SUB Korn_25 () ' controller 25 , as on bono ' steers de velocities wherewith the solenoids will activate the valves. ' controlled by PIC2 on the pulse/velo board. ' This controller is for hardware development and not intended to be used by composers. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_25).tog THEN IF ISFALSE Task(%Korn_25).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="valv25" MakeTaskParameterDialog %Korn_25,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_25).SliderNumbers(0) Korn.ctrl(25) = 18 Slider(slnr).value = Korn.ctrl(25) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_25).freq = 5 Task(%Korn_25).tog = %True END IF IF slider(slnr).value <> Korn.ctrl(25) THEN Korn.ctrl(25) = Slider(slnr).value Controller Korn.channel, 25, Korn.ctrl(25) END IF END SUB SUB Korn_20 () ' tuning to diapason. [quartertone up max. range] ' controller 20 STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_20).tog THEN IF ISFALSE Task(%Korn_20).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="tune" MakeTaskParameterDialog %Korn_20,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_20).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL20) Slider(slnr).value = Korn.ctrl(20) ' 0 = 440Hz SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_20).freq = 0.45 Task(%Korn_20).tog = %True END IF END SUB SUB Korn_SL20 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_20).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(20) THEN Korn.ctrl(20) = Slider(slnr).value Controller Korn.channel, 20, Korn.ctrl(20) END IF END SUB SUB Korn_Lites () ' updated 15.05.2008, 31.10.2010 STATIC cnt AS LONG STATIC udnr AS DWORD STATIC slnr AS DWORD STATIC lite AS BYTE IF ISFALSE Task(%Korn_Lites).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Nr." IF ISFALSE Task(%Korn_Lites).hParam THEN MakeTaskParameterDialog %Korn_Lites,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Lites).SliderNumbers(0) Slider(slnr).minval =1 ' tempo Slider(slnr).maxval = 127 Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF IF udnr = %False THEN udnr = TaskEX(%Korn_Lites).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_Lites_UD) ' nr. updown UDctrl(udnr).value = 118 UDctrl(udnr).minval = 118 UDctrl(udnr).maxval = 127 UDctrl(udnr).stap = 1 END IF Task(%Korn_Lites).tog = %True END IF ' lites controlled by PIC2 'IF BIT (cnt,0) THEN Play Korn.channel, 127,1 ELSE Play Korn.channel, 127,0 'IF BIT (cnt,1) THEN Play Korn.channel, 126,1 ELSE Play Korn.channel, 126,0 'IF BIT (cnt,2) THEN Play Korn.channel, 124,1 ELSE Play Korn.channel, 124,0 ' Harley Davidson lite IF lite <> UDctrl(udnr).value THEN NoteOff Korn.channel, lite lite = UDctrl(udnr).value END IF IF ISFALSE cnt MOD 2 THEN Play Korn.channel, lite, 127 ELSE Play Korn.channel, lite, 0 END IF INCR cnt Task(%Korn_Lites).freq = MAX(1,(Slider(slnr).value / 4)) END SUB SUB Korn_Lites_UD () ' callback on parameter UpDowns. : lite number LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Lites).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 127 THEN UDctrl(udnr).value = 127 : value = 127 IF value < 118 THEN UDCTRL(udnr).value = 118 : value = 118 SetDlgItemText Task(%Korn_Lites).hparam, %GMT_TEXT0_ID + 16, STR$(value) END SUB SUB Korn_Test() STATIC slnr AS DWORD STATIC udnr AS DWORD LOCAL value AS LONG STATIC noot AS BYTE STATIC onfreq AS SINGLE STATIC offFreq AS SINGLE STATIC oldnote AS BYTE STATIC resetval AS BYTE LOCAL velo AS BYTE LOCAL period AS SINGLE LOCAL onpart AS SINGLE LOCAL offpart AS SINGLE IF ISFALSE Task(%Korn_Test).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" ' rescaled in proc. TaskParamLabels(1) = "Velo" ' drive volume 0-127 - velocity byte TaskParamLabels(3) = "Stac" ' staccato - legato up down ' UD0 TaskParamLabels(4) = "Note" ' pitch ' UD1 TaskParamLabels(2) = "Bend" ' pitch-bend value 'SL2 - was UD2 IF ISFALSE Task(%Korn_Test).hParam THEN MakeTaskParameterDialog %Korn_Test,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Test).SliderNumbers(0) Slider(slnr).minval =1 ' tempo Slider(slnr).maxval = 127 Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+2).value = 64 Slider(slnr+2).minval = 0 Slider(slnr+2).maxval = 127 SendMessage Slider(slnr + 2).h, %TBM_SETPOS, %True, SlideR(slnr + 2).value END IF IF udnr = %False THEN udnr = TaskEX(%Korn_Test).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_UD0) ' staccato - legato updown UDctrl(udnr).value = 50 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 100 UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(Korn_UD1) ' pitch up down (note) UDctrl(udnr+1).value = Korn.lowtes UDctrl(udnr+1).minval = Korn.lowtes UDctrl(udnr+1).maxval = Korn.Hightes ' UDctrl(udnr+2).cptr = CODEPTR(Korn_UD2) ' pitchbend value ' UDctrl(udnr+2).value = 64 ' UDctrl(udnr+2).minval = 0 ' UDctrl(udnr+2).maxval = 127 resetval = 64 END IF Task(%Korn_Test).tog = %True END IF period = 1! / (Slider(slnr).value / 10!) ' tempo Task(%Korn_Test).tempo = 60 / period ' on-off periods: onpart = period * (UDctrl(udnr).value / 100!) ' 0 - 100 offpart = period - onpart ' 100 - 0 IF UDctrl(udnr).value < 1 THEN ' silence IF oldnote THEN NoteOff Korn.channel, oldnote oldnote = %False END IF offFreq = 1! / period Task(%Korn_Test).freq = OffFreq EXIT SUB ELSE onfreq = 1!/onpart END IF IF UDctrl(udnr).value > 99 THEN ' legato, no note offs oldnote = %False ELSE offFreq = 1! /Offpart END IF IF oldnote THEN NoteOff Korn.channel, oldnote Task(%Korn_Test).freq = OffFreq oldnote = %False ELSE noot = UDctrl(udnr+1).value velo = Slider(slnr+1).value ' IF BIT(Korn.ctrl(13), 2) THEN Controller Korn.channel, 13, Korn.ctrl(13) Play Korn.channel, noot, velo Bend Korn.channel, 0, Slider(slnr + 2).value 'UDctrl(udnr+2).value Task(%Korn_Test).freq = OnFreq oldnote = noot END IF IF Task(%Korn_Test).freq < 0.2 THEN Task(%Korn_Test).freq = 0.2 END SUB SUB Korn_UD0 () ' callback on parameter UpDowns. : on/off proportion LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 99 THEN UDctrl(udnr).value = 100 : value = 100 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 16, "L=" & STR$(value) END SUB SUB Korn_UD1 () ' controls the notes to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 17, "N=" & STR$(noot) END SUB SUB Korn_UD2 () ' ' pitchbend UD - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpDownNumbers(2) value = UDCtrl(udnr).value IF value > 127 THEN value = 127 IF value < 0 THEN value = 0 SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 18, "b=" & STR$(value) ' sending is in the main task. END SUB SUB Korn_Calls () STATIC tc AS CUR STATIC note AS CUR STATIC cnt AS LONG STATIC oldnote AS CUR STATIC rest AS LONG LOCAL f AS CUR LOCAL harnr AS INTEGER LOCAL velo AS BYTE ' demo stukje gwr - this plays in just intonation harmonic overtones. (religious version) ' first rough sketch... IF ISFALSE Task(%Korn_Calls).tog THEN tc = 58 ' start on Bb cnt = 0 Task(%Korn_Calls).tog = %True END IF IF rest = 2 THEN Task(%Korn_Calls).freq = 1 rest = 1 EXIT SUB END IF IF rest = 1 THEN IF FRAC(oldnote) <= 0.5 THEN Play Korn.channel, FIX(oldnote),velo '- (harnr * 2) Bend Korn.channel, 0, 63 + (FRAC(oldnote) * 128) ELSE Play Korn.channel, FIX(oldnote+1), velo Bend Korn.channel, 0, (1 - FRAC(oldnote)) *128 ' checked 24.11.2008 END IF rest = 0 Task(%Korn_Calls).freq = 2 EXIT SUB END IF velo = 100 harnr = RND(1) * 12 f = NF2F(tc) * harnr note = F2NF(f) IF note >= Korn.hightes + 1 THEN note = note - 12 IF note = oldnote THEN rest = 2 EXIT SUB ELSE IF FRAC(note) <= 0.5 THEN Play Korn.channel, FIX(note), velo Bend Korn.channel, 0, 63 + (FRAC(note) * 128) ELSE Play Korn.channel, FIX(note + 1), velo Bend Korn.channel, 0, (1-FRAC(note)) * 128 END IF ' following was wrong: 'Play Korn.channel, FIX(note),velo - (harnr * 2) 'Bend Korn.channel, 0, 64 + ((FRAC(note) - 0.5) * 127) rest = %False END IF INCR cnt IF ISFALSE cnt MOD 24 THEN f = NF2F(tc) f = f * 3!/2! tc = F2NF(f) IF tc > 63 THEN tc = tc - 12 END IF Task(%Korn_Calls).freq = 4 oldnote = note END SUB FUNCTION Korn_MotPosCal () AS LONG ' called on the one shot cockpit button nr. 12 ' ctrl 70 implemented but not functioning correctly. ' 31.10.2010: Now this ought to work correctly... Controller Korn.channel, 70, 64 END FUNCTION SUB Korn_Moves () STATIC h AS LONG STATIC v AS LONG STATIC hs AS LONG STATIC vs AS LONG STATIC slnr AS DWORD STATIC cnt AS DWORD STATIC stepsize AS LONG IF ISFALSE task(%Korn_Moves).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "v-hor" TaskParamLabels(1) = "v-ver" IF ISFALSE Task(%Korn_Moves).hParam THEN MakeTaskParameterDialog %Korn_Moves,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Moves).SliderNumbers(0) Slider(slnr).minval = 2 ' hor tempo Slider(slnr).maxval = 127 Slider(slnr).value = 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).minval = 2 ' ver tempo Slider(slnr+1).maxval = 127 Slider(slnr+1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF h = 64 v = 82 stepsize = 4 hs = stepsize '1 vs = stepsize '1 cnt = %False Task(%Korn_Moves).tog = %True END IF IF ISFALSE cnt MOD (128 - Slider(slnr).value) THEN h = h + hs END IF IF h > 127 THEN h = 127 IF h < 0 THEN h = 0 IF ISFALSE cnt MOD (128 - Slider(slnr+1).value) THEN v = v + vs END IF IF v > 127 THEN v = 127 IF v < 0 THEN v = 0 IF h <> Korn.ctrl(21) THEN Controller Korn.channel, 21, h Korn.ctrl(21) = h END IF IF v <> Korn.ctrl(22) THEN Controller Korn.channel, 22, v Korn.ctrl(22) = v END IF IF h => 127 THEN hs = - stepsize END IF IF h <= 0 THEN hs = stepsize END IF IF v >= 127 THEN vs = -stepsize END IF IF v <= 0 THEN vs = stepsize END IF INCR cnt Task(%Korn_Moves).freq = 8 END SUB SUB Korn_13 () LOCAL i AS DWORD STATIC onoff AS DWORD STATIC cnt AS LONG STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC udnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_13).tog THEN IF ISFALSE Task(%Korn_13).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="bits345" TaskParamLabels(1)="012" MakeTaskParameterDialog %Korn_13,1, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_13).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value IF udnr = %False THEN udnr = TaskEX(%Korn_13).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_13_UD0) ' step size UDctrl(udnr).value = 0 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 4 UDctrl(udnr).stap = 1 END IF END IF Task(%Korn_13).tog = %True END IF n = slider(slnr).value \ 16 ' 0-7 - 3 bits for the valves IF UDctrl(udnr).value = 4 THEN n = n * 8 ' bits 3,4,5 for the valves n = n + 4 ' set bit 2, bit 0 and 1 must be 0 ELSE n = MIN(UDctrl(udnr).value, 3) ' set bits 0 and 1 END IF IF Korn.ctrl(13) <> n THEN Controller Korn.channel, 13, n Korn.ctrl(13) = n END IF Task(%Korn_13).freq = 20 END SUB SUB Korn_13_UD0 () ' callback on parameter UpDowns lowest 2 bits LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_13).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 4 THEN UDctrl(udnr).value = 4 : value = 4 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_13).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Brass_Calls () ' stukje in just intonation voor koperkwartet: Korn, Heli, Bono, So ' optional percussion in just intonation. ' met de huidige kode is de duur varierend van 4' tot 6'40" (elke keer anders!) ' de duur kan niet korter zijn van 4'. LOCAL f AS CUR LOCAL harnr AS INTEGER LOCAL tst AS INTEGER LOCAL retval AS SINGLE LOCAL kloknoot AS CUR LOCAL i AS LONG LOCAL j AS LONG LOCAL interval AS CUR STATIC einde AS LONG STATIC slnr AS LONG STATIC nrkloks AS DWORD LOCAL ex AS SINGLE ' probabilistische exponent STATIC duur AS SINGLE STATIC start AS SINGLE IF ISFALSE Task(%Brass_Calls).tog THEN IF ISFALSE Task(%Brass_Calls).hParam THEN DIM TaskParamLabels(4) AS LOCAL ASCIIZ * 8 TaskParamLabels(0)="korn" TaskParamLabels(1)="bono" TaskParamLabels(2)="heli" TaskParamLabels(3)= "so" TaskParamLabels(4) = "tempo" MakeTaskParameterDialog %Brass_Calls,5, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Brass_Calls).SliderNumbers(0) Slider(slnr).value = 120 ' korn SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 94 ' bono SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 64 ' heli SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value Slider(slnr+3).value = 48 ' so SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value Slider(slnr+4).value = 60 '64 tempo slider Sendmessage Slider(slnr+4).h, %TBM_SETPOS, %True, Slider(slnr+4).value END IF SetDlgItemText gh.Cockpit, %GMT_LABEL_MSG1, "Tonal Center" ' bovenste text-box SetDlgItemText gh.Cockpit, %GMT_LABEL_MSG2, "Counter" ' onderste text-box RESET BraCa ' to make a restart possible BraCa.tc = 22.0 ' start on Bb einde = %False nrkloks = %False duur = %False start = TIMER ' resolution = 1 cs retval = PlayKloks (22,64,2,0,0) ' this initializes the function. 'SetDlgItemText gh.Cockpit, %GMT_TITLE, STR$(F2NF(442))= 69.08 ' STR$(F2NF(435)) = 68.80 SetDlgItemText gh.Cockpit, %GMT_TITLE, "Just Calls for Brass" Task(%Brass_Calls).freq = 1 Task(%Brass_Calls).tog = %True StartTask %BraCa_TC ' adds other sounds as the tonal center changes EXIT SUB END IF IF einde THEN stoptask %Brass_Calls SELECT CASE BraCa.rest CASE 1 ' nootherhalingen IF BraCa.oldn(0) THEN IF FRAC(BraCa.oldn(0)) <= 0.5 THEN Play Korn.channel, FIX(BraCa.oldn(0)),BraCa.v(0) Bend Korn.channel, 0, 63 + (FRAC(BraCa.oldn(0)) * 128) ELSE Play Korn.channel, FIX(BraCa.oldn(0)+1), BraCa.v(0) Bend Korn.channel, 0, (1 - FRAC(BraCa.oldn(0))) *128 ' checked 24.11.2008 END IF ELSE NoteOff Korn.channel, BraCa.n(0) END IF IF BraCa.oldn(1) THEN IF FRAC(BraCa.oldn(1)) <= 0.5 THEN Play Bono.channel, FIX(BraCa.oldn(1)),BraCa.v(1) Bend Bono.channel, 0, 63 + (FRAC(BraCa.oldn(1)) * 128) ELSE Play Bono.channel, FIX(BraCa.oldn(1)+1), BraCa.v(1) Bend Bono.channel, 0, (1 - FRAC(BraCa.oldn(1))) *128 END IF ELSE Noteoff Bono.channel, BraCa.n(1) END IF IF BraCa.oldn(2) THEN IF FRAC(BraCa.oldn(2)) <= 0.5 THEN Play Heli.channel, FIX(BraCa.oldn(2)),BraCa.v(2) Bend Heli.channel, 0, 63 + (FRAC(BraCa.oldn(2)) * 128) ELSE Play Heli.channel, FIX(BraCa.oldn(2)+1), BraCa.v(2) Bend Heli.channel, 0, (1 - FRAC(BraCa.oldn(2))) *128 END IF ELSE Noteoff Heli.channel, BraCa.n(2) END IF IF BraCa.oldn(3) THEN IF FRAC(BraCa.oldn(3)) <= 0.5 THEN Play So.channel, FIX(BraCa.oldn(3)),BraCa.v(3) Bend So.channel, 0, 63 + (FRAC(BraCa.oldn(3)) * 128) ELSE Play So.channel, FIX(BraCa.oldn(3)+1), BraCa.v(3) Bend So.channel, 0, (1 - FRAC(BraCa.oldn(3))) *128 END IF ELSE NoteOff So.channel, BraCa.n(3) END IF ' add percussion: IF BraCa.oldn(3) THEN retval = PlayKloks (BraCa.oldn(3),64,4, 0,0) IF ISFALSE retval THEN IF BraCa.oldn(2) THEN retval = Playkloks( BraCa.oldn(2), 64, 4, 0 , 0) END IF IF ISFALSE retval THEN IF BraCa.oldn(1) THEN retval = Playkloks (BraCa.oldn(1), 64, 3, 0,0) END IF IF ISFALSE retval THEN IF BraCa.oldn(0) THEN retval = PlayKloks (BraCa.oldn(0), 64, 3, 0,0) END IF IF ISFALSE retval THEN harnr = 1 DO kloknoot = SpectralnoteF(Braca.tc, harnr,0,%True) IF kloknoot > 127 THEN EXIT LOOP retval = PlayKloks (kloknoot, 64 , 2, 0,0) INCR harnr LOOP UNTIL retval END IF ' IF retval THEN ' INCR nrkloks ' for debug and monitoring only ' SetDlgItemText gh.Cockpit, %GMT_TITLE, STR$(nrkloks) ' END IF ' end add percussion section BraCa.rest = 0 Task(%Korn_Calls).freq = Slider(slnr+4).value / 32 EXIT SUB CASE 2 Task(%Brass_Calls).freq = Slider(slnr+4).value / 64 ' hold BraCa.oldn(0) = %False BraCa.rest = 1 EXIT SUB CASE 3 Task(%Brass_Calls).freq = Slider(slnr+4).value / 48 ' hold BraCa.oldn(3) = %False BraCa.rest = 1 EXIT SUB CASE 4 ' added 16.12 Task(%Brass_Calls).freq = Slider(slnr+4).value / 27 ' hold BraCa.rest = 1 EXIT SUB END SELECT BraCa.v(0) = Slider(slnr).value BraCa.v(1) = Slider(slnr+1).value BraCa.v(2) = Slider(slnr+2).value BraCa.v(3) = Slider(slnr+3).value 'probabilistische exponent: 'eventueel te begrenzen tot maxval 2 of 3 ex = 1! + (BraCa.cnt/330.0) ' was 340 ' zoek noot voor Korn: tst = %False DO harnr = (RND(1)^ex) * 48 ' integer BraCa.n(0) = SpectralNoteF (BraCa.tc, harnr,0,%True) IF (BraCa.n(0) >= 58) AND (BraCa.n(0) <= 96) THEN IF BraCa.oldn(0) THEN ' grote intervalsprongen vermijden: SELECT CASE ABS(BraCa.n(0) - BraCa.oldn(0)) CASE =< 3 tst = %True CASE 6.95 TO 7.05 ' kwintsprong tst = %True CASE 12 tst = %True ' oktaafsprong END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True ' zoek noot voor Bono: tst = %False DO harnr = (RND(1)^ex) * 36 BraCa.n(1) = SpectralNoteF (BraCa.tc,harnr,0,%True) IF (BraCa.n(1) >= 34) AND (BraCa.n(1) <= 88) THEN IF BraCa.oldn(1) THEN SELECT CASE ABS(BraCa.n(1) - BraCa.oldn(1)) CASE =< 3 tst = %True CASE 6.97 TO 7.03 tst = %True CASE 12 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True ' zoek noot voor Heli: tst = %False DO harnr = (RND(1)^ex) * 28 ' integer BraCa.n(2) = SpectralNoteF (BraCa.tc, harnr, 0, %True) IF (BraCa.n(2) >= BraCa.tc) AND (BraCa.n(2) <= 75) THEN IF BraCa.oldn(2) THEN SELECT CASE ABS(BraCa.n(2) - BraCa.oldn(2)) CASE =< 4 tst = %True CASE 6.98 TO 7.02 tst = %True CASE 12 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True ' zoek noot voor So: tst = %False DO harnr = (RND(1)^ex) * 24 BraCa.n(3) = SpectralNoteF (BraCa.tc- 12, harnr, 0, %True) IF (BraCa.n(3) >= BraCa.tc-12) AND (BraCa.n(3) <= 39) THEN IF BraCa.oldn(3) THEN SELECT CASE ABS(BraCa.n(3) - BraCa.oldn(3)) CASE <=12 tst = %TRue CASE 18.95 TO 19.05 'duodeciem sprong tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True Braca.unisons = %False IF ABS((BraCa.n(0) MOD 12) - (BraCa.n(1) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF ABS((BraCa.n(0) MOD 12) - (BraCa.n(2) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF ABS((BraCa.n(0) MOD 12) - (BraCa.n(3) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF ABS((BraCa.n(1) MOD 12) - (BraCa.n(2) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF ABS((BraCa.n(1) MOD 12) - (BraCa.n(3) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF ABS((BraCa.n(2) MOD 12) - (BraCa.n(3) MOD 12)) < 0.02 THEN INCR BraCa.unisons IF BraCa.unisons > 4 THEN ' was >= duur = TIMER - start IF (duur > 240) AND (FRAC(BraCa.tc) > 0.5) THEN ' minimum duur is 4 minuten 180 THEN ' we moeten minstens een kwarttoon verschoven zijn. einde = %True Task(%Brass_Calls).freq = 0.25 ' 4 seconds hold ELSE Task(%Brass_Calls).freq = 0.5 ' 2 seconds hold END IF END IF IF (BraCa.n(0) = BraCa.oldn(0)) THEN IF RND(1) < 0.3 THEN BraCa.rest = 2 EXIT SUB ' causes a repeat - same note in Korn END IF END IF IF BraCa.n(3) = BraCa.oldn(3) THEN IF RND(1) < 0.2 THEN ' thinning BraCa.rest = 3 ' causes a repeat - same note in So EXIT SUB END IF END IF ' triadic consonant case BraCa.fifths = 0 BraCa.thirds = 0 FOR i = 0 TO 2 FOR j = i+1 TO 3 interval = ABS((BraCa.n(i) MOD 12) - (BraCa.n(j) MOD 12)) IF (interval > 6.95) AND (interval < 7.05) THEN INCR BraCa.fifths IF (interval > 4.95) AND (interval < 5.05) THEN INCR Braca.fifths IF (interval > 3.0) AND (interval < 4.05) THEN INCR Braca.thirds IF (interval > 9.0) AND (interval < 7.95) THEN INCR BraCa.thirds NEXT j NEXT i IF ((BraCa.unisons AND Braca.fifths) AND Braca.thirds) THEN Braca.Rest = 4 EXIT SUB END IF ' interval = ABS((BraCa.n(0) MOD 12) - (BraCa.n(1) MOD 12)) ' interval tussen korn en bono ' if interval > 6.95 and interval < 7.05 then fifth = %True ' interval = ABS((BraCa.n(1) MOD 12) - (BraCa.n(2) MOD 12)) ' interval tussen bono en heli ' IF INT((BraCa.n(0) MOD 12) - (BraCa.n(1) MOD 12)) = 5 THEN ' IF INT((BraCa.n(1) MOD 12) - (BraCa.n(2) MOD 12)) = 3 THEN ' IF INT((BraCa.n(2) MOD 12) - (BraCa.n(3) MOD 12)) = 12 THEN ' BraCa.rest = 4 ' EXIT SUB ' END IF ' END IF ' END IF ' playing procedure: IF FRAC(BraCa.n(0)) <= 0.5 THEN Play Korn.channel, FIX(BraCa.n(0)), BraCa.v(0) Bend Korn.channel, 0, 63 + (FRAC(BraCa.n(0)) * 128) ' verhogen ELSE Play Korn.channel, FIX(BraCa.n(0) + 1), BraCa.v(0) ' midi noot + 1 Bend Korn.channel, 0, (1-FRAC(BraCa.n(0))) * 128 ' verlagen END IF IF FRAC(BraCa.n(1)) <= 0.5 THEN Play Bono.channel, FIX(BraCa.n(1)), BraCa.v(1) Bend Bono.channel, 0, 63 + (FRAC(BraCa.n(1)) * 128) ELSE Play Bono.channel, FIX(BraCa.n(1) + 1), BraCa.v(1) Bend Bono.channel, 0, (1-FRAC(BraCa.n(1))) * 128 END IF IF FRAC(BraCa.n(2)) <= 0.5 THEN Play Heli.channel, FIX(BraCa.n(2)), BraCa.v(2) Bend Heli.channel, 0, 63 + (FRAC(BraCa.n(2)) * 128) ELSE Play Heli.channel, FIX(BraCa.n(2) + 1), BraCa.v(2) Bend Heli.channel, 0, (1-FRAC(BraCa.n(2))) * 128 END IF IF FRAC(BraCa.n(3)) <= 0.5 THEN Play So.channel, FIX(BraCa.n(3)), BraCa.v(3) Bend So.channel, 0, 63 + (FRAC(BraCa.n(3)) * 128) ELSE Play So.channel, FIX(BraCa.n(3) + 1), BraCa.v(3) Bend So.channel, 0, (1-FRAC(BraCa.n(3))) * 128 END IF BraCa.rest = %False SELECT CASE BraCa.unisons CASE 0 Task(%Brass_Calls).freq = Slider(slnr+4).value / 12 ' 3 x 4 = 3 x 2 x 2 ' 8 CASE 1 Task(%Brass_Calls).freq = Slider(slnr+4).value / 16 ' 2 x 2 x 2 x 2 '12 CASE 2 Task(%Brass_Calls).freq = Slider(slnr+4).value / 21 ' 3x 7 '16 CASE 3 Task(%Brass_Calls).freq = Slider(slnr+4).value / 25 ' 2 x 2 x 5 '24 CASE 4 Task(%Brass_Calls).freq = Slider(slnr+4).value / 27 ' 3 x 3 x 3 'added 13.12.2008 CASE 5 ' stoptask %Brass_Calls END SELECT INCR BraCa.cnt BraCa.oldn(0) = BraCa.n(0) BraCa.oldn(1) = BraCa.n(1) BraCa.oldn(2) = BraCa.n(2) ' hier eventueel extra konditie toevoegen, bvb. unisons < 3 IF ISFALSE BraCa.cnt MOD 17 THEN '19, 24 THEN ' bepaalt de snelheid van de transpositiecycli f = NF2F(BraCa.tc) f = f * 3! ' /2! -try out... BraCa.tc = F2NF(f) IF BraCa.tc > 34 THEN DO BraCa.tc = BraCa.tc - 12 ' note that BraCa.tc is also fractional!!! LOOP UNTIL BraCa.tc < 35 END IF IF FRAC(BraCa.tc) <= 0.5 THEN Play So.channel, FIX(BraCa.tc), 80 Bend So.channel, 0, 63 + (FRAC(BraCa.tc) * 128) ELSE Play So.channel, FIX(BraCa.tc + 1), 80 Bend So.channel, 0, (1-FRAC(BraCa.tc)) * 128 END IF BraCa.oldn(3) = BraCa.tc BraCa.oldn(0) = %False ' zonder dit kan de melodiseerfunktie vastlopen!!! BraCa.oldn(1) = %False Braca.oldn(2) = %False ' calculate new tonerow: harnr = 1 DO BraCa.tonerow(harnr)= SpectralNoteF (BraCa.tc, harnr, 0, %True) IF BraCa.tonerow(harnr) > 120 THEN BraCa.tonerow(harnr) = %False 'EXIT LOOP END IF INCR Harnr LOOP UNTIL Harnr > 48 ELSE BraCa.oldn(3) = BraCa.n(3) END IF SetDlgItemText gh.Cockpit, %GMT_MSG1, STR$(BraCa.tc) ' bovenste text-box SetDlgItemText gh.Cockpit, %GMT_MSG2, STR$(BraCa.cnt) ' onderste text-box END SUB SUB Brass_Calls_Start () LOCAL harnr AS LONG RANDOMIZE CVS(CHR$(255,255,255,255)) ' this way we always reset the rnd generator and ' obtain an always predictable result BraCa.tc = 22.0 MM_Korn_On Controller Korn.channel, 17, 112 '87 Controller Korn.channel, 18, 103 '105 harnr = 1 DO BraCa.tonerow(harnr)= SpectralNoteF (BraCa.tc, harnr, 0, %True) IF BraCa.tonerow(harnr) > 120 THEN EXIT LOOP INCR Harnr LOOP UNTIL Harnr > 48 MM_Bono_On Controller Bono.channel, 7, 48 Controller Bono.channel, 17, 120 '64 Controller Bono.channel, 18, 110 '105 Controller Bono.channel, 19, 120 '107 MM_Heli_On MM_So_On Controller So.channel, 1, 18 ' wind Controller So.channel, 7, 105 ' volume Controller So.channel, 18, 122 ' attack MM_So_On %MM_Red OR %MM_White MM_Heli_On %MM_White ' not yet implemented Controller Heli.channel, 7, 64 '18 ' optor Controller Heli.channel, 17, 73 '84 ' volume Controller Heli.channel, 18, 125 '100 ' attack Controller Heli.channel, 19, 110 '112 ' release MM_Korn_On %MM_Blue OR %MM_White 'MM_Bono_On %MM_Yellow - still needs bug fix!!! Play So.channel, 22, 100 MM_Belly_On MM_Vitello_On MM_Llor_On ' vacca has no switch Task(%Brass_Calls).freq = 0.5 END SUB SUB Brass_Calls_Stop () IF Task(%Braca_Tc).swit THEN stoptask %Braca_Tc StartTask %Braca_End 'MM_AllOff 'SLEEP 3000 ' volgende werkte niet steeds goed... (Korn en So bleven plakken...) 'MM_Korn_Off 'MM_Heli_Off 'MM_So_Off 'MM_Bono_Off END SUB SUB Brass_Calls_TC () ' slave task for Calls for Brass ' the BraCa structure is a global, so we can access it here. ' bourdons toevoegen: STATIC oldtc AS CUR IF oldtc <> Braca.tc THEN SELECT CASE FRAC(BraCa.tc) CASE 0.00 TO 0.02 ' 440Hz tuning MM_Tubi_On Play Vibi.channel, 72 + FIX(BraCa.tc MOD 12), 120 CASE 0.07 TO 0.09 '0.08 ' 442Hz tuning - Vibi MM_Vibi_On Play Vibi.channel, 60 + INT(BraCa.tc MOD 12), 120 CASE 0.78 TO 0.82 '0.80 ' harma tuning 435Hz MM_Harma_On Play Harma.channel, FIX(BraCa.tc+1), 64 Harma.ctrl(80) = %True CASE 0.48 TO 0.52 '0.50 ' quartertones - Qt, tubi, puff, xy MM_Tubi_On Play Tubi.channel,24 + FIX(BraCa.tc MOD 12), 127 END SELECT IF (FRAC(BraCa.tc) <0.78) OR (FRAC(Braca.tc) >0.82) THEN IF Harma.ctrl(80) THEN MM_Harma_Off Harma.ctrl(80) = %False END IF END IF oldtc = Braca.tc END IF END SUB SUB Brass_Calls_End () ' %Braca_End ' slotformule voor Just Calls for Brass STATIC cnt AS DWORD LOCAL retval AS SINGLE LOCAL harnr AS LONG LOCAL kloknoot AS SINGLE IF ISFALSE Task(%Braca_End).tog THEN MM_Tubi_On cnt = %False Task(%Braca_End).freq = 1 Task(%Braca_End).tog = %True END IF SELECT CASE cnt CASE 0 IF FRAC(BraCa.tc) <= 0.5 THEN Play So.channel, FIX(BraCa.tc), 85 Bend So.channel, 0, 63 + (FRAC(BraCa.tc) * 128) ELSE Play So.channel, FIX(BraCa.tc + 1), 80 Bend So.channel, 0, (1-FRAC(BraCa.tc)) * 128 END IF harnr = 1 DO IF BraCa.tonerow(harnr) > %False THEN retval = PlayKloks (Braca.tonerow(harnr),70, 2, 0, 0) ELSE EXIT LOOP END IF 'kloknoot = SpectralnoteF(Braca.tc, harnr,0,%True) 'IF kloknoot > 127 THEN EXIT LOOP 'retval = PlayKloks (kloknoot, 64 , 2, 0,0) INCR harnr LOOP UNTIL harnr > 48 'retval CASE 1 IF FRAC(BraCa.tc) <= 0.5 THEN Play Heli.channel, FIX(BraCa.tc+12), 75 '80 ' tc * 2 Bend Heli.channel, 0, 63 + (FRAC(BraCa.tc) * 128) ELSE Play Heli.channel, FIX(BraCa.tc + 13), 75 '80 Bend Heli.channel, 0, (1-FRAC(BraCa.tc)) * 128 END IF harnr = 1 DO kloknoot = SpectralnoteF(Braca.tc+12, harnr,0,%True) IF kloknoot > 127 THEN EXIT LOOP retval = PlayKloks (kloknoot, 64 , 2, 0,0) INCR harnr LOOP UNTIL retval CASE 2 IF FRAC(BraCa.tc) <= 0.5 THEN Play Bono.channel, FIX(BraCa.tc+24), 94 ' tc * 4 Bend Bono.channel, 0, 63 + (FRAC(BraCa.tc) * 128) ELSE Play Bono.channel, FIX(BraCa.tc + 25), 94 Bend Bono.channel, 0, (1-FRAC(BraCa.tc)) * 128 END IF harnr = 1 DO kloknoot = SpectralnoteF(Braca.tc, harnr,0,%True) IF kloknoot > 127 THEN EXIT LOOP retval = PlayKloks (kloknoot, 64 , 2, 0,0) INCR harnr LOOP UNTIL retval CASE 3 IF FRAC(BraCa.tc) <= 0.5 THEN Play Korn.channel, FIX(BraCa.tc+36), 125 '80 ' tc * 8 Bend Korn.channel, 0, 63 + (FRAC(BraCa.tc) * 128) ELSE Play Korn.channel, FIX(BraCa.tc + 37), 125 '80 Bend Korn.channel, 0, (1-FRAC(BraCa.tc)) * 128 END IF harnr = 1 DO kloknoot = SpectralnoteF(Braca.tc, harnr,0,%True) IF kloknoot > 127 THEN EXIT LOOP retval = PlayKloks (kloknoot, 64 , 2, 0,0) INCR harnr LOOP UNTIL retval CASE 4 Braca.n(2) = SpectralNoteF (Braca.tc, 3, 0, %True) ' kwint IF FRAC(BraCa.n(2)) <= 0.5 THEN Play Heli.channel, FIX(BraCa.n(2)), 75 Bend Heli.channel, 0, 63 + (FRAC(BraCa.n(2)) * 128) ELSE Play Heli.channel, FIX(BraCa.n(2) + 1), 75 Bend Heli.channel, 0, (1-FRAC(BraCa.n(2))) * 128 END IF retval = PlayKloks (BraCa.n(2), 64 , 4, 0,0) CASE 5 Braca.n(1) = SpectralNoteF (Braca.tc, 5, 0, %True) ' terts IF FRAC(BraCa.n(1)) <= 0.5 THEN Play Bono.channel, FIX(BraCa.n(1)), 96 Bend Bono.channel, 0, 63 + (FRAC(BraCa.n(1)) * 128) ELSE Play Bono.channel, FIX(BraCa.n(1) + 1), 96 Bend Bono.channel, 0, (1-FRAC(BraCa.n(1))) * 128 END IF retval = PlayKloks (BraCa.n(1), 64 , 4, 0,0) IF (FRAC(Braca.n(1)) > 0.46) AND (FRAC(Braca.n(1)) < 0.54) THEN Play Tubi.channel, FIX(Braca.n(1) - 48), 127 ELSEIF (FRAC(Braca.n(1)) < 0.1) THEN Play Vibi.channel, Braca.n(1), 120 END IF CASE 6 Braca.n(0) = SpectralNoteF (Braca.tc, 7, 0, %True) ' septiem + oktaaf IF FRAC(BraCa.n(0)) <= 0.5 THEN Play Korn.channel, FIX(BraCa.n(0)+12), 110 Bend Korn.channel, 0, 63 + (FRAC(BraCa.n(0)) * 128) ELSE Play Heli.channel, FIX(BraCa.n(0) + 13), 110 Bend Heli.channel, 0, (1-FRAC(BraCa.n(0))) * 128 END IF retval = PlayKloks (BraCa.n(0), 64 , 4, 0,0) IF (FRAC(Braca.n(0)) > 0.46) AND (FRAC(Braca.n(0)) < 0.54) THEN Play Tubi.channel, 24 + FIX(BraCa.n(0) MOD 12),127 ELSEIF (FRAC(Braca.n(0)) < 0.1) THEN Play Vibi.channel, 60 + FIX(Braca.n(0) MOD 12), 120 END IF CASE ELSE MM_AllOff StopTask %Braca_End END SELECT Task(%Braca_End).freq = Task(%Braca_End).freq / 1.4! ' ritardando INCR cnt END SUB SUB Korn_Fingerings () STATIC hw AS LONG IF ISFALSE hw THEN DIALOG NEW 0, "fingerings", ,,100, 50 TO hw CONTROL ADD LABEL, hw, 1, "valves", 1, 1, 89, 12 CONTROL ADD CHECKBOX, hw, 2, "1", 10, 14, 12, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 3, "2", 24, 14, 12, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 4, "3", 38, 14, 12, 12, %BS_PUSHLIKE DIALOG SHOW MODELESS hw, CALL CB_Korn_Fingerings END IF END SUB CALLBACK FUNCTION CB_Korn_Fingerings LOCAL i AS LONG LOCAL cc AS BYTE IF CBMSG <> %WM_COMMAND THEN EXIT FUNCTION IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION cc = &B100 CONTROL GET CHECK CBHNDL, 2 TO i IF i THEN BIT SET cc, 3 CONTROL GET CHECK CBHNDL, 3 TO i IF i THEN BIT SET cc, 4 CONTROL GET CHECK CBHNDL, 4 TO i IF i THEN BIT SET cc, 5 CONTROL SET TEXT gh.cockpit, %GMT_Msg1, BIN$(cc) Controller Korn.channel, 13, cc END FUNCTION SUB Korn_31 () 'horizontal motor speed STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_31).tog THEN IF ISFALSE Task(%Korn_31).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Speed" MakeTaskParameterDialog %Korn_31,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_31).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_31).freq = 4 Task(%Korn_31).tog = %TRue END IF Task(%Korn_31).freq = 4 IF Slider(slnr).value <> Korn.ctrl(31) THEN Korn.ctrl(31) = Slider(slnr).value Controller Korn.channel, 31, Korn.ctrl(31) END IF END SUB SUB Korn_90 () 'pir sensor STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_90).tog THEN IF ISFALSE Task(%Korn_90).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Speed" MakeTaskParameterDialog %Korn_90,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_90).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_90).freq = 4 Task(%Korn_90).tog = %TRue END IF Task(%Korn_90).freq = 4 IF Slider(slnr).value <> Korn.ctrl(90) THEN Korn.ctrl(90) = Slider(slnr).value Controller Korn.channel, 90, Korn.ctrl(90) END IF END SUB SUB Korn_100 () 'midiout STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_100).tog THEN IF ISFALSE Task(%Korn_100).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Speed" MakeTaskParameterDialog %Korn_100,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_100).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_100).freq = 4 Task(%Korn_100).tog = %TRue END IF Task(%Korn_100).freq = 4 IF Slider(slnr).value <> Korn.ctrl(100) THEN Korn.ctrl(100) = Slider(slnr).value Controller Korn.channel, 100, Korn.ctrl(100) END IF END SUB SUB Korn_67 () Controller Korn.channel, 67, 64 stoptask %Korn_67 END SUB SUB Korn_68 () Controller Korn.channel, 68, 64 stoptask %Korn_68 END SUB SUB Korn_69 () Controller Korn.channel, 69, 64 stoptask %Korn_69 END SUB SUB Korn_70 () Controller Korn.channel, 70, 64 stoptask %Korn_70 END SUB