' *************************************************************** ' * test and debug code for midi controlled robots and automats * ' * * ' * an automated rotary valve trombone * ' *************************************************************** ' 19.08.2007: creation date of this module ' find and replaced copy of so code. not checked as yet. ' 27.11.2007: further development... ' 03.12.2007: PIC1 and PIC2 programmed. ' controller 17 implemented in this test code. ' 08.12.2007: debug session on bono ' 09.12.2007: further tests and debug ' most sliders now work with callbacks ' so they also work when the task is off. ' 22.12.2007: new debug session ' 24.01.2008: code added and included here ' 01.11.2008: upgraded. New sound driver. No more motor. '#INCLUDE "C:\b\pb\gmt\robots\korn\korn.inc" - no longer. ' 08.11.2008: Calls for Bono added. Demo, derived from Korn code. ' 11.11.2008: Bono dsPIC firmware upgraded. Ctrl 19. added. ' 24.11.2008: quartertone test added. ' 20.09.2010: New firmware written for midihub PIC, 18F2525. ' Lite bugs should be solved now. ' 22.09.2010: debug code added for valve pic %Bono_Test = 48 ' demo en test kode voor %Bono_Scale = 50 %Bono_Qscale = 51 ' quartertone scale test %Bono_Lites = 53 %Bono_Lite120 = 54 %Bono_Lite121 = 55 %Bono_Lite122 = 56 %Bono_Lite123 = 57 %Bono_Lite124 = 58 %Bono_Lite125 = 59 ' to do: (evt. Xtof) %Bono_Valve_Sx = 61 ' sys-ex tests - valve lookup tables - pin 'bova' '%Bono_Wind_Sx = 62 ' sys-ex tests - wind control tables - pin 'bowi' no longer needed. %Bono_ds_Sx = 63 ' moving coil driver tables - pin 'bods', no longer needed. ' pic 1 %Bono_Motor = 32 ' ctrl 1 en ctrl 66 ' pic 2 - valve pic %Bono_Lookup = 35 ' ctrl 13 ' to do - valves %Bono_25 = 36 ' ctrl 25 ' implemented instead of 14 'for debug of PIC2: Valve control - 22.09.2010 %Bono_V0 = 17 %Bono_V1 = 18 %Bono_V2 = 19 %Bono_V3 = 20 %Bono_C13 = 21 %Bono_OS = 22 ' pic 3 - dspic %Bono_7 = 39 ' ctrl 7 ' optor volume %Bono_17 = 40 ' ctrl 17 ' attack amplitude %Bono_18 = 41 ' ctrl 18 ' attack time %Bono_19 = 42 ' ctrl 19 ' release time %Bono_20 = 43 ' ctrl 20 ' main tuning to diapason %Bono_f1 = 44 ' ctrl 21 %Bono_f2 = 45 ' ctrl 22 %Bono_Tremolo = 46 ' tremolo met ctrl 7 %Bono_Vibrato = 47 ' pitch bend is implemented! %Bono_Calls = 63 ' demo piece in just intonation. 'GLOBAL Bono as musician done in g_mm.inc 'procedure declarations: DECLARE SUB Bono_Motor () ' ctrl 1 & 66 DECLARE SUB Bono_SLwind () ' slider callback DECLARE SUB Bono_OnOff () ' ud callback DECLARE SUB Bono_Test () DECLARE SUB Bono_UD0 () DECLARE SUB Bono_UD1 () DECLARE SUB Bono_UD2 () DECLARE SUB Bono_UD3 () DECLARE SUB Bono_Scale () DECLARE SUB Bono_Scale_UD0 () DECLARE SUB Bono_Scale_UD1 () DECLARE SUB Bono_Scale_UD2 () DECLARE SUB Bono_Qscale () DECLARE SUB Bono_Lites () DECLARE SUB Bono_Lite120 () DECLARE SUB Bono_lite121 () DECLARE SUB Bono_Lite122 () DECLARE SUB Bono_Lite123 () DECLARE SUB Bono_Lite124 () DECLARE SUB Bono_Lite125 () ' controllers: DECLARE SUB Bono_7 () DECLARE SUB Bono_SL7 () DECLARE SUB Bono_17 () DECLARE SUB Bono_SL17 () DECLARE SUB Bono_18 () DECLARE SUB Bono_SL18 () DECLARE SUB Bono_19 () DECLARE SUB Bono_SL19 () DECLARE SUB Bono_Lookup_Ctrl () DECLARE SUB Bono_20 () ' tuning DECLARE SUB Bono_SL20 () DECLARE SUB Bono_Tremolo () DECLARE SUB Bono_Vibrato () DECLARE SUB Bono_Valves DECLARE CALLBACK FUNCTION Bono_Valves_cb DECLARE SUB Bono_25 () DECLARE FUNCTION Bono_Valve_Sysx AS LONG DECLARE FUNCTION Bono_Wind_Sysx AS LONG DECLARE FUNCTION Init_Bono () AS LONG DECLARE SUB Bono_V0() DECLARE SUB Bono_V1() DECLARE SUB Bono_V2() DECLARE SUB Bono_V3() DECLARE SUB Bono_C13 () DECLARE SUB Bono_OS () DECLARE SUB Bono_Calls () DECLARE SUB Bono_Fingerings DECLARE CALLBACK FUNCTION CB_Bono_Fingerings ' code starts here: ------------------------------------------------------------ FUNCTION Init_Bono () AS LONG LOCAL retval AS LONG ' GetInstrumentParams Bono, %IDM_Bono ' retval = SetRobotPort (Bono, Inifilename, hMidiO()) Task(%Bono_Motor).naam = "Motor" Task(%Bono_Motor).cptr = CODEPTR(Bono_Motor) Task(%Bono_Motor).flags = %False Task(%Bono_Motor).freq = 10 Task(%Bono_Test).naam = "" Task(%Bono_Test).cptr = CODEPTR(Bono_Test) Task(%Bono_Test).freq = 2 Task(%Bono_Test).flags = %False ' TaskEx(%Bono_test).stopcptr = CODEPTR(MM_Bono_Off) 'TaskEx(%Bono_test).startcptr = CODEPTR(MM_Bono_On) Task(%Bono_Scale).naam = "Scale" Task(%Bono_Scale).cptr = CODEPTR(Bono_Scale) Task(%Bono_Scale).freq = 2 Task(%Bono_Scale).flags = %False Task(%Bono_QScale).naam = "QScale" Task(%Bono_QScale).cptr = CODEPTR(Bono_QScale) Task(%Bono_QScale).freq = 2 Task(%Bono_QScale).flags = %False Task(%Bono_Lites).naam = "lites" Task(%Bono_Lites).cptr = CODEPTR(Bono_Lites) Task(%Bono_Lites).freq = 3 Task(%Bono_Lites).flags = %False Task(%Bono_Lite120).naam = "lite120" 'was 84 Task(%Bono_Lite120).cptr = CODEPTR(Bono_Lite120) Task(%Bono_Lite120).freq = 3.1 Task(%Bono_Lite120).flags = %False Task(%Bono_Lite121).naam = "lite121" Task(%Bono_Lite121).cptr = CODEPTR(Bono_Lite121) Task(%Bono_Lite121).freq = 3.2 Task(%Bono_Lite121).flags = %False Task(%Bono_Lite122).naam = "lite122" Task(%Bono_Lite122).cptr = CODEPTR(Bono_Lite122) Task(%Bono_Lite122).freq = 3.3 Task(%Bono_Lite122).flags = %False Task(%Bono_Lite123).naam = "lite123" Task(%Bono_Lite123).cptr = CODEPTR(Bono_Lite123) Task(%Bono_Lite123).freq = 3.4 Task(%Bono_Lite123).flags = %False Task(%Bono_Lite124).naam = "lite124" Task(%Bono_Lite124).cptr = CODEPTR(Bono_Lite124) Task(%Bono_Lite124).freq = 3.5 Task(%Bono_Lite124).flags = %False Task(%Bono_Lite125).naam = "lite125" Task(%Bono_Lite125).cptr = CODEPTR(Bono_Lite125) Task(%Bono_Lite125).freq = 3.6 Task(%Bono_Lite125).flags = %False Task(%Bono_17).naam = "Aa_C17" Task(%Bono_17).cptr = CODEPTR(Bono_17) Task(%Bono_17).freq = 10 Task(%Bono_17).flags = %False Task(%Bono_7).naam = "Vol_C7" Task(%Bono_7).cptr = CODEPTR(Bono_7) Task(%Bono_7).freq = 10 Task(%Bono_7).flags = %False Task(%Bono_tremolo).naam = "Tremolo" Task(%Bono_tremolo).cptr = CODEPTR(Bono_Tremolo) Task(%Bono_tremolo).freq = 16 Task(%Bono_tremolo).flags = %False Task(%Bono_18).naam = "At_C18" Task(%Bono_18).cptr = CODEPTR(Bono_18) Task(%Bono_18).freq = 10 Task(%Bono_18).flags = %False Task(%Bono_19).naam = "Re_C19" Task(%Bono_19).cptr = CODEPTR(Bono_19) Task(%Bono_19).freq = 10 Task(%Bono_19).flags = %False Task(%Bono_20).naam = "Tun_C20" Task(%Bono_20).cptr = CODEPTR(Bono_20) Task(%Bono_20).freq = 10 Task(%Bono_20).flags = %False Task(%Bono_f1).naam = "f1" Task(%Bono_f1).cptr = CODEPTR(Bono_f1) ' ctrl 21 Task(%Bono_f1).freq = 10 Task(%Bono_f1).flags = %False Task(%Bono_f2).naam = "f2" Task(%Bono_f2).cptr = CODEPTR(Bono_f2) ' ctrl 22 Task(%Bono_f2).freq = 10 Task(%Bono_f2).flags = %False Task(%Bono_Valve_sx).naam = "ValveSysx" Task(%Bono_Valve_sx).freq = .33 Task(%Bono_Valve_sx).cptr = CODEPTR(Bono_Valve_Sysx) 'in m_robots.inc Task(%Bono_25).naam = "Valv_C25" Task(%Bono_25).freq = 8 Task(%Bono_25).cptr = CODEPTR(Bono_25) Task(%Bono_vibrato).naam = "Vibrato" Task(%Bono_vibrato).freq = 12 Task(%Bono_vibrato).cptr = CODEPTR(Bono_Vibrato) Task(%Bono_Calls).naam = "Bo_Calls" Task(%Bono_Calls).freq = 24 Task(%Bono_Calls).cptr = CODEPTR(Bono_Calls) Task(%Bono_V0).naam = "Bono_V0" Task(%Bono_V0).freq = 1 Task(%Bono_V0).cptr = CODEPTR(Bono_V0) Task(%Bono_V1).naam = "Bono_V1" Task(%Bono_V1).freq = 1 Task(%Bono_V1).cptr = CODEPTR(Bono_V1) Task(%Bono_V2).naam = "Bono_V2" Task(%Bono_V2).freq = 1 Task(%Bono_V2).cptr = CODEPTR(Bono_V2) Task(%Bono_V3).naam = "Bono_V3" Task(%Bono_V3).freq = 1 Task(%Bono_V3).cptr = CODEPTR(Bono_V3) Task(%Bono_C13).naam = "Bono_13" Task(%Bono_C13).freq = 1 Task(%Bono_C13).cptr = CODEPTR(Bono_C13) Task(%Bono_OS).naam = "Bono_OS" Task(%Bono_OS).freq = 1 Task(%Bono_OS).cptr = CODEPTR(Bono_OS) ButnOS(2).tag = "Bono Off" ButnOS(2).cptr = CODEPTR(MM_Bono_Off) ButnSw(7).tag0 = "Valves" ButnSw(7).tag1 = "Valves" ButnSw(7).cptr = CODEPTR(Bono_Valves) 'ProgChange Bono.channel, 127 ' expert mode, for research and development. FUNCTION = %True END FUNCTION SUB Bono_Motor () 'motor now removed STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC wind AS BYTE STATIC motor AS LONG IF ISFALSE Task(%Bono_Motor).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Wind" ' wind pressure 0-127 - controller 1 TaskParamLabels(1) = "C66" ' on/off controller IF ISFALSE Task(%Bono_Motor).hParam THEN MakeTaskParameterDialog %Bono_Motor,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bono_Motor).SliderNumbers(0) Slider(slnr).minval = 0 ' tempo Slider(slnr).maxval = 127 Slider(slnr).cptr = CODEPTR(Bono_SLwind) Slider(slnr).minval = 0 Slider(slnr).maxval = 127 Slider(slnr).value = 64 Bono.ctrl(1) = 64 END IF Slider(slnr).value = Bono.ctrl(1) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value IF udnr = %False THEN udnr = TaskEX(%Bono_Motor).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bono_OnOff) ' ctrl 66 IF ISFALSE bono.ctrl(66) THEN UDctrl(udnr).value = %False ELSE UDctrl(udnr).value = %True END IF UDctrl(udnr).minval = 0 UDctrl(udnr).maxval = 1 UDctrl(udnr).stap = 1 END IF Task(%Bono_Motor).tog = %True END IF Task(%Bono_motor).freq = 4 ''stoptask %Bono_Motor END SUB SUB Bono_OnOff () ' controller 66 ' callback on parameter UpDowns. : on/off switch ' will also work when the task is off LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_Motor).UpdownNumbers(0) value = UDCtrl(udnr).value IF value >= 1 THEN UDctrl(udnr).value = 1 : value = 1 IF value <= 0 THEN UDCTRL(udnr).value = 0 : value = 0 Controller Bono.channel, 66, 127 * value ''value * 64 Bono.ctrl(66) = value * 127 SetDlgItemText Task(%Bono_Motor).hparam, %GMT_TEXT0_ID + 16, "66=" & STR$(value) END SUB SUB Bono_SLwind () ' controller 1 ' this slider will work even if its task is off. ' note that it overrides program change settings !!! ' wind no longer implemented now!!! (01.11.2008) STATIC slnr AS DWORD slnr = TaskEX(%Bono_Motor).SliderNumbers(0) IF Slider(slnr).value <> Bono.ctrl(1) THEN ' send the appropriate midi controller... Bono.ctrl(1) = Slider(slnr).value ' 0-127 Controller Bono.channel, 1, Bono.Ctrl(1) END IF END SUB SUB Bono_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(%Bono_Test).tog THEN 'tasks that reset their sliders each time they get toggled off/on are very annoying!! - xof DIM TaskParamLabels(0 TO 5) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" ' rescaled in proc. TaskParamLabels(1) = "Velo" ' drive volume 0-127 - velocity byte TaskParamLabels(2) = "Stac" ' staccato - legato up down ' UD0 TaskParamLabels(3) = "Note" ' pitch ' UD1 TaskParamLabels(4) = "Bend" ' pitch-bend value ' UD2 TaskParamLabels(5) = "Prog" ' progchangfe ' UD3 IF ISFALSE Task(%Bono_Test).hParam THEN MakeTaskParameterDialog %Bono_Test,2,Slider(),4,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bono_Test).SliderNumbers(0) Slider(slnr).minval =1 ' tempo Slider(slnr).maxval = 127 END IF Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value IF udnr = %False THEN udnr = TaskEX(%Bono_Test).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bono_UD0) ' staccato - legato updown UDctrl(udnr).value = 50 UDctrl(udnr).minval = 0 '1 UDctrl(udnr).maxval = 100 '99 UDctrl(udnr).stap = 1 UDctrl(udnr+1).cptr = CODEPTR(Bono_UD1) ' pitch up down (note) UDctrl(udnr+1).value = 22 'Bono.lowtes UDctrl(udnr+1).minval = 0 'Bono.lowtes UDctrl(udnr+1).maxval = 96 'Bono.Hightes UDctrl(udnr+2).cptr = CODEPTR(Bono_UD2) ' pitchbend value UDctrl(udnr+2).value = 64 UDctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = 127 UDctrl(udnr+3).cptr = CODEPTR(Bono_UD3) ' progchange value UDctrl(udnr+3).value = 0 UDctrl(udnr+3).minval = 0 UDctrl(udnr+3).maxval = 3 resetval = 64 END IF Task(%Bono_Test).tog = %True END IF period = 1! / (Slider(slnr).value / 10!) ' tempo Task(%Bono_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 Bono.channel, oldnote oldnote = %False END IF offFreq = 1! / period 'OffPart Task(%Bono_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 Bono.channel, oldnote Task(%Bono_Test).freq = OffFreq oldnote = %False ELSE noot = UDctrl(udnr+1).value velo = Slider(slnr+1).value 'CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "velo:" + STR$(velo) + ", att:" + STR$(Bono.ctrl(18)) 'if fingerings are set with Bono.ctrl(13) we need to resend it for every single note, even if we repeat a note.. 'note: ctrl(13) can be set by the Bono_Valves_cb function PLAY Bono.channel, noot, velo 'ctl 13 lijkt niets te doen?? IF BIT(Bono.ctrl(13), 4) THEN Controller Bono.channel, 13, (Bono.ctrl(13) AND &B1111) :warning "send" + STR$(bono.ctrl(13) AND &B111) 'moet na de play instructie komen!! Bend Bono.channel, 0, UDctrl(udnr+2).value Task(%Bono_Test).freq = OnFreq oldnote = noot END IF IF Task(%Bono_Test).freq < 0.2 THEN Task(%Bono_Test).freq = 0.2 END SUB SUB Bono_valves () 'in current implementation, the valve settings are forgotten with each note off! 'this forces you to resend controllers for every note, even if you just want the same fingering.. 'Godfried: changing the valves with ctl 13 works also without playing a note! STATIC hw AS DWORD IF ISFALSE hw THEN DIALOG NEW 0, "valves control", , , 146, 40, %WS_BORDER OR %WS_CAPTION OR %WS_POPUP TO hw CONTROL ADD LABEL, hw, 1, "lookup:", 1, 1, 40, 12 'not working/relevant in current state.. CONTROL ADD CHECKBOX, hw, 10, "0", 42, 1, 20, 12, %BS_PUSHLIKE ' default empirical CONTROL ADD CHECKBOX, hw, 11, "1", 63, 1, 20, 12, %BS_PUSHLIKE ' acoustic CONTROL ADD CHECKBOX, hw, 12, "2", 84, 1, 20, 12, %BS_PUSHLIKE ' user table 1 CONTROL ADD CHECKBOX, hw, 13, "3", 105, 1, 20, 12, %BS_PUSHLIKE ' user table 2 CONTROL ADD LABEL, hw, 2, "valves:",1, 14, 40, 12 CONTROL ADD CHECKBOX, hw, 20, "-1", 63, 14, 20, 12, %BS_PUSHLIKE ' for trombone CONTROL ADD CHECKBOX, hw, 21, "-2", 84 , 14, 20, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 22, "-3", 42, 14, 20, 12, %BS_PUSHLIKE ' not same as CONTROL ADD CHECKBOX, hw, 23, "-5", 105, 14,20,12, %BS_PUSHLIKE ' control add checkbox, hw, 23, "-5", '--- series of mystical numbers... ' xtof: here we need one more checkbox for the fourth valve ( - 5) CONTROL ADD LABEL, hw, 30, "Ctrl(13): ?", 1, 27, 145, 12 DIALOG SHOW MODELESS hw, CALL Bono_Valves_cb ELSE DIALOG END hw END IF END SUB CALLBACK FUNCTION Bono_Valves_cb LOCAL i AS LONG LOCAL j AS LONG IF CBMSG <> %WM_COMMAND THEN EXIT FUNCTION IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION SELECT CASE CBCTL CASE 10 TO 13 FOR i = 10 TO 13 IF i = CBCTL THEN ITERATE FOR CONTROL SET CHECK CBHNDL, i, 0 NEXT FOR i = 20 TO 23 CONTROL SET CHECK CBHNDL, i, 0 NEXT Bono.ctrl(13) = 0 'CBCTL - 10 ' 0 - 3 CASE 20 TO 23 FOR i = 10 TO 13 CONTROL SET CHECK CBHNDL, i, 0 NEXT Bono.ctrl(13) = &B10000 'internal flag, telling repeatring task to use ctl13 for every note.. FOR i = 20 TO 23 CONTROL GET CHECK CBHNDL, i TO j BIT CALC Bono.ctrl(13), i - 20, j '20 was 17 NEXT CASE ELSE EXIT FUNCTION END SELECT Controller Bono.channel, 13, Bono.ctrl(13) CONTROL SET TEXT CBHNDL, 30, "Ctrl(13):" + STR$(Bono.ctrl(13)) + " (" + BIN$(Bono.ctrl(13)) + ")" END FUNCTION SUB Bono_UD0 () ' callback on parameter UpDowns. : on/off proportion LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_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(%Bono_Test).hparam, %GMT_TEXT0_ID + 16, "L=" & STR$(value) END SUB SUB Bono_UD1 () ' controls the notes to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_Test).UpDownNumbers(1) noot = UDCtrl(udnr).value SetDlgItemText Task(%Bono_Test).hparam, %GMT_TEXT0_ID + 17, "N=" & STR$(noot) END SUB SUB Bono_UD2 () ' ' pitchbend UD - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_Test).UpDownNumbers(2) value = UDCtrl(udnr).value IF value > 127 THEN value = 127 IF value < 0 THEN value = 0 SetDlgItemText Task(%Bono_Test).hparam, %GMT_TEXT0_ID + 18, "b=" & STR$(value) ' sending is in the main task. END SUB SUB Bono_UD3 () ' ' pitchbend UD - has to be send for each note!!! LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_Test).UpDownNumbers(3) value = UDCtrl(udnr).value IF value > 3 THEN value = 3 IF value < 0 THEN value = 0 SetDlgItemText Task(%Bono_Test).hparam, %GMT_TEXT0_ID + 19, "p=" & STR$(value) Progchange Bono.channel, value END SUB SUB Bono_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(%Bono_Scale).tog THEN IF ISFALSE Task(%Bono_Scale).hParam THEN DIM TaskParamLabels(4) TaskParamLabels(0)= "velo" TaskParamLabels(1)= "speed" TaskParamLabels(2)= "step" TaskParamLabels(3)= "hilim" TaskParamLabels(4)= "lowlim" MakeTaskParameterDialog %Bono_Scale,2, Slider(),3,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_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(%Bono_Scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bono_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(Bono_Scale_UD1) ' high note limit UDctrl(udnr+1).value = 60 UDctrl(udnr+1).minval = 22 ' Bono.lowtes '0 UDctrl(udnr+1).maxval = 96 'Bono.Hightes '72 UDctrl(udnr+2).cptr = CODEPTR(Bono_Scale_UD2) ' low note limit UDctrl(udnr+2).value = 12 UDctrl(udnr+2).minval = Bono.lowtes '0 UDctrl(udnr+2).maxval = 96 'Bono.Hightes '72 END IF END IF Task(%Bono_Scale).tog = %True cnt = 22 'Bono.Lowtes EXIT SUB END IF IF ISFALSE onoff THEN IF n THEN NoteOff Bono.channel, n n = %False onoff = %True ELSE n = cnt PLAY Bono.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(%Bono_Scale).freq = Slider(slnr+1).value / 16 END SUB SUB Bono_Scale_UD0 () ' callback on parameter UpDowns step size LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_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(%Bono_Scale).hparam, %GMT_TEXT0_ID + 16, "s=" & STR$(value) END SUB SUB Bono_Scale_UD1 () ' controls the high limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_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 > 96 THEN UDctrl(udnr).value = 96 : noot = 96 SetDlgItemText Task(%Bono_Scale).hparam, %GMT_TEXT0_ID + 17, "Hi=" & STR$(noot) END SUB SUB Bono_Scale_UD2 () ' controls the low limit of the note scale to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_Scale).UpDownNumbers(2) noot = UDCtrl(udnr).value IF noot < 0 THEN UDctrl(udnr).value = 0 : noot = 0 IF noot > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value : noot = UDctrl(udnr-1).value SetDlgItemText Task(%Bono_Scale).hparam, %GMT_TEXT0_ID + 18, "Lo=" & STR$(noot) END SUB SUB Bono_Lites () ' mapped on notes 120 - 127, vroeger: 84 - 88 (tot 2010) STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lites).tog THEN cnt = 120 Task(%Bono_Lites).tog = %true END IF NoteOff Bono.channel, cnt INCR cnt IF cnt > 127 THEN cnt = 120 PLAY Bono.channel, cnt, 127 END SUB SUB bono_lite120 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite120).tog THEN cnt = %False Task(%Bono_Lite120).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 120, 127 ELSE NoteOff Bono.channel, 120 END IF INCR cnt END SUB SUB Bono_lite121 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite121).tog THEN cnt = %False Task(%Bono_Lite121).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 121, 127 ELSE NoteOff Bono.channel, 121 END IF INCR cnt END SUB SUB Bono_lite122 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite122).tog THEN cnt = %False Task(%Bono_Lite122).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 122, 127 ELSE NoteOff Bono.channel, 122 END IF INCR cnt END SUB SUB Bono_lite123 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite123).tog THEN cnt = %False Task(%Bono_Lite123).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 123, 127 ELSE NoteOff Bono.channel, 123 END IF INCR cnt END SUB SUB Bono_lite124 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite124).tog THEN cnt = %False Task(%Bono_Lite124).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 124, 127 ELSE NoteOff Bono.channel, 124 END IF INCR cnt END SUB SUB Bono_lite125 () STATIC cnt AS DWORD IF ISFALSE Task(%Bono_Lite125).tog THEN cnt = %False Task(%Bono_Lite125).tog = %true END IF IF cnt MOD 2 THEN PLAY Bono.channel, 125, 127 ELSE NoteOff Bono.channel, 125 END IF INCR cnt END SUB SUB Bono_7 () ' controller 7 test - DS pic controlled. - this is the overall sound level ' controlled with PWM to the Optor circuit. ' This works differently than on ' It can be used for global crescendo and descrescendo playing, indepently from the ADSR controls. STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_7).tog THEN IF ISFALSE Task(%Bono_7).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="Cont 7" MakeTaskParameterDialog %Bono_7,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_7).SliderNumbers(0) Slider(slnr).value = 63 Slider(slnr).cptr = CODEPTR(Bono_SL7) ' works with callback, so also when the task is OFF SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_7).tog = %True END IF Task(%Bono_7).freq = 0.5 END SUB SUB Bono_SL7 () ' slider callback for volume slider task STATIC slnr AS DWORD slnr = TaskEX(%Bono_7).SliderNumbers(0) IF Slider(slnr).value <> Bono.ctrl(7) THEN ' send the appropriate midi controller... Bono.ctrl(7) = Slider(slnr).value ' 0-127 Controller Bono.channel, 7, Bono.Ctrl(7) END IF END SUB SUB Bono_Tremolo () ' tremolo test met controller 7 STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Bono_tremolo).tog THEN IF ISFALSE Task(%Bono_tremolo).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" ' max. level controlled with ctrl 7 task MakeTaskParameterDialog %Bono_tremolo,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_tremolo).SliderNumbers(0) Slider(slnr).value = 63 Task(%Bono_tremolo).freq = 64/4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 0 ' maximale modulatiediepte SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE Task(%Bono_7).hParam THEN starttask %Bono_7 ' we need this slider here!!! END IF cnt = %False Task(%Bono_tremolo).tog = %True END IF IF slider(slnr).value THEN Task(%Bono_tremolo).freq = slider(slnr).value / 4 ' max 32Hz IF ISFALSE cnt MOD 2 THEN Controller Bono.channel, 7, Bono.ctrl(7) ELSE Controller Bono.channel, 7, MIN(Bono.ctrl(7), Slider(slnr+1).value) END IF INCR cnt ELSE Controller Bono.channel, 7, Bono.ctrl(7) stoptask %Bono_tremolo EXIT SUB END IF END SUB SUB Bono_20 () ' implemented 11.08.2007 tuning to diapason. [quartertone up max. range] ' controller 20 ' checked o.k. gwr. 12.08.2007 (0n So) STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_20).tog THEN IF ISFALSE Task(%Bono_20).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="tune" MakeTaskParameterDialog %Bono_20,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_20).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Bono_SL20) Slider(slnr).value = Bono.ctrl(20) ' 0 = 440Hz SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_20).freq = 0.45 Task(%Bono_20).tog = %True END IF END SUB SUB Bono_SL20 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Bono_20).SliderNumbers(0) IF slider(slnr).value <> Bono.ctrl(20) THEN Bono.ctrl(20) = Slider(slnr).value Controller Bono.channel, 20, Bono.ctrl(20) END IF END SUB SUB Bono_17 () ' controller 17 test ' equivalent to what we did with ctrl 7 on . This controls the maximum amplitude of the attack STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_17).tog THEN IF ISFALSE Task(%Bono_17).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C17" MakeTaskParameterDialog %Bono_17,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_17).SliderNumbers(0) Slider(slnr).cptr = CODEPTR(Bono_SL17) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_17).freq = 10 Task(%Bono_17).tog = %TRue END IF Task(%Bono_17).freq = 0.5 END SUB SUB Bono_SL17 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Bono_17).SliderNumbers(0) IF slider(slnr).value <> Bono.ctrl(17) THEN Bono.ctrl(17) = Slider(slnr).value Controller Bono.channel, 17, Bono.ctrl(17) END IF END SUB SUB Bono_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(%Bono_18).tog THEN IF ISFALSE Task(%Bono_18).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C18" MakeTaskParameterDialog %Bono_18,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_18).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Bono_sl18) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_18).freq = 0.4 Task(%Bono_18).tog = %TRue END IF END SUB SUB Bono_SL18 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Bono_18).SliderNumbers(0) IF slider(slnr).value <> Bono.ctrl(18) THEN Bono.ctrl(18) = Slider(slnr).value Controller Bono.channel, 18, Bono.ctrl(18) END IF END SUB SUB Bono_19 () ' controller 19 test - this sets the duration of the release sound ' ds pic board. Implemented 11.11.2008 on dsPIC STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_19).tog THEN IF ISFALSE Task(%Bono_19).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="C19" MakeTaskParameterDialog %Bono_19,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_19).SliderNumbers(0) slider(slnr).cptr = CODEPTR(Bono_sl19) Slider(slnr).value = 100 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_19).freq = 0.4 Task(%Bono_19).tog = %TRue END IF END SUB SUB Bono_SL19 () ' slider callback STATIC slnr AS DWORD slnr = TaskEX(%Bono_19).SliderNumbers(0) IF slider(slnr).value <> Bono.ctrl(19) THEN Bono.ctrl(19) = Slider(slnr).value Controller Bono.channel, 19, Bono.ctrl(19) END IF END SUB SUB Bono_f1 () ' controller 21 test ' first harmonic (octave) strength in signal ' in the works on dspic level (not yet implemented on So nor Bono) STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_f1).tog THEN IF ISFALSE Task(%Bono_f1).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="f1" MakeTaskParameterDialog %Bono_f1,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_f1).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_f1).freq = 10 Task(%Bono_f1).tog = %True END IF IF slider(slnr).value <> Bono.ctrl(21) THEN Bono.ctrl(21) = Slider(slnr).value Controller Bono.channel, 21, Bono.ctrl(21) END IF END SUB SUB Bono_f2 () ' controller 22 test ' second harmonic (fifth) strength in signal ' in the works on dspic level. (not yet implemented on So nor Bono) STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 IF ISFALSE Task(%Bono_f2).tog THEN IF ISFALSE Task(%Bono_f2).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="f2" MakeTaskParameterDialog %Bono_f2,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_f2).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_f2).freq = 10 Task(%Bono_f2).tog = %True END IF IF slider(slnr).value <> Bono.ctrl(22) THEN Bono.ctrl(22) = Slider(slnr).value Controller Bono.channel, 22, Bono.ctrl(22) END IF END SUB 'specific sysexes for Bono FUNCTION Bono_Valve_Sysx AS LONG 'upon request by gwr we hardcode the data in this function.. 'according to johannes doc we can only fill in tables 2 and 3... STATIC headr$ LOCAL i AS LONG STATIC tab2$, tab3$ STATIC cc AS DWORD 'the following is just a cut and paste from so.. not rey for bono yet MSGBOX "not ready yet!!",,FUNCNAME$ IF ISFALSE LEN(headr$) THEN 'first time we enter this function i = MSGBOX("Are you sure you want to send a VALVE Sysex to Bono?" + $CRLF _ + "Make sure no other midi is sent until you get a confirmation that the sysex was sent.." + $CRLF + _ "If you don't uderstand what this is about say no!", %MB_YESNO OR %MB_DEFBUTTON2, FUNCNAME$) IF i <> %IDYES THEN Stoptask %Bono_Valve_Sx EXIT FUNCTION END IF ' this is code !!!! ' for bono we have another range and 4 valves. The format will be different !!!!! headr$ = CHR$(&HF0, &H7d, "bova", bono.channel) tab2$ = CHR$(headr$, 2, 0, 7, 0, 6, 4, 5, 4, 3, 2, 1, 0, 2, 1, 0, 0, 4, 2, 0, 2, 3, 6, 1, 0, 6, 4, 2, 3, 0, 4, 2, 3, 3, 2, 1, 4, 6, 4, 7, 2, 1, 0, 3, 3, 5, 1, 0, 3, 1, &HF7) tab3$ = CHR$(headr$, 3, 0, 7, 0, 6, 4, 5, 4, 3, 2, 1, 0, 2, 1, 0, 0, 4, 2, 0, 2, 3, 6, 1, 0, 6, 4, 2, 3, 0, 4, 2, 3, 3, 2, 1, 4, 6, 4, 7, 2, 1, 0, 3, 3, 5, 1, 0, 3, 1, &HF7) EXIT FUNCTION 'give us some time to go watch the sysex led.. END IF INCR cc SELECT CASE cc CASE 1 SysEx hMidiO(HIBYT(Bono.channel)), tab2$ EXIT FUNCTION CASE 2 SysEx hMidiO(HIBYT(Bono.channel)), tab3$ CASE ELSE 'reset and stop RESET cc, headr$ StopTask %Bono_Valve_Sx MSGBOX "The Bono valve sysexes where sent. It's recommended to restart now.",,FUNCNAME$ EXIT FUNCTION END SELECT END FUNCTION 'FUNCTION Bono_Wind_Sysx AS LONG 'upon request by gwr we hardcode the data in this function.. ' 'cfr gmt\robots\Bono\Bono-mappings.ods ' STATIC header$ ' LOCAL i AS LONG ' STATIC table$() '0, 120-126 ' STATIC cc AS DWORD ' IF ISFALSE LEN(header$) THEN 'first time we entr this function ' i = MSGBOX("Are you sure you want to send a WIND Sysex to Bono?" + $CRLF _ ' + "Make sure no other midi is sent until you get a confirmation that the sysex was sent.." + $CRLF + _ ' "If you don't uderstand what this is about say no!", %MB_YESNO OR %MB_DEFBUTTON2, FUNCNAME$) ' IF i <> %IDYES THEN ' Stoptask %Bono_Wind_Sx ' EXIT FUNCTION ' END IF ' header$ = CHR$(&HF0, &H7d, "bowi", 14) ' DIM table$(7) ' ' this is code!!! to be adapted for bono (different range!!!) ' table$(0) = CHR$(header$, 0,STRING$(10, 120), STRING$(6, 110), STRING$(5, 100), STRING$(17, 90), STRING$(5, 80), STRING$(5, 90), &HF7) ' table$(1) = CHR$(header$, 120, STRING$(48, 90), &HF7) ' table$(2) = CHR$(header$, 121, STRING$(48, 90), &HF7) ' table$(3) = CHR$(header$, 122, STRING$(11, 120), 110, 110, 100, 100, 100, 100, 92, 94, 100, 94, 94, STRING$(8, 90), STRING$(5, 96), 100, 100, STRING$(6, 90), STRING$(5, 80), &HF7) ' table$(4) = CHR$(header$, 123, STRING$(11, 120), 110, 110, 100, STRING$(24, 90), 70, 70, 70, 80, 90, STRING$(5, 80), &HF7) ' table$(5) = CHR$(header$, 124, STRING$(48, 90), &HF7) ' table$(6) = CHR$(header$, 125, 100, STRING$(11, 105), STRING$(9, 100), STRING$(17, 90), STRING$(5, 80), STRING$(5, 90), &HF7) ' table$(7) = CHR$(header$, 126, STRING$(48, 90), &HF7) ' EXIT FUNCTION 'give us some time to go watch the sysex led.. ' END IF ' INCR cc ' IF (cc - 1) > UBOUND(table$) THEN ' RESET cc, header$ ' StopTask %Bono_Wind_Sx ' MSGBOX "The Bono wind sysexes where sent. It's recommended to restart now.",,FUNCNAME$ ' EXIT FUNCTION ' END IF ' SysEx hMidiO(HIBYT(Bono.channel)), table$(cc-1) 'END FUNCTION SUB Bono_25 () ' added 09.12.2007 - controller 25 - was implemented instead of 14 - 28.12.2007 ' 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(%Bono_25).tog THEN IF ISFALSE Task(%Bono_25).hParam THEN DIM TaskParamLabels(0) TaskParamLabels(0)="valv25" MakeTaskParameterDialog %Bono_25,1, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_25).SliderNumbers(0) Bono.ctrl(25) = 64 Slider(slnr).value = Bono.ctrl(25) SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Bono_25).freq = 5 Task(%Bono_25).tog = %True END IF IF slider(slnr).value <> Bono.ctrl(25) THEN Bono.ctrl(25) = Slider(slnr).value Controller Bono.channel, 25, Bono.ctrl(25) END IF END SUB SUB Bono_Vibrato () ' vibrato test met de pitchbend (geimplementeerd op de dspic) STATIC slnr AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC cnt AS DWORD IF ISFALSE Task(%Bono_vibrato).tog THEN IF ISFALSE Task(%Bono_vibrato).hParam THEN DIM TaskParamLabels(1) TaskParamLabels(0)="Speed" TaskParamlabels(1)="Depth" ' pitch deviation MakeTaskParameterDialog %Bono_vibrato,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_vibrato).SliderNumbers(0) Slider(slnr).value = 63 Task(%Bono_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(%Bono_vibrato).tog = %True END IF ' not very good code yet! we should do it much more gradually IF slider(slnr).value THEN Task(%Bono_vibrato).freq = slider(slnr).value / 4 ' max 32Hz IF ISFALSE cnt MOD 2 THEN bend Bono.channel, 0, 63 + (slider(slnr+1).value/ 2) ELSE bend Bono.channel, 0, 64 - (slider(slnr+1).value /2) END IF INCR cnt ELSE Bend Bono.channel, 0, 64 ' reset stoptask %Bono_Vibrato END IF END SUB SUB Bono_QScale () ' quartertone scale test. STATIC onoff AS DWORD STATIC TaskParamLabels() AS ASCIIZ*8 STATIC slnr AS INTEGER STATIC n AS INTEGER IF ISFALSE Task(%Bono_Qscale).tog THEN IF ISFALSE Task(%Bono_QScale).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="velo" TaskParamLabels(1)="speed" MakeTaskParameterDialog %Bono_QScale,2, Slider(),0,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Bono_QScale).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Controller Bono.channel, 17, 84 Bono.ctrl(17) = 84 Controller Bono.channel, 18, 104 Bono.ctrl(18) = 104 Slider(slnr+1).value = 30 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF MM_Bono_On 'Controller Bono.channel, 66, 127 Task(%Bono_QScale).tog = %True n = Bono.Lowtes END IF IF ISFALSE onoff THEN Bend Bono.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 Bono.channel, n, Slider(slnr).value onoff = %True ELSE PLAY Bono.channel, n, Slider(slnr).value Bend Bono.channel, 0, 127 ' or, 64 + 50 = 114 if a step corresponds to a cent. onoff = %False INCR n END IF IF n > Bono.hightes THEN n= Bono.lowtes Task(%Bono_QScale).freq = MAX(0.25,Slider(slnr+1).value / 4) END SUB SUB Bono_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... derived from similar piece for Korn. IF ISFALSE Task(%Bono_Calls).tog THEN tc = 22 ' start on Bb oldnote = 22 rest = 0 cnt = 0 Controller Bono.channel, 66, 127 Task(%Bono_Calls).tog = %True END IF IF rest = 2 THEN Task(%Bono_Calls).freq = 1 rest = 1 EXIT SUB END IF IF rest = 1 THEN IF FRAC(oldnote) <= 0.5 THEN PLAY Bono.channel, FIX(oldnote),velo '- (harnr * 2) Bend Bono.channel, 0, 63 + (FRAC(oldnote) * 128) ELSE PLAY Bono.channel, FIX(oldnote+1), velo Bend Bono.channel, 0, (1 - FRAC(oldnote)) *128 ' checked 24.11.2008 END IF 'Play Bono.channel, FIX(oldnote),velo '- (harnr * 2) 'Bend Bono.channel, 0, 64 + ((FRAC(oldnote)-0.5) * 100) rest = 0 Task(%Bono_Calls).freq = 2 EXIT SUB END IF velo = 100 harnr = RND(1) * 12 f = NF2F(tc) * harnr note = F2NF(f) IF note >= 79 THEN note = note - 12 'Bono.hightes + 1 THEN note = note - 12 IF note = oldnote THEN rest = 2 EXIT SUB ELSE IF FRAC(note) <= 0.5 THEN PLAY Bono.channel, FIX(note), velo Bend Bono.channel, 0, 63 + (FRAC(note) * 128) ELSE PLAY Bono.channel, FIX(note + 1), velo Bend Bono.channel, 0, (1-FRAC(note)) * 128 END IF 'Play Bono.channel, FIX(note),velo - (harnr * 2) 'Bend Bono.channel, 0, 64 + ((FRAC(note)-0.5) * 100) rest = %False END IF INCR cnt IF ISFALSE cnt MOD 24 THEN f = NF2F(tc) f = f * 3!/2! tc = F2NF(f) IF tc > 61 THEN tc = tc - 12 END IF Task(%Bono_Calls).freq = 4 oldnote = note END SUB SUB Bono_V0() 'test valve 0 - 1 semitone down 'note 52 = 0001 'note 53 = 0000, note 11 = 1111 STATIC cnt AS LONG IF ISFALSE cnt MOD 2 THEN NoteOff Bono.channel, 52 PLAY Bono.channel, 53, 10 ELSE NoteOff Bono.channel, 53 PLAY Bono.channel, 52, 10 END IF INCR cnt END SUB SUB Bono_V1() 'test valve 1 - 1 tone down 'note 51 0010 'note 53 = 0000, note 11 = 1111 STATIC cnt AS LONG IF ISFALSE cnt MOD 2 THEN NoteOff Bono.channel, 51 PLAY Bono.channel, 53, 10 ELSE NoteOff Bono.channel, 53 PLAY Bono.channel, 51, 10 END IF INCR cnt END SUB SUB Bono_V2() 'test valve 2 -3 semitones down 'note 50 = 0100 'note 52 = 0000, note 11 = 1111 STATIC cnt AS LONG IF ISFALSE cnt MOD 2 THEN NoteOff Bono.channel, 50 PLAY Bono.channel, 53, 10 ELSE NoteOff Bono.channel, 53 PLAY Bono.channel, 50, 10 END IF INCR cnt END SUB SUB Bono_V3() 'test valve 3 - fourth down (5 semitones) 'note 60 = 1000 'note 52 = 0000, note 11 = 1111 STATIC cnt AS LONG IF ISFALSE cnt MOD 2 THEN NoteOff Bono.channel, 60 PLAY Bono.channel, 53, 10 ELSE NoteOff Bono.channel, 53 PLAY Bono.channel, 60, 10 END IF INCR cnt END SUB SUB Bono_C13 () STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC cnt, note AS WORD IF ISFALSE Task(%Bono_C13).tog THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "tempo" TaskParamLabels(1) = "note" IF ISFALSE Task(%Bono_C13).hParam THEN MakeTaskParameterDialog %Bono_C13,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Bono_C13).SliderNumbers(0) Slider(slnr).minval = 1 ' tempo Slider(slnr).maxval = 127 END IF IF udnr = %False THEN udnr = TaskEX(%Bono_C13).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Bono_C13N) UDctrl(udnr).value = 34 UDctrl(udnr).minval = 22 UDctrl(udnr).maxval = 99 UDctrl(udnr).stap = 1 END IF note = %False cnt = %False Task(%Bono_C13).tog = %True END IF IF note <> UDctrl(udnr).value THEN note = UDctrl(udnr).value PLAY Bono.channel, note, 64 END IF Controller Bono.channel, 13, cnt INCR cnt IF cnt > 15 THEN cnt = 0 Task(%Bono_C13).freq = MAX(1, Slider(slnr).value / 16) END SUB SUB Bono_C13N () LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Bono_C13).UpdownNumbers(0) value = UDCtrl(udnr).value SetDlgItemText Task(%Bono_C13).hparam, %GMT_TEXT0_ID + 16, STR$(value) END SUB SUB Bono_OS () 'one shot task for valve -1/2 PLAY Bono.channel, 45, 100 stoptask %Bono_OS END SUB ' 'SUB Bono_Fingerings ' STATIC hw AS LONG ' IF ISFALSE hw THEN ' DIALOG NEW 0, "fingerings", ,,80, 30 TO hw ' CONTROL ADD LABEL, hw, 1, "valves", 1, 1, 78, 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 ' CONTROL ADD CHECKBOX, hw, 5, "4", 52, 14, 12, 12, %BS_PUSHLIKE ' DIALOG SHOW MODELESS hw, CALL CB_Bono_Fingerings ' END IF 'END SUB ' 'CALLBACK FUNCTION CB_Bono_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 GET CHECK CBHNDL, 5 TO i ' IF i THEN BIT SET cc, 6 ' CONTROL SET TEXT gh.cockpit, %GMT_Msg1, BIN$(cc) ' Controller Bono.channel, 13, cc 'END FUNCTION '[EOF]