' *************************************************************************** ' * * ' * an automated spinet by dr.Godfried-Willem Raes * ' * Operational since july 2011 * ' *************************************************************************** '13.07.2011: debug session on PIC midihub board. '16.07.2011: Lites and muffler up and working... '11.09.2011: A Namuda demo for Spiro is available now, using the ii2010 sensor system. GLOBAL hwCtrlSpiro AS LONG DECLARE FUNCTION Spiro_Init () AS DWORD DECLARE SUB Spiro_ButnSWHandler () DECLARE SUB Spiro_ButnOSHandler () DECLARE SUB Spiro_test () ' scale test for Spiro - not range limited. DECLARE SUB Spiro_test_stop () DECLARE SUB Spiro_Muffler () DECLARE SUB Spiro_120 () ' blue led strip on strings DECLARE SUB Spiro_121 () DECLARE SUB Spiro_122 () DECLARE SUB Spiro_123 () DECLARE SUB Spiro_124 () DECLARE SUB Spiro_125 () DECLARE SUB Spiro_126 () DECLARE SUB Spiro_127 () DECLARE SUB Spiro_120_stop () ' blue led strip on strings DECLARE SUB Spiro_121_stop () ' blue light under instrument DECLARE SUB Spiro_122_stop () DECLARE SUB Spiro_123_stop () DECLARE SUB Spiro_124_stop () DECLARE SUB Spiro_125_stop () DECLARE SUB Spiro_126_stop () DECLARE SUB Spiro_127_stop () DECLARE SUB Spiro_lampjes () DECLARE SUB Spiro_Lights_Off () DECLARE SUB Spiro_controlroom () DECLARE CALLBACK FUNCTION CB_Spiro_Controlroom () DECLARE SUB Spiro_repeat () %Spiro_tst = 48 %Spirorep = 49 %SpiroMuffler = 50 %Spiro_lites = 52 %Spiro_120 = 53 %Spiro_121 = 54 %Spiro_122 = 55 %Spiro_123 = 56 %Spiro_124 = 57 %Spiro_125 = 58 %Spiro_126 = 59 %Spiro_127 = 60 %Spiro_cc = 61 FUNCTION Spiro_Init () EXPORT AS DWORD LOCAL CockpitLayo AS CockpitLabels LOCAL i AS DWORD LOCAL m AS ASCIIZ * 40 LOCAL zText AS ASCIIZ * 25 LOCAL retval AS LONG GetInstrumentParams Spiro, %IDM_Spiro retval = SetRobotport (Spiro, Inifilename, hMidiO()) Task(App.ReadSeqScoreTaskNr).cPtr = %False ' remove from cockpit. App.butnSWCptr = CODEPTR(Spiro_ButnSWHandler) App.butnOSCptr = CODEPTR(Spiro_ButnOSHandler) ' delete buttons that are not required or functional: ButnSW(2).tag0 = "" ButnSW(2).tag1 = "" ButnSW(2).cptr = %False ButnSW(5).tag0 = "" ButnSW(5).tag1 = "" ButnSW(5).cptr = %False ButnSW(7).tag0 = "SpiroCtrl tog" ButnSW(7).tag1 = "SpiroCtrl tog" ButnSW(7).cptr = CODEPTR(Spiro_Controlroom) ButnSW(8).tag0 = "" ButnSW(8).tag1 = "" ButnSW(8).cptr = %False ButnOS(3).tag = "" ButnOS(4).tag = "" ButnOS(5).tag = "" ButnOS(6).tag = "" ButnOS(7).tag = "H_Off" ButnOS(8).tag = "Clear" IF ISFALSE hMidiI(0) THEN Task(16).naam = "" Task(16).cptr = %False END IF ' Spiro test code Task(%Spiro_tst).cPtr = CODEPTR(Spiro_Test) ' scale with velo Task(%Spiro_tst).freq = 2 Task(%Spiro_tst).naam = "Spiro" Task(%Spiro_tst).flags = %False TaskEx(%Spiro_tst).stopcptr = CODEPTR(Spiro_Test_Stop) Task(%Spiro_lites).cptr = CODEPTR(Spiro_lampjes) Task(%Spiro_lites).freq = 1 Task(%Spiro_lites).naam = "Licht" Task(%Spiro_lites).flags = %False TaskEX(%Spiro_lites).stopcptr = CODEPTR(Spiro_Lights_Off) Task(%Spiro_120).cptr = CODEPTR(Spiro_120) Task(%Spiro_120).freq = 4 Task(%Spiro_120).naam = "L-120" Task(%Spiro_120).flags = %False TaskEX(%Spiro_120).stopcptr = CODEPTR(Spiro_120_stop) Task(%Spiro_121).cptr = CODEPTR(Spiro_121) Task(%Spiro_121).freq = 4 Task(%Spiro_121).naam = "L-121" Task(%Spiro_121).flags = %False TaskEX(%Spiro_121).stopcptr = CODEPTR(Spiro_121_stop) Task(%Spiro_122).cptr = CODEPTR(Spiro_122) Task(%Spiro_122).freq = 4 Task(%Spiro_122).naam = "L-122" Task(%Spiro_122).flags = %False TaskEX(%Spiro_122).stopcptr = CODEPTR(Spiro_122_stop) Task(%Spiro_123).cptr = CODEPTR(Spiro_123) Task(%Spiro_123).freq = 4 Task(%Spiro_123).naam = "L-123" Task(%Spiro_123).flags = %False TaskEX(%Spiro_123).stopcptr = CODEPTR(Spiro_123_stop) Task(%Spiro_124).cptr = CODEPTR(Spiro_124) Task(%Spiro_124).freq = 4 Task(%Spiro_124).naam = "L-124" Task(%Spiro_124).flags = %False TaskEX(%Spiro_124).stopcptr = CODEPTR(Spiro_124_stop) Task(%Spiro_125).cptr = CODEPTR(Spiro_125) Task(%Spiro_125).freq = 4 Task(%Spiro_125).naam = "L-125" Task(%Spiro_125).flags = %False TaskEX(%Spiro_125).stopcptr = CODEPTR(Spiro_125_stop) Task(%Spiro_126).cptr = CODEPTR(Spiro_126) Task(%Spiro_126).freq = 4 Task(%Spiro_126).naam = "L-126" Task(%Spiro_126).flags = %False TaskEX(%Spiro_126).stopcptr = CODEPTR(Spiro_126_stop) Task(%Spiro_127).cptr = CODEPTR(Spiro_127) Task(%Spiro_127).freq = 4 Task(%Spiro_127).naam = "L-127" Task(%Spiro_127).flags = %False TaskEX(%Spiro_127).stopcptr = CODEPTR(Spiro_127_stop) Task(%Spirorep).cPtr = CODEPTR(Spiro_repeat) Task(%Spirorep).freq = 3 Task(%Spirorep).naam = "Repeats" Task(%Spirorep).flags = %False Task(%Spiromuffler).cPtr = CODEPTR(Spiro_muffler) Task(%Spiromuffler).freq = 1 Task(%Spiromuffler).naam = "Muffler" Task(%Spiromuffler).flags = %False Task(%Spiro_cc).cPtr = CODEPTR(Spiro_ccTask) Task(%Spiro_cc).freq = 1 Task(%Spiro_cc).naam = "Controlroom" Task(%Spiro_cc).flags = %False Task(%MM_SysxTask).naam = "SendSysx" Task(%MM_SysxTask).freq = .33 Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc App.id = %IDM_Spiro m = "" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) FUNCTION = %True END FUNCTION SUB Spiro_ButnSWHandler () LOCAL ButtonNr AS LONG ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID SELECT CASE ButtonNr 'case 0 = Midi Thru CASE 1 ' starts the promil counter. The MT should already be running! ' Starting the cockpit will at the same time block reception of sysex messages, by ' setting the blocking flags in SxThread.flags. IF ButnSW(Buttonnr).flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "STOP" ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) ' dll procedure ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "CONT" END IF CASE 2 ' on off switch IF ButnSW(Buttonnr).flag THEN Controller Spiro.channel, 66, %True Spiro.ctrl(66) = 127 ELSE Controller Spiro.channel, 66, %False Spiro.ctrl(66) = %False END IF CASE 4 IF ButnSW(Buttonnr).flag THEN MakeHarVelWindow ' displays Har.vel structure ELSE DestroyWindow gh.HarVel END IF CASE 6 IF ButnSW(Buttonnr).flag THEN MakeHarPsyWindow ' small har.psy window ELSE DestroyWindow gh.HarPsy END IF CASE 7 IF ButnSW(Buttonnr).flag THEN MakeSpectrumWindow ELSE DestroyWindow gh.Spec END IF END SELECT App.butnSWparam = %False END SUB SUB Spiro_ButnOSHandler () LOCAL ButtonNr AS LONG ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID SELECT CASE ButtonNr CASE 7 Controller Spiro.channel, 123, %False CASE 8 ClearDelayArrays ClearMiBuf 0 END SELECT App.butnOSparam = %False END SUB SUB Spiro_test () STATIC noot AS BYTE STATIC oldnote AS INTEGER STATIC slnr AS BYTE LOCAL velo AS BYTE IF ISFALSE Task(%Spiro_tst).tog THEN Task(%Spiro_tst).tog = %True ' create a parameter window ' The handle for this window will be returned in Task(Tasknr).hParam DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Level" TaskParamLabels(2) = "High " TaskParamLabels(3) = "Low " IF Task(%Spiro_tst).hParam = %Null THEN MakeTaskParameterDialog BYVAL %Spiro_tst,4,Slider(),0,UDctrl(),TaskParamLabels() END IF Controller Spiro.channel, 123, 0 EXIT SUB END IF IF ISFALSE slnr THEN slnr = TaskEX(%Spiro_tst).SliderNumbers(0) END IF IF oldnote THEN NoteOff Spiro.channel, oldnote noot = oldnote + 1 oldnote = %False END IF ' no limitation to real range. This is a hardware/firmware test module... velo = Slider(slnr+1).value IF noot > Slider(slnr+2).value THEN noot = Slider(slnr+3).value IF noot < Slider(slnr+3).value THEN noot = Slider(slnr+3).value mPlay Spiro.channel, noot, velo oldnote = noot Task(%Spiro_tst).freq = Slider(slnr).value * 0.25 IF Task(%Spiro_tst).freq < 1 THEN Task(%Spiro_tst).freq = 1 END SUB SUB spiro_test_stop () Controller Spiro.channel, 123, %False END SUB SUB Spiro_Lampjes () STATIC cnt AS LONG Task(%Spiro_lites).freq = 2 mPlay Spiro.channel, 120 + (cnt MOD 8), 0 INCR cnt mPlay Spiro.channel, 120 + (cnt MOD 8), 127 CONTROL SET TEXT gh.cockpit, %GMT_MSG1, "note:" + STR$(120 + (cnt MOD 8)) END SUB SUB Spiro_120 () ' blue LED strip on the strings ' coding with test for periodic flashing functionality: STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_120).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L120" IF ISFALSE Task(%Spiro_120).hParam THEN MakeTaskParameterDialog %Spiro_120,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_120).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 120, 127 'KeyPress Spiro.channel,120, slider(slnr).value Task(%Spiro_120).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 120, n 'KeyPress Spiro.channel, 120, n END IF Task(%Spiro_120).freq = 10 END SUB SUB Spiro_120_Stop () mplay Spiro.channel, 120, %False END SUB SUB Spiro_121 () STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_121).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L121" IF ISFALSE Task(%Spiro_121).hParam THEN MakeTaskParameterDialog %Spiro_121,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_121).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 121, 127 'KeyPress Spiro.channel,121, slider(slnr).value Task(%Spiro_121).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 121, n 'KeyPress Spiro.channel, 121, n END IF Task(%Spiro_121).freq = 10 END SUB SUB Spiro_121_Stop () mplay Spiro.channel, 121, %False END SUB SUB Spiro_Lights_Off () MM_Spiro_Off %MM_Lights END SUB SUB Spiro_122 () STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_122).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L122" IF ISFALSE Task(%Spiro_122).hParam THEN MakeTaskParameterDialog %Spiro_122,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_122).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 122, 127 'KeyPress Spiro.channel,122, slider(slnr).value Task(%Spiro_122).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 122, n 'KeyPress Spiro.channel, 122, n END IF Task(%Spiro_122).freq = 10 END SUB SUB Spiro_122_Stop () mplay Spiro.channel, 122, %False END SUB SUB Spiro_123 () STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_123).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L123" IF ISFALSE Task(%Spiro_123).hParam THEN MakeTaskParameterDialog %Spiro_123,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_123).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 123, 127 'KeyPress Spiro.channel,123, slider(slnr).value Task(%Spiro_123).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 123, n 'KeyPress Spiro.channel, 123, n END IF Task(%Spiro_123).freq = 10 END SUB SUB Spiro_123_Stop () mplay Spiro.channel, 123, %False END SUB SUB Spiro_124 () STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_124).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L124" IF ISFALSE Task(%Spiro_124).hParam THEN MakeTaskParameterDialog %Spiro_124,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_124).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 124, 127 'KeyPress Spiro.channel,124, slider(slnr).value Task(%Spiro_124).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 124, n 'KeyPress Spiro.channel, 124, n END IF Task(%Spiro_124).freq = 10 END SUB SUB Spiro_124_Stop () mplay Spiro.channel, 124, %False END SUB SUB Spiro_125 () ' coding with test for periodic flashing functionality: STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_125).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L125" IF ISFALSE Task(%Spiro_125).hParam THEN MakeTaskParameterDialog %Spiro_125,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_125).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 125, 127 'KeyPress Spiro.channel,125, slider(slnr).value Task(%Spiro_125).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 125, n 'KeyPress Spiro.channel, 125, n END IF Task(%Spiro_125).freq = 10 END SUB SUB Spiro_125_Stop () mplay Spiro.channel, 125, %False END SUB SUB Spiro_126 () ' coding with test for periodic flashing functionality: STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_126).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L126" IF ISFALSE Task(%Spiro_126).hParam THEN MakeTaskParameterDialog %Spiro_126,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_126).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 126, 127 'KeyPress Spiro.channel,126, slider(slnr).value Task(%Spiro_126).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 126, n 'KeyPress Spiro.channel, 126, n END IF Task(%Spiro_126).freq = 10 END SUB SUB Spiro_126_Stop () mplay Spiro.channel, 126, %False END SUB SUB Spiro_127 () ' coding with test for periodic flashing functionality: STATIC n AS INTEGER STATIC slnr AS DWORD IF ISFALSE Task(%Spiro_127).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "L127" IF ISFALSE Task(%Spiro_127).hParam THEN MakeTaskParameterDialog %Spiro_127,1,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_127).SliderNumbers(0) Slider(slnr).value = 127 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF mPlay Spiro.channel, 127, 127 'KeyPress Spiro.channel,127, slider(slnr).value Task(%Spiro_127).tog = %True END IF IF slider(slnr).value <> n THEN n = Slider(slnr).value mPlay Spiro.channel, 127, n 'KeyPress Spiro.channel, 127, n END IF Task(%Spiro_127).freq = 10 END SUB SUB Spiro_127_Stop () mplay Spiro.channel, 127, %False END SUB SUB Spiro_controlroom () ' to be adapted to range of Spiro LOCAL i AS LONG LOCAL x AS LONG LOCAL b$ IF ISFALSE hwCtrlSpiro THEN DIALOG NEW 0, "Spiro Control",1,150 ,450, 104, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlSpiro x = 5 FOR i = Spiro.lowtes TO Spiro.LowTes + (Spiro.HighTes - Spiro.LowTes)/2 '((Spiro.LowTes + Spiro.HighTes)/2) - 1 logfile STR$(i) + STR$(x) SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "C", x, 55, 18, 12, %BS_PUSHLIKE logfile "C" x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "C#", x, 43, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "D", x, 55, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "D#", x, 43, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "E", x, 55, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "F", x, 55, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "F#", x, 43, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "G", x, 55, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "G#", x, 43, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "A", x, 55, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "Bb", x, 43, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "B", x, 55, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT NEXT x = 5 FOR i = Spiro.LowTes + (Spiro.HighTes - Spiro.LowTes)/2 TO Spiro.Hightes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "C", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "C#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "D", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "D#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "E", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "F", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "F#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "G", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "G#", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "A", x, 24, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "Bb", x, 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlSpiro, i, "B", x, 24, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT NEXT IF ISFALSE Task(%spiro_cc).tog THEN starttask %spiro_cc CONTROL ADD BUTTON, hwCtrlSpiro, 600, "All Off", 247, 76, 30, 12 DIALOG SHOW MODELESS hwCtrlSpiro CALL CB_Spiro_Controlroom ELSE DIALOG END hwCtrlSpiro hwCtrlSpiro = 0 IF Task(%spiro_cc).tog THEN StopTask %spiro_cc END IF END SUB SUB Spiro_cctask LOCAL slnr AS LONG LOCAL i AS LONG, ch AS LONG STATIC j AS LONG STATIC onoff AS SINGLE, period AS SINGLE IF ISFALSE Task(%spiro_cc).tog THEN Task(%spiro_cc).tog = 1 IF ISFALSE hwCtrlSpiro THEN Spiro_controlroom DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "On/off " IF Task(%Spiro_cc).hParam = %Null THEN MakeTaskParameterDialog BYVAL %Spiro_cc,3,Slider(),0,UDctrl(),TaskParamLabels() slnr = TaskEX(%Spiro_cc).SliderNumbers(0) Slider(slnr).value = 4 'Task(%Spiro_cc).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, 64 ' mid position Controller Spiro.channel, 123, 0 EXIT SUB END IF IF ISFALSE slnr THEN slnr = TaskEX(%Spiro_cc).SliderNumbers(0) OnOff = Slider(slnr+2).value / 128 ' 0- 0.99218 IF OnOff < 0.0078 THEN OnOff = 0.0078125 period = 2 / (32! * ((Slider(slnr).value+1) / 128!)) ' halved the tempo ' warning str$(j) IF ISFALSE j THEN warning "play" FOR i = Spiro.LowTes TO Spiro.HighTes CONTROL GET CHECK hwCtrlSpiro, i TO ch IF ch THEN addNote2Har Spiro.har(1), i, Slider(slnr + 1).value NEXT period = period * OnOff ELSE warning "rest" i = UDctrl(TaskEX(%Spirorep).UpDownNumbers(0)).value period = period * (1! - OnOff) END IF warning "j:" + STR$(j) + " onoff:" + STR$(onoff) + " period:" + STR$(period) InstrumPlay Spiro Task(%Spiro_cc).freq = MAX(MIN(1! / period, 1000),.25) warning "F:" + STR$(Task(%Spiro_cc).freq) INCR j j = j MOD 2 END SUB CALLBACK FUNCTION CB_Spiro_Controlroom () LOCAL wind AS BYTE LOCAL valve AS SINGLE LOCAL i AS LONG LOCAL note AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE Spiro.Lowtes TO Spiro.hightes 'note checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL ' mPlay Spiro.channel, note, BYVAL i CASE 600 'all off Controller Spiro.channel, 123, %False FOR i = Spiro.lowtes TO Spiro.hightes CONTROL SET CHECK CBHNDL, i, 0 SLEEP 10 DIALOG DOEVENTS NEXT Spiro.ctrl(7) = %False 'Controller Spiro.channel, 7, Spiro.ctrl(7) CONTROL SET TEXT CBHNDL, 503, "0"' END SELECT CASE %WM_HSCROLL, %WM_VSCROLL 'note: id doesn't correspond at all with the one given at creation SELECT CASE CBLPARAM END SELECT CASE %WM_CLOSE, %WM_QUIT hwCtrlSpiro = 0 Controller Spiro.channel, 123, %False Spiro.ctrl(7) = %False ' Controller Spiro.channel, 7, Spiro.ctrl(7) END SELECT END FUNCTION SUB Spiro_repeat () ' task %pprep - tests repeated notes. ' parameters: repetition rate ' push-time ' release-time ' velocity ' note STATIC slnr AS DWORD STATIC j AS DWORD STATIC i AS INTEGER LOCAL onoff AS SINGLE LOCAL period AS SINGLE IF ISFALSE Task(%Spirorep).tog THEN DIM TaskParamLabels(0 TO 4) AS ASCIIZ * 8 ARRAY ASSIGN TaskParamLabels() = "Tempo", "Level", "On/Off", "Note", "Prog" IF ISFALSE Task(%Spirorep).hParam THEN slnr = %False MakeTaskParameterDialog %Spirorep,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Spirorep).SliderNumbers(0) UDctrl(TaskEX(%Spirorep).UpdownNumbers(0)).cptr = CODEPTR(Spiro_Note_UD1) ' note i = 60 UDctrl(TaskEX(%Spirorep).UpDownNumbers(0)).value = i UDCtrl(TaskEX(%Spirorep).UpdownNumbers(1)).cptr = CODEPTR(Spiro_Prog_UD2) UDctrl(TaskEX(%Spirorep).UpDownNumbers(1)).value =1 j = 0 Task(%Spirorep).freq = 2 Slider(slnr).value = Task(%Spirorep).freq SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 4 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, 4 ' low level on init. Slider(slnr+2).value = 64 SendMessage Slider(Slnr+2).h, %TBM_SETPOS,%True, 64 ' mid position END IF j = %False Task(%Spirorep).tog = %True EXIT SUB END IF OnOff = Slider(slnr+2).value / 128 ' 0- 0.99218 IF OnOff < 0.0078 THEN OnOff = 0.0078125 period = 1! / (32! * ((Slider(slnr).value+1) / 128!)) ' tempo - duur in sekonden. IF ISFALSE j THEN mPlay Spiro.channel, i, Slider(slnr+1).value period = period * OnOff ELSE NoteOff Spiro.channel, i i = UDctrl(TaskEX(%Spirorep).UpDownNumbers(0)).value period = period * (1! - OnOff) END IF Task(%Spirorep).freq = MAX(MIN(1! / period, 1000),1) INCR j j = j MOD 2 END SUB SUB Spiro_Note_UD1 () ' controls the note to be played. LOCAL noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Spirorep).UpDownNumbers(0) noot = UDCtrl(udnr).value IF noot < Spiro.lowtes THEN UDctrl(udnr).value = Spiro.lowtes : noot = Spiro.lowtes IF noot > Spiro.hightes THEN UDctrl(udnr).value = Spiro.hightes : noot = Spiro.hightes SetDlgItemText Task(%Spirorep).hparam, %GMT_TEXT0_ID + 16, "n=" & STR$(noot) END SUB SUB Spiro_Prog_UD2 LOCAL udnr AS LONG LOCAL vl AS LONG udnr = TaskEX(%Spirorep).UpDownNumbers(1) vl = UDCtrl(udnr).value IF vl = 2 THEN vl = 122 IF vl > 127 THEN vl = 1 IF vl = 121 THEN vl = 1 UDCtrl(udnr).value = vl ProgChange Spiro.channel, vl SetDlgItemText Task(%Spirorep).hparam, %GMT_TEXT0_ID + 17, "p=" & STR$(vl) END SUB SUB Spiro_muffler () STATIC cnt AS INTEGER STATIC slnr AS BYTE IF ISFALSE Task(%spiromuffler).tog THEN Task(%Spiromuffler).tog = %True ' create a parameter window DIM TaskParamLabels(0 TO 2) AS ASCIIZ * 8 TaskParamLabels(0) = "Bass" TaskParamLabels(1) = "Trebble" TaskParamlabels(2) = "Speed" IF Task(%spiromuffler).hParam = %Null THEN MakeTaskParameterDialog BYVAL %spiromuffler,3,Slider(),0,UDctrl(),TaskParamLabels() END IF Controller Spiro.channel, 123, 0 EXIT SUB END IF IF ISFALSE slnr THEN slnr = TaskEX(%Spiromuffler).SliderNumbers(0) END IF IF cnt THEN Controller Spiro.channel, 28, %False Controller Spiro.channel, 29, %False cnt = %False ELSE Controller Spiro.channel, 28, Slider(slnr).value Controller Spiro.channel, 29, Slider(slnr+1).value cnt = %True END IF Task(%Spiromuffler).freq = (Slider(slnr+2).value) / 32! IF Task(%Spiromuffler).freq < 0.1 THEN Task(%Spiromuffler).freq = 0.1 END SUB '[eof]