'******************************************** '* * '* a microtonal basson playing robot by * '* dr.Godfried-Willem Raes * '* 2010 - 2012 * '******************************************** ' 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 ' 27.04.2011: Code revised in function of better PIC testing. ' PicHub and PicValve firmware upgrades. ' 29.09.2012: dsPIC board replaced with ARM 32-bit controller. ' Now we have the same controllers as in ' Implemented ambitus: 32-91 ' 2016: new motor board added. ' 09.03.2020: Firmware for the hub board rewritten ' controller 69 added as switch for automated eyes. ' ARM-board tasks: %Fa_Arm = 20 %Fa_Filters = 21 %Fa_Bendrange = 22 %Fa_Vibrato = 23 %Fa_Tremolo = 24 %Fa_Duodec = 25 ' ds-PIC controller tasks: '%Fa_dsPic = 32 ' controllers 1,7,17,18,19,20 - old version 1.1, 2011 %Fa_scale = 34 %Fa_test = 35 ' repeated note test '%Fa_Tremolo = 36 '%Fa_Vibrato = 37 ' ValvePic controller tasks: %Fa_ValvePic = 39 ' controller 100,101,102,103 '%Fa_KeyPress = 40 ' now aftertouch for fingered vibrato %Fa_100 = 41 %Fa_101 = 42 %Fa_102 = 43 %Fa_103 = 44 ' MidiHub controller tasks: %Fa_HubPic = 48 ' controllers 21,22,23 ' motor control: %Fa_Pendulum = 63 'to do 'lights: [ hub board ] %Fa_lites = 54 'on-off test %Fa0 = 55 ' front %Fa1 = 56 %Fa2 = 57 %Fa3 = 58 %Fa4 = 59 'eyes %Fa5 = 60 GLOBAL FaKeyPress AS LONG DECLARE FUNCTION Init_Fa () AS LONG 'DECLARE SUB Fa_dsPIC () DECLARE SUB Fa_HubPic () DECLARE SUB Fa_ValvePic () DECLARE SUB Fa_100103_ud0 () DECLARE SUB Fa_Scale () DECLARE SUB Fa_Scale_UD0 () DECLARE SUB Fa_Scale_UD1 () DECLARE SUB Fa_Scale_UD2 () DECLARE SUB Fa_Vibrato () DECLARE SUB Fa_Tremolo () DECLARE SUB Fa_SL18 () DECLARE SUB Fa_SL19 () DECLARE SUB Fa_SL20 () DECLARE SUB Fa_SL21 () DECLARE SUB Fa_SL22 () DECLARE SUB Fa_SL23 () DECLARE SUB Fa_SL30 () 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 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_dsPIC).naam = "dsPIC" 'Task(%Fa_dsPIC).cptr = CODEPTR(Fa_dsPIC) 'Task(%Fa_dsPIC).freq = 2 'Task(%Fa_dsPIC).flags = %False Task(%Fa_Arm).naam = "Fa-ARM" Task(%Fa_Arm).cptr = CODEPTR(Fa_Arm) Task(%Fa_Arm).freq = 2 Task(%Fa_Arm).flags = %False Task(%Fa_Bendrange).naam = "PB-range" Task(%Fa_Bendrange).cptr = CODEPTR(Fa_Bendrange) Task(%Fa_Bendrange).freq = 2 Task(%Fa_Bendrange).flags = %False Task(%Fa_duodec).naam = "duodec" Task(%Fa_duodec).cptr = CODEPTR(Fa_duodec) Task(%Fa_duodec).freq = 2 Task(%Fa_duodec).flags = %False Task(%Fa_filters).naam = "filters" Task(%Fa_filters).cptr = CODEPTR(Fa_filters) Task(%Fa_filters).freq = 2 Task(%Fa_filters).flags = %False Task(%Fa_HubPIC).naam = "HubPIC" Task(%Fa_HubPIC).cptr = CODEPTR(Fa_HubPIC) Task(%Fa_HubPIC).freq = 2 Task(%Fa_HubPIC).flags = %False Task(%Fa_ValvePIC).naam = "ValPIC" Task(%Fa_ValvePIC).cptr = CODEPTR(Fa_ValvePIC) Task(%Fa_ValvePIC).freq = 2 Task(%Fa_ValvePIC).flags = %False 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_Lites).naam = "lites" Task(%Fa_Lites).cptr = CODEPTR(Fa_Lites) Task(%Fa_Lites).freq = 2 Task(%Fa_Lites).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_vibrato).naam = "Vibrato" Task(%Fa_vibrato).freq = 12 Task(%Fa_vibrato).cptr = CODEPTR(Fa_Vibrato) 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" Task(%Fa0).cptr = CODEPTR(Fa0) Task(%Fa0).freq = 20 Task(%Fa0).flags = %False TaskEX(%Fa0).StopCptr = CODEPTR(Fa0_Stop) Task(%Fa1).naam = "Li-1" 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(11).tag = "Fa On" ButnOS(11).cptr = CODEPTR(Fa_66) 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) ' Controller Fa.channel, 123, %False ' all notes off 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(6) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" TaskParamLabels(2)="legato" TaskParamLabels(3)="FinVib" ' aftertouch TaskParamLabels(4)="step" TaskParamLabels(5)= "hilim" TaskParamLabels(6)="lowlim" MakeTaskParameterDialog %Fa_Scale,4, 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 Slider(slnr+3).value = 0 Sendmessage Slider(slnr+3).h, %TBM_SETPOS, %True, Slider(slnr+3).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 = 91 'Fa.Hightes + 12 UDctrl(udnr+2).cptr = CODEPTR(Fa_Scale_UD2) ' low note limit UDctrl(udnr+2).value = 34 UDctrl(udnr+2).minval = Fa.lowtes UDctrl(udnr+2).maxval = 91 'Fa.Hightes + 12 '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 Task(%Fa_Scale).freq = MAX(2,Slider(slnr+2).value * 6) ELSE ' in dit geval puur legato zonder note-off's Task(%Fa_Scale).freq = 1000 END IF onoff = %True ELSE n = cnt mPlay Fa.channel, n, Slider(slnr).value ' IF Slider(3).value THEN ' Aftertouch Fa.channel, Slider(3).value ' must be send after each note on ' END IF IF Slider(slnr+3).value <> Fa.ctrl(31) THEN Fa.ctrl(31) = Slider(slnr+3).value Controller Fa.channel, 31, Slider(slnr+3).value END IF 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 / 4) 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+12 THEN UDctrl(udnr).value = Fa.HighTes+12 : noot = Fa.hightes+12 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_Vibrato () ' ' vibrato test met de pitchbend ' ' 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(%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_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_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(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 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 ' ----- dsPIC testing ----------------------------------------------- 'SUB Fa_dsPIC () ' ' controllers 1,7,17,18,19,20 ' ' ds pic board. ' STATIC slnr AS DWORD ' STATIC TaskParamLabels() AS ASCIIZ*8 ' IF ISFALSE Task(%Fa_dsPIC).tog THEN ' IF ISFALSE Task(%Fa_dsPIC).hParam THEN ' DIM TaskParamLabels(5) ' TaskParamLabels(0)="C1" ' noise ' TaskParamLabels(1)="C7" ' volume ' TaskParamLabels(2)="C17" ' attack ' TaskParamLabels(3)="C18" ' hold ' TaskParamLabels(4)="C19" ' release ' TaskParamlabels(5)="C20" ' tuning ' MakeTaskParameterDialog %Fa_dsPIC,6, Slider(),0,UdCtrl(), TaskParamLabels() ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(0) ' slider(slnr).cptr = CODEPTR(Fa_sl1) ' Slider(slnr).value = 5 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' ' slider(slnr+1).cptr = CODEPTR(Fa_sl7) ' Slider(slnr+1).value = 127 ' SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value ' ' slider(slnr+2).cptr = CODEPTR(Fa_sl17) ' Slider(slnr+2).value = 127 ' SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value ' ' slider(slnr+3).cptr = CODEPTR(Fa_sl18) ' Slider(slnr+3).value = 110 ' SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value ' ' slider(slnr+4).cptr = CODEPTR(Fa_sl19) ' Slider(slnr+4).value = 115 ' SendMessage Slider(Slnr+4).h, %TBM_SETPOS,%True, Slider(Slnr+4).value ' ' slider(slnr+5).cptr = CODEPTR(Fa_sl20) ' Slider(slnr+5).value = 22 ' SendMessage Slider(Slnr+5).h, %TBM_SETPOS,%True, Slider(Slnr+5).value ' ' END IF ' Task(%Fa_dsPIC).tog = %True ' END IF ' StopTask %Fa_dsPIC 'END SUB ' 'SUB Fa_SL1 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).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_SL7 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(1) ' 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_SL17 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(2) ' 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_SL18 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(3) ' 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_SL19 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(4) ' 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_SL20 () ' ' slider callback ' STATIC slnr AS DWORD ' slnr = TaskEX(%Fa_dsPIC).SliderNumbers(5) ' 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_HubPIC () ' controllers 21,22,23,67 ' lites 0,1,2,3,4,5 ' Midi Hub board. ' 04.11.2016: Changed: now motor function are handled by the motor board! STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_HubPIC).tog THEN IF ISFALSE Task(%Fa_HubPIC).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="C21" ' mimimum motorspeed TaskParamLabels(1)="C22" ' position TaskParamLabels(2)="C23" ' maximum motorspeed TaskParamLabels(3)="C67" ' automove 'TaskParamLabels(4)="C " 'TaskParamlabels(5)="C " MakeTaskParameterDialog %Fa_HubPIC,4, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_HubPIC).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Fa_sl21) Slider(slnr).value = 5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' slider(slnr+1).cptr = CODEPTR(Fa_sl22) - do not use callback, but poll!!! Slider(slnr+1).value = 0 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+2).cptr = CODEPTR(Fa_sl23) Slider(slnr+2).value = 10 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value slider(slnr+3).cptr = CODEPTR(Fa_sl67) Slider(slnr+3).value = 0 SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value END IF Task(%Fa_HubPIC).freq = 2 Task(%Fa_HubPIC).tog = %True END IF ' poll code for this slider: IF slider(slnr+1).value <> Fa.ctrl(22) THEN Fa.ctrl(22) = Slider(slnr+1).value Controller Fa.channel, 22, Fa.ctrl(22) END IF END SUB SUB Fa_SL21 () ' slider callback - movement minimum speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_HubPic).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_SL22 () ' slider callback - position: ' this cannot work well: we should not send all these intermadiate values ' from the slider when it is moved with the mouse. STATIC slnr AS DWORD slnr = TaskEX(%Fa_HubPic).SliderNumbers(1) IF slider(slnr).value <> Fa.ctrl(22) THEN Fa.ctrl(22) = Slider(slnr).value Controller Fa.channel, 22, Fa.ctrl(22) END IF END SUB SUB Fa_SL23 () ' slider callback - movement maximum speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_HubPic).SliderNumbers(2) 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_SL67 () ' slider callback - movement automation STATIC slnr AS DWORD slnr = TaskEX(%Fa_HubPic).SliderNumbers(3) IF slider(slnr).value <> Fa.ctrl(67) THEN Fa.ctrl(67) = Slider(slnr).value Controller Fa.channel, 67, Fa.ctrl(67) END IF END SUB '-------------------------------------------------- SUB Fa_ValvePic () ' note fingering ' controllers 100, 101, 102, 103 ' fingered vibrato STATIC slnr, udnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_ValvePIC).tog THEN IF ISFALSE Task(%Fa_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-28 via ctrl 100-103 MakeTaskParameterDialog %Fa_ValvePIC,3, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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(Fa_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(%Fa_ValvePic).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Fa_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(%Fa_ValvePIC).freq = 10 Task(%Fa_ValvePIC).tog = %True END IF ' poll code for this slider: IF Slider(slnr).value > 0 THEN Aftertouch Fa.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(%Fa_ValvePIC).freq = 1 + Slider(slnr+1).value END SUB SUB Fa_SL30 () ' slider callback - release delay time ' tested o.k. 27.04.2011 - gwr STATIC slnr AS DWORD slnr = TaskEX(%Fa_ValvePic).SliderNumbers(2) IF slider(slnr).value <> Fa.ctrl(30) THEN Fa.ctrl(30) = Slider(slnr).value Controller Fa.channel, 30, Fa.ctrl(30) END IF END SUB SUB Fa_100103_ud0 () ' callback on parameter UpDowns. individual valve test. ' valve board controller 100-103 LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Fa_ValvePic).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 28 THEN UDctrl(udnr).value = 28 : value = 28 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Fa_ValvePic).hparam, %GMT_TEXT0_ID + 16, "V=" & STR$(value) SELECT CASE value CASE 0 Controller Fa.channel, 100, 0 Controller Fa.channel, 101, 0 Controller Fa.channel, 102, 0 Controller Fa.channel, 103, 0 CASE 1 Controller Fa.channel, 100, 1 CASE 2 Controller Fa.channel, 100, 2 CASE 3 Controller Fa.channel, 100, 4 CASE 4 Controller Fa.channel, 100, 8 CASE 5 Controller Fa.channel, 100, 16 CASE 6 Controller Fa.channel, 100, 32 CASE 7 Controller Fa.channel, 100, 64 Controller Fa.channel, 101, 0 CASE 8 Controller Fa.channel, 100, 0 Controller Fa.channel, 101, 1 CASE 9 Controller Fa.channel, 101, 2 CASE 10 Controller Fa.channel, 101, 4 CASE 11 Controller Fa.channel, 101, 8 CASE 12 Controller Fa.channel, 101, 16 CASE 13 Controller Fa.channel, 101, 32 CASE 14 Controller Fa.channel, 101, 64 Controller Fa.channel, 102, 0 CASE 15 Controller Fa.channel, 101, 0 Controller Fa.channel, 102, 1 CASE 16 Controller Fa.channel, 102, 2 CASE 17 Controller Fa.channel, 102, 4 CASE 18 Controller Fa.channel, 102, 8 CASE 19 Controller Fa.channel, 102, 16 CASE 20 Controller Fa.channel, 102, 32 CASE 21 Controller Fa.channel, 102, 64 Controller Fa.channel, 103, 0 CASE 22 Controller Fa.channel, 102, 0 Controller Fa.channel, 103, 1 CASE 23 Controller Fa.channel, 103, 2 CASE 24 Controller Fa.channel, 103, 4 CASE 25 Controller Fa.channel, 103, 8 CASE 26 Controller Fa.channel, 103, 16 CASE 27 Controller Fa.channel, 103, 32 CASE 28 Controller Fa.channel, 103, 64 END SELECT END SUB SUB Fa_66 () Controller Fa.channel, 66, 127 Fa.ctrl(66)= 127 END SUB ' *** ARM controlled functions: SUB Fa_Arm () ' controllers 1,7, 16, 17,18,19,20 ' ARM controller board. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_Arm).tog THEN IF ISFALSE Task(%Fa_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 %Fa_Arm,7, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_Arm).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Fa_sl1) Slider(slnr).value = 5 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr+1).cptr = CODEPTR(Fa_sl7) Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+2).cptr = CODEPTR(Fa_sl16) Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value slider(slnr+3).cptr = CODEPTR(Fa_sl17) Slider(slnr+3).value = 100 SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value slider(slnr+4).cptr = CODEPTR(Fa_sl18) Slider(slnr+4).value = 90 SendMessage Slider(Slnr+4).h, %TBM_SETPOS,%True, Slider(Slnr+4).value slider(slnr+5).cptr = CODEPTR(Fa_sl19) Slider(slnr+5).value = 64 SendMessage Slider(Slnr+5).h, %TBM_SETPOS,%True, Slider(Slnr+5).value slider(slnr+6).cptr = CODEPTR(Fa_sl20) Slider(slnr+6).value = 64 SendMessage Slider(Slnr+6).h, %TBM_SETPOS,%True, Slider(Slnr+6).value END IF Task(%Fa_Arm).tog = %True END IF StopTask %Fa_Arm END SUB SUB Fa_SL1 () ' slider callback - noise signal STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).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_SL7 () ' slider callback - main volume STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(1) 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_SL16 () ' - attack time ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(2) IF slider(slnr).value <> Fa.ctrl(16) THEN Fa.ctrl(16) = Slider(slnr).value Controller Fa.channel, 16, Fa.ctrl(16) END IF END SUB SUB Fa_SL17 () ' slider callback - attack level STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(3) 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_SL18 () ' slider callback - attack decay towards velo level STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(4) 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_SL19 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(5) 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_SL20 () ' slider callback - tuning STATIC slnr AS DWORD slnr = TaskEX(%Fa_Arm).SliderNumbers(6) 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_Filters () ' test for filters - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_filters).tog THEN IF ISFALSE Task(%Fa_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 %Fa_filters,6, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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(Fa_sl2) slider(slnr+1).cptr = CODEPTR(Fa_sl29) slider(slnr+2).cptr = CODEPTR(Fa_sl25) slider(slnr+3).cptr = CODEPTR(Fa_sl26) slider(slnr+4).cptr = CODEPTR(Fa_sl27) slider(slnr+5).cptr = CODEPTR(Fa_sl28) END IF Task(%Fa_Filters).tog = %True END IF Stoptask %Fa_Filters END SUB SUB Fa_SL2 () ' lfo3 filter speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(2) THEN Fa.ctrl(2) = Slider(slnr).value Controller Fa.channel, 2, Fa.ctrl(2) END IF END SUB SUB Fa_SL29 () ' lfo3 filter depth STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(1) IF slider(slnr).value <> Fa.ctrl(29) THEN Fa.ctrl(29) = Slider(slnr).value Controller Fa.channel, 29, Fa.ctrl(29) END IF END SUB SUB Fa_SL25 () ' filter cut off frequency STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(2) IF slider(slnr).value <> Fa.ctrl(25) THEN Fa.ctrl(25) = Slider(slnr).value Controller Fa.channel, 25, Fa.ctrl(25) END IF END SUB SUB Fa_SL26 () ' filter resonance STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(3) IF slider(slnr).value <> Fa.ctrl(26) THEN Fa.ctrl(26) = Slider(slnr).value Controller Fa.channel, 26, Fa.ctrl(26) END IF END SUB SUB Fa_SL27 () ' echo mix amplitude STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(4) IF slider(slnr).value <> Fa.ctrl(27) THEN Fa.ctrl(27) = Slider(slnr).value Controller Fa.channel, 27, Fa.ctrl(27) END IF END SUB SUB Fa_SL28 () ' lfo3 filter speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_Filters).SliderNumbers(5) IF slider(slnr).value <> Fa.ctrl(28) THEN Fa.ctrl(28) = Slider(slnr).value Controller Fa.channel, 28, Fa.ctrl(28) END IF END SUB SUB Fa_DuoDec () ' test op toevoeging duodecime in het spectrum - arm processor STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_duodec).tog THEN IF ISFALSE Task(%Fa_duodec).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Amplit" ' CC42 TaskParamlabels(1)="Detune" ' CC41 MakeTaskParameterDialog %Fa_duodec,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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(Fa_sl42) slider(slnr+1).cptr = CODEPTR(Fa_sl41) END IF Task(%Fa_duodec).tog = %True END IF Stoptask %Fa_duodec END SUB SUB Fa_SL42 () ' duodecime sine wave component amplitude - made for the clarinet! STATIC slnr AS DWORD slnr = TaskEX(%Fa_Duodec).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(42) THEN Fa.ctrl(42) = Slider(slnr).value Controller Fa.channel, 42, Fa.ctrl(42) END IF END SUB SUB Fa_SL41 () ' duodecime sine wave component amplitude STATIC slnr AS DWORD slnr = TaskEX(%Fa_Duodec).SliderNumbers(1) IF slider(slnr).value <> Fa.ctrl(41) THEN Fa.ctrl(41) = Slider(slnr).value Controller Fa.channel, 41, Fa.ctrl(41) END IF END SUB SUB Fa_Bendrange () ' test for pitchbendrange - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_bendrange).tog THEN IF ISFALSE Task(%Fa_bendrange).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Range" ' CC40 MakeTaskParameterDialog %Fa_bendrange,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_bendrange).SliderNumbers(0) Slider(slnr).value = 1 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr).cptr = CODEPTR(Fa_sl40) END IF Task(%Fa_Bendrange).tog = %True END IF Stoptask %Fa_Bendrange END SUB SUB Fa_SL40 () ' pitchbend range controller STATIC slnr AS DWORD slnr = TaskEX(%Fa_Bendrange).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(40) THEN Fa.ctrl(40) = Slider(slnr).value Controller Fa.channel, 40, Fa.ctrl(40) END IF END SUB SUB Fa_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(%Fa_vibrato).tog THEN IF ISFALSE Task(%Fa_vibrato).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="Speed" ' controller #4 TaskParamlabels(1)="Depth" ' controller #3 TaskParamLabels(2)="Delay" ' controller #43 MakeTaskParameterDialog %Fa_vibrato,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_vibrato).SliderNumbers(0) Slider(slnr).value = 8 Task(%Fa_vibrato).freq = 50 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr).cptr = CODEPTR(Fa_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(Fa_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(Fa_sl43) END IF Task(%Fa_vibrato).tog = %True END IF stoptask %Fa_Vibrato END SUB SUB Fa_SL4 () ' vibrato speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_Vibrato).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(4) THEN Fa.ctrl(4) = Slider(slnr).value Controller Fa.channel, 4, Fa.ctrl(4) END IF END SUB SUB Fa_SL3 () ' vibrato depth STATIC slnr AS DWORD slnr = TaskEX(%Fa_Vibrato).SliderNumbers(1) IF slider(slnr).value <> Fa.ctrl(3) THEN Fa.ctrl(3) = Slider(slnr).value Controller Fa.channel, 3, Fa.ctrl(3) END IF END SUB SUB Fa_SL43 () ' vibrato delay STATIC slnr AS DWORD slnr = TaskEX(%Fa_Vibrato).SliderNumbers(2) IF slider(slnr).value <> Fa.ctrl(43) THEN Fa.ctrl(43) = Slider(slnr).value Controller Fa.channel, 43, Fa.ctrl(43) END IF END SUB SUB Fa_Tremolo () ' test for tremolo - ARM controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Fa_tremolo).tog THEN IF ISFALSE Task(%Fa_tremolo).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="Speed" ' CC6 TaskParamlabels(1)="Depth" ' CC5 TaskParamlabels(2)="Delay" ' CC44 MakeTaskParameterDialog %Fa_tremolo,3, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Fa_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(Fa_sl6) slider(slnr+1).cptr = CODEPTR(Fa_sl5) slider(slnr+2).cptr = CODEPTR(Fa_sl44) END IF Task(%Fa_Tremolo).tog = %True END IF Stoptask %Fa_Tremolo END SUB SUB Fa_SL6 () ' tremolo speed STATIC slnr AS DWORD slnr = TaskEX(%Fa_Tremolo).SliderNumbers(0) IF slider(slnr).value <> Fa.ctrl(6) THEN Fa.ctrl(6) = Slider(slnr).value Controller Fa.channel, 6, Fa.ctrl(6) END IF END SUB SUB Fa_SL5 () ' tremolo depth STATIC slnr AS DWORD slnr = TaskEX(%Fa_Tremolo).SliderNumbers(1) IF slider(slnr).value <> Fa.ctrl(5) THEN Fa.ctrl(5) = Slider(slnr).value Controller Fa.channel, 5, Fa.ctrl(5) END IF END SUB SUB Fa_SL44 () ' tremolo delay STATIC slnr AS DWORD slnr = TaskEX(%Fa_Tremolo).SliderNumbers(2) IF slider(slnr).value <> Fa.ctrl(44) THEN Fa.ctrl(44) = Slider(slnr).value Controller Fa.channel, 44, Fa.ctrl(44) END IF END SUB