'******************************************** '* < FLEX > * '* musical robot by dr.Godfried-Willem Raes * '* 2002-2016 * '* User interface and driver code * '******************************************** '29.08.2002: start coding '09.09.2002: tests for stepping motors '27.12.2002: pincode test o.k. '28.12.2002: test session bending motors. Using USB on putty. '01.01.2003: test bow motor code. '04.01.2003: flex_beat rewritten in DLL. '07.01.2003: centers in sliders widened. '12.01.2003: param-window arranger added. '13.01.2003: exact mapping of hardware components checked '18.01.2003: midi listen task implemented. '29.05.2003: test coding for softpush solenoids added. '01.06.2003: practical test on flex. '07.06.2003: debug session. '08.06.2003: start coding ' we still have an inconsistency in the numbering of bows, blades and motors in the different functions. '10.06.2003: start double coding (in part in Faust) '22.07.2003: ADXL port opened automatically from listen task for '27.07.2007: adapted to new AXE3 sensor. - flexes code moved to flexes in Faust. '25.04.2016: Flex upgraded to version 2.0. ' From now on it's a midi controlled robot. ' Code for bow motors debugged and found o.k. ' Bow motor frontal tested with PIC. '25.05.2016: First tests with the bow assembly. Nothing works... '26.05.2016: Motor control working ' bow movement still problematic. '27.05.2016: CC40, 41, 42 added. '19.06.2016: Works taken up again... '20.06.2016: Midi implementation memo: ' note 36 Turn spindle until position is reached for the Pi-saw ' note 37 Turn spindle until position is reached for the e-saw ' note 48 Frontbow motor CW ' note 49 Frontbowmotor CCW ' note 50 Backbowmotor CW ' note 51 Backbowmotor CCW ' note 60 Frontbow to Pi saw ' note 61 Frontbow to e saw ' note 62 Backbow to Pi saw ' note 63 Backbow to e saw ' note 64 Frontbow center command ' note 65 Backbow center command ' note 66 Frontbow brake ' note 67 Backbow brake ' note 72 Pi-saw frontal beater motor ' note 73 Pi-saw back beater motor (optional) ' note 74 Pi-saw beater 1 ' note 75 Pi-saw beater 2 ' note 84 e-saw frontal beater motor ' note 85 e-saw back beater motor (optional) ' note 86 e-saw beater 1 ' note 87 e-saw beater 2 ' controller 40: Bow minimum force dropped ' controller 41: Bow attack force ' controller 42: Hysteresis range bows dropped ' controller 50: Calibrate saw zero position dropped ' controller 51: Calibrate saw max position dropped ' controller 52: Blocking calibration command. dropped ' controller 53: run clockwise dropped ' controller 54: run counterclockwise dropped ' controller 66: Power on/off ' controller 123: all notes off ' 23.06.2016: cockpit rearranged ' beater test procedures added. ' 24.06.2016:test code for the lights added. ' 28.06.2016: further procs. added for debugging ' 29.06.2016: Firmware V1.0 for the saw blades ready. ' tests for notes 38-41 added. ' 07.07.2016: Hardware added to flex. Code for tests revised. ' backmotor testcode added. ' 08.07.2016: positioning code modified for common use of sliders. ' 14.07.2016: some recoding of the tests. Tasks recombined. ' 08.08.2016: code modules for our research into dsPIC33 and PIC24 controllers added. ' Pi saw commands: %Flex_PiMotPos = 16 ' Pi-motor saw blade positioning task note 36 %Flex_PiStretch = 17 ' command to fully stretch the saw - note 38 %Flex_PiInwards = 18 ' note 40 %Flex_72 = 20 ' Pi-front 1 motor beater %Flex_73 = 21 ' Pi-backside motor beater %Flex_7475 = 22 ' 2 piano beaters Pi backside ' e saw commands %Flex_eMotPos = 32 ' e -motor positioning task note 37 %Flex_eStretch = 33 ' command to fully stretch the saw - should become note 39 %Flex_eInwards = 34 ' should become note 41 %Flex_84 = 36 ' e-front-1 motor beater %Flex_85 = 37 ' e-backside motor beater %Flex_8687 = 38 ' 2 piano beaters e backside ' bow commands %Flex_Controllers = 48 ' for the bows %Flex_BackBow = 50 ' backside bow - motor ctrl %Flex_FrontBow = 51 ' frontside bow - motor ctrl '%Flex_PushBackBow = 52 ' back bow pushers '%Flex_PushFrontBow = 53 ' front bow pushers %Flex_Center_Back = 54 %Flex_Center_Front = 55 %Flex_fb_e = 57 ' one shot commands %Flex_fb_pi = 58 %Flex_bb_e = 59 %Flex_bb_pi = 60 %Flex_PiLites = 31 %Flex_ELites = 47 ' hardware & firmware test for PIC24 board %Pic24 = 15 %Pic24pwm = 1 %Pic24_V1 = 3 %PIC24_V2 = 4 %PIC24_V3 = 5 %PIC24_Wave = 8 'GLOBAL pAXE3 AS Axe_Type PTR ' new version 27.10.2007 DECLARE FUNCTION Init_Flex () AS LONG DECLARE SUB Flex_Power () DECLARE SUB FlexPos_e () DECLARE SUB FlexPos_Pi () DECLARE SUB FlexPos_e_Stop () DECLARE SUB FlexPos_Pi_Stop () DECLARE SUB Flex_PiStretch () DECLARE SUB Flex_PiStretch_stop () DECLARE SUB Flex_PiInwards () DECLARE SUB Flex_PiInwards_stop () DECLARE SUB Flex_eStretch () DECLARE SUB Flex_eStretch_stop () DECLARE SUB Flex_eInwards () DECLARE SUB Flex_eInwards_stop () DECLARE SUB Flex_PiLites () DECLARE SUB Flex_Elites () DECLARE SUB Flex_BackBow () DECLARE SUB Flex_FrontBow () DECLARE SUB Flex_BackBowStop () DECLARE SUB Flex_FrontBowStop () 'DECLARE SUB Flex_PushBackBow () 'DECLARE SUB Flex_PushFrontBow () 'DECLARE SUB Flex_PushBackBowStop () 'DECLARE SUB Flex_PushFrontBowStop () DECLARE SUB Flex_Controllers () DECLARE SUB Flex_Center_Back_Bow () DECLARE SUB Flex_center_front_Bow () DECLARE SUB FlexBeaters_Pi_7475 () DECLARE SUB FlexBeaters_Pi_7475_stop () DECLARE SUB FlexBeaters_e_8687 () DECLARE SUB FlexBeaters_e_8687_stop () DECLARE SUB Flex_fb_e () DECLARE SUB Flex_fb_pi () DECLARE SUB Flex_bb_e () DECLARE SUB Flex_bb_pi () DECLARE SUB Pic24 () DECLARE SUB Pic24_V1 () DECLARE SUB Pic24_V2 () DECLARE SUB Pic24_V3 () FUNCTION Init_Flex () AS LONG LOCAL m AS ASCIIZ * 40 LOCAL i AS DWORD 'delete unnecessary buttons ButnSW(2).tag0 = "PowOff" ' switches solenoid voltage on/off ButnSW(2).tag1 = "Pow ON" ButnSW(2).cptr = CODEPTR(Flex_Power) ButnSW(3).tag0 = "" ButnSW(4).tag0 = "" ButnSW(5).tag0 = "" ButnSW(6).tag0 = "" ButnSW(7).tag0 = "" ButnSW(8).tag0 = "" ButnSW(9).tag0 = "" ButnSW(10).tag0 = "" ' ButnOS(5).tag = "cc50" ' ButnOS(5).cptr = CODEPTR(Flex_CC50) ' ButnOS(6).tag = "cc51" ' ButnOS(6).cptr = CODEPTR(Flex_CC51) ' ButnOS(7).tag = "cc52" ' ButnOS(7).cptr = CODEPTR(Flex_CC52) ' ButnOS(9).tag = "cc53-cw" ' ButnOS(9).cptr = CODEPTR(Flex_CC53) ' ButnOS(10).tag = "cc54-ccw" ' ButnOS(10).cptr = CODEPTR(Flex_CC54) ButnOS(3).tag = "" ButnOS(4).tag = "" ButnOS(8).tag = "" ' ButnOS(9).tag = "ArrWin" ' ButnOS(9).cptr = CODEPTR(Flex_MoveWindows) Task(%Flex_Controllers).naam = "Ctrls" Task(%Flex_Controllers).freq = 12 Task(%Flex_Controllers).cptr = CODEPTR(flex_controllers) Task(%Flex_Controllers).flags = %False ' TaskEx(%Flex_Controllers).Stopcptr = CODEPTR(flex_Ctrl_Stop) Task(%Flex_PiMotPos).naam = "Pi-pos" ' saw blade thread motors Task(%Flex_PiMotPos).freq = 4 Task(%Flex_PiMotPos).cptr = CODEPTR(flexPos_Pi) TaskEX(%Flex_PiMotPos).stopcptr = CODEPTR(FlexPos_Pi_Stop) Task(%Flex_eMotPos).naam = "e-pos" Task(%Flex_eMotPos).freq = 4 Task(%Flex_eMotPos).cptr = CODEPTR(flexPos_e) TaskEX(%Flex_eMotPos).stopcptr = CODEPTR(FlexPos_e_stop) Task(%Flex_PiStretch).naam = "Pi-out" ' fully stretch Pi sawblade Task(%Flex_PiStretch).freq = 4 Task(%Flex_PiStretch).cptr = CODEPTR(flex_PiStretch) TaskEX(%Flex_PiStretch).stopcptr = CODEPTR(Flex_PiStretch_stop) Task(%Flex_PiInwards).naam = "Pi-in" ' fully bend Pi sawblade Task(%Flex_PiInwards).freq = 4 Task(%Flex_PiInwards).cptr = CODEPTR(flex_PiInwards) TaskEX(%Flex_PiInwards).stopcptr = CODEPTR(Flex_PiInwards_stop) Task(%Flex_eStretch).naam = "e-out" ' fully stretch e sawblade Task(%Flex_eStretch).freq = 4 Task(%Flex_eStretch).cptr = CODEPTR(flex_eStretch) TaskEX(%Flex_eStretch).stopcptr = CODEPTR(Flex_eStretch_stop) Task(%Flex_eInwards).naam = "e-in" ' fully bend e sawblade Task(%Flex_eInwards).freq = 4 Task(%Flex_eInwards).cptr = CODEPTR(flex_eInwards) TaskEX(%Flex_eInwards).stopcptr = CODEPTR(Flex_eInwards_stop) Task(%Flex_BackBow).naam = "BackBow" ' bow motor Task(%Flex_BackBow).freq = 10 Task(%Flex_BackBow).cptr = CODEPTR(flex_BackBow) Task(%Flex_Backbow).flags = %False TaskEX(%Flex_Backbow).Stopcptr = CODEPTR(flex_BackBow_Stop) Task(%Flex_FrontBow).naam = "FrontBow" ' bow motor Task(%Flex_FrontBow).freq = 10 Task(%Flex_FrontBow).cptr = CODEPTR(flex_FrontBow) Task(%Flex_FrontBow).flags = %False TaskEX(%Flex_Frontbow).Stopcptr = CODEPTR(flex_FrontBow_Stop) Task(%Flex_Center_Back).naam ="B-center" Task(%Flex_Center_Back).freq = 50 Task(%Flex_Center_Back).cptr = CODEPTR(flex_Center_Back_bow) Task(%Flex_Center_Back).flags = %False Task(%Flex_Center_Front).naam ="F-center" Task(%Flex_Center_Front).freq = 50 Task(%Flex_Center_Front).cptr = CODEPTR(flex_Center_Front_bow) Task(%Flex_Center_Front).flags = %False ' bow positioning one shots: Task(%Flex_fb_e).naam = "fb@e" Task(%Flex_fb_e).freq = 50 Task(%Flex_fb_e).cptr = CODEPTR(Flex_fb_e) Task(%Flex_fb_pi).naam = "fb@pi" Task(%Flex_fb_pi).freq = 50 Task(%Flex_fb_pi).cptr = CODEPTR(Flex_fb_pi) Task(%Flex_bb_e).naam = "bb@e" Task(%Flex_bb_e).freq = 50 Task(%Flex_bb_e).cptr = CODEPTR(Flex_bb_e) Task(%Flex_bb_pi).naam = "bb@pi" Task(%Flex_bb_pi).freq = 50 Task(%Flex_bb_pi).cptr = CODEPTR(Flex_bb_pi) ' beater test procedures: Task(%Flex_7475).naam = "Pi-7475" Task(%Flex_7475).cptr = CODEPTR(FlexBeaters_Pi_7475) Task(%Flex_7475).freq = 30 TaskEX(%Flex_7475).stopcptr = CODEPTR(FlexBeaters_Pi_7475_stop) Task(%Flex_8687).naam = "e-8687" Task(%Flex_8687).cptr = CODEPTR(FlexBeaters_e_8687) Task(%Flex_8687).freq = 30 TaskEX(%Flex_8687).stopcptr = CODEPTR(FlexBeaters_e_8687_stop) Task(%Flex_72).naam = "Pi-72mot" ' Pi saw, motor beater Task(%Flex_72).cptr = CODEPTR(FlexBeaterMotor_Pi) Task(%Flex_72).freq = 30 TaskEX(%Flex_72).stopcptr = CODEPTR(FlexBeaterMotor_Pi_Stop) Task(%Flex_73).naam = "Pi-73mot" ' Pi saw, motor beater backside Task(%Flex_73).cptr = CODEPTR(Pi_73mot) Task(%Flex_73).freq = 30 TaskEX(%Flex_73).stopcptr = CODEPTR(Pi_73mot_stop) Task(%Flex_84).naam = "e-84mot" ' e saw, motor beater Task(%Flex_84).cptr = CODEPTR(FlexBeaterMotor_e) Task(%Flex_84).freq = 30 TaskEX(%Flex_84).stopcptr = CODEPTR(FlexBeaterMotor_e_Stop) Task(%Flex_85).naam = "e-85mot" ' e saw, backside motor beater Task(%Flex_85).cptr = CODEPTR(e_85mot) Task(%Flex_85).freq = 30 TaskEX(%Flex_85).stopcptr = CODEPTR(e_85mot_stop) Task(%Flex_PiLites).naam = "Pi-Lits" Task(%Flex_Pilites).freq = 1 Task(%Flex_Pilites).cptr = CODEPTR(Flex_PiLites) TaskEX(%Flex_PiLites).stopcptr = CODEPTR(Flex_PiLites_Stop) Task(%Flex_ELites).naam = "E-Lites" Task(%Flex_Elites).freq = 1 Task(%Flex_Elites).cptr = CODEPTR(Flex_ELites) TaskEX(%Flex_ELites).stopcptr = CODEPTR(Flex_ELites_Stop) Task(%PIC24).naam = "Pic24" Task(%PIC24).freq = 16 Task(%PIC24).cptr = CODEPTR(Pic24) TaskEX(%PIC24).stopcptr = CODEPTR(Pic24_stop) Task(%PIC24pwm).naam = "P24pwm" Task(%PIC24pwm).freq = 16 Task(%PIC24pwm).cptr = CODEPTR(Pic24pwm) ' TaskEX(%PIC24pwm).stopcptr = CODEPTR(Pic24_stop) Task(%PIC24_V1).naam = "P24_V1" Task(%PIC24_V1).freq = 4 Task(%PIC24_V1).cptr = CODEPTR(Pic24_V1) TaskEX(%PIC24_V1).stopcptr = CODEPTR(Pic24_V1_stop) Task(%PIC24_V2).naam = "P24_V2" Task(%PIC24_V2).freq = 4 Task(%PIC24_V2).cptr = CODEPTR(Pic24_V2) Task(%PIC24_V3).naam = "P24_V3" Task(%PIC24_V3).freq = 4 Task(%PIC24_V3).cptr = CODEPTR(Pic24_V3) Task(%PIC24_Wave).naam = "Waves" Task(%PIC24_Wave).freq = 4 Task(%PIC24_Wave).cptr = CODEPTR(Pic24_Wave) SetDlgItemText gh.Cockpit, %GMT_TITLE, " V2.0" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %true END FUNCTION SUB Flex_Power () ' buttonswitch handler ' on/off switch STATIC init AS DWORD STATIC onoff AS DWORD LOCAL i AS LONG IF ISFALSE init THEN onoff = %True init = %True END IF BIT TOGGLE onoff,0 IF onoff THEN ButnSW(2).tag0 = "PowOff" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 2, ButnSW(2).tag0 Controller Flex.channel, 66, %False ELSE ButnSW(2).tag1 = "PowOn" SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 2, ButnSW(2).tag1 Controller Flex.channel, 66, 127 END IF END SUB SUB Flex_Controllers () ' added 27.05.2016 gwr, for pic code development. STATIC slnr AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Flex_Controllers).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(5) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "#66" ' power on/off TaskParamLabels(1) = "#41" ' attackforce 128 + #41, default in PIC is 240, so eqv 112 TaskParamlabels(2) = "#43" ' attack time puls duration, default in pic is 127 TaskParamlabels(3) = "#44" ' ramping speed for bow motors, default is 64 IF ISFALSE Task(%Flex_Controllers).hParam THEN MakeTaskParameterDialog %Flex_Controllers,4,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Flex_Controllers).SliderNumbers(0) Slider(Slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Controller Flex.channel, 66, %False Flex.ctrl(66) = %False Slider(slnr+1).value = 112 Flex.ctrl(41) = 112 Controller Flex.channel, 41, 112 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 127 Flex.ctrl(43) = 127 ' = default waarde 127 in PIC firmware Controller Flex.channel, 43, 127 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value Slider(slnr+3).value = 64 Flex.ctrl(44) = 64 ' = default waarde 64 in PIC firmware Controller Flex.channel, 44, 64 SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value END IF Task(%Flex_Controllers).tog = %True END IF IF flex.ctrl(66) THEN IF slider(slnr).value = 0 THEN flex.ctrl(66) = 0 Controller Flex.channel, 66, 0 END IF END IF IF ISFALSE Flex.ctrl(66) THEN IF slider(slnr).value THEN flex.ctrl(66) = 1 Controller Flex.channel, 66, 1 END IF END IF IF flex.ctrl(41) <> Slider(slnr+1).value THEN flex.ctrl(41) = Slider(slnr+1).value Controller Flex.channel,41, Flex.ctrl(41) END IF IF flex.ctrl(43) <> Slider(slnr+2).value THEN flex.ctrl(43) = Slider(slnr+2).value Controller Flex.channel,43, Flex.ctrl(43) END IF IF flex.ctrl(44) <> Slider(slnr+3).value THEN flex.ctrl(44) = Slider(slnr+3).value Controller Flex.channel,44, Flex.ctrl(44) END IF END SUB SUB FlexPos_Pi () ' test positioning code. ' %Flex_PiMotPos = 33 ' Pi-motor positioning task ' horizontal bending motor with trapezoidal thread. ' 22.06.2016: rewritten ' 27.06.2016: test runs ' 14.07.2016: adapted STATIC slnr, pipos, oldpipos, snelheid, rampspeed AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Flex_PiMotPos).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "Pi-Pos" TaskParamLabels(1) = "speed" TaskParamLabels(2) = "ramp" IF ISFALSE Task(%Flex_PiMotPos).hParam THEN MakeTaskParameterDialog %Flex_PiMotPos,3,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Flex_PiMotPos).SliderNumbers(0) Slider(Slnr).value = 0 RESET Pipos SendMessage Slider(Slnr).h, %TBM_SETRANGEMIN,%True, 0 SendMessage Slider(Slnr).h, %TBM_SETRANGEMAX,%True, 255 slider(slnr).maxval = 255 slider(slnr).minval = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(Slnr+1).value = 64 snelheid = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value rampspeed = 80 slider(slnr+2).value = rampspeed sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, Slider(slnr+2).value END IF NoteOff Flex.channel, 36 Task(%Flex_PiMotPos).tog = %True END IF Pipos = Slider(slnr).value ' now 8 bits IF PiPos <> oldPipos THEN Controller Flex.channel, 45, 0 ' set PB to pi saw ' lsb-msb order Bend Flex.channel, pipos MOD 128, pipos \ 128 snelheid = slider(slnr+1).value mPlay Flex.channel, 36, slider(slnr+1).value oldpipos = piPos ELSEIF Slider(slnr+1).value <> snelheid THEN snelheid = slider(slnr+1).value KeyPress Flex.channel, 36, snelheid END IF IF Slider(slnr+2).value <> rampspeed THEN rampspeed = slider(slnr+2).value Controller Flex.channel, 46, rampspeed END IF END SUB SUB FlexPos_Pi_Stop () NoteOff Flex.channel, 36 END SUB SUB FlexPos_e () '%Flex_eMotPos = 49 ' e -motor positioning task '22.06.2016: rewritten '14.07.2016: adapted STATIC slnr, epos, oldepos, snelheid, rampspeed AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Flex_eMotPos).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "e-Pos" 'TaskParamLabels(1) = "ePoLSB" TaskParamLabels(1) = "speed" TaskParamLabels(2) = "ramp" IF ISFALSE Task(%Flex_eMotPos).hParam THEN MakeTaskParameterDialog %Flex_eMotPos,3,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Flex_eMotPos).SliderNumbers(0) Slider(Slnr).value = 0 RESET epos SendMessage Slider(Slnr).h, %TBM_SETRANGEMIN,%True, 0 SendMessage Slider(Slnr).h, %TBM_SETRANGEMAX,%True, 255 slider(slnr).maxval = 255 slider(slnr).minval = %False SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(Slnr+1).value = 64 snelheid = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value rampspeed = 80 slider(slnr+2).value = rampspeed sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, Slider(slnr+2).value END IF NoteOff Flex.channel, 37 Task(%Flex_eMotPos).tog = %True END IF 'epos = (slider(slnr).value * 128) + Slider(slnr+1).value epos = Slider(slnr).value ' now 8 bits IF ePos <> oldepos THEN Controller Flex.channel, 45, 127 ' set PB to e saw 'Bend Flex.channel, slider(slnr+1).value, slider(slnr).value ' lsb-msb order Bend Flex.channel, epos MOD 128, epos \ 128 snelheid = slider(slnr+1).value mPlay Flex.channel, 37, slider(slnr+1).value oldepos = ePos ELSEIF Slider(slnr+1).value <> snelheid THEN snelheid = slider(slnr+1).value KeyPress Flex.channel, 37, snelheid END IF IF Slider(slnr+2).value <> rampspeed THEN rampspeed = slider(slnr+2).value Controller Flex.channel, 46, rampspeed END IF END SUB SUB FlexPos_e_stop () NoteOff Flex.channel, 37 END SUB SUB Flex_BackBow () ' Motor control backbow ' adapted 25.04.2016 gwr ' 27.05.2016 : with ramping now in the PIC ' 20.06.2016 : Firmware o.k. now. ' 21.06.2016 : Updated. ' 14.06.2016 : Pressure for bow added here as well as Pi-e positioning STATIC oldspeed, note50, note51, force , eside, piside AS LONG STATIC slnr, udnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Flex_Backbow).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ*8 TaskParamLabels(0)="speed" ' back bow TaskParamLabels(1)="Force" ' bow pressure TaskParamLabels(2)="dir" ' direction of rotation UD TaskParamLabels(3)="e-Pi" ' UD e-side/ pi-side IF ISFALSE Task(%Flex_BackBow).hParam THEN MakeTaskParameterDialog %Flex_Backbow,2, Slider(),2,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_Backbow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value oldspeed = 64 force = 10 slider(slnr+1).value = force SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%Flex_Backbow).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Flex_Backbowdir) UDCtrl(udnr).value = 0 UDctrl(udnr).maxval = 1 'cww UDctrl(udnr).minval = 0 'cw UDctrl(udnr+1).cptr = CODEPTR(Flex_BackBow_ePi) UDCtrl(udnr+1).value = 0 UDctrl(udnr+1).maxval = 1 'Pi UDctrl(udnr+1).minval = 0 'e END IF RESET note50, note51 NoteOff Flex.channel, 50 NoteOff Flex.channel, 51 oldspeed = Slider(slnr).value 'if task(%Flex_Center_Back).tog then stoptask %Flex_Center_Back - not needed, its a one shot Task(%Flex_Backbow).tog = %True END IF SELECT CASE UDctrl(udnr).value CASE 0 'run CW IF slider(slnr).value <> oldspeed THEN oldspeed = slider(slnr).value IF ISFALSE Note50 THEN 'NoteOff Flex.channel, 50 would cause ramping from 0 IF Note51 THEN NoteOff Flex.channel, 51 RESET Note51 END IF mPlay Flex.channel, 50, oldspeed ' cw Note50 = %True ELSE Keypress Flex.channel, 50, oldspeed RESET Note51 END IF ELSE IF ISFALSE Note50 THEN IF Note51 THEN NoteOff Flex.channel, 51 : RESET Note51 mPlay Flex.channel, 50, oldspeed Note50 = %True END IF END IF CASE 1 'run ccw IF slider(slnr).value <> oldspeed THEN 'NoteOff Flex.channel, 51 oldspeed = slider(slnr).value IF ISFALSE Note51 THEN IF note50 THEN NoteOff Flex.channel, 50 mPlay Flex.channel, 51, oldspeed ' ccw Note51 = %True ELSE KeyPress Flex.channel, 51, oldspeed RESET Note50 END IF ELSE IF ISFALSE Note51 THEN IF Note50 THEN NoteOff Flex.channel, 50 : RESET Note50 mPlay Flex.channel, 51, oldspeed Note51 = %True END IF END IF END SELECT IF slider(slnr+1).value <> force THEN force = slider(slnr+1).value SELECT CASE UDctrl(udnr+1).value CASE 0 ' e-side IF ISFALSE eside THEN mPlay Flex.channel, 63, force ' already done in UD-ctrl... ELSE KeyPress Flex.channel, 63, force END IF eside = %True Piside = %False CASE 1 ' pi-side IF ISFALSE PiSide THEN mPlay Flex.channel, 62, force ELSE KeyPress Flex.Channel, 62, force END IF eside = %False Piside = %True END SELECT END IF Task(%Flex_Backbow).freq = 10 END SUB SUB Flex_Backbowdir () ' UD callback LOCAL udnr, dir AS DWORD udnr = TaskEX(%Flex_Backbow).UpDownNumbers(0) dir = UDctrl(udnr).value IF ISFALSE dir THEN SetDlgItemText Task(%Flex_Backbow).hparam, %GMT_TEXT0_ID + 16, "cw" ' NoteOff Flex.channel, 51 ELSE SetDlgItemText Task(%Flex_Backbow).hparam, %GMT_TEXT0_ID + 16, "ccw" ' NoteOff Flex.channel, 50 END IF END SUB SUB Flex_Backbow_ePi () ' UD callback STATIC udnr, slnr, epi AS DWORD udnr = TaskEX(%Flex_Backbow).UpDownNumbers(1) slnr = TaskEX(%Flex_Backbow).SliderNumbers(1) ' force ePi = UDctrl(udnr).value IF ISFALSE ePi THEN SetDlgItemText Task(%Flex_Backbow).hparam, %GMT_TEXT0_ID + 17, "e" NoteOff Flex.channel, 62 ' release Pi side mPlay Flex.channel, 63, Slider(slnr).value 'attack e side ELSE SetDlgItemText Task(%Flex_Backbow).hparam, %GMT_TEXT0_ID + 17, "Pi" NoteOff Flex.channel, 63 ' release e-side mPlay Flex.channel, 62, Slider(slnr).value ' attack Pi-side END IF END SUB SUB Flex_Backbow_Stop () 'stop bow movement NoteOff Flex.channel, 50 NoteOff Flex.channel, 51 starttask %Flex_Center_Back END SUB SUB Flex_Frontbow_Stop () 'stop bow movement NoteOff Flex.channel, 48 NoteOff Flex.channel, 49 starttask %Flex_Center_Front END SUB SUB Flex_FrontBow () ' Motor control frontbow ' adapted 25.04.2016 gwr ' 27.05.2016 : with ramping now in the PIC ' 20.06.2016 : Firmware o.k. now. ' 21.06.2016 : Updated. ' 14.07.2016 : Merged with force and e-pi controll STATIC oldspeed, note48, note49, force, eside, piside AS LONG STATIC slnr, udnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Flex_Frontbow).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ*8 TaskParamLabels(0)="speed" ' front bow TaskParamLabels(1)="force" ' bow pressure TaskParamLabels(2)="dir" ' direction of rotation TaskParamlabels(3)="e-Pi" ' e side or Pi-side UD IF ISFALSE Task(%Flex_FrontBow).hParam THEN MakeTaskParameterDialog %Flex_Frontbow,2, Slider(),2,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_Frontbow).SliderNumbers(0) Slider(Slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value oldspeed = 64 force = 10 slider(slnr+1).value = force SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%Flex_Frontbow).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Flex_Frontbowdir) UDCtrl(udnr).value = 0 UDctrl(udnr).maxval = 1 'cww UDctrl(udnr).minval = 0 'cw UDctrl(udnr+1).cptr = CODEPTR(Flex_FrontBow_ePi) UDCtrl(udnr+1).value = 0 UDctrl(udnr+1).maxval = 1 'Pi UDctrl(udnr+1).minval = 0 'e END IF RESET note48, note49 NoteOff Flex.channel, 48 NoteOff Flex.channel, 49 oldspeed = Slider(slnr).value Task(%Flex_Frontbow).tog = %True END IF SELECT CASE UDctrl(udnr).value CASE 0 'run CW IF slider(slnr).value <> oldspeed THEN oldspeed = slider(slnr).value IF ISFALSE Note48 THEN IF Note49 THEN NoteOff Flex.channel, 49 RESET Note49 END IF mPlay Flex.channel, 48, oldspeed ' cw Note48 = %True ELSE Keypress Flex.channel, 48, oldspeed RESET Note49 END IF ELSE IF ISFALSE Note48 THEN IF Note49 THEN NoteOff Flex.channel, 49 : RESET Note49 mPlay Flex.channel, 48, oldspeed Note48 = %True END IF END IF CASE 1 'run ccw IF slider(slnr).value <> oldspeed THEN oldspeed = slider(slnr).value IF ISFALSE Note49 THEN IF note48 THEN NoteOff Flex.channel, 48 mPlay Flex.channel, 49, oldspeed ' ccw Note49 = %True ELSE KeyPress Flex.channel, 49, oldspeed RESET Note48 END IF ELSE IF ISFALSE Note49 THEN IF Note48 THEN NoteOff Flex.channel, 48 : RESET Note48 mPlay Flex.channel, 49, oldspeed Note49 = %True END IF END IF END SELECT IF slider(slnr+1).value <> force THEN force = slider(slnr+1).value SELECT CASE UDctrl(udnr+1).value CASE 0 ' e-side IF eside = %False THEN mPlay Flex.channel, 61, force ELSE KeyPress Flex.channel, 61, force END IF eside = %True Piside = %False CASE 1 ' pi-side IF Piside = %False THEN mPlay Flex.channel, 60, force ELSE KeyPress Flex.channel, 60, force END IF eside = %False Piside = %True END SELECT END IF Task(%Flex_Frontbow).freq = 10 END SUB SUB Flex_Frontbowdir () ' UD callback LOCAL udnr, dir AS DWORD udnr = TaskEX(%Flex_Frontbow).UpDownNumbers(0) dir = UDctrl(udnr).value IF ISFALSE dir THEN SetDlgItemText Task(%Flex_Frontbow).hparam, %GMT_TEXT0_ID + 16, "cw" 'NoteOff Flex.channel, 49 ELSE SetDlgItemText Task(%Flex_Frontbow).hparam, %GMT_TEXT0_ID + 16, "ccw" 'NoteOff Flex.channel, 48 END IF END SUB SUB Flex_Frontbow_ePi () ' UD callback LOCAL udnr, slnr, epi AS DWORD udnr = TaskEX(%Flex_Frontbow).UpDownNumbers(1) slnr = TaskEX(%Flex_Frontbow).SliderNumbers(1) ePi = UDctrl(udnr).value IF ISFALSE ePi THEN SetDlgItemText Task(%Flex_Frontbow).hparam, %GMT_TEXT0_ID + 17, "e" NoteOff Flex.channel, 60 ' release Pi side mPlay Flex.channel, 61, Slider(slnr).value ' activate e side ELSE SetDlgItemText Task(%Flex_Frontbow).hparam, %GMT_TEXT0_ID + 17, "Pi" NoteOff Flex.channel, 61 ' release e-side mPlay Flex.channel, 60, Slider(slnr).value ' activate Pi-side END IF END SUB SUB FlexBeaters_Pi_7475 () 'alternating beating task. '23.06.2016 '07.07.2016 modified with sending Key pressure every time STATIC cnt AS DWORD STATIC slnr, pres AS DWORD IF ISFALSE Task(%Flex_7475).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(2) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " TaskParamLabels(2)="Reps " IF Task(%Flex_7475).hParam = %Null THEN MakeTaskParameterDialog %Flex_7475,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_7475).SliderNumbers(0) END IF Task(%Flex_7475).tog = %True END IF IF pres <> slider(slnr+2).value THEN pres = slider(slnr+2).value 'Keypress Flex.channel, 74, pres 'KeyPress Flex.channel, 75, pres END IF IF ISFALSE cnt THEN cnt = %True NoteOff Flex.channel, 75 mPlay Flex.channel, 74, Slider(slnr+1).value Keypress Flex.channel, 74, pres ELSE NoteOff Flex.channel, 74 mPlay Flex.channel, 75, Slider(slnr+1).value Keypress Flex.channel, 75, pres RESET cnt END IF Task(%Flex_7475).freq = MAX(0.1, Slider(slnr).value / 16) END SUB SUB FlexBeaters_Pi_7475_stop () NoteOff Flex.channel, 74 NoteOff Flex.channel, 75 Keypress Flex.channel, 74, %False KeyPress Flex.channel, 75, %False END SUB SUB FlexBeaters_e_8687 () 'alternating beating task. '23.06.2016 STATIC cnt AS DWORD STATIC slnr, pres AS DWORD IF ISFALSE Task(%Flex_8687).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(2) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Speed" TaskParamLabels(1)="Velo " TaskParamLabels(2)="Reps " IF Task(%Flex_8687).hParam = %Null THEN MakeTaskParameterDialog %Flex_8687,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_8687).SliderNumbers(0) END IF Task(%Flex_8687).tog = %True END IF IF pres <> slider(slnr+2).value THEN pres = slider(slnr+2).value 'Keypress Flex.channel, 86, pres 'KeyPress Flex.channel, 87, pres END IF IF ISFALSE cnt THEN cnt = %True NoteOff Flex.channel, 87 mPlay Flex.channel, 86, Slider(slnr+1).value Keypress Flex.channel, 86, pres ELSE NoteOff Flex.channel, 86 mPlay Flex.channel, 87, Slider(slnr+1).value KeyPress Flex.channel, 87, pres RESET cnt END IF Task(%Flex_8687).freq = MAX(0.1, Slider(slnr).value / 16) END SUB SUB FlexBeaters_e_8687_stop () NoteOff Flex.channel, 86 NoteOff Flex.channel, 87 Keypress Flex.channel, 86, %False KeyPress Flex.channel, 87, %False END SUB SUB FlexBeaterMotor_Pi () ' frontaal, binnenkant, Pi blad - Johnson motor ' met pwm sturing no key press. repeats STATIC slnr, cnt AS DWORD IF ISFALSE Task(%Flex_72).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Rate" TaskParamLabels(1)="speed " ' steers speed of rotation IF ISFALSE Task(%Flex_72).hParam THEN MakeTaskParameterDialog %Flex_72,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_72).SliderNumbers(0) END IF RESET cnt Task(%Flex_72).tog = %True END IF Task(%Flex_72).freq = MAX(0.1,Slider(slnr).value / 16 ) IF ISFALSE cnt THEN mPlay Flex.channel, 72, slider(slnr+1).value cnt = %True ELSE noteoff Flex.channel, 72 RESET cnt END IF END SUB SUB FlexBeaterMotor_Pi_Stop () NoteOff Flex.channel, 72 END SUB SUB FlexBeaterMotor_e () ' frontaal, binnenkant, e blad - Johnson motor ' met pwm sturing no key press. repeats ' keypress can be used to modulate motor speed STATIC slnr, cnt AS DWORD IF ISFALSE Task(%Flex_84).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Rate" TaskParamLabels(1)="speed " ' steers speed of rotation IF ISFALSE Task(%Flex_84).hParam THEN MakeTaskParameterDialog %Flex_84,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_84).SliderNumbers(0) END IF RESET cnt Task(%Flex_84).tog = %True END IF Task(%Flex_84).freq = MAX(0.1,Slider(slnr).value / 16 ) IF ISFALSE cnt THEN mPlay Flex.channel, 84, slider(slnr+1).value cnt = %True ELSE noteoff Flex.channel, 84 RESET cnt END IF END SUB SUB FlexBeaterMotor_e_Stop () NoteOff Flex.channel, 84 END SUB SUB e_85mot () ' achterkant e blad - Johnson motor ' met pwm sturing no key press. repeats ' keypress can be used to modulate motor speed STATIC slnr, cnt AS DWORD IF ISFALSE Task(%Flex_85).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Rate" TaskParamLabels(1)="speed " ' steers speed of rotation IF ISFALSE Task(%Flex_85).hParam THEN MakeTaskParameterDialog %Flex_85,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_85).SliderNumbers(0) END IF RESET cnt Task(%Flex_85).tog = %True END IF Task(%Flex_85).freq = MAX(0.1,Slider(slnr).value / 16 ) IF ISFALSE cnt THEN mPlay Flex.channel, 85, slider(slnr+1).value cnt = %True ELSE noteoff Flex.channel, 85 RESET cnt END IF END SUB SUB e_85mot_Stop () NoteOff Flex.channel, 85 END SUB SUB Pi_73mot () ' achterkant Pi blad - Johnson motor ' met pwm sturing no key press. repeats ' keypress can be used to modulate motor speed STATIC slnr, cnt AS DWORD IF ISFALSE Task(%Flex_73).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Rate" TaskParamLabels(1)="speed " ' steers speed of rotation IF ISFALSE Task(%Flex_73).hParam THEN MakeTaskParameterDialog %Flex_73,2, Slider(),0,UdCtrl(), TaskParamLabels() END IF slnr = TaskEX(%Flex_73).SliderNumbers(0) END IF RESET cnt Task(%Flex_73).tog = %True END IF Task(%Flex_73).freq = MAX(0.1,Slider(slnr).value / 16 ) IF ISFALSE cnt THEN mPlay Flex.channel, 73, slider(slnr+1).value cnt = %True ELSE noteoff Flex.channel, 73 RESET cnt END IF END SUB SUB Pi_73mot_Stop () NoteOff Flex.channel, 73 END SUB SUB Flex_fb_e() 'frontbow tegen e-blad mPlay Flex.channel, 61, 127 stoptask %Flex_fb_e END SUB SUB Flex_fb_pi() 'frontbow tegen pi-blad mPlay Flex.channel, 60, 127 stoptask %Flex_fb_pi END SUB SUB Flex_bb_e() 'backbow tegen e -blad mPlay Flex.channel, 63, 127 Stoptask %Flex_bb_e END SUB SUB Flex_bb_pi() 'backbow tegen Pi-blad mPlay Flex.channel, 62, 127 Stoptask %Flex_bb_pi END SUB SUB Flex_Center_Back_Bow () ' one shot command IF task(%Flex_Backbow).tog THEN stoptask %Flex_BackBow mPlay Flex.channel, 65, 127 'brake would be note 67 stoptask %Flex_Center_Back END SUB SUB Flex_center_front_Bow () ' one shot command IF task(%Flex_Frontbow).tog THEN stoptask %Flex_FrontBow mPlay Flex.channel, 64, 127 'brake would be note 66 stoptask %Flex_Center_Front END SUB SUB Flex_CC50 () ' called with the one-shot button Controller Flex.channel, 50, 64 END SUB SUB Flex_CC51 () Controller Flex.channel, 51, 64 END SUB SUB Flex_ELites () STATIC n AS INTEGER NoteOff Flex.channel, 120 + n INCR n IF n> 3 THEN RESET n mPlay Flex.channel, 120 + n , 64 END SUB SUB Flex_Elites_Stop () NoteOff Flex.channel, 120 NoteOff Flex.channel, 121 NoteOff Flex.channel, 122 NoteOff Flex.channel, 123 END SUB SUB Flex_PiLites () STATIC n AS INTEGER NoteOff Flex.channel, 124 + n INCR n IF n> 3 THEN RESET n mPlay Flex.channel, 124 + n , 64 END SUB SUB Flex_PiLites_Stop () NoteOff Flex.channel, 124 NoteOff Flex.channel, 125 NoteOff Flex.channel, 126 NoteOff Flex.channel, 127 END SUB SUB Flex_PiStretch () ' one shot task - should also calibrate the fully stretched endposition ' 14.07.2016: modified. STATIC snelheid, ramp, slnr AS INTEGER IF ISFALSE task(%Flex_PiStretch).tog THEN ' code with the note 38 implementation: IF Task(%Flex_PiMotPos).tog THEN stoptask %Flex_PiMotPos IF Task(%Flex_PiInwards).tog THEN stoptask %Flex_PiInwards IF TaskEx(%Flex_PiMotPos).slidernumbers(1) THEN ' if this task was initialized, we can use that slider slnr = TaskEx(%Flex_PiMotPos).slidernumbers(1) snelheid = Slider(slnr).value ramp = Slider(slnr+1).value Controller Flex.channel, 46, ramp ' ramping speed ELSE ramp = 80 snelheid = 70 Controller Flex.channel, 46, ramp END IF mPlay Flex.channel, 38, snelheid Task(%Flex_PiStretch).tog = %True END IF ' noteoff is sent on stopping the task END SUB SUB Flex_PiStretch_Stop () NoteOff Flex.channel, 38 END SUB SUB Flex_PiInwards () ' one shot task - should also calibrate the fully bend endposition ' 08.07.2016: now using sliders from the Pipos task. ' 14.07.2016: adapted. STATIC snelheid, ramp, slnr AS INTEGER IF ISFALSE task(%Flex_PiInwards).tog THEN IF Task(%Flex_PiMotPos).tog THEN stoptask %Flex_PiMotPos IF Task(%Flex_PiStretch).tog THEN stoptask %Flex_PiStretch IF TaskEx(%Flex_PiMotPos).slidernumbers(1) THEN ' if this task was initialized, we can use that slider slnr = TaskEx(%Flex_PiMotPos).slidernumbers(1) snelheid = Slider(slnr).value ramp = Slider(slnr+1).value Controller Flex.channel, 46, ramp ' ramping speed ELSE ramp = 80 snelheid = 70 Controller Flex.channel, 46, ramp END IF mPlay Flex.channel, 40, snelheid Task(%Flex_PiInwards).tog = %True END IF ' noteoff is sent on stopping the task END SUB SUB Flex_PiInwards_stop () NoteOff Flex.channel, 40 END SUB SUB Flex_eStretch () ' one shot task - should also calibrate the fully stretched endposition ' 14.07.2014: rechecked for firmware version 1.2 STATIC snelheid, ramp, slnr AS INTEGER IF ISFALSE task(%Flex_eStretch).tog THEN IF Task(%Flex_eMotPos).tog THEN stoptask %Flex_eMotPos IF Task(%Flex_eInwards).tog THEN stoptask %Flex_eInwards IF TaskEx(%Flex_eMotPos).slidernumbers(1) THEN ' if this task was initialized, we can use that slider slnr = TaskEx(%Flex_eMotPos).slidernumbers(1) snelheid = Slider(slnr).value ramp = Slider(slnr+1).value Controller Flex.channel, 46, ramp ' ramping speed ELSE ramp = 80 snelheid = 70 Controller Flex.channel, 46, ramp END IF mPlay Flex.channel, 39, snelheid ' velobyte = speed Task(%Flex_eStretch).tog = %True END IF ' noteoff is sent on stopping the task END SUB SUB Flex_eStretch_Stop () NoteOff Flex.channel, 39 END SUB SUB Flex_eInwards () ' one shot task - should also calibrate the fully bend endposition STATIC snelheid, ramp, slnr AS INTEGER IF ISFALSE task(%Flex_eInwards).tog THEN IF Task(%Flex_eMotPos).tog THEN stoptask %Flex_eMotPos IF Task(%Flex_eStretch).tog THEN stoptask %Flex_eStretch IF TaskEx(%Flex_eMotPos).slidernumbers(1) THEN ' if this task was initialized, we can use that slider slnr = TaskEx(%Flex_eMotPos).slidernumbers(1) snelheid = Slider(slnr).value ramp = Slider(slnr+1).value Controller Flex.channel, 46, ramp ' ramping speed ELSE ramp = 80 snelheid = 70 Controller Flex.channel, 46, ramp END IF mPlay Flex.channel, 41, snelheid ' velobyte = speed Task(%Flex_eInwards).tog = %True END IF ' noteoff is sent on stopping the task END SUB SUB Flex_eInwards_stop () NoteOff Flex.channel, 41 END SUB '----------------- pic 24 testkode SUB Pic24() STATIC slnr,velo0, velo1, velo2, velo3 AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(3) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "velo0" TaskParamLabels(1) = "velo1" TaskParamLabels(2) = "velo2" TaskParamLabels(3) = "velo3" IF ISFALSE Task(%Pic24).hParam THEN MakeTaskParameterDialog %Pic24,4,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Pic24).SliderNumbers(0) RESET velo0, velo1, velo2, velo3 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, velo0 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, velo1 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, velo2 sendmessage slider(slnr+3).h, %TBM_SETPOS,%True, velo3 END IF NoteOff Flex.channel, 0 NoteOff Flex.channel, 1 NoteOff Flex.channel, 2 NoteOff Flex.channel, 3 Task(%Pic24).tog = %True END IF IF velo0 <> slider(slnr).value THEN mPlay Flex.channel, 0, slider(slnr).value velo0 = slider(slnr).value END IF IF velo1 <> slider(slnr+1).value THEN mPlay Flex.channel, 1, slider(slnr+1).value velo1 = slider(slnr+1).value END IF IF velo2 <> slider(slnr+2).value THEN mPlay Flex.channel, 2, slider(slnr+2).value velo2 = slider(slnr+2).value END IF IF velo3 <> slider(slnr+3).value THEN mPlay Flex.channel, 3, slider(slnr+3).value velo3 = slider(slnr+3).value END IF END SUB SUB Pic24_stop () NoteOff Flex.channel, 0 NoteOff Flex.channel, 1 NoteOff Flex.channel, 2 NoteOff Flex.channel, 3 END SUB SUB Pic24Pwm () STATIC slnr,v0, v1, v2, v3, v4, v5 AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24pwm).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(5) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "pwm1" TaskParamLabels(1) = "faze1" TaskParamLabels(2) = "pwm2" TaskParamLabels(3) = "faze2" TaskParamLabels(4) = "pwm3" TaskParamLabels(5) = "faze3" IF ISFALSE Task(%Pic24pwm).hParam THEN MakeTaskParameterDialog %Pic24pwm,6,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Pic24pwm).SliderNumbers(0) RESET v0, v1, v2, v3, v4, v5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, v0 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, v1 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, v2 sendmessage slider(slnr+3).h, %TBM_SETPOS,%True, v3 sendmessage slider(slnr+4).h, %TBM_SETPOS,%True, v4 sendmessage slider(slnr+5).h, %TBM_SETPOS,%True, v5 END IF controller Flex.channel, 100, 0 controller Flex.channel, 101, 0 controller Flex.channel, 102, 0 controller Flex.channel, 103, 0 controller Flex.channel, 104, 0 controller Flex.channel, 105, 0 Task(%Pic24pwm).tog = %True END IF IF v0 <> slider(slnr).value THEN controller Flex.channel, 100, slider(slnr).value v0 = slider(slnr).value END IF IF v1 <> slider(slnr+1).value THEN controller Flex.channel, 101, slider(slnr+1).value v1 = slider(slnr+1).value END IF IF v2 <> slider(slnr+2).value THEN controller Flex.channel, 102, slider(slnr+2).value v2 = slider(slnr+2).value END IF IF v3 <> slider(slnr+3).value THEN controller Flex.channel, 103, slider(slnr+3).value v3 = slider(slnr+3).value END IF IF v4 <> slider(slnr+4).value THEN controller Flex.channel, 104, slider(slnr+4).value v4 = slider(slnr+4).value END IF IF v5 <> slider(slnr+5).value THEN controller Flex.channel, 105, slider(slnr+5).value v3 = slider(slnr+5).value END IF END SUB SUB Pic24_V1 () ' voice 1 for midi synth STATIC cnt, note, velo, rele, cc7, cc17, cc18 AS BYTE STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24_V1).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(6) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "speed" TaskParamLabels(1) = "note1" TaskParamLabels(2) = "velo1" TaskParamlabels(3) = "rele1" TaskParamlabels(4) = "CC7" TaskParamlabels(5) = "CC17" TaskParamlabels(6) = "CC18" ' decay IF ISFALSE Task(%Pic24_V1).hParam THEN MakeTaskParameterDialog %Pic24_V1,7,Slider(),0,UdCtrl(),TaskParamLabels() END IF note = 22 Task(%Pic24_V1).pan = 22 slnr= TaskEX(%Pic24_V1).SliderNumbers(0) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 22 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, 0 sendmessage slider(slnr+3).h, %TBM_SETPOS,%True, 0 sendmessage slider(slnr+4).h, %TBM_setpos, %True, 127 sendmessage slider(slnr+5).h, %TBM_setpos, %True, 64 sendmessage slider(slnr+6).h, %TBM_setpos, %True, 32 RESET rele END IF Task(%Pic24_V1).tog = %True END IF INCR cnt IF cnt > 1 THEN RESET cnt velo = slider(slnr+2).value IF slider(slnr+1).value < 22 THEN slider(slnr+1).value = 22 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 22 END IF IF note <> slider(slnr+1).value THEN release Flex.channel, note, slider(slnr+3).value note = slider(slnr+1).value Task(%Pic24_V1).pan = note END IF IF rele <> slider(slnr+3).value THEN rele = slider(slnr+3).value Controller Flex.channel, 19, rele END IF note = slider(slnr+1).value IF cc7 <> slider(slnr+4).value THEN cc7 = slider(slnr+4).value Controller Flex.channel, 7, cc7 END IF IF cc17 <> slider(slnr+5).value THEN cc17 = slider(slnr+5).value Controller Flex.channel, 17, cc17 END IF IF cc18 <> slider(slnr+6).value THEN cc18 = slider(slnr+6).value Controller Flex.channel, 18, cc18 END IF IF ISFALSE cnt THEN NoteOff Flex.channel, note ELSE mPlay Flex.channel, note, velo END IF Task(%Pic24_V1).freq = 0.5 + (slider(slnr).value /16) END SUB SUB Pic24_V1_stop () NoteOff Flex.channel, Task(%PIC24_V1).pan END SUB SUB Pic24_V2 () ' voice 2 for midi synth STATIC cnt, note, velo AS BYTE STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24_V2).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(2) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "speed" TaskParamLabels(1) = "note2" TaskParamLabels(2) = "velo2" IF ISFALSE Task(%Pic24_V2).hParam THEN MakeTaskParameterDialog %Pic24_V2,3,Slider(),0,UdCtrl(),TaskParamLabels() END IF note = 23 slnr= TaskEX(%Pic24_V2).SliderNumbers(0) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 23 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, 0 END IF Task(%Pic24_V2).tog = %True END IF INCR cnt IF cnt > 1 THEN RESET cnt velo = slider(slnr+2).value IF slider(slnr+1).value < 22 THEN slider(slnr+1).value = 22 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 22 END IF IF note <> slider(slnr+1).value THEN NoteOff Flex.channel, note ' note = slider(slnr+1).value END IF note = slider(slnr+1).value IF ISFALSE cnt THEN NoteOff Flex.channel, note ELSE mPlay Flex.channel, note, velo END IF Task(%Pic24_V2).freq = 0.5 + (slider(slnr).value /16) END SUB SUB Pic24_V3 () ' voice 3 for midi synth STATIC cnt, note, velo AS BYTE STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24_V3).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(2) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "speed" TaskParamLabels(1) = "note3" TaskParamLabels(2) = "velo3" IF ISFALSE Task(%Pic24_V3).hParam THEN MakeTaskParameterDialog %Pic24_V3,3,Slider(),0,UdCtrl(),TaskParamLabels() END IF note = 24 slnr= TaskEX(%Pic24_V3).SliderNumbers(0) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 24 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, 0 END IF Task(%Pic24_V3).tog = %True END IF INCR cnt IF cnt > 1 THEN RESET cnt velo = slider(slnr+2).value IF slider(slnr+1).value < 22 THEN slider(slnr+1).value = 22 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 22 END IF IF note <> slider(slnr+1).value THEN NoteOff Flex.channel, note ' note = slider(slnr+1).value END IF note = slider(slnr+1).value IF ISFALSE cnt THEN NoteOff Flex.channel, note ELSE mPlay Flex.channel, note, velo END IF Task(%Pic24_V3).freq = 0.5 + (slider(slnr).value /16) END SUB SUB Pic24_Wave () ' waveforms for 3 voices in midi synth STATIC w1, w2, w3 AS BYTE STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Pic24_Wave).tog THEN IF ISFALSE slnr THEN DIM TaskParamLabels(2) AS STATIC ASCIIZ*8 TaskParamLabels(0) = "Wave1" TaskParamLabels(1) = "Wave2" TaskParamLabels(2) = "Wave3" IF ISFALSE Task(%Pic24_wave).hParam THEN MakeTaskParameterDialog %Pic24_wave,3,Slider(),0,UdCtrl(),TaskParamLabels() END IF slnr= TaskEX(%Pic24_wave).SliderNumbers(0) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, 127 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 127 sendmessage slider(slnr+2).h, %TBM_SETPOS,%True, 127 w1 = 127 w2 = 127 w3 = 127 END IF Task(%Pic24_wave).tog = %True END IF IF slider(slnr).value < w1 THEN w1 = Slider(slnr).value Controller Flex.channel, 16, w1 END IF IF slider(slnr+1).value < w2 THEN w2 = Slider(slnr+1).value Controller Flex.channel, 26, w2 END IF IF slider(slnr+2).value < w3 THEN w3 = Slider(slnr+2).value Controller Flex.channel, 36, w3 END IF END SUB