'******************************************** '* * '* a microtonal Bb cornet playing robot by * '* dr.Godfried-Willem Raes * '* 2008 * '******************************************** ' hardware tests and development code ' this file is also included in the Bono compilation ' 28.01.2008: debugged gwr. ' 20.11.2008: hardware revision. ' tweede kolom cockpit: %Korn_scale = 17 ' toonladder test %Korn_test = 18 ' repeated note test %Korn_Qscale = 19 ' kwarttoons toonladder test %Korn_Vibrato = 21 ' pitch bend test %Korn_Tremolo = 22 ' tremolo test ' derde kolon in cockpit: controllers '%Korn_7 = 20 ' ctrl 7 ' volume - niet geimplementeerd op korn!!! %Korn_13 = 32 ' ctrl 13: valve control %Korn_17 = 33 ' ctrl 17 ' attack amplitude %Korn_18 = 34 ' ctrl 18 ' attack time %Korn_20 = 35 ' ctrl 20 ' main tuning to diapason %KOrn_Hormove = 36 ' ctrl 21 %Korn_Vermove = 37 ' ctrl 22 %Korn_25 = 38 ' ctrl 25 ' valve velo controller %Korn_lites = 39 ' vierde kolom cockpit %Korn_Calls = 60 %Korn_Moves = 61 %Brass_Calls = 63 DECLARE FUNCTION Init_Korn () AS LONG DECLARE SUB Korn_Scale () DECLARE SUB Korn_Scale_UD0 () DECLARE SUB Korn_Scale_UD1 () DECLARE SUB Korn_Scale_UD2 () DECLARE SUB Korn_Hormove () DECLARE SUB Korn_SL21 () DECLARE SUB Korn_Vermove () DECLARE SUB Korn_SL22 () DECLARE SUB Korn_Vibrato () DECLARE SUB Korn_Tremolo () DECLARE SUB Korn_13 () ' valves DECLARE SUB Korn_13_UD0 () DECLARE SUB Korn_18 () DECLARE SUB Korn_SL18 () DECLARE SUB Korn_20 () ' tuning DECLARE SUB Korn_SL20 () DECLARE SUB Korn_25 () ' valve velo DECLARE SUB Korn_lites () DECLARE SUB Korn_Lites_UD () DECLARE SUB Korn_Test () DECLARE SUB Korn_UD0 () DECLARE SUB Korn_UD1 () DECLARE SUB Korn_UD2 () DECLARE SUB Korn_Calls () ' gwr demo stukje DECLARE FUNCTION Korn_MotPosCal () AS LONG ' callback for one shot ctrl.70 DECLARE SUB Korn_Moves () DECLARE SUB Korn_Qscale () ' quartertone scale test DECLARE SUB Brass_Calls () DECLARE SUB Brass_Calls_Start () DECLARE SUB Brass_Calls_Stop () DECLARE SUB Korn_Fingerings DECLARE CALLBACK FUNCTION CB_Korn_Fingerings FUNCTION Init_Korn () AS LONG LOCAL retval AS LONG LOCAL m AS ASCIIZ * 30 ' GetInstrumentParams Korn, %IDM_Korn ' retval = SetRobotPort (Korn, Inifilename, hMidiO()) Task(%Korn_Scale).naam = "Scale" Task(%Korn_Scale).cptr = CODEPTR(Korn_Scale) Task(%Korn_Scale).freq = 2 Task(%Korn_Scale).flags = %False Task(%Korn_Test).naam = "Test" Task(%korn_Test).cptr = CODEPTR(Korn_Test) Task(%Korn_Test).freq = 4 Task(%Korn_Test).flags = %False Task(%Korn_QScale).naam = "QScale" Task(%Korn_QScale).cptr = CODEPTR(Korn_QScale) Task(%Korn_QScale).freq = 2.5 Task(%Korn_QScale).flags = %False Task(%Korn_Hormove).naam = "HorMov" Task(%Korn_Hormove).cptr = CODEPTR(Korn_Hormove) Task(%Korn_Hormove).freq = 2 Task(%Korn_Hormove).flags = %False Task(%Korn_Vermove).naam = "VerMov" Task(%Korn_Vermove).cptr = CODEPTR(Korn_Vermove) Task(%Korn_Vermove).freq = 2 Task(%Korn_Vermove).flags = %False Task(%Korn_Lites).naam = "lites" Task(%Korn_Lites).cptr = CODEPTR(Korn_Lites) Task(%Korn_Lites).freq = 2 Task(%Korn_Lites).flags = %False Task(%Korn_13).naam = "V_C13" Task(%Korn_13).cptr = CODEPTR(Korn_13) Task(%Korn_13).freq = 10 Task(%Korn_13).flags = %False Task(%Korn_17).naam = "Aa_C17" Task(%Korn_17).cptr = CODEPTR(Korn_17) Task(%Korn_17).freq = 10 Task(%Korn_17).flags = %False Task(%Korn_tremolo).naam = "Tremolo" Task(%Korn_tremolo).cptr = CODEPTR(Korn_Tremolo) Task(%Korn_tremolo).freq = 16 Task(%Korn_tremolo).flags = %False Task(%Korn_18).naam = "At_C18" Task(%Korn_18).cptr = CODEPTR(Korn_18) Task(%Korn_18).freq = 10 Task(%Korn_18).flags = %False Task(%Korn_20).naam = "Tun_C20" Task(%Korn_20).cptr = CODEPTR(Korn_20) Task(%Korn_20).freq = 10 Task(%Korn_20).flags = %False ' Task(%Korn_Valve_sx).naam = "ValveSysx" ' Task(%Korn_Valve_sx).freq = .33 ' Task(%Korn_Valve_sx).cptr = CODEPTR(Korn_Valve_Sysx) 'in m_robots.inc Task(%Korn_25).naam = "Valv_C25" Task(%Korn_25).freq = 8 Task(%Korn_25).cptr = CODEPTR(Korn_25) Task(%Korn_vibrato).naam = "Vibrato" Task(%Korn_vibrato).freq = 12 Task(%Korn_vibrato).cptr = CODEPTR(Korn_Vibrato) Task(%Korn_Calls).naam = "Calls" Task(%Korn_Calls).freq = 24 Task(%Korn_Calls).cptr = CODEPTR(Korn_Calls) Task(%Korn_Moves).naam = "Moves" Task(%Korn_Moves).freq = 4 Task(%Korn_Moves).cptr= CODEPTR(Korn_Moves) ' koperkwartet: Task(%Brass_Calls).naam = "BrasCall" Task(%Brass_Calls).freq = 24 Task(%Brass_Calls).cptr = CODEPTR(Brass_Calls) TaskEX(%Brass_Calls).startcptr = CODEPTR(Brass_Calls_Start) TaskEX(%Brass_Calls).stopcptr= CODEPTR(Brass_Calls_Stop) ' ButnSw(7).tag0 = "Valves" ' ButnSw(7).tag1 = "Valves" ' ButnSw(7).cptr = CODEPTR(Korn_Valves) ButnOs(9).tag = "fingers" ButnOs(9).cptr = CODEPTR(Korn_Fingerings) ButnOS(10).tag = "Korn Off" ButnOS(10).cptr = CODEPTR(MM_Korn_Off) ' calibration button for motors - ctrl.70 ButnOS(11).tag = "MotPos" ButnOS(11).cptr = CODEPTR(Korn_MotPosCal) ' m = " test & debug" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr SetDlgItemText gh.Cockpit, %GMT_MSG1, "test and evaluation procs" SetDlgItemText gh.Cockpit, %GMT_MSG2, "for our Korn robot" MM_Korn_On FUNCTION = %True END FUNCTION SUB Korn_Scale () LOCAL i AS DWORD STATIC onoff AS DWORD STATIC cnt AS LONG STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC udnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_Scale).tog THEN IF ISFALSE Task(%Korn_Scale).hParam THEN DIM TaskParamLabels(4) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" TaskParamLabels(2)="step" TaskParamLabels(3)= "hilim" TaskParamLabels(4)="lowlim" MakeTaskParameterDialog %Korn_Scale,2, Slider(),3,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_Scale).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 36 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value IF udnr = %False THEN udnr = TaskEX(%Korn_Scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_Scale_UD0) ' step size UDctrl(udnr).value = 1 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 12 UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(Korn_Scale_UD1) ' high note limit UDctrl(udnr+1).value = 96 'Korn.hightes UDctrl(udnr+1).minval = 52 'Korn.lowtes UDctrl(udnr+1).maxval = 96 'Korn.Hightes UDctrl(udnr+2).cptr = CODEPTR(Korn_Scale_UD2) ' low note limit UDctrl(udnr+2).value = 52 UDctrl(udnr+2).minval = 52 'Korn.lowtes '0 UDctrl(udnr+2).maxval = 96 'Korn.Hightes '72 END IF END IF 'Controller Korn.channel, 66, 127 ' niet nodig... 26.01.2006 gwr Task(%Korn_Scale).tog = %True cnt = Korn.Lowtes EXIT SUB END IF IF ISFALSE onoff THEN IF n THEN NoteOff Korn.channel, n n = %False onoff = %True ELSE n = cnt Play Korn.channel, n, Slider(slnr).value 'Slider(slnr).value -(cnt * 2) cnt = cnt + UDCtrl(udnr).value IF cnt > UDctrl(udnr+1).value THEN cnt = UDctrl(udnr+2).value onoff = %False END IF Task(%Korn_Scale).freq = MAX(0.25,Slider(slnr+1).value / 8) END SUB SUB Korn_Scale_UD0 () ' callback on parameter UpDowns step size LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 12 THEN UDctrl(udnr).value = 12 : value = 12 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Korn_Scale_UD1 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpDownNumbers(1) noot = UDCtrl(udnr).value IF noot < UDctrl(udnr+1).value THEN UDctrl(udnr).value = UDctrl(udnr+1).value : noot = UDctrl(udnr+1).value ' IF noot > Korn.HighTes THEN UDctrl(udnr).value = Korn.HighTes : noot = Korn.hightes SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Korn_Scale_UD2 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Scale).UpDownNumbers(2) noot = UDCtrl(udnr).value ' IF noot < Korn.lowtes THEN UDctrl(udnr).value = Korn.lowtes : noot = Korn.lowtes IF noot > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr-1).value SetDlgItemText Task(%Korn_Scale).hparam, %GMT_TEXT0_ID + 18, "Lo=" & STR$(noot) END SUB SUB Korn_QScale () ' quartertone scale test. STATIC onoff AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_Qscale).tog THEN IF ISFALSE Task(%Korn_QScale).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" MakeTaskParameterDialog %Korn_QScale,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_QScale).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Controller Korn.channel, 17, 84 Korn.ctrl(17) = 84 Controller Korn.channel, 18, 104 Korn.ctrl(18) = 104 Slider(slnr+1).value = 30 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF Controller Korn.channel, 66, 127 ' niet nodig... 26.01.2008 gwr Task(%Korn_QScale).tog = %True n = Korn.Lowtes END IF IF ISFALSE onoff THEN Bend Korn.channel, 0, 64 ' if this is required there is a bug in the pic firmware. ' as of 23.11.2008 we do have this bug however!!! Play Korn.channel, n, Slider(slnr).value onoff = %True ELSE Play Korn.channel, n, Slider(slnr).value Bend Korn.channel, 0, 127 ' or, 64 + 50 = 114 if a step corresponded to a cent, as we first wanted. ' this coding conforms to the PIC implementation and was tested ' to be correct 24.11.2008 - gwr. onoff = %False INCR n END IF IF n > Korn.hightes THEN n= Korn.lowtes Task(%Korn_QScale).freq = MAX(0.25,Slider(slnr+1).value / 4) END SUB SUB Korn_Hormove () ' controller 21 test ' implemented 02.05.2008. ' calibration happens on PIC level after ctrl 21 = 0 and ctrl 21 = 127. ' Give the motor enough time to complete the movements however! ' After these commands have been performed, 64 will correspond to a full center position STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_Hormove).tog THEN IF ISFALSE Task(%Korn_Hormove).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Hor" MakeTaskParameterDialog %Korn_hormove,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_hormove).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL21) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_Hormove).freq = 10 Task(%Korn_Hormove).tog = %TRue END IF Task(%Korn_Hormove).freq = 0.5 END SUB SUB Korn_SL21 () ' slider callback - horizontal movement STATIC slnr AS DWORD slnr = TaskEX(%Korn_Hormove).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(21) THEN Korn.ctrl(21) = Slider(slnr).value Controller Korn.channel, 21, Korn.ctrl(21) END IF END SUB SUB Korn_Vermove () ' controller 22 test - vertical movement STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_Vermove).tog THEN IF ISFALSE Task(%Korn_Vermove).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Ver" MakeTaskParameterDialog %Korn_Vermove,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_Vermove).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL22) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_Vermove).freq = 10 Task(%Korn_VERmove).tog = %TRue END IF Task(%Korn_Vermove).freq = 0.5 END SUB SUB Korn_SL22 () ' slider callback - vertical movement STATIC slnr AS DWORD slnr = TaskEX(%Korn_Vermove).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(22) THEN Korn.ctrl(22) = Slider(slnr).value Controller Korn.channel, 22, Korn.ctrl(22) END IF END SUB SUB Korn_Vibrato () ' vibrato test met de pitchbend STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Korn_vibrato).tog THEN IF ISFALSE Task(%Korn_vibrato).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" ' pitch deviation MakeTaskParameterDialog %Korn_vibrato,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_vibrato).SliderNumbers(0) Slider(slnr).value = 63 Task(%Korn_vibrato).freq = 64/4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' geen vibrato SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF cnt = %False Task(%Korn_vibrato).tog = %True END IF ' not very good code yet! we should do it much more gradually IF slider(slnr).value THEN Task(%Korn_vibrato).freq = slider(slnr).value / 4 ' max 32Hz IF ISFALSE cnt MOD 2 THEN bend Korn.channel, 0, 63 + (slider(slnr+1).value/ 2) ELSE bend Korn.channel, 0, 64 - (slider(slnr+1).value /2) END IF INCR cnt ELSE Bend Korn.channel, 0, 64 ' reset stoptask %Korn_Vibrato END IF END SUB SUB Korn_17 () ' controller 17 test ' This controls the maximum amplitude of the attack STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_17).tog THEN IF ISFALSE Task(%Korn_17).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C17" MakeTaskParameterDialog %Korn_17,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_17).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL17) Slider(slnr).value = 86 Korn.ctrl(17) = 86 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_17).freq = 10 Task(%Korn_17).tog = %TRue END IF Task(%Korn_17).freq = 0.5 END SUB SUB Korn_SL17 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_17).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(17) THEN Korn.ctrl(17) = Slider(slnr).value Controller Korn.channel, 17, Korn.ctrl(17) END IF END SUB SUB Korn_18 () ' controller 18 test - this sets the duration of the attack pulse ' ds pic board. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_18).tog THEN IF ISFALSE Task(%Korn_18).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C18" MakeTaskParameterDialog %Korn_18,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_18).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Korn_sl18) Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_18).freq = 0.4 Task(%Korn_18).tog = %TRue END IF END SUB SUB Korn_SL18 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_18).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(18) THEN Korn.ctrl(18) = Slider(slnr).value Controller Korn.channel, 18, Korn.ctrl(18) END IF END SUB SUB Korn_Tremolo () ' controller 17 test for tremolo - DS pic controlled. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Korn_tremolo).tog THEN IF ISFALSE Task(%Korn_tremolo).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" MakeTaskParameterDialog %Korn_tremolo,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_tremolo).SliderNumbers(0) Slider(slnr).value = 8 Slider(slnr+1).value = 20 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Sendmessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(slnr+1).value END IF cnt = %False Task(%Korn_Tremolo).tog = %True END IF IF Slider(slnr).value THEN Task(%Korn_Tremolo).freq = Slider(slnr).value ELSE EXIT SUB END IF IF Slider(slnr+1).value THEN IF cnt MOD 2 THEN Controller Korn.channel, 17, Korn.ctrl(17) ELSE Controller Korn.channel, 17, Korn.ctrl(17) * (Slider(slnr+1).value / 127) END IF INCR cnt END IF END SUB SUB Korn_25 () ' controller 25 , as on bono ' steers de velocities wherewith the solenoids will activate the valves. ' controlled by PIC2 on the pulse/velo board. ' This controller is for hardware development and not intended to be used by composers. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_25).tog THEN IF ISFALSE Task(%Korn_25).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="valv25" MakeTaskParameterDialog %Korn_25,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_25).SliderNumbers(0) Korn.ctrl(25) = 18 Slider(slnr).value = Korn.ctrl(25) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_25).freq = 5 Task(%Korn_25).tog = %True END IF IF slider(slnr).value <> Korn.ctrl(25) THEN Korn.ctrl(25) = Slider(slnr).value Controller Korn.channel, 25, Korn.ctrl(25) END IF END SUB SUB Korn_20 () ' tuning to diapason. [quartertone up max. range] ' controller 20 STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Korn_20).tog THEN IF ISFALSE Task(%Korn_20).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="tune" MakeTaskParameterDialog %Korn_20,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_20).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Korn_SL20) Slider(slnr).value = Korn.ctrl(20) ' 0 = 440Hz SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Korn_20).freq = 0.45 Task(%Korn_20).tog = %True END IF END SUB SUB Korn_SL20 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Korn_20).SliderNumbers(0) IF slider(slnr).value <> Korn.ctrl(20) THEN Korn.ctrl(20) = Slider(slnr).value Controller Korn.channel, 20, Korn.ctrl(20) END IF END SUB SUB Korn_Lites () ' updated 15.05.2008 STATIC cnt AS LONG STATIC udnr AS DWORD STATIC slnr AS DWORD STATIC lite AS BYTE IF ISFALSE Task(%Korn_Lites).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Nr." IF ISFALSE Task(%Korn_Lites).hParam THEN MakeTaskParameterDialog %Korn_Lites,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Lites).SliderNumbers(0) Slider(slnr).minval =1 ' tempo Slider(slnr).maxval = 127 Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF IF udnr = %False THEN udnr = TaskEX(%Korn_Lites).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_Lites_UD) ' nr. updown UDctrl(udnr).value = 118 UDctrl(udnr).minval = 118 UDctrl(udnr).maxval = 127 UDctrl(udnr).stap = 1 END IF Task(%Korn_Lites).tog = %True END IF ' lites controlled by PIC2 'IF BIT (cnt,0) THEN Play Korn.channel, 127,1 ELSE Play Korn.channel, 127,0 'IF BIT (cnt,1) THEN Play Korn.channel, 126,1 ELSE Play Korn.channel, 126,0 'IF BIT (cnt,2) THEN Play Korn.channel, 124,1 ELSE Play Korn.channel, 124,0 ' Harley Davidson lite IF lite <> UDctrl(udnr).value THEN NoteOff Korn.channel, lite lite = UDctrl(udnr).value END IF IF ISFALSE cnt MOD 2 THEN Play Korn.channel, lite, 1 ELSE Play Korn.channel, lite, 0 END IF INCR cnt Task(%Korn_Lites).freq = MAX(1,(Slider(slnr).value / 4)) END SUB SUB Korn_Lites_UD () ' callback on parameter UpDowns. : lite number LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Lites).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 127 THEN UDctrl(udnr).value = 127 : value = 127 IF value < 118 THEN UDCTRL(udnr).value = 118 : value = 118 SetDlgItemText Task(%Korn_Lites).hparam, %GMT_TEXT0_ID + 16, STR$(value) END SUB SUB Korn_Test() STATIC slnr AS DWORD STATIC udnr AS DWORD LOCAL value AS LONG STATIC noot AS BYTE STATIC onfreq AS SINGLE STATIC offFreq AS SINGLE STATIC oldnote AS BYTE STATIC resetval AS BYTE LOCAL velo AS BYTE LOCAL period AS SINGLE LOCAL onpart AS SINGLE LOCAL offpart AS SINGLE IF ISFALSE Task(%Korn_Test).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" ' rescaled in proc. TaskParamLabels(1) = "Velo" ' drive volume 0-127 - velocity byte TaskParamLabels(3) = "Stac" ' staccato - legato up down ' UD0 TaskParamLabels(4) = "Note" ' pitch ' UD1 TaskParamLabels(2) = "Bend" ' pitch-bend value 'SL2 - was UD2 IF ISFALSE Task(%Korn_Test).hParam THEN MakeTaskParameterDialog %Korn_Test,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Test).SliderNumbers(0) Slider(slnr).minval =1 ' tempo Slider(slnr).maxval = 127 Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+2).value = 64 Slider(slnr+2).minval = 0 Slider(slnr+2).maxval = 127 SendMessage Slider(slnr + 2).h, %TBM_SETPOS, %True, SlideR(slnr + 2).value END IF IF udnr = %False THEN udnr = TaskEX(%Korn_Test).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_UD0) ' staccato - legato updown UDctrl(udnr).value = 50 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 100 UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(Korn_UD1) ' pitch up down (note) UDctrl(udnr+1).value = Korn.lowtes UDctrl(udnr+1).minval = Korn.lowtes UDctrl(udnr+1).maxval = Korn.Hightes ' UDctrl(udnr+2).cptr = CODEPTR(Korn_UD2) ' pitchbend value ' UDctrl(udnr+2).value = 64 ' UDctrl(udnr+2).minval = 0 ' UDctrl(udnr+2).maxval = 127 resetval = 64 END IF Task(%Korn_Test).tog = %True END IF period = 1! / (Slider(slnr).value / 10!) ' tempo Task(%Korn_Test).tempo = 60 / period ' on-off periods: onpart = period * (UDctrl(udnr).value / 100!) ' 0 - 100 offpart = period - onpart ' 100 - 0 IF UDctrl(udnr).value < 1 THEN ' silence IF oldnote THEN NoteOff Korn.channel, oldnote oldnote = %False END IF offFreq = 1! / period Task(%Korn_Test).freq = OffFreq EXIT SUB ELSE onfreq = 1!/onpart END IF IF UDctrl(udnr).value > 99 THEN ' legato, no note offs oldnote = %False ELSE offFreq = 1! /Offpart END IF IF oldnote THEN NoteOff Korn.channel, oldnote Task(%Korn_Test).freq = OffFreq oldnote = %False ELSE noot = UDctrl(udnr+1).value velo = Slider(slnr+1).value ' IF BIT(Korn.ctrl(13), 2) THEN Controller Korn.channel, 13, Korn.ctrl(13) Play Korn.channel, noot, velo Bend Korn.channel, 0, Slider(slnr + 2).value 'UDctrl(udnr+2).value Task(%Korn_Test).freq = OnFreq oldnote = noot END IF IF Task(%Korn_Test).freq < 0.2 THEN Task(%Korn_Test).freq = 0.2 END SUB SUB Korn_UD0 () ' callback on parameter UpDowns. : on/off proportion LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 99 THEN UDctrl(udnr).value = 100 : value = 100 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 16, "L=" & STR$(value) END SUB SUB Korn_UD1 () ' controls the notes to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 17, "N=" & STR$(noot) END SUB SUB Korn_UD2 () ' ' pitchbend UD - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_Test).UpDownNumbers(2) value = UDCtrl(udnr).value IF value > 127 THEN value = 127 IF value < 0 THEN value = 0 SetDlgItemText Task(%Korn_Test).hparam, %GMT_TEXT0_ID + 18, "b=" & STR$(value) ' sending is in the main task. END SUB SUB Korn_Calls () STATIC tc AS CUR STATIC note AS CUR STATIC cnt AS LONG STATIC oldnote AS CUR STATIC rest AS LONG LOCAL f AS CUR LOCAL harnr AS INTEGER LOCAL velo AS BYTE ' demo stukje gwr - this plays in just intonation harmonic overtones. (religious version) ' first rough sketch... IF ISFALSE Task(%Korn_Calls).tog THEN tc = 58 ' start on Bb cnt = 0 Task(%Korn_Calls).tog = %True END IF IF rest = 2 THEN Task(%Korn_Calls).freq = 1 rest = 1 EXIT SUB END IF IF rest = 1 THEN IF FRAC(oldnote) <= 0.5 THEN Play Korn.channel, FIX(oldnote),velo '- (harnr * 2) Bend Korn.channel, 0, 63 + (FRAC(oldnote) * 128) ELSE Play Korn.channel, FIX(oldnote+1), velo Bend Korn.channel, 0, (1 - FRAC(oldnote)) *128 ' checked 24.11.2008 END IF rest = 0 Task(%Korn_Calls).freq = 2 EXIT SUB END IF velo = 100 harnr = RND(1) * 12 f = NF2F(tc) * harnr note = F2NF(f) IF note >= Korn.hightes + 1 THEN note = note - 12 IF note = oldnote THEN rest = 2 EXIT SUB ELSE IF FRAC(note) <= 0.5 THEN Play Korn.channel, FIX(note), velo Bend Korn.channel, 0, 63 + (FRAC(note) * 128) ELSE Play Korn.channel, FIX(note + 1), velo Bend Korn.channel, 0, (1-FRAC(note)) * 128 END IF ' following was wrong: 'Play Korn.channel, FIX(note),velo - (harnr * 2) 'Bend Korn.channel, 0, 64 + ((FRAC(note) - 0.5) * 127) rest = %False END IF INCR cnt IF ISFALSE cnt MOD 24 THEN f = NF2F(tc) f = f * 3!/2! tc = F2NF(f) IF tc > 63 THEN tc = tc - 12 END IF Task(%Korn_Calls).freq = 4 oldnote = note END SUB FUNCTION Korn_MotPosCal () AS LONG ' called on the one shot cockpit button nr. 12 ' ctrl 70 implemented but not functioning correctly. ' For horizontal calibration move the motor fully CW (ctrl21=0) and then fully CCW (ctrl21=127). Controller Korn.channel, 70, 64 ' SLEEP 10 ' Controller Korn.channel, 70, %False ' maybe not required. It should be a one shot in the ' firmware as well. END FUNCTION SUB Korn_Moves () STATIC h AS LONG STATIC v AS LONG STATIC hs AS LONG STATIC vs AS LONG STATIC slnr AS DWORD STATIC cnt AS DWORD STATIC stepsize AS LONG IF ISFALSE task(%Korn_Moves).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "v-hor" TaskParamLabels(1) = "v-ver" IF ISFALSE Task(%Korn_Moves).hParam THEN MakeTaskParameterDialog %Korn_Moves,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Korn_Moves).SliderNumbers(0) Slider(slnr).minval = 2 ' hor tempo Slider(slnr).maxval = 127 Slider(slnr).value = 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).minval = 2 ' ver tempo Slider(slnr+1).maxval = 127 Slider(slnr+1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF h = 64 v = 82 stepsize = 4 hs = stepsize '1 vs = stepsize '1 cnt = %False Task(%Korn_Moves).tog = %True END IF IF ISFALSE cnt MOD (128 - Slider(slnr).value) THEN h = h + hs END IF IF h > 127 THEN h = 127 IF h < 0 THEN h = 0 IF ISFALSE cnt MOD (128 - Slider(slnr+1).value) THEN v = v + vs END IF IF v > 127 THEN v = 127 IF v < 0 THEN v = 0 IF h <> Korn.ctrl(21) THEN Controller Korn.channel, 21, h Korn.ctrl(21) = h END IF IF v <> Korn.ctrl(22) THEN Controller Korn.channel, 22, v Korn.ctrl(22) = v END IF IF h => 127 THEN hs = - stepsize END IF IF h <= 0 THEN hs = stepsize END IF IF v >= 127 THEN vs = -stepsize END IF IF v <= 0 THEN vs = stepsize END IF INCR cnt Task(%Korn_Moves).freq = 8 END SUB SUB Korn_13 () LOCAL i AS DWORD STATIC onoff AS DWORD STATIC cnt AS LONG STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC udnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Korn_13).tog THEN IF ISFALSE Task(%Korn_13).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="bits345" TaskParamLabels(1)="012" MakeTaskParameterDialog %Korn_13,1, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Korn_13).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value IF udnr = %False THEN udnr = TaskEX(%Korn_13).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Korn_13_UD0) ' step size UDctrl(udnr).value = 0 UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 4 UDctrl(udnr).stap = 1 END IF END IF Task(%Korn_13).tog = %True END IF n = slider(slnr).value \ 16 ' 0-7 - 3 bits for the valves IF UDctrl(udnr).value = 4 THEN n = n * 8 ' bits 3,4,5 for the valves n = n + 4 ' set bit 2, bit 0 and 1 must be 0 ELSE n = MIN(UDctrl(udnr).value, 3) ' set bits 0 and 1 END IF IF Korn.ctrl(13) <> n THEN Controller Korn.channel, 13, n Korn.ctrl(13) = n END IF Task(%Korn_13).freq = 20 END SUB SUB Korn_13_UD0 () ' callback on parameter UpDowns lowest 2 bits LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Korn_13).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 4 THEN UDctrl(udnr).value = 4 : value = 4 IF value < 0 THEN UDCTRL(udnr).value = 0 : value = 0 SetDlgItemText Task(%Korn_13).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Brass_Calls () ' stukje in just intonation voor koperkwartet: Korn, Heli, Bono, So STATIC tc AS CUR STATIC cnt AS LONG STATIC rest AS LONG DIM n(0 TO 3) AS STATIC CUR ' korn, bono, Heli, So DIM oldn(0 TO 3) AS STATIC CUR DIM v(0 TO 3) AS STATIC BYTE LOCAL f AS CUR LOCAL harnr AS INTEGER LOCAL tst AS INTEGER STATIC einde AS LONG STATIC unisons AS LONG STATIC slnr AS LONG ' demo stukje gwr - this plays in just intonation harmonic overtones. (religious version) ' first rough sketch... IF ISFALSE Task(%Brass_Calls).tog THEN IF ISFALSE Task(%Brass_Calls).hParam THEN DIM TaskParamLabels(4) AS LOCAL ASCIIZ * 8 TaskParamLabels(0)="korn" TaskParamLabels(1)="bono" TaskParamLabels(2)="heli" TaskParamLabels(3)= "so" TaskParamLabels(4) = "tempo" MakeTaskParameterDialog %Brass_Calls,5, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Brass_Calls).SliderNumbers(0) Slider(slnr).value = 120 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value Slider(slnr+3).value = 48 SendMessage Slider(Slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value Slider(slnr+4).value = 64 Sendmessage Slider(slnr+4).h, %TBM_SETPOS, %True, Slider(slnr+4).value END IF SetDlgItemText gh.Cockpit, %GMT_LABEL_MSG1, "Tonal Center" ' bovenste text-box SetDlgItemText gh.Cockpit, %GMT_LABEL_MSG2, "Counter" ' onderste text-box tc = 22 ' start on Bb cnt = 0 einde = %False Task(%Brass_Calls).tog = %True END IF IF einde THEN stoptask %Brass_Calls IF rest = 2 THEN Task(%Brass_Calls).freq = Slider(slnr+4).value / 64 oldn(0) = %False rest = 1 EXIT SUB END IF IF rest = 3 THEN Task(%Brass_Calls).freq = Slider(slnr+4).value / 48 oldn(3) = %False rest = 1 EXIT SUB END IF IF rest = 1 THEN ' nootherhalingen IF oldn(0) THEN IF FRAC(oldn(0)) <= 0.5 THEN Play Korn.channel, FIX(oldn(0)),v(0) '- (harnr * 2) Bend Korn.channel, 0, 63 + (FRAC(oldn(0)) * 128) ELSE Play Korn.channel, FIX(oldn(0)+1), v(0) Bend Korn.channel, 0, (1 - FRAC(oldn(0))) *128 ' checked 24.11.2008 END IF ELSE NoteOff Korn.channel, n(0) END IF IF oldn(1) THEN IF FRAC(oldn(1)) <= 0.5 THEN Play Bono.channel, FIX(oldn(1)),v(1) '- (harnr * 2) Bend Bono.channel, 0, 63 + (FRAC(oldn(1)) * 128) ELSE Play Bono.channel, FIX(oldn(1)+1), v(1) Bend Bono.channel, 0, (1 - FRAC(oldn(1))) *128 END IF ELSE Noteoff Bono.channel, n(1) END IF IF oldn(2) THEN IF FRAC(oldn(2)) <= 0.5 THEN Play Heli.channel, FIX(oldn(2)),v(2) '- (harnr * 2) Bend Heli.channel, 0, 63 + (FRAC(oldn(2)) * 128) ELSE Play Heli.channel, FIX(oldn(2)+1), v(2) Bend Heli.channel, 0, (1 - FRAC(oldn(2))) *128 END IF ELSE Noteoff Heli.channel, n(2) END IF IF oldn(3) THEN IF FRAC(oldn(3)) <= 0.5 THEN Play So.channel, FIX(oldn(3)),v(3) '- (harnr * 2) Bend So.channel, 0, 63 + (FRAC(oldn(3)) * 128) ELSE Play So.channel, FIX(oldn(3)+1), v(3) Bend So.channel, 0, (1 - FRAC(oldn(3))) *128 END IF ELSE NoteOff So.channel, n(3) END IF rest = 0 Task(%Korn_Calls).freq = Slider(slnr+4).value / 32 EXIT SUB END IF v(0) = Slider(slnr).value v(1) = Slider(slnr+1).value v(2) = Slider(slnr+2).value v(3) = Slider(slnr+3).value tst = %False DO harnr = RND(1) * 48 ' integer f = NF2F(tc) * harnr n(0) = F2NF(f) IF (n(0) >= 58) AND (n(0) <= 96) THEN IF oldn(0) THEN 'IF ABS(n(0) - oldn(0)) < 8 THEN tst = %True ' grote intervalsprongen vermijden: SELECT CASE ABS(n(0) - oldn(0) CASE =< 3 tst = %True CASE 7, 12 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True tst = %False DO harnr = RND(1) * 36 f = NF2F(tc) * harnr n(1) = F2NF(f) IF (n(1) >= 34) AND (n(1) <= 88) THEN IF oldn(1) THEN 'IF ABS(n(1) - oldn(1)) < 8 THEN tst = %True SELECT CASE ABS(n(1) - oldn(1)) CASE =< 3 tst = %True CASE 6.98 TO 7.02 tst = %True CASE 12 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True '(n(1) >= 34) AND n(1) <= 83 tst = %False DO harnr = RND(1) * 28 ' integer f = NF2F(tc) * harnr n(2) = F2NF(f) IF (n(2) >= 22) AND (n(2) <= 75) THEN IF oldn(2) THEN 'IF ABS(n(2) - oldn(2)) < 8 THEN tst = %True SELECT CASE ABS(n(2) - oldn(2)) CASE =< 4 tst = %True CASE 6.98 TO 7.02 tst = %True CASE 12 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True '(n(2) >= 22) AND n(2) <= 75 tst = %False DO harnr = RND(1) * 24 f = NF2F(tc) * harnr n(3) = F2NF(f) IF (n(3) >= 12) AND (n(3) <= 39) THEN IF oldn(3) THEN 'IF ABS(n(3) - oldn(3)) =< 12 THEN tst = %True SELECT CASE ABS(n(3) - oldn(3)) CASE <=12 tst = %TRue CASE 18.95 TO 19.05 tst = %True END SELECT ELSE tst = %True END IF END IF LOOP UNTIL tst = %True '(n(3) > = 12) AND (n(3) <= 47) unisons = %False IF ABS((n(0) MOD 12) - (n(1) MOD 12)) < 0.02 THEN INCR unisons IF ABS((n(0) MOD 12) - (n(2) MOD 12)) < 0.02 THEN INCR unisons IF ABS((n(0) MOD 12) - (n(3) MOD 12)) < 0.02 THEN INCR unisons IF ABS((n(1) MOD 12) - (n(2) MOD 12)) < 0.02 THEN INCR unisons IF ABS((n(1) MOD 12) - (n(3) MOD 12)) < 0.02 THEN INCR unisons IF ABS((n(2) MOD 12) - (n(3) MOD 12)) < 0.02 THEN INCR unisons IF unisons => 4 THEN einde = %True END IF IF (n(0) = oldn(0)) THEN rest = 2 EXIT SUB ' causes a repeat - same note in Korn END IF IF n(3) = oldn(3) THEN IF RND(1) < 0.5 THEN ' thinning rest = 3 ' causes a repeat - same note in So EXIT SUB END IF END IF IF FRAC(n(0)) <= 0.5 THEN Play Korn.channel, FIX(n(0)), v(0) Bend Korn.channel, 0, 63 + (FRAC(n(0)) * 128) ELSE Play Korn.channel, FIX(n(0) + 1), v(0) Bend Korn.channel, 0, (1-FRAC(n(0))) * 128 END IF IF FRAC(n(1)) <= 0.5 THEN Play Bono.channel, FIX(n(1)), v(1) Bend Bono.channel, 0, 63 + (FRAC(n(1)) * 128) ELSE Play Bono.channel, FIX(n(1) + 1), v(1) Bend Bono.channel, 0, (1-FRAC(n(1))) * 128 END IF IF FRAC(n(2)) <= 0.5 THEN Play Heli.channel, FIX(n(2)), v(2) Bend Heli.channel, 0, 63 + (FRAC(n(2)) * 128) ELSE Play Heli.channel, FIX(n(2) + 1), v(2) Bend Heli.channel, 0, (1-FRAC(n(2))) * 128 END IF IF FRAC(n(3)) <= 0.5 THEN Play So.channel, FIX(n(3)), v(3) Bend So.channel, 0, 63 + (FRAC(n(3)) * 128) ELSE Play So.channel, FIX(n(3) + 1), v(3) Bend So.channel, 0, (1-FRAC(n(3))) * 128 END IF rest = %False IF einde = %TRue THEN EXIT SUB INCR cnt IF ISFALSE cnt MOD 24 THEN f = NF2F(tc) f = f * 3!/2! tc = F2NF(f) IF tc > 34 THEN tc = tc - 12 ' note that tc is also fractional!!! IF FRAC(tc) <= 0.5 THEN Play So.channel, FIX(tc), 80 Bend So.channel, 0, 63 + (FRAC(tc) * 128) ELSE Play So.channel, FIX(tc + 1), 80 Bend So.channel, 0, (1-FRAC(tc)) * 128 END IF ELSE SELECT CASE unisons CASE 0 Task(%Brass_Calls).freq = Slider(slnr+4).value / 8 CASE 1 Task(%Brass_Calls).freq = Slider(slnr+4).value / 12 CASE 2 Task(%Brass_Calls).freq = Slider(slnr+4).value / 16 CASE 3 Task(%Brass_Calls).freq = Slider(slnr+4).value / 24 END SELECT END IF oldn(0) = n(0) oldn(1) = n(1) oldn(2) = n(2) oldn(3) = n(3) SetDlgItemText gh.Cockpit, %GMT_MSG1, STR$(tc) ' bovenste text-box SetDlgItemText gh.Cockpit, %GMT_MSG2, STR$(cnt) ' onderste text-box END SUB SUB Brass_Calls_Start () MM_Korn_On Controller Korn.channel, 17, 87 Controller Korn.channel, 18, 105 MM_Bono_On Controller Bono.channel, 17, 64 Controller Bono.channel, 18, 105 Controller Bono.channel, 19, 107 MM_Heli_On MM_So_On Controller So.channel, 1, 17 ' wind Controller So.channel, 7, 120 ' volume Controller So.channel, 18, 127 ' attack MM_So_On %MM_Red OR %MM_White MM_Heli_On %MM_White Controller Heli.channel, 7, 18 ' optor Controller Heli.channel, 17, 64 ' volume Controller Heli.channel, 18, 100 ' attack Controller Heli.channel, 19, 112 ' release MM_Korn_On %MM_Blue 'MM_Bono_On %MM_Yellow - still needs bug fix!!! Play So.channel, 22, 100 SLEEP 1000 END SUB SUB Brass_Calls_Stop () SLEEP 3000 MM_Korn_Off MM_Heli_Off SLEEP 10 MM_So_Off MM_Bono_Off END SUB SUB Korn_Fingerings () STATIC hw AS LONG IF ISFALSE hw THEN DIALOG NEW 0, "fingerings", ,,100, 50 TO hw CONTROL ADD LABEL, hw, 1, "valves", 1, 1, 89, 12 CONTROL ADD CHECKBOX, hw, 2, "1", 10, 14, 12, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 3, "2", 24, 14, 12, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 4, "3", 38, 14, 12, 12, %BS_PUSHLIKE DIALOG SHOW MODELESS hw, CALL CB_Korn_Fingerings END IF END SUB CALLBACK FUNCTION CB_Korn_Fingerings LOCAL i AS LONG LOCAL cc AS BYTE IF CBMSG <> %WM_COMMAND THEN EXIT FUNCTION IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION cc = &B100 CONTROL GET CHECK CBHNDL, 2 TO i IF i THEN BIT SET cc, 3 CONTROL GET CHECK CBHNDL, 3 TO i IF i THEN BIT SET cc, 4 CONTROL GET CHECK CBHNDL, 4 TO i IF i THEN BIT SET cc, 5 CONTROL SET TEXT gh.cockpit, %GMT_Msg1, BIN$(cc) Controller Korn.channel, 13, cc END FUNCTION