'******************************************** '* * '* a microtonal basson playing robot by * '* dr.Godfried-Willem Raes * '* 2010 - 2011 * '******************************************** ' 10.04.2011: Version 1.0 flashed in dsPIC ' This code module started with a copy of coding. ' 21.04.2011: Version 1.0 flashed in 18F2525 pic midihub board. ' key control board still to be mounted and wired. ' 24.04.2011: Version 1.0 flashed in 18F4620 pic valve board ' 26.04.2011: test code added ' CC30 : release time ' channel aftertouch for fingered vibrato %Fa_scale = 32 %Fa_1 = 33 ' ctrl 1 noise %Fa_7 = 34 ' ctrl 7 volume %Fa_17 = 35 ' ctrl 17 ' attack amplitude %Fa_18 = 36 ' ctrl 18 ' attack time %Fa_19 = 37 ' ctrl 19 ' release time %Fa_20 = 38 ' ctrl 20 ' main tuning to diapason %Fa_test = 39 ' repeated note test %Fa_Tremolo = 40 %Fa_Vibrato = 41 %Fa_KeyPress = 42 ' now aftertouch for fingered vibrato %Fa_100 = 43 %Fa_101 = 44 %Fa_102 = 45 %Fa_103 = 46 'motor tasks: %Fa_CC21 = 17 'ctrl 21 - minimum motorspeed (for research) %Fa_Move = 18 'ctrl 22 - position 0-64-127 64= vertical 127= to the front, 0= backwards. %Fa_CC23 = 19 'ctrl 23 - PWM frequency - for research only %Fa_CC24 = 20 'ctrl24 - maximum motorspeed (for research)) %Fa_Pendulum = 22 'to do 'lights: %Fa_lites = 48 'on-off test %Fa0 = 49 ' front %Fa1 = 50 %Fa2 = 51 %Fa3 = 52 %Fa4 = 53 'eyes %Fa5 = 54 GLOBAL FaKeyPress AS LONG DECLARE FUNCTION Init_Fa () AS LONG DECLARE SUB Fa_Scale () DECLARE SUB Fa_Scale_UD0 () DECLARE SUB Fa_Scale_UD1 () DECLARE SUB Fa_Scale_UD2 () DECLARE SUB Fa_Move () DECLARE SUB Fa_SL21 () DECLARE SUB Fa_Vibrato () DECLARE SUB Fa_Tremolo () DECLARE SUB Fa_1 () DECLARE SUB Fa_7 () DECLARE SUB Fa_18 () DECLARE SUB Fa_SL18 () DECLARE SUB Fa_19 () DECLARE SUB Fa_SL19 () DECLARE SUB Fa_20 () ' tuning DECLARE SUB Fa_SL20 () DECLARE SUB Fa_lites () DECLARE SUB Fa_Lites_UD () DECLARE SUB Fa_Test () DECLARE SUB Fa_UD0 () DECLARE SUB Fa_UD1 () DECLARE SUB Fa_UD2 () DECLARE FUNCTION Fa_Finger (n AS BYTE) AS WORD ' finger table in 16 bit format, left adjusted. DECLARE SUB Fa_KeyPress () DECLARE SUB Fa_Pendulum () DECLARE SUB Fa_Pendulum_Stop () DECLARE SUB Fa_CC21 () DECLARE SUB Fa_CC23 () DECLARE SUB Fa_CC24 () DECLARE SUB Fa0 () DECLARE SUB Fa1 () DECLARE SUB Fa2 () DECLARE SUB Fa3 () DECLARE SUB Fa4 () DECLARE SUB Fa5 () DECLARE SUB Fa_100 () DECLARE SUB Fa_101 () DECLARE SUB Fa_102 () DECLARE SUB Fa_103 () FUNCTION Init_Fa () AS LONG LOCAL retval AS LONG ' GetInstrumentParams Fa, %IDM_Fa ' retval = SetRobotPort (Fa, Inifilename, hMidiO()) FaKeyPress = -1 Task(%Fa_Scale).naam = "Scale" Task(%Fa_Scale).cptr = CODEPTR(Fa_Scale) Task(%Fa_Scale).freq = 2 Task(%Fa_Scale).flags = %False Task(%Fa_Test).naam = "Test" Task(%Fa_Test).cptr = CODEPTR(Fa_Test) Task(%Fa_Test).freq = 4 Task(%Fa_Test).flags = %False Task(%Fa_Move).naam = "Move" Task(%Fa_Move).cptr = CODEPTR(Fa_Move) 'CC22 Task(%Fa_Move).freq = 2 Task(%Fa_Move).flags = %False Task(%Fa_Lites).naam = "lites" Task(%Fa_Lites).cptr = CODEPTR(Fa_Lites) Task(%Fa_Lites).freq = 2 Task(%Fa_Lites).flags = %False Task(%Fa_1).naam = "Noise" Task(%Fa_1).cptr = CODEPTR(Fa_1) Task(%Fa_1).freq = 10 Task(%Fa_1).flags = %False Task(%Fa_7).naam = "Ctrl_7" Task(%Fa_7).cptr = CODEPTR(Fa_7) Task(%Fa_7).freq = 10 Task(%Fa_7).flags = %False Task(%Fa_17).naam = "Aa_C17" Task(%Fa_17).cptr = CODEPTR(Fa_17) Task(%Fa_17).freq = 10 Task(%Fa_17).flags = %False Task(%Fa_tremolo).naam = "Tremolo" Task(%Fa_tremolo).cptr = CODEPTR(Fa_Tremolo) Task(%Fa_tremolo).freq = 16 Task(%Fa_tremolo).flags = %False Task(%Fa_18).naam = "At_C18" Task(%Fa_18).cptr = CODEPTR(Fa_18) Task(%Fa_18).freq = 10 Task(%Fa_18).flags = %False Task(%Fa_19).naam = "Re_C19" Task(%Fa_19).cptr = CODEPTR(Fa_19) Task(%Fa_19).freq = 9.7 Task(%Fa_19).flags = %False Task(%Fa_20).naam = "Tun_C20" Task(%Fa_20).cptr = CODEPTR(Fa_20) Task(%Fa_20).freq = 10 Task(%Fa_20).flags = %False Task(%Fa_vibrato).naam = "Vibrato" Task(%Fa_vibrato).freq = 12 Task(%Fa_vibrato).cptr = CODEPTR(Fa_Vibrato) Task(%Fa_CC21).naam = "C21" Task(%Fa_CC21).cptr = CODEPTR(Fa_CC21) 'sets minimum speed Task(%Fa_CC21).freq = 20 Task(%Fa_CC21).flags = %False Task(%Fa_CC23).naam = "C23" Task(%Fa_CC23).cptr = CODEPTR(Fa_CC23) Task(%Fa_CC23).freq = 20 Task(%Fa_CC23).flags = %False Task(%Fa_CC24).naam = "C24" Task(%Fa_CC24).cptr = CODEPTR(Fa_CC24) Task(%Fa_CC24).freq = 20 Task(%Fa_CC24).flags = %False Task(%Fa_Pendulum).naam = "Slinger" Task(%Fa_Pendulum).cptr = CODEPTR(Fa_Pendulum) Task(%Fa_Pendulum).freq = 0.25 Task(%Fa_Pendulum).flags = %False TaskEX(%Fa_Pendulum).stopcptr = CODEPTR(Fa_Pendulum_Stop) Task(%Fa0).naam = "Li-0" 'white LED's Task(%Fa0).cptr = CODEPTR(Fa0) Task(%Fa0).freq = 20 Task(%Fa0).flags = %False TaskEX(%Fa0).StopCptr = CODEPTR(Fa0_Stop) Task(%Fa1).naam = "Li-1" 'nc Task(%Fa1).cptr = CODEPTR(Fa1) Task(%Fa1).freq = 20 Task(%Fa1).flags = %False TaskEX(%Fa1).StopCptr = CODEPTR(Fa1_Stop) Task(%Fa2).naam = "Li-2" Task(%Fa2).cptr = CODEPTR(Fa2) Task(%Fa2).freq = 20 Task(%Fa2).flags = %False TaskEX(%Fa2).StopCptr = CODEPTR(Fa2_Stop) Task(%Fa3).naam = "Li-3" Task(%Fa3).cptr = CODEPTR(Fa3) Task(%Fa3).freq = 20 Task(%Fa3).flags = %False TaskEX(%Fa3).StopCptr = CODEPTR(Fa3_Stop) Task(%Fa4).naam = "Li-4" Task(%Fa4).cptr = CODEPTR(Fa4) Task(%Fa4).freq = 20 Task(%Fa4).flags = %False TaskEX(%Fa4).StopCptr = CODEPTR(Fa4_Stop) Task(%Fa5).naam = "Li-5" Task(%Fa5).cptr = CODEPTR(Fa5) Task(%Fa5).freq = 20 Task(%Fa5).flags = %False TaskEX(%Fa5).StopCptr = CODEPTR(Fa5_Stop) Task(%Fa_100).naam = "C100" Task(%Fa_100).cptr = CODEPTR(Fa_100) Task(%Fa_100).freq = 20 Task(%Fa_100).flags = %False Task(%Fa_101).naam = "C101" Task(%Fa_101).cptr = CODEPTR(Fa_101) Task(%Fa_101).freq = 20 Task(%Fa_101).flags = %False Task(%Fa_102).naam = "C102" Task(%Fa_102).cptr = CODEPTR(Fa_102) Task(%Fa_102).freq = 20 Task(%Fa_102).flags = %False Task(%Fa_103).naam = "C103" Task(%Fa_103).cptr = CODEPTR(Fa_103) Task(%Fa_103).freq = 20 Task(%Fa_103).flags = %False ' Task(%Fa_keypress).naam = "Keying" 'using a task for this makes no sense. mapped to ButnSw(9) ' Task(%Fa_keypress).freq = 12 ' Task(%Fa_keypress).cptr = CODEPTR(Fa_Keypress) ButnOS(10).tag = "Fa Off" ButnOS(10).cptr = CODEPTR(MM_Fa_Off) ButnSw(9).tag0 = "Fingerings" ButnSw(9).tag1 = "Fngrs off" ButnSw(9).cptr = CODEPTR(Fa_KeyPress) ' calibration button for motors - ctrl.70 ' ButnOS(11).tag = "MotPos" ' ButnOS(11).cptr = CODEPTR(Fa_MotPosCal) ' FUNCTION = %True END FUNCTION SUB Fa_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(%Fa_Scale).tog THEN IF ISFALSE Task(%Fa_Scale).hParam THEN DIM TaskParamLabels(5) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" TaskParamLabels(2)="legato" TaskParamLabels(3)="step" TaskParamLabels(4)= "hilim" TaskParamLabels(5)="lowlim" MakeTaskParameterDialog %Fa_Scale,3, Slider(),3,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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 Slider(slnr+2).value = 64 ' stacc-legato Sendmessage Slider(slnr+2).h, %TBM_SETPOS, %True, Slider(slnr+2).value IF udnr = %False THEN udnr = TaskEX(%Fa_Scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Fa_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(Fa_Scale_UD1) ' high note limit UDctrl(udnr+1).value = Fa.hightes UDctrl(udnr+1).minval = Fa.lowtes UDctrl(udnr+1).maxval = Fa.Hightes UDctrl(udnr+2).cptr = CODEPTR(Fa_Scale_UD2) ' low note limit UDctrl(udnr+2).value = 34 UDctrl(udnr+2).minval = Fa.lowtes '0 UDctrl(udnr+2).maxval = Fa.Hightes '92, maar goede klank tot 79 END IF END IF Task(%Fa_Scale).tog = %True cnt = Fa.Lowtes EXIT SUB END IF IF ISFALSE onoff THEN IF Slider(slnr+2).value < 127 THEN IF n THEN NoteOff Fa.channel, n n = %False onoff = %True Task(%Fa_Scale).freq = MAX(2,Slider(slnr+2).value * 6) ELSE ' in dit geval puur legato zonder note-off's onoff = %True Task(%Fa_Scale).freq = 1000 END IF ELSE n = cnt mPlay Fa.channel, n, Slider(slnr).value cnt = cnt + UDCtrl(udnr).value IF cnt > UDctrl(udnr+1).value THEN cnt = UDctrl(udnr+2).value onoff = %False Task(%Fa_Scale).freq = MAX(0.25,Slider(slnr+1).value / 8) END IF END SUB SUB Fa_Scale_UD0 () ' callback on parameter UpDowns step size LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_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(%Fa_Scale).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Fa_Scale_UD1 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_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 > Fa.HighTes THEN UDctrl(udnr).value = Fa.HighTes : noot = Fa.hightes SetDlgItemText Task(%Fa_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Fa_Scale_UD2 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_Scale).UpDownNumbers(2) noot = UDCtrl(udnr).value IF noot < Fa.lowtes THEN UDctrl(udnr).value = Fa.lowtes : noot = Fa.lowtes IF noot > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr-1).value SetDlgItemText Task(%Fa_Scale).hparam, %GMT_TEXT0_ID + 18, "Lo=" & STR$(noot) END SUB SUB Fa_CC21 () ' controller 21 test - motor speed - minimum ' for test only, motor speed will finaly become out of user control. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_CC21).tog THEN IF ISFALSE Task(%Fa_CC21).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="CC21" MakeTaskParameterDialog %Fa_CC21,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_CC21).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL21) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_CC21).freq = 10 Task(%Fa_CC21).tog = %TRue END IF Task(%Fa_CC21).freq = 0.5 END SUB SUB Fa_SL21 () ' slider callback - movement speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_CC21).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(21) THEN Fa.ctrl(21) = Slider(slnr).value Controller Fa.channel, 21, Fa.ctrl(21) END IF END SUB SUB Fa_Move () ' controller 22 test - firmware version 2.0 ' slider = position of Fa in the cradle ' problem here: we should not send intermediate values of the slider to Fa... STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_Move).tog THEN IF ISFALSE Task(%Fa_Move).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Move" MakeTaskParameterDialog %Fa_Move,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_move).SliderNumbers(0) Slider(slnr).value = 64 'vertical SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_move).freq = 10 Task(%Fa_move).tog = %TRue END IF IF slider(slnr).value <> Fa.ctrl(22) THEN Fa.ctrl(22) = Slider(slnr).value Controller Fa.channel, 22, Fa.ctrl(22) END IF Task(%Fa_move).freq = 1 'slow to avoid intermediate values.... END SUB SUB Fa_Vibrato () ' vibrato test met de pitchbend ' vibrato test voor fingered vibrato met aftertouch STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Fa_vibrato).tog THEN IF ISFALSE Task(%Fa_vibrato).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" ' pitch deviation MakeTaskParameterDialog %Fa_vibrato,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_vibrato).SliderNumbers(0) Slider(slnr).value = 63 Task(%Fa_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(%Fa_vibrato).tog = %True END IF ' not very good code yet! we should do it much more gradually IF slider(slnr).value THEN Task(%Fa_vibrato).freq = slider(slnr).value / 4 ' max 32Hz Aftertouch Fa.channel, slider(slnr).value ' test IF ISFALSE cnt MOD 2 THEN bend Fa.channel, 0, 63 + (slider(slnr+1).value/ 2) ELSE bend Fa.channel, 0, 64 - (slider(slnr+1).value /2) END IF INCR cnt ELSE Bend Fa.channel, 0, 64 ' reset Aftertouch Fa.channel, 0 ' fingered vibrato off stoptask %Fa_Vibrato END IF END SUB SUB Fa_1 () ' controller 1 test ' This controls the noise level STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_1).tog THEN IF ISFALSE Task(%Fa_1).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C1" MakeTaskParameterDialog %Fa_1,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_1).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL1) Slider(slnr).value = 0 Fa.ctrl(1) = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_1).freq = 10 Task(%Fa_1).tog = %TRue END IF Task(%Fa_1).freq = 0.5 END SUB SUB Fa_SL1 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_1).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(1) THEN Fa.ctrl(1) = Slider(slnr).value Controller Fa.channel, 1, Fa.ctrl(1) END IF END SUB SUB Fa_7 () ' controller 7 test ' This controls the master volume STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_7).tog THEN IF ISFALSE Task(%Fa_7).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C7" MakeTaskParameterDialog %Fa_7,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_7).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL7) Slider(slnr).value = 0 Fa.ctrl(7) = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_7).freq = 10 Task(%Fa_7).tog = %TRue END IF Task(%Fa_7).freq = 0.5 END SUB SUB Fa_SL7 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_7).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(7) THEN Fa.ctrl(7) = Slider(slnr).value Controller Fa.channel, 7, Fa.ctrl(7) END IF END SUB SUB Fa_17 () ' controller 17 test ' This controls the maximum amplitude of the attack STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_17).tog THEN IF ISFALSE Task(%Fa_17).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C17" MakeTaskParameterDialog %Fa_17,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_17).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL17) Slider(slnr).value = 86 Fa.ctrl(17) = 86 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_17).freq = 10 Task(%Fa_17).tog = %TRue END IF Task(%Fa_17).freq = 0.5 END SUB SUB Fa_SL17 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_17).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(17) THEN Fa.ctrl(17) = Slider(slnr).value Controller Fa.channel, 17, Fa.ctrl(17) END IF END SUB SUB Fa_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(%Fa_18).tog THEN IF ISFALSE Task(%Fa_18).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C18" MakeTaskParameterDialog %Fa_18,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_18).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Fa_sl18) Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_18).freq = 0.4 Task(%Fa_18).tog = %TRue END IF END SUB SUB Fa_SL18 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_18).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(18) THEN Fa.ctrl(18) = Slider(slnr).value Controller Fa.channel, 18, Fa.ctrl(18) END IF END SUB SUB Fa_19 () ' controller 19 test - this sets the duration of the release sound ' ds pic board. Implemented 11.11.2008 on dsPIC STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_19).tog THEN IF ISFALSE Task(%Fa_19).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C19" MakeTaskParameterDialog %Fa_19,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_19).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Fa_sl19) Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_19).freq = 0.4 Task(%Fa_19).tog = %TRue END IF END SUB SUB Fa_SL19 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_19).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(19) THEN Fa.ctrl(19) = Slider(slnr).value Controller Fa.channel, 19, Fa.ctrl(19) END IF END SUB SUB Fa_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(%Fa_tremolo).tog THEN IF ISFALSE Task(%Fa_tremolo).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" MakeTaskParameterDialog %Fa_tremolo,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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(%Fa_Tremolo).tog = %True END IF IF Slider(slnr).value THEN Task(%Fa_Tremolo).freq = Slider(slnr).value ELSE EXIT SUB END IF IF Slider(slnr+1).value THEN IF cnt MOD 2 THEN Controller Fa.channel, 17, Fa.ctrl(17) ELSE Controller Fa.channel, 17, Fa.ctrl(17) * (Slider(slnr+1).value / 127) END IF INCR cnt END IF END SUB SUB Fa_20 () ' tuning to diapason. [quartertone up max. range] ' controller 20 STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_20).tog THEN IF ISFALSE Task(%Fa_20).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="tune" MakeTaskParameterDialog %Fa_20,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_20).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL20) Slider(slnr).value = Fa.ctrl(20) ' 0 = 440Hz SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_20).freq = 0.45 Task(%Fa_20).tog = %True END IF END SUB SUB Fa_SL20 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_20).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(20) THEN Fa.ctrl(20) = Slider(slnr).value Controller Fa.channel, 20, Fa.ctrl(20) END IF END SUB SUB Fa_Lites () ' on midihub board STATIC cnt AS LONG STATIC udnr AS DWORD STATIC slnr AS DWORD STATIC lite AS BYTE IF ISFALSE Task(%Fa_Lites).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Nr." IF ISFALSE Task(%Fa_Lites).hParam THEN MakeTaskParameterDialog %Fa_Lites,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Fa_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(%Fa_Lites).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Fa_Lites_UD) ' nr. updown UDctrl(udnr).value = 0 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 7 UDctrl(udnr).stap = 1 END IF Task(%Fa_Lites).tog = %True END IF ' lites controlled by PIC1 IF lite <> UDctrl(udnr).value THEN NoteOff Fa.channel, lite lite = UDctrl(udnr).value END IF IF ISFALSE cnt MOD 2 THEN mPlay Fa.channel, lite, 127 ELSE mPlay Fa.channel, lite, 0 END IF INCR cnt Task(%Fa_Lites).freq = MAX(1,(Slider(slnr).value / 4)) END SUB SUB Fa_Lites_UD () ' callback on parameter UpDowns. : lite number LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_Lites).UpdownNumbers(0) value = UDCtrl(udnr).value SetDlgItemText Task(%Fa_Lites).hparam, %GMT_TEXT0_ID + 16, STR$(value) END SUB SUB Fa_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 LOCAL fingers AS WORD LOCAL msb AS WORD ' could be byte LOCAL lsb AS WORD ' cannot be byte IF ISFALSE Task(%Fa_Test).tog THEN DIM TaskParamLabels(0 TO 5) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" ' rescaled in proc. TaskParamLabels(1) = "Velo" ' drive volume 0-127 - velocity byte TaskParamLabels(2) = "Bend" ' pitch-bend value 'SL2 - was UD2 - quartertone down or up. TaskParamLabels(3) = "Stac" ' staccato - legato up down ' UD0 TaskParamLabels(4) = "Note" ' pitch ' UD1 TaskParamLabels(5) = "Fing" ' vingerzetting via key-pressure ' UD2 IF ISFALSE Task(%Fa_Test).hParam THEN MakeTaskParameterDialog %Fa_Test,3,Slider(),3,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Fa_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 'pitch bend reset 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(%Fa_Test).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Fa_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(Fa_UD1) ' pitch up down (note) UDctrl(udnr+1).value = Fa.lowtes UDctrl(udnr+1).minval = Fa.lowtes UDctrl(udnr+1).maxval = Fa.Hightes UDctrl(udnr+2).cptr = CODEPTR(Fa_UD2) ' fingering via aftertouch on/off UDctrl(udnr+2).value = 0 UDctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = 1 resetval = 64 END IF Task(%Fa_Test).tog = %True EXIT SUB END IF period = 1! / (Slider(slnr).value / 10!) ' tempo Task(%Fa_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 Fa.channel, oldnote oldnote = %False END IF offFreq = 1! / period Task(%Fa_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 Fa.channel, oldnote Task(%Fa_Test).freq = OffFreq oldnote = %False ELSE noot = UDctrl(udnr+1).value velo = Slider(slnr+1).value mPlay Fa.channel, noot, velo Bend Fa.channel, 0, Slider(slnr + 2).value ' revision needed: this is OB code, Fa has many more valves!!! IF UDctrl(udnr+2).value THEN fingers = Fa_Finger (noot) msb = Fingers AND &B1111111000000000 ' mask, eigenlijk hier niet nodig SHIFT RIGHT msb, 9 ' 7 bits msb ' format 0xxx xxxx lsb = fingers AND &B0000000111111111 ' mask &B0000000111111000 kan ook SHIFT RIGHT lsb, 2 ' 7 bits lsb ' format 0xxx xxx0 Keypress Fa.channel, msb, lsb ' violating the midi standard, where msb = note END IF IF FaKeyPress > -1 THEN KeyPress Fa.channel, HIBYT(LOWRD(FaKeyPress)), LOBYT(FaKeyPress) 'if we use the Fa_KeyPess dialog, it overrides other settings for the fingerings. ' close the dialog with the button to revert to normal fingerings Task(%Fa_Test).freq = OnFreq oldnote = noot END IF IF Task(%Fa_Test).freq < 0.2 THEN Task(%Fa_Test).freq = 0.2 END SUB SUB Fa_UD0 () ' callback on parameter UpDowns. : on/off proportion LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_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(%Fa_Test).hparam, %GMT_TEXT0_ID + 16, "L=" & STR$(value) END SUB SUB Fa_UD1 () ' controls the notes to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value SetDlgItemText Task(%Fa_Test).hparam, %GMT_TEXT0_ID + 17, "N=" & STR$(noot) END SUB SUB Fa_UD2 () ' ' fingering UD switch - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_Test).UpDownNumbers(2) value = UDCtrl(udnr).value IF value > 1 THEN value = 1 IF value < 0 THEN value = 0 SetDlgItemText Task(%Fa_Test).hparam, %GMT_TEXT0_ID + 18, "F=" & STR$(value) ' sending is in the main task. END SUB FUNCTION Fa_Finger (n AS BYTE) AS WORD ' TO BE REWRITTEN: this is Ob code!!! ' finger table - lookup as descibed on the webpage for Fa ' the fingering can be send to Fa using a note aftertouch command ' &H160 + k, HIBYTE(7hibitsfunction), LOWBYTE(6lowerbitsfunction) ' msb = low valves, 7 bits = msb = shift right, value, 9 ' lsb = high valves, 6 bits = lsb = shift left, value,7 ' lsb = shift right, lsb, 9 ' we use only 13 bits. IF n < Fa.lowtes THEN FUNCTION = %False : EXIT FUNCTION IF n > Fa.hightes THEN FUNCTION = %False: EXIT FUNCTION SELECT CASE n CASE 58 FUNCTION = &HD770 ' binary 1101 0111 0111 0000 CASE 59 FUNCTION = &H5770 ' binary 0101 0111 0111 0000 CASE 60 FUNCTION = &H1770 ' binary 0001 0111 0111 0000 CASE 61,73,85 FUNCTION = &H0F70 ' binary 0000 1111 0111 0000 CASE 62,74 FUNCTION = &H0770 ' binary 0000 0111 0111 0000 CASE 63,75 FUNCTION = &H2770 ' kan ook: &H3370 te testen CASE 64,76,83 FUNCTION = &H0370 CASE 65,77 FUNCTION = &H0570 ' fork CASE 66,78 FUNCTION = &H0170 CASE 67,79 FUNCTION = &H0070 CASE 68,80 FUNCTION = &H00F0 CASE 69,81 FUNCTION = &H0030 CASE 70 FUNCTION = &H0530 CASE 71 FUNCTION = &H0660 CASE 72,84 FUNCTION = &H0110 CASE 82 FUNCTION = &H0130 CASE 86 FUNCTION = &H0070 CASE 87 FUNCTION = &H00F0 CASE 88 FUNCTION = &H20F0 CASE 89 FUNCTION = &H00B0 CASE 90 FUNCTION = &H1130 CASE 91 FUNCTION = &H1310 CASE 92 FUNCTION = &H0650 CASE 93 FUNCTION = &H0250 CASE 94 FUNCTION = &H22D0 CASE 95 FUNCTION = &H4368 ' &H4361 is mistake in the lookups: must be &H4368 CASE 96 FUNCTION = &H0328 ' &H0321 is mistake in the lookups: must be &H0328 CASE ELSE FUNCTION = %False END SELECT END FUNCTION SUB Fa_KeyPress () ' test for finding optimum fingerings 'interacts with Fa_test 'close the dialog with the button to revert to normal fingerings ' must be an interface with the 21 valves, each clickable... STATIC fingering AS WORD STATIC hw AS DWORD LOCAL i AS LONG IF hw THEN DIALOG END hw hw = 0 FaKeyPRess = -1 'disable EXIT SUB END IF DIALOG NEW 0, "Keypress",,,72, 217 TO hw 'to be filled in.. FOR i = 1 TO 22 'not 0 to 12!!! CONTROL ADD CHECKBOX, hw, i, "key" + STR$(i), 1, 1 + (i-1) * 15, 70, 12, %BS_PUSHLIKE,,CALL cb_Fa_keypress NEXT CONTROL ADD LABEL, hw, 100, HEX$(FaKeyPRess), 1, 203, 70, 12 DIALOG SHOW MODELESS hw END SUB CALLBACK FUNCTION CB_Fa_KeyPress LOCAL i AS LONG LOCAL v AS LONG IF CBMSG <> %WM_COMMAND THEN EXIT FUNCTION IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION IF FaKeyPRess = -1 THEN FaKeyPRess = 0 i = CBCTL CONTROL GET CHECK CBHNDL, CBCTL TO v IF i > 6 THEN INCR i IF v THEN BIT SET FakeyPRess, i ELSE BIT RESET FaKeyPress, i END IF CONTROL SET TEXT CBHNDL, 100, HEX$(FaKeyPress) ' + " -" + bin$(lowrd(FaKeyPRess)) END FUNCTION SUB Fa_Pendulum () STATIC slnr, tog AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL excursie AS BYTE IF ISFALSE task(%Fa_Pendulum).tog THEN ' required: slider for frequency ' slider for amplitude IF ISFALSE Task(%Fa_Pendulum).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="speed" TaskParamLabels(1)="amplitude" MakeTaskParameterDialog %Fa_Pendulum,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_Pendulum).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_Pendulum).freq = 0.2 Task(%Fa_Pendulum).tog = %True END IF excursie = Slider(slnr+1).value \2 '0 - 63 IF ISFALSE tog THEN Controller Fa.channel, 22, 64 - excursie '20 is minimum ELSE Controller Fa.channel, 22, 64 + excursie '100 is maximum END IF INCR tog tog = tog MOD 2 Task(%Fa_Pendulum).freq = MAX(Slider(slnr).value/ 127, 0.01) END SUB SUB Fa_Pendulum_Stop () Controller Fa.channel, 22, 64 END SUB SUB Fa_CC23 () ' controller 23 test - motor speed - maximum ' for test only, motor speed will finaly become out of user control. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_CC23).tog THEN IF ISFALSE Task(%Fa_CC23).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="CC23" MakeTaskParameterDialog %Fa_CC23,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_CC23).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL23) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_CC23).freq = 10 Task(%Fa_CC23).tog = %TRue END IF Task(%Fa_CC23).freq = 0.5 END SUB SUB Fa_SL23 () ' slider callback - movement speed maximum STATIC slnr AS DWORD slnr = TaskEX(%Fa_CC23).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(23) THEN Fa.ctrl(23) = Slider(slnr).value Controller Fa.channel, 23, Fa.ctrl(23) END IF END SUB SUB Fa_CC24 () ' controller 24 test - motor ctrl. pwm frequency ' for test only, motor pwm will finaly become out of user control. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_CC24).tog THEN IF ISFALSE Task(%Fa_CC24).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="CC24" MakeTaskParameterDialog %Fa_CC24,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_CC24).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Fa_SL24) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Fa_CC24).freq = 10 Task(%Fa_CC24).tog = %TRue END IF Task(%Fa_CC24).freq = 0.5 END SUB SUB Fa_SL24 () ' slider callback - pwm freq. STATIC slnr AS DWORD slnr = TaskEX(%Fa_CC24).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(24) THEN Fa.ctrl(24) = Slider(slnr).value Controller Fa.channel, 24, Fa.ctrl(24) END IF END SUB SUB Fa0 () ' front STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa0).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L0" IF ISFALSE Task(%Fa0).hParam THEN MakeTaskParameterDialog %Fa0,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa0).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 0,127 Task(%Fa0).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 0, n END IF Task(%Fa0).freq = 10 END SUB SUB Fa0_Stop () NoteOff Fa.channel, 0 END SUB SUB Fa1 () 'front STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa1).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L1" IF ISFALSE Task(%Fa1).hParam THEN MakeTaskParameterDialog %Fa1,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa1).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 1, 127 'KeyPress Fa.channel,1, slider(slnr).value Task(%Fa1).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 1, n 'KeyPress Fa.channel, 1, n END IF Task(%Fa1).freq = 10 END SUB SUB Fa1_Stop () NoteOff Fa.channel, 1 END SUB SUB Fa2 () 'front STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa2).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L2" IF ISFALSE Task(%Fa2).hParam THEN MakeTaskParameterDialog %Fa2,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa2).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 2, 127 'KeyPress Fa.channel,2, slider(slnr).value Task(%Fa2).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 2, n END IF Task(%Fa2).freq = 10 END SUB SUB Fa2_Stop () NoteOff Fa.channel, 2 END SUB SUB Fa3 () 'front STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa3).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L3" IF ISFALSE Task(%Fa3).hParam THEN MakeTaskParameterDialog %Fa3,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa3).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 3, 127 'KeyPress Fa.channel,3, slider(slnr).value Task(%Fa3).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 3, n END IF Task(%Fa3).freq = 10 END SUB SUB Fa3_Stop () NoteOff Fa.channel, 3 END SUB SUB Fa4 () 'eye STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa4).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L4" IF ISFALSE Task(%Fa4).hParam THEN MakeTaskParameterDialog %Fa4,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa4).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 4, 127 'KeyPress Fa.channel,4, slider(slnr).value Task(%Fa4).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 4, n END IF Task(%Fa4).freq = 10 END SUB SUB Fa4_Stop () NoteOff Fa.channel, 4 END SUB SUB Fa5 () 'eye STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Fa5).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L5" IF ISFALSE Task(%Fa5).hParam THEN MakeTaskParameterDialog %Fa5,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Fa5).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Fa.channel, 5, 127 'KeyPress Fa.channel,5, slider(slnr).value Task(%Fa5).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Fa.channel, 5, n END IF Task(%Fa5).freq = 10 END SUB SUB Fa5_Stop () NoteOff Fa.channel, 5 END SUB SUB Fa_100 () ' controller 100 test ' This controls valves 1-7 STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC i AS INTEGER IF ISFALSE Task(%Fa_100).tog THEN ' IF ISFALSE Task(%Fa_100).hParam THEN ' DIM TaskParamLabels(0) ' TaskParamLabels(0)="C100" ' MakeTaskParameterDialog %Fa_100,1, Slider(),0,UdCtrl(), TaskParamLabels() ' slnr = TaskEX(%Fa_100).SliderNumbers(0) ' Slider(slnr).cptr = CODEPTR(Fa_SL100) ' Slider(slnr).value = 0 ' Fa.ctrl(100) = 0 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' END IF Task(%Fa_100).freq = 10 Task(%Fa_100).tog = %TRue END IF INCR i i = i MOD 6 Controller Fa.channel, 100, 2^i Task(%Fa_100).freq = 2 END SUB SUB Fa_101 () ' controller 101 test ' This controls valves 8-14 STATIC i AS INTEGER IF ISFALSE Task(%Fa_101).tog THEN Task(%Fa_101).freq = 10 Task(%Fa_101).tog = %TRue END IF INCR i i = i MOD 6 Controller Fa.channel, 101, 2^i Task(%Fa_101).freq = 2 END SUB SUB Fa_102 () ' controller 102 test ' This controls valves 15-21 STATIC i AS INTEGER IF ISFALSE Task(%Fa_102).tog THEN Task(%Fa_102).freq = 10 Task(%Fa_102).tog = %TRue END IF INCR i i = i MOD 6 Controller Fa.channel, 102, 2^i Task(%Fa_102).freq = 2 END SUB SUB Fa_103 () ' controller 103 test ' This controls valves 22-28 STATIC i AS INTEGER IF ISFALSE Task(%Fa_103).tog THEN Task(%Fa_103).freq = 10 Task(%Fa_103).tog = %TRue END IF INCR i i = i MOD 6 Controller Fa.channel, 103, 2^i Task(%Fa_103).freq = 2 END SUB