'*************************************************** '* * '* a microtonal alto saxophone playing robot by * '* dr.Godfried-Willem Raes * '* 2013 * '*************************************************** '22/05/2013 test code based on Klar. '13.06.2013: made ready to test the hub board. ' First test run for the movement solenoids. '16.06.2013: Valve board programmed and ready for testing ' eight lights implemented. ' Arm controller tasks: %asa_Arm = 32 ' controllers 1,7,16,17,18,19,20 %asa_Filters = 33 ' controllers 2, 29,25,26, 27, 28 %asa_Duodec = 34 %asa_Tremolo = 38 %asa_Vibrato = 39 %asa_Bendrange = 40 ' ValvePic controller tasks: %asa_ValvePic = 48 ' controller 100,101,102 %asa_100 = 49 %asa_101 = 50 %asa_102 = 51 ' MidiHub controller tasks: %asa_HubPic = 53 ' controllers 22,23 - movement functions ' motor control: '%asa_Pendulum = 63 'to do ''lights: [ hub board ] %asa_lites = 54 'on-off test %asa0 = 55 ' front %asa1 = 56 %asa2 = 57 %asa3 = 58 %asa4 = 59 'eyes %asa5 = 60 %asa6 = 61 %asa7 = 63 %asa_scale = 20 %asa_test = 21 ' repeated note test %asaMus = 24 GLOBAL AsaKeyPress AS LONG DECLARE FUNCTION Init_asa () AS LONG DECLARE SUB asa_Arm () DECLARE SUB asa_HubPic () DECLARE SUB asa_ValvePic () DECLARE SUB asa_100103_ud0 () DECLARE SUB asa_Scale () DECLARE SUB asa_Scale_UD0 () DECLARE SUB asa_Scale_UD1 () DECLARE SUB asa_Scale_UD2 () DECLARE SUB asa_Vibrato () DECLARE SUB asa_SL4 () DECLARE SUB asa_SL3 () DECLARE SUB asa_SL43 () DECLARE SUB asa_Tremolo () DECLARE SUB asa_SL6 () DECLARE SUB asa_SL5 () DECLARE SUB asa_SL44 () DECLARE SUB asa_Bendrange () DECLARE SUB asa_SL40 () DECLARE SUB asa_Filters () DECLARE SUB asa_SL2 () DECLARE SUB asa_SL29 () DECLARE SUB asa_SL25 () DECLARE SUB asa_SL26 () DECLARE SUB asa_SL27 () DECLARE SUB asa_SL28 () DECLARE SUB asa_Duodec () DECLARE SUB asa_SL42 () DECLARE SUB asa_SL41 () DECLARE SUB asa_SL16 () DECLARE SUB asa_SL17 () DECLARE SUB asa_SL18 () DECLARE SUB asa_SL19 () DECLARE SUB asa_SL20 () DECLARE SUB asa_SL21 () DECLARE SUB asa_SL22 () DECLARE SUB asa_SL23 () DECLARE SUB asa_SL30 () DECLARE SUB asa_lites () DECLARE SUB asa_Lites_UD () DECLARE SUB asa_Test () DECLARE SUB asa_UD0 () DECLARE SUB asa_UD1 () DECLARE SUB asa_UD2 () DECLARE SUB asa_Pendulum () DECLARE SUB asa_Pendulum_Stop () DECLARE SUB asa0 () DECLARE SUB asa1 () DECLARE SUB asa2 () DECLARE SUB asa3 () DECLARE SUB asa4 () DECLARE SUB asa5 () DECLARE SUB asa6 () DECLARE SUB asa7 () DECLARE SUB asa_100 () DECLARE SUB asa_101 () DECLARE SUB asa_102 () 'DECLARE SUB asa_103 () DECLARE SUB asaMusic () DECLARE SUB asaMusic_Stop () FUNCTION Init_asa () AS LONG LOCAL retval AS LONG ' GetInstrumentParams asa, %IDM_ASA ' retval = SetRobotPort (asa, Inifilename, hMidiO()) ' asaKeyPress = -1 Task(%asa_Arm).naam = "Arm" Task(%asa_Arm).cptr = CODEPTR(asa_Arm) Task(%asa_Arm).freq = 2 Task(%asa_Arm).flags = %False ' Task(%asa_Duodec).naam = "DuoDec" ' Task(%asa_Duodec).cptr = CODEPTR(asa_Duodec) ' Task(%asa_Duodec).freq = 2 ' Task(%asa_Duodec).flags = %False Task(%asa_Filters).naam = "Filters" Task(%asa_Filters).cptr = CODEPTR(asa_Filters) Task(%asa_Filters).freq = 2 Task(%asa_Filters).flags = %False Task(%asa_HubPIC).naam = "HubPIC" Task(%asa_HubPIC).cptr = CODEPTR(asa_HubPIC) Task(%asa_HubPIC).freq = 2 Task(%asa_HubPIC).flags = %False ' Task(%asa_ValvePIC).naam = "ValPIC" Task(%asa_ValvePIC).cptr = CODEPTR(asa_ValvePIC) Task(%asa_ValvePIC).freq = 2 Task(%asa_ValvePIC).flags = %False Task(%asa_Scale).naam = "Scale" Task(%asa_Scale).cptr = CODEPTR(asa_Scale) Task(%asa_Scale).freq = 2 Task(%asa_Scale).flags = %False Task(%asa_Test).naam = "Test" Task(%asa_Test).cptr = CODEPTR(asa_Test) Task(%asa_Test).freq = 4 Task(%asa_Test).flags = %False Task(%asa_Lites).naam = "lites" Task(%asa_Lites).cptr = CODEPTR(asa_Lites) Task(%asa_Lites).freq = 2 Task(%asa_Lites).flags = %False Task(%asa_tremolo).naam = "Tremolo" Task(%asa_tremolo).cptr = CODEPTR(asa_Tremolo) Task(%asa_tremolo).freq = 16 Task(%asa_tremolo).flags = %False Task(%asa_vibrato).naam = "Vibrato" Task(%asa_vibrato).freq = 12 Task(%asa_vibrato).cptr = CODEPTR(asa_Vibrato) Task(%asa_vibrato).flags = %False Task(%asa_bendrange).naam = "bendrang" Task(%asa_bendrange).freq = 12 Task(%asa_bendrange).cptr = CODEPTR(asa_Bendrange) Task(%asa_bendrange).flags = %False ' Task(%asa_Pendulum).naam = "Slinger" ' Task(%asa_Pendulum).cptr = CODEPTR(asa_Pendulum) ' Task(%asa_Pendulum).freq = 0.25 ' Task(%asa_Pendulum).flags = %False ' TaskEX(%asa_Pendulum).stopcptr = CODEPTR(asa_Pendulum_Stop) ' Task(%asa0).naam = "Li-120" Task(%asa0).cptr = CODEPTR(asa0) Task(%asa0).freq = 20 Task(%asa0).flags = %False TaskEX(%asa0).StopCptr = CODEPTR(asa0_Stop) Task(%asa1).naam = "Li-121" Task(%asa1).cptr = CODEPTR(asa1) Task(%asa1).freq = 20 Task(%asa1).flags = %False TaskEX(%asa1).StopCptr = CODEPTR(asa1_Stop) Task(%asa2).naam = "Li-122" Task(%asa2).cptr = CODEPTR(asa2) Task(%asa2).freq = 20 Task(%asa2).flags = %False TaskEX(%asa2).StopCptr = CODEPTR(asa2_Stop) Task(%asa3).naam = "Li-123" ' wit halogeen Task(%asa3).cptr = CODEPTR(asa3) Task(%asa3).freq = 20 Task(%asa3).flags = %False TaskEX(%asa3).StopCptr = CODEPTR(asa3_Stop) Task(%asa4).naam = "Li-124" Task(%asa4).cptr = CODEPTR(asa4) ' valve board Task(%asa4).freq = 20 Task(%asa4).flags = %False TaskEX(%asa4).StopCptr = CODEPTR(asa4_Stop) Task(%asa5).naam = "Li-125" Task(%asa5).cptr = CODEPTR(asa5) Task(%asa5).freq = 20 Task(%asa5).flags = %False TaskEX(%asa5).StopCptr = CODEPTR(asa5_Stop) Task(%asa6).naam = "Li-126" Task(%asa6).cptr = CODEPTR(asa6) Task(%asa6).freq = 20 Task(%asa6).flags = %False TaskEX(%asa6).StopCptr = CODEPTR(asa6_Stop) Task(%asa7).naam "Li-127" Task(%asa7).cptr = CODEPTR(asa7) Task(%asa7).freq = 20 Task(%asa7).flags = %False TaskEX(%asa7).StopCptr = CODEPTR(asa7_Stop) Task(%asa_100).naam = "C100" Task(%asa_100).cptr = CODEPTR(asa_100) Task(%asa_100).freq = 20 Task(%asa_100).flags = %False Task(%asa_101).naam = "C101" Task(%asa_101).cptr = CODEPTR(asa_101) Task(%asa_101).freq = 20 Task(%asa_101).flags = %False Task(%asa_102).naam = "C102" Task(%asa_102).cptr = CODEPTR(asa_102) Task(%asa_102).freq = 20 Task(%asa_102).flags = %False ' Task(%asa_103).naam = "C103" ' Task(%asa_103).cptr = CODEPTR(asa_103) ' Task(%asa_103).freq = 20 ' Task(%asa_103).flags = %False ' Task(%asa_keypress).naam = "Keying" 'using a task for this makes no sense. mapped to ButnSw(9) ' Task(%asa_keypress).freq = 12 ' Task(%asa_keypress).cptr = CODEPTR(asa_Keypress) Task(%asaMus).naam = "Music" Task(%asaMus).cptr = CODEPTR(asaMusic) Task(%asaMus).freq = 20 Task(%asaMus).flags = %False TaskEX(%asaMus).StopCptr = CODEPTR(asaMusic_Stop) ButnOS(11).tag = "asa On" ButnOS(11).cptr = CODEPTR(asa_66) ButnOS(10).tag = "asa Off" ButnOS(10).cptr = CODEPTR(MM_asa_Off) ' ButnSw(9).tag0 = "Fingerings" ' ButnSw(9).tag1 = "Fngrs off" ' ButnSw(9).cptr = CODEPTR(asa_KeyPress) Controller asa.channel, 123, %False ' all notes off FUNCTION = %True END FUNCTION SUB asa_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(%asa_Scale).tog THEN IF ISFALSE Task(%asa_Scale).hParam THEN DIM TaskParamLabels(6) TaskParamLabels(0)="velo" ' Arm chip TaskParamLabels(1)="speed" TaskParamLabels(2)="legato" ' TaskParamLabels(3)="FinVib" ' aftertouch TaskParamLabels(3)="step" TaskParamLabels(4)= "hilim" TaskParamLabels(5)="lowlim" TaskParamLabels(6)="F(0)/Bb(1)" MakeTaskParameterDialog %asa_Scale,3, Slider(),4,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_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 ' Slider(slnr+3).value = 0 ' Sendmessage Slider(slnr+3).h, %TBM_SETPOS, %True, Slider(slnr+3).value IF udnr = %False THEN udnr = TaskEX(%asa_Scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(asa_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(asa_Scale_UD1) ' high note limit UDctrl(udnr+1).value = asa.hightes UDctrl(udnr+1).minval = asa.lowtes UDctrl(udnr+1).maxval = asa.Hightes UDctrl(udnr+2).cptr = CODEPTR(asa_Scale_UD2) ' low note limit UDctrl(udnr+2).value = asa.lowtes UDctrl(udnr+2).minval = asa.lowtes UDctrl(udnr+2).maxval = asa.Hightes Udctrl(udnr+3).value = 0 UDctrl(udnr+3).minval = 0 UDctrl(udnr+3).maxval = 1 UDctrl(udnr+3).cptr = CODEPTR(asa_Scale_UD3) ' low note limit END IF END IF Task(%asa_Scale).tog = %True cnt = asa.Lowtes EXIT SUB END IF SELECT CASE UdCtrl(udnr+3).value CASE 0 IF asa.ctrl(33) <> 0 THEN asa.ctrl(33) = 0 Controller asa.channel, 33, 0 END IF CASE 1 IF asa.ctrl(33) <> 127 THEN asa.ctrl(33) = 127 Controller asa.channel, 33, 127 END IF END SELECT IF ISFALSE onoff THEN IF Slider(slnr+2).value < 127 THEN IF n THEN NoteOff asa.channel, n n = %False Task(%asa_Scale).freq = MAX(2,Slider(slnr+2).value * 6) ELSE ' in dit geval puur legato zonder note-off's Task(%asa_Scale).freq = 1000 END IF onoff = %True ELSE n = cnt + IIF(asa.ctrl(33), 5,0) 'cc33 switches between f/bb - we transpose accordingly here mPlay asa.channel, n, Slider(slnr).value ' IF Slider(3).value THEN ' Aftertouch asa.channel, Slider(3).value ' must be send after each note on ' END IF ' IF Slider(slnr+3).value <> asa.ctrl(31) THEN ' asa.ctrl(31) = Slider(slnr+3).value ' Controller asa.channel, 31, Slider(slnr+3).value ' END IF cnt = cnt + UDCtrl(udnr).value IF cnt = 30 THEN cnt = 35 'jump over unplayable range IF cnt > UDctrl(udnr+1).value THEN cnt = UDctrl(udnr+2).value onoff = %False Task(%asa_Scale).freq = MAX(0.25,Slider(slnr+1).value / 4) END IF END SUB SUB asa_Scale_UD0 () ' callback on parameter UpDowns step size LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_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(%asa_Scale).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB asa_Scale_UD1 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_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 > asa.HighTes THEN UDctrl(udnr).value = asa.HighTes : noot = asa.hightes SetDlgItemText Task(%asa_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB asa_Scale_UD2 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_Scale).UpDownNumbers(2) noot = UDCtrl(udnr).value IF noot < asa.lowtes THEN UDctrl(udnr).value = asa.lowtes : noot = asa.lowtes IF noot > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr-1).value SetDlgItemText Task(%asa_Scale).hparam, %GMT_TEXT0_ID + 18, "Lo=" & STR$(noot) END SUB SUB asa_Scale_UD3 () LOCAL cc AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_Scale).UpDownNumbers(3) cc = UDCtrl(udnr).value IF cc < 0 THEN UDctrl(udnr).value = 0 IF cc > 1 THEN UDctrl(udnr).value = 1 SetDlgItemText Task(%asa_Scale).hparam, %GMT_TEXT0_ID + 19, "C33=" & STR$(IIF(cc,127,0)) END SUB SUB asa_Vibrato () ' vibrato is built into the ARM firmware. ' vibrato test voor fingered vibrato met aftertouch: cancelled here again STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 'STATIC cnt AS DWORD IF ISFALSE Task(%asa_vibrato).tog THEN IF ISFALSE Task(%asa_vibrato).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="Speed" ' controller #4 TaskParamlabels(1)="Depth" ' controller #3 TaskParamLabels(2)="Delay" ' controller #43 MakeTaskParameterDialog %asa_vibrato,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_vibrato).SliderNumbers(0) Slider(slnr).value = 8 Task(%asa_vibrato).freq = 50 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr).cptr = CODEPTR(asa_sl4) Slider(slnr+1).value = 0 ' geen vibrato SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+1).cptr = CODEPTR(asa_sl3) Slider(slnr+2).value = 10 ' vibrato delay time Sendmessage Slider(Slnr+2).h, %TBM_SETPOS, %True, Slider(slnr+2).value slider(slnr+2).cptr = CODEPTR(asa_sl43) END IF Task(%asa_vibrato).tog = %True END IF stoptask %asa_Vibrato END SUB SUB asa_SL4 () ' vibrato speed STATIC slnr AS DWORD slnr = TaskEX(%asa_Vibrato).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(4) THEN asa.ctrl(4) = Slider(slnr).value Controller asa.channel, 4, asa.ctrl(4) END IF END SUB SUB asa_SL3 () ' vibrato depth STATIC slnr AS DWORD slnr = TaskEX(%asa_Vibrato).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(3) THEN asa.ctrl(3) = Slider(slnr).value Controller asa.channel, 3, asa.ctrl(3) END IF END SUB SUB asa_SL43 () ' vibrato delay STATIC slnr AS DWORD slnr = TaskEX(%asa_Vibrato).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(43) THEN asa.ctrl(43) = Slider(slnr).value Controller asa.channel, 43, asa.ctrl(43) END IF END SUB SUB asa_Tremolo () ' test for tremolo - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_tremolo).tog THEN IF ISFALSE Task(%asa_tremolo).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="Speed" ' CC6 TaskParamlabels(1)="Depth" ' CC5 TaskParamlabels(2)="Delay" ' CC44 MakeTaskParameterDialog %asa_tremolo,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_tremolo).SliderNumbers(0) Slider(slnr).value = 8 Slider(slnr+1).value = 0 Slider(slnr+2).value = 10 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value Sendmessage Slider(slnr+2).h, %TBM_SETPOS,%True, Slider(slnr+2).value slider(slnr).cptr = CODEPTR(asa_sl6) slider(slnr+1).cptr = CODEPTR(asa_sl5) slider(slnr+2).cptr = CODEPTR(asa_sl44) END IF Task(%asa_Tremolo).tog = %True END IF Stoptask %asa_Tremolo END SUB SUB asa_SL6 () ' tremolo speed STATIC slnr AS DWORD slnr = TaskEX(%asa_Tremolo).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(6) THEN asa.ctrl(6) = Slider(slnr).value Controller asa.channel, 6, asa.ctrl(6) END IF END SUB SUB asa_SL5 () ' tremolo depth STATIC slnr AS DWORD slnr = TaskEX(%asa_Tremolo).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(5) THEN asa.ctrl(5) = Slider(slnr).value Controller asa.channel, 5, asa.ctrl(5) END IF END SUB SUB asa_SL44 () ' tremolo delay STATIC slnr AS DWORD slnr = TaskEX(%asa_Tremolo).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(44) THEN asa.ctrl(44) = Slider(slnr).value Controller asa.channel, 44, asa.ctrl(44) END IF END SUB SUB asa_Filters () ' test for filters - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_filters).tog THEN IF ISFALSE Task(%asa_filters).hParam THEN DIM TaskParamLabels(5) TaskParamLabels(0)="Speed" ' CC2 - lfo3 frequency TaskParamlabels(1)="Depth" ' CC29 - lfo3 amplitude TaskParamlabels(2)="freq" ' CC25 - filter cut off frequency TaskParamlabels(3)="reson" ' CC26 resonance filter TaskParamLabels(4)="echomix" ' CC27 echo mix TaskParamlabels(5) ="Feedback" ' cc28 echo feedback MakeTaskParameterDialog %asa_filters,6, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_filters).SliderNumbers(0) Slider(slnr).value = 2 Slider(slnr+1).value = 20 Slider(slnr+2).value = 64 Slider(slnr+3).value = 90 Slider(slnr+4).value = 0 Slider(slnr+5).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value Sendmessage Slider(slnr+2).h, %TBM_SETPOS,%True, Slider(slnr+2).value SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value Sendmessage Slider(slnr+4).h, %TBM_SETPOS,%True, Slider(slnr+4).value Sendmessage Slider(slnr+5).h, %TBM_SETPOS,%True, Slider(slnr+5).value slider(slnr).cptr = CODEPTR(asa_sl2) slider(slnr+1).cptr = CODEPTR(asa_sl29) slider(slnr+2).cptr = CODEPTR(asa_sl25) slider(slnr+3).cptr = CODEPTR(asa_sl26) slider(slnr+4).cptr = CODEPTR(asa_sl27) slider(slnr+5).cptr = CODEPTR(asa_sl28) END IF Task(%asa_Filters).tog = %True END IF Stoptask %asa_Filters END SUB SUB asa_SL2 () ' lfo3 filter speed STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(2) THEN asa.ctrl(2) = Slider(slnr).value Controller asa.channel, 2, asa.ctrl(2) END IF END SUB SUB asa_SL29 () ' lfo3 filter depth STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(29) THEN asa.ctrl(29) = Slider(slnr).value Controller asa.channel, 29, asa.ctrl(29) END IF END SUB SUB asa_SL25 () ' filter cut off frequency STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(25) THEN asa.ctrl(25) = Slider(slnr).value Controller asa.channel, 25, asa.ctrl(25) END IF END SUB SUB asa_SL26 () ' filter resonance STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(3) IF slider(slnr).value <> asa.ctrl(26) THEN asa.ctrl(26) = Slider(slnr).value Controller asa.channel, 26, asa.ctrl(26) END IF END SUB SUB asa_SL27 () ' echo mix amplitude STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(4) IF slider(slnr).value <> asa.ctrl(27) THEN asa.ctrl(27) = Slider(slnr).value Controller asa.channel, 27, asa.ctrl(27) END IF END SUB SUB asa_SL28 () ' lfo3 filter speed STATIC slnr AS DWORD slnr = TaskEX(%asa_Filters).SliderNumbers(5) IF slider(slnr).value <> asa.ctrl(28) THEN asa.ctrl(28) = Slider(slnr).value Controller asa.channel, 28, asa.ctrl(28) END IF END SUB 'SUB asa_DuoDec () ' ' test op toevoeging duodecime in het spectrum - arm processor ' STATIC slnr AS DWORD ' STATIC TaskParamLabels() AS ASCIIZ*8 ' IF ISFALSE Task(%asa_duodec).tog THEN ' IF ISFALSE Task(%asa_duodec).hParam THEN ' DIM TaskParamLabels(1) ' TaskParamLabels(0)="Amplit" ' CC42 ' TaskParamlabels(1)="Detune" ' CC41 ' MakeTaskParameterDialog %asa_duodec,2, Slider(),0,UdCtrl(), TaskParamLabels() ' slnr = TaskEX(%asa_duodec).SliderNumbers(0) ' Slider(slnr).value = 120 ' Slider(slnr+1).value = 62 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value ' slider(slnr).cptr = CODEPTR(asa_sl42) ' slider(slnr+1).cptr = CODEPTR(asa_sl41) ' END IF ' Task(%asa_duodec).tog = %True ' END IF ' Stoptask %asa_duodec 'END SUB ' SUB asa_SL42 () ' duodecime sine wave component amplitude - klar code STATIC slnr AS DWORD slnr = TaskEX(%asa_Duodec).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(42) THEN asa.ctrl(42) = Slider(slnr).value Controller asa.channel, 42, asa.ctrl(42) END IF END SUB SUB asa_SL41 () ' duodecime sine wave component amplitude STATIC slnr AS DWORD slnr = TaskEX(%asa_Duodec).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(41) THEN asa.ctrl(41) = Slider(slnr).value Controller asa.channel, 41, asa.ctrl(41) END IF END SUB SUB asa_Bendrange () ' test for pitchbendrange - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_bendrange).tog THEN IF ISFALSE Task(%asa_bendrange).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Range" ' CC40 MakeTaskParameterDialog %asa_bendrange,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_bendrange).SliderNumbers(0) Slider(slnr).value = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr).cptr = CODEPTR(asa_sl40) END IF Task(%asa_Bendrange).tog = %True END IF Stoptask %asa_Bendrange END SUB SUB asa_SL40 () ' pitchbend range controller STATIC slnr AS DWORD slnr = TaskEX(%asa_Bendrange).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(40) THEN asa.ctrl(40) = Slider(slnr).value Controller asa.channel, 40, asa.ctrl(40) END IF END SUB SUB asa_Lites () ' on midihub board for light 120-123 ' on valve board for 124-127 STATIC cnt AS LONG STATIC udnr AS DWORD STATIC slnr AS DWORD STATIC lite AS BYTE IF ISFALSE Task(%asa_Lites).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Nr." IF ISFALSE Task(%asa_Lites).hParam THEN MakeTaskParameterDialog %asa_Lites,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%asa_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(%asa_Lites).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(asa_Lites_UD) ' nr. updown UDctrl(udnr).value = 120 UDctrl(udnr).minval = 120 UDctrl(udnr).maxval = 127 UDctrl(udnr).stap = 1 END IF Task(%asa_Lites).tog = %True END IF ' lites controlled by PIC1 IF lite <> UDctrl(udnr).value THEN NoteOff asa.channel, lite lite = UDctrl(udnr).value END IF IF ISFALSE cnt MOD 2 THEN mPlay asa.channel, lite, 127 ELSE mPlay asa.channel, lite, 0 END IF INCR cnt Task(%asa_Lites).freq = MAX(1,(Slider(slnr).value / 4)) END SUB SUB asa_Lites_UD () ' callback on parameter UpDowns. : lite number LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_Lites).UpdownNumbers(0) value = UDCtrl(udnr).value SetDlgItemText Task(%asa_Lites).hparam, %GMT_TEXT0_ID + 16, STR$(value) END SUB SUB asa_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(%asa_Test).tog THEN DIM TaskParamLabels(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) = "F/Bb" ' UD2 IF ISFALSE Task(%asa_Test).hParam THEN MakeTaskParameterDialog %asa_Test,3,Slider(),3,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%asa_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(%asa_Test).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(asa_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(asa_UD1) ' pitch up down (note) UDctrl(udnr+1).value = asa.lowtes UDctrl(udnr+1).minval = asa.lowtes UDctrl(udnr+1).maxval = asa.Hightes UDctrl(udnr+2).cptr = CODEPTR(asa_UD2) ' F/Bb UDctrl(udnr+2).value = 0 UDctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = 1 resetval = 64 END IF Task(%asa_Test).tog = %True EXIT SUB END IF SELECT CASE UdCtrl(udnr+3).value CASE 0 IF asa.ctrl(33) <> 0 THEN asa.ctrl(33) = 0 Controller asa.channel, 33, 0 END IF CASE 1 IF asa.ctrl(33) <> 127 THEN asa.ctrl(33) = 127 Controller asa.channel, 33, 127 END IF END SELECT period = 1! / (Slider(slnr).value / 10!) ' tempo Task(%asa_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 asa.channel, oldnote oldnote = %False END IF offFreq = 1! / period Task(%asa_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 asa.channel, oldnote Task(%asa_Test).freq = OffFreq oldnote = %False ELSE noot = UDctrl(udnr+1).value velo = Slider(slnr+1).value mPlay asa.channel, noot, velo Bend asa.channel, 0, Slider(slnr + 2).value ' ' revision needed: this is OB code, Asa has many more valves!!! ' IF UDctrl(udnr+2).value THEN ' fingers = asa_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 asa.channel, msb, lsb ' violating the midi standard, where msb = note ' END IF ' IF FaKeyPress > -1 THEN KeyPress asa.channel, HIBYT(LOWRD(FaKeyPress)), LOBYT(FaKeyPress) 'if we use the asa_KeyPess dialog, it overrides other settings for the fingerings. ' close the dialog with the button to revert to normal fingerings Task(%asa_Test).freq = OnFreq oldnote = noot END IF IF Task(%asa_Test).freq < 0.2 THEN Task(%asa_Test).freq = 0.2 END SUB SUB asa_UD0 () ' callback on parameter UpDowns. : on/off proportion LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_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(%asa_Test).hparam, %GMT_TEXT0_ID + 16, "L=" & STR$(value) END SUB SUB asa_UD1 () ' controls the notes to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value SetDlgItemText Task(%asa_Test).hparam, %GMT_TEXT0_ID + 17, "N=" & STR$(noot) END SUB SUB asa_UD2 () ' ' fingering UD switch - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_Test).UpDownNumbers(2) value = UDCtrl(udnr).value IF value > 1 THEN value = 1 IF value < 0 THEN value = 0 SetDlgItemText Task(%asa_Test).hparam, %GMT_TEXT0_ID + 18, "C33" & STR$(IIF(value, 127, 0)) ' sending is in the main task. END SUB 'SUB asa_Pendulum () ' STATIC slnr, tog AS DWORD ' STATIC TaskParamLabels() AS ASCIIZ*8 ' LOCAL excursie AS BYTE ' IF ISFALSE task(%asa_Pendulum).tog THEN ' ' required: slider for frequency ' ' slider for amplitude ' IF ISFALSE Task(%asa_Pendulum).hParam THEN ' DIM TaskParamLabels(1) ' TaskParamLabels(0)="speed" ' TaskParamLabels(1)="amplitude" ' MakeTaskParameterDialog %asa_Pendulum,2, Slider(),0,UdCtrl(), TaskParamLabels() ' slnr = TaskEX(%asa_Pendulum).SliderNumbers(0) ' Slider(slnr).value = 20 ' Slider(slnr+1).value = 5 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value ' END IF ' Task(%asa_Pendulum).freq = 0.2 ' Task(%asa_Pendulum).tog = %True ' END IF ' excursie = Slider(slnr+1).value \2 '0 - 63 ' IF ISFALSE tog THEN ' Controller asa.channel, 22, 64 - excursie ' ELSE ' Controller asa.channel, 22, 64 + excursie ' END IF ' INCR tog ' tog = tog MOD 2 ' Task(%asa_Pendulum).freq = MAX(Slider(slnr).value/ 127, 0.01) 'END SUB SUB asa_Pendulum_Stop () Controller asa.channel, 22, 64 asa.ctrl(22) = 64 Controller asa.channel, 23, 64 asa.ctrl(23) = 64 END SUB SUB asa0 () ' front left yellow - hub board, with tempo ctrl. STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa0).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L120" IF ISFALSE Task(%asa0).hParam THEN MakeTaskParameterDialog %asa0,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%asa0).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay asa.channel, 120,127 Task(%asa0).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay asa.channel, 120, n END IF Task(%asa0).freq = 10 END SUB SUB asa0_Stop () NoteOff asa.channel, 120 END SUB ' SUB asa1 () 'front right yellow STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa1).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L121" IF ISFALSE Task(%asa1).hParam THEN MakeTaskParameterDialog %asa1,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%asa1).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay asa.channel, 121, 127 'KeyPress asa.channel,121, slider(slnr).value Task(%asa1).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay asa.channel, 121, n 'KeyPress asa.channel, 1, n END IF Task(%asa1).freq = 10 END SUB SUB asa1_Stop () NoteOff asa.channel, 121 END SUB ' SUB asa2 () 'front red , hub board. STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa2).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L122" IF ISFALSE Task(%asa2).hParam THEN MakeTaskParameterDialog %asa2,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%asa2).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay asa.channel, 122, 127 'KeyPress asa.channel,2, slider(slnr).value Task(%asa2).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay asa.channel, 122, n END IF Task(%asa2).freq = 10 END SUB SUB asa2_Stop () NoteOff asa.channel, 122 END SUB ' ' SUB asa3 () 'front - white dots - Viessman. Hub board controlled. STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa3).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L123" IF ISFALSE Task(%asa3).hParam THEN MakeTaskParameterDialog %asa3,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%asa3).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay asa.channel, 123, 127 'KeyPress asa.channel,123, slider(slnr).value Task(%asa3).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay asa.channel, 123, n END IF Task(%asa3).freq = 10 END SUB SUB asa3_Stop () NoteOff asa.channel, 123 END SUB ' SUB asa4 () 'white LED strip, on the right on saxophone - Valve board controlled. 'on/off STATIC n AS INTEGER 'STATIC slnr AS DWORD IF ISFALSE Task(%asa4).tog THEN ' DIM TaskParamLabels(0) AS ASCIIZ * 8 ' ARRAY ASSIGN TaskParamLabels() = "L124" ' IF ISFALSE Task(%asa4).hParam THEN ' MakeTaskParameterDialog %asa4,1,Slider(),0,UDctrl(),TaskParamLabels() ' slnr = TaskEX(%asa4).SliderNumbers(0) ' Slider(slnr).value = 127 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' END IF mPlay asa.channel, 124, 127 'KeyPress asa.channel,124, slider(slnr).value Task(%asa4).tog = %True END IF 'IF slider(slnr).value <> n THEN ' n = Slider(slnr).value ' mPlay asa.channel, 124, n 'END IF Task(%asa4).freq = 10 END SUB SUB asa4_Stop () NoteOff asa.channel, 124 END SUB ' SUB asa5 () ' blue LED's on the saxophone upper part 'on off STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa5).tog THEN 'DIM TaskParamLabels(0) AS ASCIIZ * 8 'ARRAY ASSIGN TaskParamLabels() = "L125" 'IF ISFALSE Task(%asa5).hParam THEN ' MakeTaskParameterDialog %asa5,1,Slider(),0,UDctrl(),TaskParamLabels() ' slnr = TaskEX(%asa5).SliderNumbers(0) ' Slider(slnr).value = 127 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value 'END IF mPlay asa.channel, 125, 127 'KeyPress asa.channel,125, slider(slnr).value Task(%asa5).tog = %True END IF 'IF slider(slnr).value <> n THEN ' n = Slider(slnr).value ' mPlay asa.channel, 125, n 'END IF Task(%asa5).freq = 10 END SUB SUB asa5_Stop () NoteOff asa.channel, 125 END SUB ' SUB asa6 () 'valve board - on/off 'Yellow LED strip on the left of the saxophone STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa6).tog THEN 'DIM TaskParamLabels(0) AS ASCIIZ * 8 'ARRAY ASSIGN TaskParamLabels() = "L126" 'IF ISFALSE Task(%asa6).hParam THEN ' MakeTaskParameterDialog %asa6,1,Slider(),0,UDctrl(),TaskParamLabels() ' slnr = TaskEX(%asa6).SliderNumbers(0) ' Slider(slnr).value = 127 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value 'END IF mPlay asa.channel, 126, 127 Task(%asa6).tog = %True END IF 'IF slider(slnr).value <> n THEN ' n = Slider(slnr).value ' mPlay asa.channel, 125, n 'END IF Task(%asa6).freq = 10 END SUB SUB asa6_Stop () NoteOff asa.channel, 126 END SUB SUB asa7 () 'valve board - on/off 'white LED assembly on the back of the saxophone STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%asa7).tog THEN mPlay asa.channel, 127, 127 Task(%asa7).tog = %True END IF Task(%asa7).freq = 10 END SUB SUB asa7_Stop () NoteOff asa.channel, 127 END SUB SUB asa_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(%asa_100).tog THEN ' IF ISFALSE Task(%asa_100).hParam THEN ' DIM TaskParamLabels(0) ' TaskParamLabels(0)="C100" ' MakeTaskParameterDialog %asa_100,1, Slider(),0,UdCtrl(), TaskParamLabels() ' slnr = TaskEX(%asa_100).SliderNumbers(0) ' Slider(slnr).cptr = CODEPTR(asa_SL100) ' Slider(slnr).value = 0 ' asa.ctrl(100) = 0 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' END IF Task(%asa_100).freq = 10 Task(%asa_100).tog = %TRue END IF INCR i i = i MOD 6 Controller asa.channel, 100, 2^i Task(%asa_100).freq = 2 END SUB ' SUB asa_101 () ' controller 101 test ' This controls valves 8-14 STATIC i AS INTEGER IF ISFALSE Task(%asa_101).tog THEN Task(%asa_101).freq = 10 Task(%asa_101).tog = %TRue END IF INCR i i = i MOD 6 Controller asa.channel, 101, 2^i Task(%asa_101).freq = 2 END SUB ' ' SUB asa_102 () ' controller 102 test ' This controls valves 15-18 STATIC i AS INTEGER IF ISFALSE Task(%asa_102).tog THEN Task(%asa_102).freq = 10 Task(%asa_102).tog = %TRue END IF INCR i i = i MOD 4 Controller asa.channel, 102, 2^i Task(%asa_102).freq = 2 END SUB ' ----- Arm testing ----------------------------------------------- SUB asa_Arm () ' controllers 1,7, 16, 17,18,19,20 ' ARM controller board. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_Arm).tog THEN IF ISFALSE Task(%asa_Arm).hParam THEN DIM TaskParamLabels(6) TaskParamLabels(0)="C1" ' noise TaskParamLabels(1)="C7" ' volume TaskParamLabels(2)="C16" ' attack time TaskParamLabels(3)="C17" ' attack level TaskParamLabels(4)="C18" ' attack decay - hold-level = velo TaskParamLabels(5)="C19" ' release TaskParamlabels(6)="C20" ' tuning MakeTaskParameterDialog %asa_Arm,7, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_Arm).SliderNumbers(0) slider(slnr).cptr = CODEPTR(asa_sl1) Slider(slnr).value = 5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr+1).cptr = CODEPTR(asa_sl7) Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+2).cptr = CODEPTR(asa_sl16) Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value slider(slnr+3).cptr = CODEPTR(asa_sl17) Slider(slnr+3).value = 100 SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value slider(slnr+4).cptr = CODEPTR(asa_sl18) Slider(slnr+4).value = 90 SendMessage Slider(Slnr+4).h, %TBM_SETPOS,%True, Slider(Slnr+4).value slider(slnr+5).cptr = CODEPTR(asa_sl19) Slider(slnr+5).value = 64 SendMessage Slider(Slnr+5).h, %TBM_SETPOS,%True, Slider(Slnr+5).value slider(slnr+6).cptr = CODEPTR(asa_sl20) Slider(slnr+6).value = 64 SendMessage Slider(Slnr+6).h, %TBM_SETPOS,%True, Slider(Slnr+6).value END IF Task(%asa_Arm).tog = %True END IF StopTask %asa_Arm END SUB SUB asa_SL1 () ' slider callback - noise signal STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(1) THEN asa.ctrl(1) = Slider(slnr).value Controller asa.channel, 1, asa.ctrl(1) END IF END SUB SUB asa_SL7 () ' slider callback - main volume STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(7) THEN asa.ctrl(7) = Slider(slnr).value Controller asa.channel, 7, asa.ctrl(7) END IF END SUB SUB asa_SL16 () ' - attack time ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(16) THEN asa.ctrl(16) = Slider(slnr).value Controller asa.channel, 16, asa.ctrl(16) END IF END SUB SUB asa_SL17 () ' slider callback - attack level STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(3) IF slider(slnr).value <> asa.ctrl(17) THEN asa.ctrl(17) = Slider(slnr).value Controller asa.channel, 17, asa.ctrl(17) END IF END SUB SUB asa_SL18 () ' slider callback - attack decay towards velo level STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(4) IF slider(slnr).value <> asa.ctrl(18) THEN asa.ctrl(18) = Slider(slnr).value Controller asa.channel, 18, asa.ctrl(18) END IF END SUB SUB asa_SL19 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(5) IF slider(slnr).value <> asa.ctrl(19) THEN asa.ctrl(19) = Slider(slnr).value Controller asa.channel, 19, asa.ctrl(19) END IF END SUB SUB asa_SL20 () ' slider callback - tuning STATIC slnr AS DWORD slnr = TaskEX(%asa_Arm).SliderNumbers(6) IF slider(slnr).value <> asa.ctrl(20) THEN asa.ctrl(20) = Slider(slnr).value Controller asa.channel, 20, asa.ctrl(20) END IF END SUB SUB asa_HubPIC () ' controllers 22,23 ' lites ' Midi Hub board. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_HubPIC).tog THEN IF ISFALSE Task(%asa_HubPIC).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="C21" ' motorspeed - not implemented on ASA TaskParamLabels(1)="C22" ' position front back - 0= backward, 64= equilibrium 127= forward (PWM implemented) TaskParamLabels(2)="C23" ' position left right - 0= left, 64 = equilibrium, 127 = right. (discrete logic) MakeTaskParameterDialog %asa_HubPIC,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_HubPIC).SliderNumbers(0) slider(slnr).cptr = CODEPTR(asa_sl21) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' slider(slnr+1).cptr = CODEPTR(asa_sl22) - do not use callback, but poll!!! Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+2).cptr = CODEPTR(asa_sl23) Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF Task(%asa_HubPIC).freq = 2 Task(%asa_HubPIC).tog = %True END IF ' poll code for this slider: IF slider(slnr+1).value <> asa.ctrl(22) THEN asa.ctrl(22) = Slider(slnr+1).value Controller asa.channel, 22, asa.ctrl(22) END IF END SUB SUB asa_SL21 () ' slider callback - movement speed - not implemented on asa STATIC slnr AS DWORD slnr = TaskEX(%asa_HubPic).SliderNumbers(0) IF slider(slnr).value <> asa.ctrl(21) THEN asa.ctrl(21) = Slider(slnr).value 'Controller asa.channel, 21, asa.ctrl(21) END IF END SUB SUB asa_SL22 () ' slider callback - front/back position: ' this cannot work well: we should not send all these intermediate values ' from the slider when it is moved with the mouse. STATIC slnr AS DWORD slnr = TaskEX(%asa_HubPic).SliderNumbers(1) IF slider(slnr).value <> asa.ctrl(22) THEN asa.ctrl(22) = Slider(slnr).value Controller asa.channel, 22, asa.ctrl(22) END IF END SUB SUB asa_SL23 () ' slider callback left right ' any value < 64 makes a left move ' any value > 64 makes a right move. ' value 64 unpowers the solenoid and causes equilibrium. STATIC slnr AS DWORD slnr = TaskEX(%asa_HubPic).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(23) THEN asa.ctrl(23) = Slider(slnr).value Controller asa.channel, 23, asa.ctrl(23) END IF END SUB '-------------------------------------------------- SUB asa_ValvePic () ' note fingering ' controllers 100, 101, 102, 103 ' fingered vibrato STATIC slnr, udnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%asa_ValvePIC).tog THEN IF ISFALSE Task(%asa_ValvePIC).hParam THEN DIM TaskParamLabels(3) TaskParamLabels(0)="f-vib" ' fingered vibrato speed - to do, via channel aftertouch TaskParamLabels(1)="speed" ' speed (task speed) TaskParamLabels(2)="CC30" ' valve release time TaskParamLabels(3)="Valve" ' test individual valves 1-21 via ctrl 100-103 MakeTaskParameterDialog %asa_ValvePIC,3, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asa_ValvePIC).SliderNumbers(0) Slider(slnr).value = 5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 9 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+2).cptr = CODEPTR(asa_sl30) Slider(slnr+2).value = 127 ' about 2 seconds this is. SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value IF udnr = %False THEN udnr = TaskEX(%asa_ValvePic).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(asa_100103_UD0) ' valve number UDctrl(udnr).value = 0 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 28 UDctrl(udnr).stap = 1 END IF END IF Task(%asa_ValvePIC).freq = 10 Task(%asa_ValvePIC).tog = %True END IF ' poll code for this slider: IF Slider(slnr).value > 0 THEN Aftertouch asa.channel, slider(slnr).value ' this will only work after the command ' following a mPlay command or as long ' as a note is playing. END IF Task(%asa_ValvePIC).freq = 1 + Slider(slnr+1).value END SUB ' SUB asa_SL30 () ' slider callback - release delay time ' tested o.k. on 27.04.2011 - gwr ' o.k. on 06.09.2012 STATIC slnr AS DWORD slnr = TaskEX(%asa_ValvePic).SliderNumbers(2) IF slider(slnr).value <> asa.ctrl(30) THEN asa.ctrl(30) = Slider(slnr).value Controller asa.channel, 30, asa.ctrl(30) END IF END SUB ' SUB asa_100103_ud0 () ' callback on parameter UpDowns. individual valve test. ' valve board controller 100-102 LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%asa_ValvePic).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 21 THEN UDctrl(udnr).value = 21 : value = 21 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%asa_ValvePic).hparam, %GMT_TEXT0_ID + 16, "V=" & STR$(value) SELECT CASE value CASE 0 Controller asa.channel, 100, 0 Controller asa.channel, 101, 0 Controller asa.channel, 102, 0 CASE 1 Controller asa.channel, 100, 1 CASE 2 Controller asa.channel, 100, 2 CASE 3 Controller asa.channel, 100, 4 CASE 4 Controller asa.channel, 100, 8 CASE 5 Controller asa.channel, 100, 16 CASE 6 Controller asa.channel, 100, 32 CASE 7 Controller asa.channel, 100, 64 Controller asa.channel, 101, 0 CASE 8 Controller asa.channel, 100, 0 Controller asa.channel, 101, 1 CASE 9 Controller asa.channel, 101, 2 CASE 10 Controller asa.channel, 101, 4 CASE 11 Controller asa.channel, 101, 8 CASE 12 Controller asa.channel, 101, 16 CASE 13 Controller asa.channel, 101, 32 CASE 14 Controller asa.channel, 101, 64 Controller asa.channel, 102, 0 CASE 15 Controller asa.channel, 101, 0 Controller asa.channel, 102, 1 CASE 16 Controller asa.channel, 102, 2 CASE 17 Controller asa.channel, 102, 4 CASE 18 Controller asa.channel, 102, 8 END SELECT END SUB ' SUB asa_66 () Controller asa.channel, 66, 127 asa.ctrl(66)= 127 END SUB SUB asaMusic () STATIC highnote, note, oldnote, minvel AS BYTE STATIC slnr, cnt AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL interval, velfak AS LONG IF ISFALSE Task(%asaMus).tog THEN IF ISFALSE Task(%asaMus).hParam THEN minvel = 5 DIM TaskParamLabels(2) TaskParamLabels(0)="Highest" ' highest note limit TaskParamLabels(1)="Speed" TaskParamLabels(2)="Volume" MakeTaskParameterDialog %asaMus,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%asaMus).SliderNumbers(0) 'Slider(slnr).cptr = CODEPTR() Slider(slnr).value = asa.lowtes + 30 Slider(slnr).minval = asa.lowtes + 12 Slider(slnr).maxval = asa.hightes SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 16 ' tempo SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 38 ' level range Slider(slnr+2).minval = minvel SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value END IF cnt = 0 oldnote = asa.lowtes Task(%asaMus).tog = %True END IF IF cnt MOD RND(3,7) = 1 THEN 'mPlay asa.channel, oldnote, %False NoteOff asa.channel, oldnote ELSE DO interval = RND(-3, +3) note = oldnote + interval LOOP UNTIL (note >= asa.lowtes) AND (note <= Slider(0).value) velfak = note - asa.lowtes ' 0 - 48 SELECT CASE note CASE asa.lowtes TO asa.lowtes + 19 velfak = velfak MOD 13 CASE asa.lowtes + 20 TO asa.lowtes + 39 ' komt van een andere robot... velfak = (velfak - 12) MOD 13 CASE asa.lowtes + 40 TO asa.lowtes + 59 velfak = (velfak - 24) MOD 13 CASE asa.lowtes + 60 TO asa.hightes velfak = (velfak -36) MOD 13 END SELECT mPlay asa.channel, note, MAX(minvel,Slider(slnr+2).value - (velfak*2)) 'rnd(minvel,Slider(slnr+2).value) oldnote = note END IF INCR cnt Task(%asaMus).freq = (Slider(slnr+1).value / 16) * RND(1,4) END SUB SUB asaMusic_Stop () Controller asa.channel, 123, %False END SUB