'************************************************************* '* * '* test, tuning and evaluation code for the logos * '* quartertone organ robot * '* by * '* Prof.dr.Godfried-Willem Raes * '*-----------------------------------------------------------* '* tuning interface written by * '* Kristof Lauwers * '* PIC microcoding by * '* Johannes Taelman * '************************************************************* '10.05.2006: Qt icon created '11.05.2006: Qt added in the GMT resource files '18.05.2006: Qt support added in library g_file.dll '02.06.2006: Creation of code module. (part of m_robots.exe) '24.07.2006: Further coding - motor test. '29.07.2006: test kode steppingmotors. Tests for PIC1 (18F2525) '01.08.2006: test kode low windchest, K1-Q1 boards (18F4620) - kanaalbug. Pic kode versie 1.0 '02.08.2006: kode verbeterd. '03.08.2006: Pic kode versie 1.1 '07.08.2006: Control room toegevoegd door Kristof Lauwers '18.09.2006: Kwintencirkel kode tests toegevoegd. '30.09.2006: Motor ctrl. split off from test. Nu aparte taak. '12.12.2006: some bugs in X-tof's keyboard code discovered. '18.01.2007: quartertone functions added in g_har.dll '28.01.2007: further debug and test with Qt '13.05.2007: code improved after springs change in windchest. Puls/pause added in repeats test proc. '14.05.2007: pressure modulation test task added. '16.05.2007: 'Wouwel' for Qt added as a demo piece by Godfried-Willem Raes. '20.05.2007: 'Wouwel' finished. - duur: ca. 5'24" - no user interaction required. '04.09.2007: 'Akafest' - start coding - gwr '05.09.2007: 'Qtree' - triad study - gwr '10.02.2008: Further work on akafest '13.02.2008: Debug session HH-functions in g_har.lib '16.02.2008: Further work on Akafest '01.03.2008: finalisation of Akafest %Qt_Riley = 1 ' tasks 1 - 15 %Qt_Q13 = 17 ' demo voor lezing %Qt_Q15 = 18 ' demo voor lezing %Qt_Qjust = 19 ' demo voor lezing %Qt_Triads = 20 %Qt_gw1 = 25 ' demostukje 'Wouwel' gwr %Qt_gw2 = 26 ' akademische feestouverture gwr 'Akafest' %Akafest_Play = 27 %Akafest_P2 = 28 %Akafest_P3 = 29 'slierten %Qt_gw3 = 30 ' quartertone triad demonstration study. 'Qtree' %Qtree = %Qt_gw3 %Qt_Test = 48 %Qt_Repeats = 49 %Qt_Lights = 50 %Qt_Motor = 51 %Qt_Trem = 52 %Qt_PresMod = 53 'testkode voor elke PIC afzonderlijk: %Qt_K1 = 32 ' 36-47 %Qt_Q1 = 33 %Qt_K2 = 34 ' 48-61 %Qt_Q2 = 35 %Qt_K3 = 36 ' 62-75 %Qt_Q3 = 37 %Qt_K4 = 38 ' 76-89 %Qt_Q4 = 39 %Qt_K5 = 40 ' 90-103 %Qt_Q5 = 41 %Qt_K6 = 42 ' 104-108 %Qt_Q6 = 43 ' 104-107 %Qt_QH = 45 'test voor de Qharmtype gerelateerde functies %Qt_Scales = 54 ' chromatic scale %Qt_Scaleq = 55 ' quartertone higher scale TYPE Wouwel_Type DWORD aan AS DWORD ' switch: wordt 1 vanzodra het stuk start. maxpres AS DWORD ' voor luchtdrukmodulatie task. minpres AS DWORD flag1 AS DWORD flag2 AS DWORD flag3 AS DWORD flag4 AS DWORD flag5 AS DWORD period AS DWORD ' periodiciteit voor modulo van tijd. sectioncounter AS DWORD dex AS SINGLE ' exponent voor de waarschijnlijkheids distributie k(6) AS INTEGER ' centroid voor distributie q(6) AS INTEGER tc AS CUR ' spectral reference note monometric AS LONG END TYPE TYPE Anafest_Type DWORD Qh AS Qharmtype Qhd AS Qharmtype Section AS LONG qnoot AS CUR END TYPE GLOBAL Wou AS wouwel_Type 'GLOBAL QH AS QHarmType ' Qh.vel: 256 places! - for Akafest. GLOBAL Af AS Anafest_type '------ Terry Riley DECLARE SUB Qt_Riley_1 () DECLARE SUB Qt_Riley_2 () DECLARE SUB Qt_Riley_3 () DECLARE SUB Qt_Riley_4 () DECLARE SUB Qt_Riley_5 () DECLARE SUB Qt_Riley_6 () DECLARE SUB Qt_Riley_7 () DECLARE SUB Qt_Riley_8 () DECLARE SUB Qt_Riley_9 () DECLARE SUB Qt_Riley_10 () DECLARE SUB Qt_Riley_11 () DECLARE SUB Qt_Riley_12 () DECLARE SUB Qt_Riley_13 () DECLARE SUB Qt_Riley_14 () DECLARE SUB Qt_Riley_15 () DECLARE SUB Qt_Riley_1_Stop () DECLARE SUB Qt_Riley_2_Stop () DECLARE SUB Qt_Riley_3_Stop () DECLARE SUB Qt_Riley_4_Stop () DECLARE SUB Qt_Riley_5_Stop () DECLARE SUB Qt_Riley_6_Stop () DECLARE SUB Qt_Riley_7_Stop () DECLARE SUB Qt_Riley_8_Stop () DECLARE SUB Qt_Riley_9_Stop () DECLARE SUB Qt_Riley_10_Stop () DECLARE SUB Qt_Riley_11_Stop () DECLARE SUB Qt_Riley_12_Stop () DECLARE SUB Qt_Riley_13_Stop () DECLARE SUB Qt_Riley_14_Stop () DECLARE SUB Qt_Riley_15_Stop () ' volgende procs. zijn als shepard akkoorden geprogrammeerd: DECLARE SUB Qt_Q13 () ' gwr kwarttoonsevaluatiekode DECLARE SUB Qt_Q15 () ' id. DECLARE SUB Qt_Qjust () ' id. DECLARE SUB Qt_Triads () ' drieklanken met kwarttoonstertsen en juiste kwint. DECLARE SUB Qt_Triads_UD () '---------------------------------------------------------------------------- DECLARE SUB Qt_Test () DECLARE SUB Qt_Test_Stop() DECLARE SUB Qt_Hilim_UD () DECLARE SUB Qt_LoLim_UD () DECLARE SUB Qt_Test_Stop () DECLARE SUB Qt_Motor () DECLARE SUB Qt_Motor_UD () DECLARE SUB Qt_Repeats () DECLARE SUB Qt_RepNote_UD () DECLARE SUB Qt_Lights () DECLARE SUB Qt_Lights_Stop () DECLARE SUB Qt_Motor () DECLARE SUB Qt_Trem () DECLARE SUB Qt_Trem_Stop () DECLARE SUB Qt_LTrem_Power_UD () DECLARE SUB Qt_HTrem_Power_UD () DECLARE SUB Qt_PresMod () DECLARE SUB Qt_Presmod_UD0 () DECLARE SUB Qt_PresMod_UD1 () DECLARE SUB Qt_Scales () ' normal chromatic scale . later: shepard scale test DECLARE SUB Qt_Sc_LowLim_UD () DECLARE SUB Qt_Sc_HiLim_UD () DECLARE SUB Qt_Scaleq () ' quartertone higher chromatic scale DECLARE SUB Qt_Scq_LowLim_UD () DECLARE SUB Qt_Scq_HiLim_UD () DECLARE SUB QT_controlroom 'tuning interface DECLARE CALLBACK FUNCTION CB_Qt_Controlroom DECLARE SUB Qt_K1 () DECLARE SUB Qt_K1_Stop () DECLARE SUB Qt_Q1 () DECLARE SUB Qt_Q1_Stop () DECLARE SUB Qt_K2 () DECLARE SUB Qt_K2_Stop () DECLARE SUB Qt_Q2 () DECLARE SUB Qt_Q2_Stop () DECLARE SUB Qt_K3 () DECLARE SUB Qt_K3_Stop () DECLARE SUB Qt_Q3 () DECLARE SUB Qt_Q3_Stop () DECLARE SUB Qt_K4 () DECLARE SUB Qt_K4_Stop () DECLARE SUB Qt_Q4 () DECLARE SUB Qt_Q4_Stop () DECLARE SUB Qt_K5 () DECLARE SUB Qt_K5_Stop () DECLARE SUB Qt_Q5 () DECLARE SUB Qt_Q5_Stop () DECLARE SUB Qt_K6 () DECLARE SUB Qt_K6_Stop () DECLARE SUB Qt_Q6 () DECLARE SUB Qt_Q6_Stop () ' qt demostukjes gwr: DECLARE SUB Wouwel () ' %Qt_gw1 DECLARE FUNCTION FindQtSpeknoot (BYVAL lowlim AS CUR, BYVAL hilim AS CUR, BYVAL factor AS SINGLE) AS CUR ' DECLARE SUB Akafest () ' %Qt_gw2 DECLARE SUB Akafest_Play () DECLARE SUB Akafest_P2 () DECLARE SUB Akafest_Slierten () DECLARE SUB Akafest_Slierten_Stop () DECLARE SUB Akafest_start () DECLARE SUB Akafest_stop () DECLARE SUB QTree () ' %Qt_gw3 DECLARE SUB QTree_start () DECLARE SUB QTree_stop () FUNCTION Init_Qt () AS LONG LOCAL retval AS LONG 'GetInstrumentParams Qt, %IDM_Qt 'retval = SetRobotport (Qt, Inifilename, hMidiO()) Task(%Qt_gw1).naam = "Wouwel" Task(%Qt_gw1).cptr = CODEPTR(Wouwel) Task(%Qt_gw1).freq = 1 Task(%Qt_gw1).flags = %False TaskEX(%Qt_gw1).stopcptr = CODEPTR(Wouwel_stop) TaskEX(%Qt_gw1).startcptr = CODEPTR(wouwel_start) '------------------------------------------------------------------------------ Task(%Qt_gw2).naam = "Akafest" ' chord generating & composition task Task(%Qt_gw2).cptr = CODEPTR(Akafest) Task(%Qt_gw2).freq = 1 Task(%Qt_gw2).flags = %False TaskEX(%Qt_gw2).stopcptr = CODEPTR(akafest_stop) TaskEX(%Qt_gw2).startcptr = CODEPTR(akafest_start) Task(%Akafest_play).naam = "auto" Task(%Akafest_play).cptr = CODEPTR(Akafest_Play) Task(%Akafest_play).freq = 6 Task(%Akafest_Play).flags = %Hidden_Task Task(%Akafest_p2).naam = "auto_2" Task(%Akafest_p2).cptr = CODEPTR(Akafest_P2) Task(%Akafest_p2).freq = 6 Task(%Akafest_P2).flags = %Hidden_Task Task(%Akafest_p3).naam = "slierten" Task(%Akafest_p3).cptr = CODEPTR(Akafest_Slierten) Task(%Akafest_p3).freq = 16 Task(%Akafest_P3).flags = %False '%Hidden_Task TaskEX(%Akafest_P3).stopcptr = CODEPTR(Akafest_Slierten_Stop) '----------------------------------------------------------------------------- Task(%Qt_gw3).naam = "Qtree" ' studie versie van Q-Triads Task(%Qt_gw3).cptr = CODEPTR(Qtree) Task(%Qt_gw3).freq = 1 Task(%Qt_gw3).flags = %False TaskEX(%Qt_gw3).stopcptr = CODEPTR(Qtree_stop) TaskEX(%Qt_gw3).startcptr = CODEPTR(Qtree_start) '----------------------------------------------------------------------------- Task(%Qt_Q13).naam = "13-5ths" Task(%Qt_Q13).cptr = CODEPTR(Qt_Q13) Task(%Qt_Q13).freq = 1 Task(%Qt_Q13).flags = %False TaskEX(%Qt_Q13).stopcptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Q15).naam = "15-5ths" Task(%Qt_Q15).cptr = CODEPTR(Qt_Q15) Task(%Qt_Q15).freq = 1 Task(%Qt_Q15).flags = %False TaskEX(%Qt_Q15).stopcptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Qjust).naam = "just5ths" Task(%Qt_Qjust).cptr = CODEPTR(Qt_Qjust) Task(%Qt_Qjust).freq = 1 Task(%Qt_Qjust).flags = %False TaskEX(%Qt_Qjust).stopcptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Triads).naam = "Q-Triads" Task(%Qt_Triads).cptr = CODEPTR(Qt_Triads) Task(%Qt_Triads).freq = 1 Task(%Qt_Triads).flags = %False TaskEX(%Qt_Triads).stopcptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Test).naam = "" Task(%Qt_Test).cptr = CODEPTR(Qt_Test) Task(%Qt_Test).freq = 4 Task(%Qt_Test).flags = %False TaskEX(%Qt_Test).stopCptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Motor).naam = "Wind" Task(%Qt_Motor).cptr = CODEPTR(Qt_Motor) Task(%Qt_Motor).freq = 4 Task(%Qt_Motor).flags = %False Task(%Qt_Repeats).naam = "Repeats" Task(%Qt_Repeats).cptr = CODEPTR(Qt_Repeats) Task(%Qt_Repeats).freq = 6 Task(%Qt_Repeats).flags = %False TaskEX(%Qt_Repeats).stopCptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Lights).naam = "Qtlites" Task(%Qt_Lights).cptr = CODEPTR(Qt_Lights) Task(%Qt_Lights).freq = 20 Task(%Qt_Lights).flags = %False TaskEX(%Qt_Lights).StopCptr = CODEPTR(Qt_Lights_Stop) Task(%Qt_Scales).naam = "" Task(%Qt_Scales).cptr = CODEPTR(Qt_Scales) Task(%Qt_Scales).freq = 4 Task(%Qt_Scales).flags = %False TaskEX(%Qt_Scales).stopCptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Scaleq).naam = "" Task(%Qt_Scaleq).cptr = CODEPTR(Qt_Scaleq) Task(%Qt_Scaleq).freq = 4 Task(%Qt_Scaleq).flags = %False TaskEX(%Qt_Scaleq).stopCptr = CODEPTR(Qt_Test_Stop) Task(%Qt_Trem).naam = "Tremul" ' test tremulanten Task(%Qt_Trem).cptr = CODEPTR(Qt_Trem) Task(%Qt_Trem).freq = 20 Task(%Qt_Trem).flags = %False TaskEx(%Qt_Trem).stopcptr = CODEPTR(Qt_Trem_Stop) Task(%Qt_Presmod).naam = "PresMod" ' test pressure modulation speed Task(%Qt_Presmod).cptr = CODEPTR(Qt_Presmod) Task(%Qt_Presmod).freq = 6 Task(%Qt_Presmod).flags = %False Task(%Qt_K1).naam = "K1" Task(%Qt_K1).cptr = CODEPTR(Qt_K1) Task(%Qt_K1).freq = 10 Task(%Qt_K1).flags = %False TaskEX(%Qt_K1).stopcptr = CODEPTR(Qt_K1_Stop) Task(%Qt_Q1).naam = "Q1" Task(%Qt_Q1).cptr = CODEPTR(Qt_Q1) Task(%Qt_Q1).freq = 10 Task(%Qt_Q1).flags = %False TaskEX(%Qt_Q1).stopcptr = CODEPTR(Qt_Q1_Stop) Task(%Qt_K2).naam = "K2" Task(%Qt_K2).cptr = CODEPTR(Qt_K2) Task(%Qt_K2).freq = 10 Task(%Qt_K2).flags = %False TaskEX(%Qt_K2).stopcptr = CODEPTR(Qt_K2_Stop) Task(%Qt_Q2).naam = "Q2" Task(%Qt_Q2).cptr = CODEPTR(Qt_Q2) Task(%Qt_Q2).freq = 10 Task(%Qt_Q2).flags = %False TaskEX(%Qt_Q2).stopcptr = CODEPTR(Qt_Q2_Stop) Task(%Qt_K3).naam = "K3" Task(%Qt_K3).cptr = CODEPTR(Qt_K3) Task(%Qt_K3).freq = 10 Task(%Qt_K3).flags = %False TaskEX(%Qt_K3).stopcptr = CODEPTR(Qt_K3_Stop) Task(%Qt_Q3).naam = "Q3" Task(%Qt_Q3).cptr = CODEPTR(Qt_Q3) Task(%Qt_Q3).freq = 10 Task(%Qt_Q3).flags = %False TaskEX(%Qt_Q3).stopcptr = CODEPTR(Qt_Q3_Stop) Task(%Qt_K4).naam = "K4" Task(%Qt_K4).cptr = CODEPTR(Qt_K4) Task(%Qt_K4).freq = 10 Task(%Qt_K4).flags = %False TaskEX(%Qt_K4).stopcptr = CODEPTR(Qt_K4_Stop) Task(%Qt_Q4).naam = "Q4" Task(%Qt_Q4).cptr = CODEPTR(Qt_Q4) Task(%Qt_Q4).freq = 10 Task(%Qt_Q4).flags = %False TaskEX(%Qt_Q4).stopcptr = CODEPTR(Qt_Q4_Stop) Task(%Qt_K5).naam = "K5" Task(%Qt_K5).cptr = CODEPTR(Qt_K5) Task(%Qt_K5).freq = 10 Task(%Qt_K5).flags = %False TaskEX(%Qt_K5).stopcptr = CODEPTR(Qt_K5_Stop) Task(%Qt_Q5).naam = "Q5" Task(%Qt_Q5).cptr = CODEPTR(Qt_Q5) Task(%Qt_Q5).freq = 10 Task(%Qt_Q5).flags = %False TaskEX(%Qt_Q5).stopcptr = CODEPTR(Qt_Q5_Stop) Task(%Qt_K6).naam = "K6" Task(%Qt_K6).cptr = CODEPTR(Qt_K6) Task(%Qt_K6).freq = 10 Task(%Qt_K6).flags = %False TaskEX(%Qt_K6).stopcptr = CODEPTR(Qt_K6_Stop) Task(%Qt_Q6).naam = "Q6" Task(%Qt_Q6).cptr = CODEPTR(Qt_Q6) Task(%Qt_Q6).freq = 10 Task(%Qt_Q6).flags = %False TaskEX(%Qt_Q6).stopcptr = CODEPTR(Qt_Q6_Stop) Task(%Qt_qh).naam="QHartest" Task(%qt_qh).freq = 8 Task(%qt_qh).cptr = CODEPTR(QharTest) TaskEx(%qt_qh).startcptr = CODEPTR(MM_Qt_On) TaskEx(%qt_qh).stopcptr = CODEPTR(MM_AllOff) Task(%MM_SysxTask).naam = "SendSysx" Task(%MM_SysxTask).freq = .33 Task(%MM_SysxTask).cptr = CODEPTR(MM_Sysx) 'in m_robots.inc ButnSW(2).tag0 = "QtCtrl tog" ButnSW(2).tag1 = "QtCtrl tog" ButnSW(2).cptr = CODEPTR(Qt_Controlroom) ' tests for initialisation for quartertone harmony in g_mus.dll ' following now no longer required. Init is automatic in g_har.dll ' LOCAL dis AS SINGLE ' dis = Qdis (60,61) ' forces calculation of the loopup in the library ' retval = Qhar_Init ' returns a pointer to the QAkuHar lookup structures Task(%Qt_Riley).naam = "Riley1" Task(%Qt_Riley).cptr = CODEPTR(Qt_Riley_1) Task(%Qt_Riley).freq = 6 Task(%Qt_Riley).flags = %False TaskEX(%Qt_Riley).stopcptr = CODEPTR(Qt_Riley_1_stop) TaskEX(%Qt_Riley).startcptr = CODEPTR(MM_Qt_On) Task(%Qt_Riley+1).naam = "Riley2" Task(%Qt_Riley+1).cptr = CODEPTR(Qt_Riley_2) Task(%Qt_Riley+1).freq = 6 Task(%Qt_Riley+1).flags = %False TaskEX(%Qt_Riley+1).stopcptr = CODEPTR(Qt_Riley_2_stop) Task(%Qt_Riley+2).naam = "Riley3" Task(%Qt_Riley+2).cptr = CODEPTR(Qt_Riley_3) Task(%Qt_Riley+2).freq = 6 Task(%Qt_Riley+2).flags = %False TaskEX(%Qt_Riley+2).stopcptr = CODEPTR(Qt_Riley_3_stop) Task(%Qt_Riley+3).naam = "Riley4" Task(%Qt_Riley+3).cptr = CODEPTR(Qt_Riley_4) Task(%Qt_Riley+3).freq = 6 Task(%Qt_Riley+3).flags = %False TaskEX(%Qt_Riley+3).stopcptr = CODEPTR(Qt_Riley_4_stop) Task(%Qt_Riley+4).naam = "Riley5" Task(%Qt_Riley+4).cptr = CODEPTR(Qt_Riley_5) Task(%Qt_Riley+4).freq = 6 Task(%Qt_Riley+4).flags = %False TaskEX(%Qt_Riley+4).stopcptr = CODEPTR(Qt_Riley_5_stop) Task(%Qt_Riley+5).naam = "Riley6" Task(%Qt_Riley+5).cptr = CODEPTR(Qt_Riley_6) Task(%Qt_Riley+5).freq = 6 Task(%Qt_Riley+5).flags = %False TaskEX(%Qt_Riley+5).stopcptr = CODEPTR(Qt_Riley_6_stop) Task(%Qt_Riley+6).naam = "Riley7" Task(%Qt_Riley+6).cptr = CODEPTR(Qt_Riley_7) Task(%Qt_Riley+6).freq = 6 Task(%Qt_Riley+6).flags = %False TaskEX(%Qt_Riley+6).stopcptr = CODEPTR(Qt_Riley_7_stop) Task(%Qt_Riley+7).naam = "Riley8" Task(%Qt_Riley+7).cptr = CODEPTR(Qt_Riley_8) Task(%Qt_Riley+7).freq = 6 Task(%Qt_Riley+7).flags = %False TaskEX(%Qt_Riley+7).stopcptr = CODEPTR(Qt_Riley_8_stop) Task(%Qt_Riley+8).naam = "Riley9" Task(%Qt_Riley+8).cptr = CODEPTR(Qt_Riley_9) Task(%Qt_Riley+8).freq = 6 Task(%Qt_Riley+8).flags = %False TaskEX(%Qt_Riley+8).stopcptr = CODEPTR(Qt_Riley_9_stop) Task(%Qt_Riley+9).naam = "Riley10" Task(%Qt_Riley+9).cptr = CODEPTR(Qt_Riley_10) Task(%Qt_Riley+9).freq = 6 Task(%Qt_Riley+9).flags = %False TaskEX(%Qt_Riley+9).stopcptr = CODEPTR(Qt_Riley_10_stop) Task(%Qt_Riley+10).naam = "Riley11" Task(%Qt_Riley+10).cptr = CODEPTR(Qt_Riley_11) Task(%Qt_Riley+10).freq = 6 Task(%Qt_Riley+10).flags = %False TaskEX(%Qt_Riley+10).stopcptr = CODEPTR(Qt_Riley_11_stop) Task(%Qt_Riley+11).naam = "Riley12" Task(%Qt_Riley+11).cptr = CODEPTR(Qt_Riley_12) Task(%Qt_Riley+11).freq = 6 Task(%Qt_Riley+11).flags = %False TaskEX(%Qt_Riley+11).stopcptr = CODEPTR(Qt_Riley_12_stop) Task(%Qt_Riley+12).naam = "Riley13" Task(%Qt_Riley+12).cptr = CODEPTR(Qt_Riley_13) Task(%Qt_Riley+12).freq = 6 Task(%Qt_Riley+12).flags = %False TaskEX(%Qt_Riley+12).stopcptr = CODEPTR(Qt_Riley_13_stop) Task(%Qt_Riley+13).naam = "Riley14" Task(%Qt_Riley+13).cptr = CODEPTR(Qt_Riley_14) Task(%Qt_Riley+13).freq = 6 Task(%Qt_Riley+13).flags = %False TaskEX(%Qt_Riley+13).stopcptr = CODEPTR(Qt_Riley_14_stop) Task(%Qt_Riley+14).naam = "Riley15" Task(%Qt_Riley+14).cptr = CODEPTR(Qt_Riley_15) Task(%Qt_Riley+14).freq = 6 Task(%Qt_Riley+14).flags = %False TaskEX(%Qt_Riley+14).stopcptr = CODEPTR(Qt_Riley_15_stop) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %True END FUNCTION SUB Qt_Test () ' test for Qt ' can be used to test quartertone scales as well as repetition speed. STATIC k AS LONG STATIC n AS CUR STATIC slnr AS BYTE STATIC wind AS BYTE STATIC noot AS CUR STATIC knote AS INTEGER STATIC qnote AS INTEGER LOCAL velo AS INTEGER LOCAL highnote AS CUR LOCAL lownote AS CUR IF ISFALSE Task(%Qt_Test).tog THEN DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" TaskParamLabels(2) = "HiLim" TaskParamLabels(3) = "LoLim" IF ISFALSE Task(%Qt_Test).hParam THEN MakeTaskParameterDialog %Qt_Test,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Test).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 32 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value UDctrl(TaskEx(%Qt_Test).UpdownNumbers(0)).cptr = CODEPTR(Qt_HiLim_UD) UDctrl(TaskEx(%Qt_Test).UpdownNumbers(0)).value = Qt.HighTes * 2 UDctrl(TaskEx(%Qt_Test).UpdownNumbers(0)).minval = Qt.Lowtes * 2 UDctrl(TaskEx(%Qt_Test).UpdownNumbers(0)).maxval = Qt.HighTes * 2 UDctrl(TaskEx(%Qt_Test).UpdownNumbers(1)).cptr = CODEPTR(Qt_LoLim_UD) UDctrl(TaskEx(%Qt_Test).UpdownNumbers(1)).value = QT.Lowtes * 2 UDctrl(TaskEx(%Qt_Test).UpdownNumbers(1)).minval = Qt.Lowtes * 2 UDctrl(TaskEx(%Qt_Test).UpdownNumbers(1)).maxval = Qt.HighTes * 2 noot = (Qt.lowtes * 2)-1 END IF IF ISFALSE Task(%Qt_Motor).tog THEN starttask %Qt_Motor END IF Task(%Qt_Test).tog = %True END IF velo = Slider(slnr+1).value highnote = UDctrl(TaskEx(%Qt_Test).UpdownNumbers(0)).value '/ 2.0 lownote = UDctrl(TaskEx(%Qt_Test).UpdownNumbers(1)).value '/ 2.0 IF k THEN IF knote THEN NoteOff Qt.channel, knote knote = %False END IF IF Qnote THEN NoteOff Qt.channel + 1, Qnote Qnote = %False END IF ELSE ' note on's noot = noot + 1 '+ 0.5 IF noot > highnote THEN noot = lownote IF noot < lownote THEN noot = lownote IF noot MOD 2 THEN ' kwarttoon IF velo THEN Qnote = noot \ 2 Play Qt.channel + 1, Qnote, velo END IF ELSE ' normale noot IF velo THEN Knote = noot \ 2 Play Qt.channel, Knote, velo END IF END IF END IF INCR k ' on/off counter k = k MOD 2 Task(%Qt_Test).freq = 32! * (Slider(slnr).value) / 128! IF Task(%Qt_Test).freq < 0.5 THEN Task(%Qt_Test).freq = 0.5 END SUB SUB Qt_Hilim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Test).UpdownNumbers(0) n = UDCtrl(udnr).value IF n > Qt.Hightes * 2 THEN UDctrl(udnr).value = Qt.Hightes *2 n = Qt.Hightes * 2 END IF IF n < UDCtrl(TaskEX(%Qt_Test).UpdownNumbers(1)).value THEN n = UDCtrl(TaskEX(%Qt_Test).UpdownNumbers(1)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Test).hparam, %GMT_TEXT0_ID + 16, STR$(n / 2.0) END SUB SUB Qt_LoLim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Test).UpdownNumbers(1) n = UDCtrl(udnr).value IF n < Qt.Lowtes * 2 THEN UDctrl(udnr).value = Qt.Lowtes * 2 n = Qt.Lowtes * 2 END IF IF n > UDCtrl(TaskEX(%Qt_Test).UpdownNumbers(0)).value THEN n = UDCtrl(TaskEX(%Qt_Test).UpdownNumbers(0)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Test).hparam, %GMT_TEXT0_ID + 17, STR$(n / 2.0) END SUB SUB Qt_Test_Stop () MM_Qt_Off %MM_Notes END SUB SUB Qt_Motor () ' motor ctrl. test task STATIC slnr AS DWORD IF ISFALSE Task(%Qt_Motor).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Wind" TaskParamLabels(1) = "On/Off" IF ISFALSE Task(%Qt_Motor).hParam THEN MakeTaskParameterDialog %Qt_Motor,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Qt_Motor).SliderNumbers(0) ' send default startup value: %MM_Qt_Motor Slider(slnr).value = %MM_Qt_Motor SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value UDctrl(TaskEX(%Qt_Motor).UpdownNumbers(0)).cptr = CODEPTR(Qt_Motor_UD) UDctrl(TaskEX(%Qt_Motor).UpDownNumbers(0)).value = %True END IF Task(%Qt_Motor).freq = 7 Task(%Qt_Motor).tog = %True END IF IF Slider(slnr).value <> Qt.ctrl(7) THEN Controller Qt.channel, 7, Slider(slnr).value ' implemented 29.07.2006 - works on both channels Qt.ctrl(7) = slider(slnr).value END IF END SUB SUB Qt_Motor_UD () ' controls motor on off switch - implemented in PIC 29.07.2006, works on both channels LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Qt_Motor).UpDownNumbers(0) n = UDCtrl(udnr).value IF n < 1 THEN UDctrl(udnr).value = 0 : n = 0 IF n > 1 THEN UDctrl(udnr).value = 1 : n = 1 IF ISFALSE n THEN Controller Qt.channel, 66, %False Qt.ctrl(66) = %False SetDlgItemText Task(%Qt_Motor).hparam, %GMT_TEXT0_ID + 16, "Off" ELSE Controller Qt.channel, 66, 127 Qt.ctrl(66) = %True SetDlgItemText Task(%Qt_Motor).hparam, %GMT_TEXT0_ID + 16, "On" END IF END SUB SUB Qt_Repeats () ' should do note by note, continuous - legato - staccato ' for evaluation of note repetition rates STATIC slnr AS LONG STATIC oldnote AS CUR STATIC cnt AS LONG LOCAL n AS CUR LOCAL velo AS INTEGER LOCAL onoff AS SINGLE LOCAL period AS SINGLE IF ISFALSE Task(%Qt_Repeats).tog THEN DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "0/1" ' puls pause verhouding TaskParamLabels(2) = "Velo" TaskParamLabels(3) = "Note" ' note UD IF ISFALSE Task(%Qt_Repeats).hParam THEN MakeTaskParameterDialog %Qt_Repeats,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Repeats).SliderNumbers(0) ' tempo ' send default startup value: Slider(slnr).value = 6 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' 50% duty cycle Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value Slider(slnr+2).value = 12 ' velo setting at startup Sendmessage Slider(slnr+2).h, %TBM_SETPOS, %True, Slider(slnr+1).value UDctrl(TaskEX(%Qt_Repeats).UpdownNumbers(0)).cptr = CODEPTR(Qt_RepNote_UD) UDctrl(TaskEX(%Qt_Repeats).UpDownNumbers(0)).value = 120 'Qt.Lowtes * 2 UDctrl(TaskEx(%Qt_Repeats).UpdownNumbers(0)).minval = Qt.Lowtes * 2 UDctrl(TaskEx(%Qt_Repeats).UpdownNumbers(0)).maxval = Qt.HighTes * 2 END IF Task(%Qt_Repeats).tog = %True END IF n = UDctrl(TaskEX(%Qt_Repeats).UpDownNumbers(0)).value ' counts 72 - 216 velo = Slider(slnr+2).value OnOff = Slider(slnr+1).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 cnt THEN ' noot aan IF n MOD 2 THEN ' odd = quartertones Play Qt.channel+1, FIX(n/2), velo oldnote = n ELSE ' even = normal tones Play Qt.channel, FIX(n/2), velo oldnote = n END IF ' aan-tijd: period = period * OnOff ' slider(slnr+1).value= 127 is 100% ON, so no pause ' = 0 is 99% pause ELSE IF oldnote MOD 2 THEN NoteOff Qt.channel+1, FIX(oldnote/2) oldnote = %False ELSE NoteOff Qt.channel, FIX(oldnote/2) oldnote = %False END IF ' uit-tijd: period = period * (1! - OnOff) END IF INCR cnt IF cnt > 1 THEN cnt = %False ' puls-pause kode: Task(%Qt_Repeats).freq = MAX(MIN(1! / period, 1000),0.5) 'Task(%Qt_Repeats).freq = Slider(slnr).value / 5! 'IF Task(%Qt_Repeats).freq < 0.5 THEN Task(%Qt_Repeats).freq = 0.5 END SUB SUB Qt_RepNote_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Repeats).UpdownNumbers(0) n = UDCtrl(udnr).value IF n > Qt.Hightes * 2 THEN UDctrl(udnr).value = Qt.Hightes *2 n = Qt.Hightes * 2 END IF IF n < Qt.Lowtes * 2 THEN UDctrl(udnr).value = Qt.lowtes * 2 n = Qt.lowtes * 2 END IF SetDlgItemText Task(%Qt_Repeats).hparam, %GMT_TEXT0_ID + 16, STR$(n / 2.0) END SUB SUB Qt_Lights () STATIC cnt AS DWORD STATIC slnr AS DWORD IF ISFALSE Task(%Qt_lights).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Qt_lights).hParam THEN MakeTaskParameterDialog %Qt_Lights,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Lights).SliderNumbers(0) ' send default startup value: Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF cnt = %False Task(%Qt_Lights).tog = %True END IF ' 24V lights on the windchest - 50% duty cycle code IF cnt MOD 6 < 3 THEN Play Qt.channel, 35, 127 ELSE NoteOff Qt.channel, 35 END IF IF cnt MOD 8 < 4 THEN Play Qt.channel +1, 35, 127 ELSE NoteOff Qt.channel +1, 35 END IF IF cnt MOD 7 < 4 THEN Play Qt.channel, 110, 127 ELSE NoteOff Qt.channel, 110 END IF IF cnt MOD 5 < 3 THEN Play Qt.channel, 111, 127 ELSE NoteOff Qt.channel, 111 END IF IF cnt MOD 9 < 5 THEN Play Qt.channel + 1, 111, 127 ELSE NoteOff Qt.channel + 1, 111 END IF IF cnt MOD 10 < 5 THEN Play Qt.channel , 120, 127 ' bim box blue - implemented 29.07.2006 ELSE NoteOff Qt.channel, 120 END IF ' dim lites: Controller Qt.channel, 8, 64 + ((SIN(cnt/ 10)) * 63) ' works INCR cnt Task(%Qt_Lights).freq = MAX(Slider(slnr).value,1) END SUB SUB Qt_lights_Stop () MM_Qt_off %MM_Lights END SUB SUB Qt_Scales () ' Normal chromatic scale ' 2 UD's: 1 for lownote ,one for highnote STATIC slnr AS BYTE STATIC note AS INTEGER STATIC oldnote AS INTEGER IF ISFALSE Task(%Qt_Scales).tog THEN Task(%Qt_Scales).tog = %True DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Velo" TaskParamLabels(2) = "High" TaskParamLabels(3) = "Low" IF ISFALSE Task(%Qt_Scales).hParam THEN MakeTaskParameterDialog %Qt_Scales,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Scales).SliderNumbers(0) ' send default startup value: Slider(slnr).value = 32 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 16 Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value ' action for ud's handled in their callback only UDctrl(TaskEX(%Qt_Scales).UpdownNumbers(0)).cptr = CODEPTR(Qt_Sc_HiLim_UD) UDctrl(TaskEX(%Qt_Scales).UpDownNumbers(0)).value = 108 UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(0)).minval = Qt.Lowtes UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(0)).maxval = Qt.hightes UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).cptr = CODEPTR(Qt_Sc_LoLim_UD) UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).value = 36 UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).minval = Qt.lowtes UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).maxval = Qt.hightes END IF note = UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).value END IF IF oldnote THEN NoteOff Qt.channel, oldnote oldnote = %False END IF Play Qt.channel, note, Slider(slnr+1).value oldnote = note INCR note IF note > UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(0)).value THEN note = UDctrl(TaskEx(%Qt_Scales).UpdownNumbers(1)).value Task(%Qt_Scales).freq = MAX(slider(slnr).value / 4, 0.25) END SUB SUB Qt_Sc_LoLim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Scales).UpdownNumbers(1) n = UDCtrl(udnr).value IF n < Qt.Lowtes THEN UDctrl(udnr).value = Qt.Lowtes n = Qt.Lowtes END IF IF n > UDCtrl(TaskEX(%Qt_Scales).UpdownNumbers(0)).value THEN n = UDCtrl(TaskEX(%Qt_Scales).UpdownNumbers(0)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Scales).hparam, %GMT_TEXT0_ID + 17, STR$(n) END SUB SUB Qt_Sc_HiLim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Scales).UpdownNumbers(0) n = UDCtrl(udnr).value IF n > Qt.Hightes THEN UDctrl(udnr).value = Qt.Hightes n = Qt.Hightes END IF IF n < UDCtrl(TaskEX(%Qt_Scales).UpdownNumbers(1)).value THEN n = UDCtrl(TaskEX(%Qt_Scales).UpdownNumbers(1)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Scales).hparam, %GMT_TEXT0_ID + 16, STR$(n) END SUB SUB Qt_Scaleq () ' quartertone higher chromatic scale ' 2 UD's: 1 for lownote ,one for highnote STATIC slnr AS BYTE STATIC note AS INTEGER STATIC oldnote AS INTEGER IF ISFALSE Task(%Qt_Scaleq).tog THEN Task(%Qt_Scaleq).tog = %True DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamLabels(1) = "Velo" TaskParamLabels(2) = "High" TaskParamLabels(3) = "Low" IF ISFALSE Task(%Qt_Scaleq).hParam THEN MakeTaskParameterDialog %Qt_Scaleq,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Scaleq).SliderNumbers(0) ' send default startup value: Slider(slnr).value = 32 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 16 Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value ' action for ud's handled in their callback only UDctrl(TaskEX(%Qt_Scaleq).UpdownNumbers(0)).cptr = CODEPTR(Qt_Scq_HiLim_UD) UDctrl(TaskEX(%Qt_Scaleq).UpDownNumbers(0)).value = 108 UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(0)).minval = Qt.lowtes UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(0)).maxval = Qt.Hightes UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).cptr = CODEPTR(Qt_Scq_LoLim_UD) UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).value = 36 UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).minval = Qt.Lowtes UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).maxval = Qt.Hightes END IF IF ISFALSE note THEN note = UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).value END IF IF oldnote THEN NoteOff Qt.channel+1, oldnote oldnote = %False END IF Play Qt.channel+1, note, Slider(slnr+1).value oldnote = note INCR note IF note > UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(0)).value THEN note = UDctrl(TaskEx(%Qt_Scaleq).UpdownNumbers(1)).value Task(%Qt_Scaleq).freq = MAX(slider(slnr).value / 4, 0.25) END SUB SUB Qt_Scq_LoLim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Scaleq).UpdownNumbers(1) n = UDCtrl(udnr).value IF n < Qt.Lowtes THEN UDctrl(udnr).value = Qt.Lowtes n = Qt.Lowtes END IF IF n > UDCtrl(TaskEX(%Qt_Scaleq).UpdownNumbers(0)).value THEN n = UDCtrl(TaskEX(%Qt_Scaleq).UpdownNumbers(0)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Scaleq).hparam, %GMT_TEXT0_ID + 17, STR$(n) END SUB SUB Qt_Scq_HiLim_UD () LOCAL udnr AS DWORD LOCAL n AS LONG udnr = TaskEx(%Qt_Scaleq).UpdownNumbers(0) n = UDCtrl(udnr).value IF n > Qt.Hightes THEN UDctrl(udnr).value = Qt.Hightes n = Qt.Hightes END IF IF n < UDCtrl(TaskEX(%Qt_Scaleq).UpdownNumbers(1)).value THEN n = UDCtrl(TaskEX(%Qt_Scaleq).UpdownNumbers(1)).value UDctrl(udnr).value = n END IF SetDlgItemText Task(%Qt_Scaleq).hparam, %GMT_TEXT0_ID + 16, STR$(n) END SUB SUB Qt_Trem () ' test voor de tremulanten in rotatie modus - CW rotation only. STATIC slnr AS BYTE IF ISFALSE Task(%Qt_Trem).tog THEN Task(%Qt_Trem).tog = %True DIM TaskParamLabels(0 TO 3) AS ASCIIZ * 8 TaskParamLabels(0) = "LTrem" TaskParamLabels(1) = "HTrem" ' not yet functional. Both motors take ctrl 11. TaskParamLabels(2) = "L-on/off" ' functional and working TaskParamLabels(3) = "H-on/off" ' functional and working IF ISFALSE Task(%Qt_Trem).hParam THEN MakeTaskParameterDialog %Qt_Trem,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Trem).SliderNumbers(0) ' send default startup value: 0 Slider(slnr).value = %False SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = %False Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value ' action for ud's handled in their callback only UDctrl(TaskEX(%Qt_Trem).UpdownNumbers(0)).cptr = CODEPTR(Qt_LTrem_Power_UD) UDctrl(TaskEX(%Qt_Trem).UpDownNumbers(0)).value = %False UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(0)).minval = 0 UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(0)).maxval = 1 UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(1)).cptr = CODEPTR(Qt_HTrem_Power_UD) UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(1)).value = %False UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(1)).minval = 0 UDctrl(TaskEx(%Qt_Trem).UpdownNumbers(1)).maxval = 1 END IF END IF IF Slider(slnr).value <> Qt.ctrl(12) THEN 'low windchest motor slider Controller Qt.channel, 12, Slider(slnr).value ' implemented 29.07.2006 Qt.ctrl(12) = Slider(slnr).value END IF IF Slider(slnr+1).value <> Qt.ctrl(11) THEN ' high motor windchest Controller Qt.channel, 11, Slider(slnr+1).value ' not yet implemented 03.08.2006 Qt.ctrl(11) = Slider(slnr+1).value END IF END SUB SUB Qt_Trem_Stop() Controller Qt.channel, 11, %False ' disables motor power at the same time Controller Qt.channel, 12, %False Qt.ctrl(11) = %False Qt.ctrl(12) = %False Controller Qt.channel, 67, %False ' implemented 03.08.2006 Controller Qt.channel, 68, %False Qt.ctrl(67)= %False Qt.ctrl(68) = %False END SUB SUB Qt_LTrem_Power_UD () ' controls low tremulant motor on off switch - implemented in PIC 03.08.2006, works on both channels LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Qt_Trem).UpDownNumbers(0) n = UDCtrl(udnr).value IF ISFALSE n THEN Controller Qt.channel, 67, %False Qt.ctrl(67) = %False SetDlgItemText Task(%Qt_Trem).hparam, %GMT_TEXT0_ID + 16, "Off" ELSE Controller Qt.channel, 67, 127 Qt.ctrl(67) = %True SetDlgItemText Task(%Qt_Trem).hparam, %GMT_TEXT0_ID + 16, "On" END IF END SUB SUB Qt_HTrem_Power_UD () ' controls high tremulant motor on off switch - implemented in PIC 03.08.2006, works on both channels LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Qt_Trem).UpDownNumbers(1) n = UDCtrl(udnr).value IF ISFALSE n THEN Controller Qt.channel, 68, %False Qt.ctrl(68) = %False SetDlgItemText Task(%Qt_Trem).hparam, %GMT_TEXT0_ID + 17, "Off" ELSE Controller Qt.channel, 68, 127 Qt.ctrl(68) = %True SetDlgItemText Task(%Qt_Trem).hparam, %GMT_TEXT0_ID + 17, "On" END IF END SUB SUB Qt_K1 () ' test kode, also used as object in 'Wouwel' STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K1).tog THEN IF ISFALSE Wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K1).hParam THEN MakeTaskParameterDialog %Qt_K1,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K1).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K1).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K1).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(Qt.lowtes + (RND(1) * 12.0), 47) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K1).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 IF ISFALSE wou.k(1) THEN Play Qt.channel, oldnote, Task(%Qt_K1).level ' completely random END IF CASE < 24 oldnote = wou.k(1) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k1 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K1).level ELSE oldnote = %False END IF CASE ELSE IF wou.k(1) THEN oldnote = wou.k(1) Play Qt.channel, oldnote, Task(%Qt_K1).level END IF END SELECT 'Task(%Qt_K1).freq = wou.frq(1) 'range 1 - 32 END IF END SUB SUB Qt_K1_Stop () LOCAL i AS LONG FOR i = 36 TO 47 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q1 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q1).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q1).hParam THEN MakeTaskParameterDialog %Qt_Q1,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q1).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q1).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q1).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(Qt.lowtes + (RND(1) * 12.0), 47) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q1).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q1).level CASE >1, < 24 IF wou.q(1) THEN oldnote = wou.q(1) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k1 IF oldnote >= Qt.lowtes THEN Play Qt.channel + 1, oldnote, Task(%Qt_Q1).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 4 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q1).level END IF END IF CASE >= 24 IF wou.q(1) THEN oldnote = wou.q(1) Play Qt.channel+1, oldnote, Task(%Qt_Q1).level END IF END SELECT END IF END SUB SUB Qt_Q1_Stop () LOCAL i AS LONG FOR i = 36 TO 47 Play Qt.channel+1, i, %False NEXT i END SUB SUB Qt_K2 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K2).tog THEN IF ISFALSE Wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K2).hParam THEN MakeTaskParameterDialog %Qt_K2,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K2).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K2).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K2).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(48 + (RND(1) * 14.0), 61) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K2).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel, oldnote, Task(%Qt_K2).level CASE >1, <24 IF wou.k(2) THEN oldnote = wou.k(2) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k2 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K2).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 6 THEN Play Qt.channel, oldnote, Task(%Qt_K2).level END IF END IF CASE ELSE IF wou.k(2) THEN oldnote = wou.k(2) Play Qt.channel, oldnote, Task(%Qt_K2).level END IF END SELECT END IF END SUB SUB Qt_K2_Stop () LOCAL i AS LONG FOR i = 48 TO 61 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q2 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q2).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q2).hParam THEN MakeTaskParameterDialog %Qt_Q2,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q2).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q2).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q2).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(48 + (RND(1) * 14.0), 61) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q2).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q2).level CASE < 24 IF wou.q(2) THEN oldnote = wou.q(2) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.q2 IF oldnote >= Qt.lowtes THEN Play Qt.channel+1, oldnote, Task(%Qt_Q2).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 6 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q2).level END IF END IF CASE >=24 IF wou.q(2) THEN oldnote = wou.q(2) Play Qt.channel+1, oldnote, Task(%Qt_Q2).level END IF END SELECT END IF END SUB SUB Qt_Q2_Stop () LOCAL i AS LONG FOR i = 48 TO 61 Play Qt.channel+1, i, %False NEXT i END SUB SUB Qt_K3 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K3).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K3).hParam THEN MakeTaskParameterDialog %Qt_K3,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K3).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K3).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K3).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(62 + (RND(1) * 14.0), 75) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K3).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <=1 Play Qt.channel, oldnote, Task(%Qt_K3).level CASE < 24 IF wou.k(3) THEN oldnote = wou.k(3) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k3 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K3).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 8 THEN Play Qt.channel, oldnote, Task(%Qt_K3).level END IF END IF CASE ELSE IF wou.k(3) THEN oldnote = wou.k(3) Play Qt.channel, oldnote, Task(%Qt_K3).level END IF END SELECT END IF END SUB SUB Qt_K3_Stop () LOCAL i AS LONG FOR i = 62 TO 75 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q3 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q3).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q3).hParam THEN MakeTaskParameterDialog %Qt_Q3,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q3).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q3).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q3).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(62 + (RND(1) * 14.0), 75) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q3).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q3).level CASE < 24 IF wou.q(3) THEN oldnote = wou.q(3) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.q6 IF oldnote >= Qt.lowtes THEN Play Qt.channel+1, oldnote, Task(%Qt_Q3).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 8 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q3).level END IF END IF CASE ELSE IF wou.q(3) THEN oldnote = wou.q(3) Play Qt.channel+1, oldnote, Task(%Qt_Q3).level END IF END SELECT END IF END SUB SUB Qt_Q3_Stop () LOCAL i AS LONG FOR i = 62 TO 75 Play Qt.channel+1, i, %False NEXT i END SUB SUB Qt_K4 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K4).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K4).hParam THEN MakeTaskParameterDialog %Qt_K4,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K4).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K4).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K4).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(76 + (RND(1) * 14.0), 89) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K4).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel, oldnote, Task(%Qt_K4).level CASE < 24 IF wou.k(4) THEN oldnote = wou.k(4) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k1 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K4).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 10 THEN Play Qt.channel, oldnote, Task(%Qt_K4).level END IF END IF CASE ELSE IF wou.k(4) THEN oldnote = wou.k(4) play qt.channel, oldnote, Task(%Qt_K4).level END IF END SELECT END IF END SUB SUB Qt_K4_Stop () LOCAL i AS LONG FOR i = 76 TO 89 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q4 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q4).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q4).hParam THEN MakeTaskParameterDialog %Qt_Q4,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q4).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q4).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q4).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(76 + (RND(1) * 14.0), 89) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q4).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q4).level CASE < 24 IF wou.q(4) THEN oldnote = wou.q(4) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.q4 IF oldnote >= Qt.lowtes THEN Play Qt.channel+1, oldnote, Task(%Qt_Q4).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 10 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q4).level END IF END IF CASE ELSE IF wou.q(4) THEN oldnote = wou.q(4) Play Qt.channel+1, oldnote, Task(%Qt_Q4).level END IF END SELECT END IF END SUB SUB Qt_Q4_Stop () LOCAL i AS LONG FOR i = 76 TO 89 Play Qt.channel+1, i, %False NEXT i END SUB SUB Qt_K5 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K5).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K5).hParam THEN MakeTaskParameterDialog %Qt_K5,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K5).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K5).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K5).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(90 + (RND(1) * 14.0), 104) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K5).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <=1 Play Qt.channel, oldnote, Task(%Qt_K5).level CASE < 24 IF wou.k(5) THEN oldnote = wou.k(5) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k5 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K5).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 12 THEN Play Qt.channel, oldnote, Task(%Qt_K5).level END IF END IF CASE ELSE IF wou.k(5) THEN oldnote = wou.k(5) Play Qt.channel, oldnote, Task(%Qt_K5).level END IF END SELECT END IF END SUB SUB Qt_K5_Stop () LOCAL i AS LONG FOR i = 90 TO 104 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q5 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q5).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q5).hParam THEN MakeTaskParameterDialog %Qt_Q5,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q5).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q5).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q5).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(90 + (RND(1) * 14.0), 104) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q5).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q5).level CASE < 24 IF wou.q(5) THEN oldnote = wou.q(5) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.q6 IF oldnote >= Qt.lowtes THEN Play Qt.channel+1, oldnote, Task(%Qt_Q5).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 12 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q5).level END IF END IF CASE ELSE IF wou.q(5) THEN oldnote = wou.q(5) Play Qt.channel+1, oldnote, Task(%Qt_Q5).level END IF END SELECT END IF END SUB SUB Qt_Q5_Stop () LOCAL i AS LONG FOR i = 90 TO 104 Play Qt.channel+1, i, %False NEXT i END SUB SUB Qt_K6 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_K6).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_K6).hParam THEN MakeTaskParameterDialog %Qt_K6,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_K6).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_K6).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_K6).tog = %True END IF IF oldnote THEN NoteOff Qt.channel, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(105 + (RND(1) * 4.0), 108) IF ISFALSE wou.aan THEN Play Qt.channel, oldnote, Slider(slnr+1).value Task(%Qt_K6).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <=1 Play Qt.channel, oldnote, Task(%Qt_K6).level CASE < 24 IF wou.k(6) THEN oldnote = wou.k(6) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.k6 IF oldnote >= Qt.lowtes THEN Play Qt.channel, oldnote, Task(%Qt_K6).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 14 THEN Play Qt.channel, oldnote, Task(%Qt_K6).level END IF END IF CASE ELSE IF wou.k(6) THEN oldnote = wou.k(6) Play Qt.channel, oldnote, Task(%Qt_K6).level END IF END SELECT END IF END SUB SUB Qt_K6_Stop () LOCAL i AS LONG FOR i = 105 TO 108 Play Qt.channel, i, %False NEXT i END SUB SUB Qt_Q6 () STATIC oldnote AS LONG STATIC slnr AS LONG IF ISFALSE Task(%Qt_Q6).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(0 TO 1) AS ASCIIZ * 8 TaskParamLabels(0) = "Tempo" TaskParamLabels(1) = "Velo" IF ISFALSE Task(%Qt_Q6).hParam THEN MakeTaskParameterDialog %Qt_Q6,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Q6).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value Slider(slnr+1).value = 64 ' velo setting at startup Sendmessage Slider(slnr+1).h, %TBM_SETPOS, %True, Slider(slnr+1).value END IF Task(%Qt_Q6).freq = 32! * (Slider(slnr).value + 1) / 128! END IF Task(%Qt_Q6).tog = %True END IF IF oldnote THEN NoteOff Qt.channel+1, Oldnote oldnote = %False EXIT SUB END IF oldnote = MIN(105 + (RND(1) * 3.0), 107) IF ISFALSE wou.aan THEN Play Qt.channel+1, oldnote, Slider(slnr+1).value Task(%Qt_Q6).freq = 32! * (Slider(slnr).value + 1) / 128! ELSE SELECT CASE wou.dex CASE <= 1 Play Qt.channel+1, oldnote, Task(%Qt_Q6).level CASE < 24 IF wou.q(6) THEN oldnote = wou.q(6) + ((SGN(RND(1) - 0.5) * (RND(1) ^ wou.dex)) * 6!) ' center on wou.q6 IF oldnote >= Qt.lowtes THEN Play Qt.channel+1, oldnote, Task(%Qt_Q6).level ELSE oldnote = %False END IF ELSE IF wou.sectioncounter < 14 THEN Play Qt.channel+1, oldnote, Task(%Qt_Q6).level END IF END IF CASE ELSE IF wou.q(6) THEN oldnote = wou.q(6) Play Qt.channel+1, oldnote, Task(%Qt_Q6).level END IF END SELECT END IF END SUB SUB Qt_Q6_Stop () LOCAL i AS LONG FOR i = 105 TO 107 Play Qt.channel+1, i, %False NEXT i END SUB SUB QT_controlroom LOCAL i AS LONG LOCAL x AS LONG LOCAL y AS LONG LOCAL hsl AS DWORD IF ISFALSE hwCtrlQT THEN DIALOG NEW 0, "QT Control",1,81 ,450, 164, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlQt x = 5 y = 12 FOR i = Qt.lowtes TO Qt.HighTes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlQt , i, "C", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "C+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlQt , i, "C#", x, y, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "C#+", x, y + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlQt , i, "D", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "D+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlQt , i, "D#", x, y, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "D#+", x, y + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlQt , i, "E", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "E+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlQt , i, "F", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "F+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlQt , i, "F#", x, y, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "F#+", x, y + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlQt , i, "G", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "G+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlQt , i, "G#", x, y, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "G#+", x, y + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlQt , i, "A", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "A+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlQt , i, "Bb", x, y, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "Bb+", x, y + 66, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlQt , i, "B", x, y + 12, 18, 12, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hwCtrlQt , i + 127, "B+", x, y + 12 + 66, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT IF x > 420 AND y < 30 THEN x = 5 y = y + 30 END IF NEXT CONTROL ADD LABEL, hwCtrlQT, 500, "velo:", 5, 147, 30, 12 CONTROL ADD "msctls_trackbar32", hwCtrlQt, 501, "velo", 36, 147, 135, 12, %WS_CHILD OR %WS_VISIBLE OR %TBS_HORZ OR %TBS_BOTTOM CONTROL HANDLE hwCtrlQt, 501 TO hsl SendMEssage hsl, %TBM_SETRANGE, 0, MAKLNG(1, 127) SendMessage hsl, %TBM_SETPOS, %true, 1 CONTROL ADD LABEL, hwCtrlQt, 503, "?", 174, 147, 30, 12 CONTROL ADD BUTTON, hwCtrlQt, 600, "All Off", 206, 147, 30, 12 DIALOG SHOW MODELESS hwCtrlQt CALL CB_Qt_Controlroom ELSE DIALOG END hwCtrlQt hwCtrlQt = 0 END IF END SUB CALLBACK FUNCTION CB_Qt_Controlroom LOCAL wind AS BYTE LOCAL i AS LONG LOCAL note AS BYTE STATIC velo AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE qt.Lowtes TO qt.hightes 'checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL Play qt.channel, note, i * velo CASE qt.lowtes + 127 TO qt.hightes + 127 'quartertones CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL - 127 Play qt.channel + 1, note, i * velo CASE 600 MM_Qt_Off FOR i = QT.lowtes TO Qt.hightes CONTROL SET CHECK CBHNDL, i, 0 CONTROL SET CHECK CBHNDL, i + 127, 0 NEXT CONTROL HANDLE CBHNDL, 501 TO i SendMessage i, %TBM_SETPOS, %true, 0 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 IF (LOWRD(CBWPARAM) = %TB_THUMBPOSITION) OR (LOWRD(CBWPARAM) = %TB_THUMBTRACK) THEN velo = HIWRD(CBWPARAM) ELSE velo = SendMessage (CBLPARAM, %TBM_GETPOS,%Null, %Null) END IF 'wind = wind * 1.27 CONTROL SET TEXT CBHNDL, 503, STR$(velo) 'qt.ctrl(7) = wind 'controller qt.channel, 7, qt.ctrl(7) 'MM_qt_On %MM_Motor CASE %WM_CLOSE, %WM_QUIT hwCtrlQt = 0 MM_Qt_Off END SELECT END FUNCTION SUB Qt_Q13 () STATIC cnt AS LONG STATIC startfreq AS SINGLE STATIC freq AS SINGLE STATIC n0 AS CUR STATIC n1 AS CUR STATIC n2 AS CUR STATIC velo AS LONG STATIC slnr AS LONG LOCAL i AS DWORD LOCAL noot AS LONG ' hier lopen we de kwintencirkel af in kwinten van 13 kwarttonen, te klein dus voor normale kwinten ' merk op dat we met 14-kwarttoons kwinten (normale) nooit bij kwarttonen kunnen uitkomen. ' In dit geval bestaan er 2 kwintencirkels die elkaar nooit raken naast elkaar. ' Bij te grote kwinten (15 kwarttonen) is de cirkel al rond na 8 noten en bestaan er dus 3 cirkels naast elkaar. IF ISFALSE Task(%Qt_Q13).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Qt_Q13).hParam THEN MakeTaskParameterDialog %Qt_Q13,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_q13).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF cnt = %False i = 0 velo = 32 startfreq = N2F(Qt.lowtes) ' 36 Task(%Qt_Q13).tog = %True END IF n0 = n1 n1 = n2 freq = startfreq * (2^(cnt/24)) cnt = (cnt + 13) MOD 24 n2 = F2NF(freq) IF n0 THEN ' oudste noot uitschakelen: IF (FRAC(n0) > 0.25) AND (FRAC(n0) < 0.75) THEN noot = FIX(n0) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n0) >= 0.75 THEN noot = FIX(n0) +1 DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n0) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' n1 blijft nu klinken... ' n2 voegen we toe: IF (FRAC(n2) > 0.25) AND (FRAC(n2) < 0.75) THEN noot = FIX(n2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n2) >= 0.75 THEN noot = FIX(n2) +1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF Task(%Qt_Q13).freq = Slider(slnr).value / 25 IF Task(%Qt_Q13).freq < 0.1 THEN task(%Qt_q13).freq = 0.1 END SUB SUB Qt_Q15 () STATIC cnt AS LONG STATIC startfreq AS SINGLE STATIC freq AS SINGLE STATIC n0 AS CUR STATIC n1 AS CUR STATIC n2 AS CUR STATIC velo AS LONG STATIC slnr AS LONG LOCAL i AS DWORD LOCAL noot AS LONG ' hier lopen we de kwintencirkel af in kwinten van 15 kwarttonen, te groot dus voor normale kwinten ' merk op dat we met 14-kwarttoons kwinten (normale) nooit bij kwarttonen kunnen uitkomen. ' In dit geval bestaan er 2 kwintencirkels die elkaar nooit raken naast elkaar. ' Bij te grote kwinten (15 kwarttonen) is de cirkel al rond na 8 noten en bestaan er dus 3 cirkels naast elkaar. IF ISFALSE Task(%Qt_Q15).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Qt_Q15).hParam THEN MakeTaskParameterDialog %Qt_Q15,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_q15).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF cnt = %False i = 0 velo = 32 startfreq = N2F(Qt.lowtes) ' 36, 36.5, 37 zijn de drie cirkels. Task(%Qt_Q15).tog = %True END IF n0 = n1 n1 = n2 freq = startfreq * (2^(cnt/24)) cnt = (cnt + 15) MOD 24 n2 = F2NF(freq) IF n0 THEN ' oudste noot uitschakelen: IF (FRAC(n0) > 0.25) AND (FRAC(n0) < 0.75) THEN noot = FIX(n0) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n0) >= 0.75 THEN noot = FIX(n0) +1 DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n0) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' n1 blijft nu klinken... ' n2 voegen we toe: IF (FRAC(n2) > 0.25) AND (FRAC(n2) < 0.75) THEN noot = FIX(n2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n2) >= 0.75 THEN noot = FIX(n2) +1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF Task(%Qt_Q15).freq = Slider(slnr).value / 25 IF Task(%Qt_Q15).freq < 0.1 THEN task(%Qt_q15).freq = 0.1 END SUB SUB Qt_Qjust () ' STATIC cnt AS LONG STATIC startfreq AS SINGLE STATIC freq AS SINGLE STATIC n0 AS CUR STATIC n1 AS CUR STATIC n2 AS CUR STATIC velo AS LONG STATIC slnr AS LONG LOCAL i AS DWORD LOCAL noot AS LONG ' hier lopen we de kwintencirkel af in juiste kwinten. We spelen slechts de op kwarttonen afgeronde ' toonhoogtes. Dezelfde noten komen meerdere keren voor en pas na 53 noten is de cirkel rond ' en hebben we alle kwarttonen gehoord. IF ISFALSE Task(%Qt_Qjust).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Qt_Qjust).hParam THEN MakeTaskParameterDialog %Qt_Qjust,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_qjust).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value END IF 'cnt = %False i = 0 velo = 32 startfreq = N2F(Qt.lowtes) ' 36 freq = startfreq Task(%Qt_Qjust).tog = %True END IF n0 = n1 n1 = n2 freq = freq * (3!/2!) ' zuivere kwinten IF freq > (startfreq * 2) THEN freq = freq / 2 n2 = F2NF(freq) IF n0 THEN ' oudste noot uitschakelen: IF (FRAC(n0) > 0.25) AND (FRAC(n0) < 0.75) THEN noot = FIX(n0) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n0) >= 0.75 THEN noot = FIX(n0) +1 DO NoteOff Qt.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n0) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' n1 blijft nu klinken... ' n2 voegen we toe: IF (FRAC(n2) > 0.25) AND (FRAC(n2) < 0.75) THEN noot = FIX(n2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n2) >= 0.75 THEN noot = FIX(n2) + 1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF Task(%Qt_Qjust).freq = Slider(slnr).value / 25 IF Task(%Qt_Qjust).freq < 0.1 THEN task(%Qt_qjust).freq = 0.1 END SUB SUB Qt_Triads () STATIC startfreq AS SINGLE STATIC freq AS SINGLE STATIC n0 AS CUR STATIC n1 AS CUR STATIC n2 AS CUR STATIC t0 AS CUR STATIC t1 AS CUR STATIC t2 AS CUR STATIC velo AS LONG STATIC slnr AS LONG STATIC udnr AS LONG LOCAL i AS DWORD LOCAL noot AS LONG ' hier lopen we de kwintencirkel af in juiste kwinten. We spelen slechts de op kwarttonen afgeronde ' toonhoogtes. Dezelfde noten komen meerdere keren voor en pas na 53 noten is de cirkel rond ' en hebben we alle kwarttonen gehoord. ' We voegen een van de vier mogelijke tertsen toe IF ISFALSE Task(%Qt_Triads).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamlabels(1) = "Third" IF ISFALSE Task(%Qt_Triads).hParam THEN MakeTaskParameterDialog %Qt_Triads,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF slnr = %False THEN slnr = TaskEX(%Qt_Triads).SliderNumbers(0) Slider(slnr).value = 20 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value UDctrl(TaskEX(%Qt_Triads).UpdownNumbers(0)).cptr = CODEPTR(Qt_Triads_UD) UDctrl(TaskEX(%Qt_Triads).UpDownNumbers(0)).value = 6 Udnr = TaskEX(%Qt_Triads).UpDownNumbers(0) END IF i = 0 velo = 32 startfreq = N2F(Qt.lowtes) ' 36 freq = startfreq Task(%Qt_Triads).tog = %True END IF n0 = n1 n1 = n2 t0 = t1 t1 = t2 freq = freq * (3!/2!) ' zuivere kwinten IF freq > (startfreq * 2) THEN freq = freq / 2 n2 = F2NF(freq) ' now calculate the triads on n1: ' exponent is 6,7,8 of 9 IF n1 THEN IF n1 < n2 THEN freq = NF2F(n1) * (2^(UDctrl(Udnr).value/ 24)) ' gelijkzwevend kwarttoons t2 = F2NF(freq) ELSE freq = NF2F(n2) * (2^(UDctrl(Udnr).value/ 24)) ' gelijkzwevend kwarttoons t2 = F2NF(freq) END IF END IF IF n0 THEN ' oudste noot uitschakelen: IF (FRAC(n0) > 0.25) AND (FRAC(n0) < 0.75) THEN noot = FIX(n0) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n0) >= 0.75 THEN noot = FIX(n0) + 1 DO NoteOff Qt.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n0) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' vorige terts uitschakelen: IF t1 THEN IF (FRAC(t1) > 0.25) AND (FRAC(t1) < 0.75) THEN noot = FIX(t1) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(t1) >= 0.75 THEN noot = FIX(t1) + 1 DO NoteOff Qt.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(t1) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' n1 blijft nu klinken... ' n2 voegen we toe: IF (FRAC(n2) > 0.25) AND (FRAC(n2) < 0.75) THEN noot = FIX(n2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n2) >=0.75 THEN noot = FIX(n2) + 1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF ' en nu nog toevoeging van de nieuwe terts: IF t2 THEN IF (FRAC(t2) > 0.25) AND (FRAC(t2) < 0.75) THEN noot = FIX(t2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(t2) >= 0.75 THEN noot = FIX(t2) + 1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(t2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF Task(%Qt_Triads).freq = Slider(slnr).value / 25 IF Task(%Qt_Triads).freq < 0.1 THEN task(%Qt_Triads).freq = 0.1 END SUB SUB Qt_Triads_UD () ' controls type of third to add in the triad LOCAL n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Qt_Triads).UpDownNumbers(0) n = UDCtrl(udnr).value IF n < 5 THEN UDctrl(udnr).value = 5 : n = 5 IF n > 8 THEN UDctrl(udnr).value = 8 : n = 8 SetDlgItemText Task(%Qt_Triads).hparam, %GMT_TEXT0_ID + 16, STR$(n) END SUB SUB QharTest 'test for qhar related functions 'basic addnote2qhar / qinstrumplay work 'now a test for GetQAkuDis: all kinds of triads on C (different octaves), sorted from least dissonant to most dissonant STATIC init AS DWORD STATIC i AS SINGLE LOCAL j AS SINGLE, k AS SINGLE, l AS SINGLE, m AS SINGLE LOCAL th AS harmtype LOCAL td AS SINGLE LOCAL noot AS SINGLE STATIC QH() AS QHarmType STATIC disso() AS SINGLE STATIC ndx() AS SINGLE IF ISFALSE init THEN DIM qh(750) DIM disso(750) DIM ndx(750) init = 1 i = 0 FOR j = QT.lowtes TO (qt.hightes - 12) STEP 12 '6 steps FOR k = 2.5 TO 4.5 STEP .5 FOR l = 2.5 TO 4.5 STEP .5 FOR m = 2.5 TO 4.5 STEP .5 AddNote2QHar qh(i), j, 1 AddNote2QHar qh(i), j + k, 1 AddNote2QHar qh(i), j + k + l, 1 AddNote2QHar qh(i), j + k + l + m, 1 ' disso(i) = GetQAkuDis(qh(i)) FillQHarType qh(i), 126 disso(i) = qh(i).dIS IF ISFALSE FRAC(k) AND ISFALSE FRAC(l) AND ISFALSE FRAC(m) THEN RESET th AddNote2Har th, j, 1 AddNote2Har th, j + k, 1 AddNote2Har th, j + k + l, 1 AddNote2Har th, j + k + l + m, 1 td = GetAkuDis(th, 126) logfile STR$(j) + STR$(k) + STR$(l) + STR$(m) + " - qdis:" + STR$(disso(i)) + ", ndis:" + STR$(td) ' logfile STR$(j) + STR$(k) + " - qdis:" + STR$(disso(i)) + ", ndis:" + STR$(td) + " -> div:" + STR$(td/MAX(0.000001, disso(i))) ELSE logfile STR$(j) + STR$(k) + STR$(l) + STR$(m) + " - qdis:" + STR$(disso(i)) ' logfile STR$(j) + STR$(k) + " - qdis:" + STR$(disso(i)) END IF INCR i IF i > UBOUND(qh) THEN Warning "i > ubound!" Warning " parms:" + FORMAT$(j, "000.00") + FORMAT$(k, "000.00") + FORMAT$(l, "000.00") END IF NEXT NEXT NEXT NEXT FOR i = LBOUND(ndx) TO UBOUND(ndx) ndx(i) = i NEXT ARRAY SORT disso(), TAGARRAY ndx(), ASCEND 'sorting with qh() as tagarray gave wrong results (probably because of the size of this array! FOR i = LBOUND(disso) TO UBOUND(disso) logfile STR$(disso(i)) + STR$(ndx(i)) + " - " + qh(ndx(i)).vel NEXT i = 0 END IF EXIT SUB logfile STR$(i) + STR$(disso(i)) + qh(ndx(i)).vel QT.qhar(1).vel = qh(ndx(i)).vel CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(i) + " - disso: " + FORMAT$(disso(i), "0.000") ' RESET Af.Qh.vel '-> QInstrumPlay behaves different then instrumplay: does not clear har.vel after playing it QInstrumPlay qt INCR i IF i > UBOUND(qh) THEN i = LBOUND(qh) END SUB SUB Qt_PresMod () ' motor ctrl. test task - speed modulation test STATIC slnr AS DWORD STATIC pres AS LONG STATIC updo AS LONG STATIC UdNrL AS LONG STATIC UdNrH AS LONG IF ISFALSE Task(%Qt_PresMod).tog THEN IF ISFALSE wou.aan THEN DIM TaskParamLabels(2) AS ASCIIZ * 8 TaskParamLabels(0) = "Freq" TaskParamLabels(1) = "H-Lim" TaskParamLabels(2) = "L-Lim" IF ISFALSE Task(%Qt_Presmod).hParam THEN MakeTaskParameterDialog %Qt_Presmod,1,Slider(),2,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Qt_Presmod).SliderNumbers(0) Slider(slnr).value = 4 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(slnr).value UDctrl(TaskEX(%Qt_Presmod).UpdownNumbers(0)).cptr = CODEPTR(Qt_PresMod_UD0) UDctrl(TaskEX(%Qt_Presmod).UpDownNumbers(0)).value = %MM_Qt_Motor UDctrl(TaskEX(%Qt_Presmod).UpdownNumbers(1)).cptr = CODEPTR(Qt_PresMod_UD1) UDctrl(TaskEX(%Qt_Presmod).UpDownNumbers(1)).value = 0 '14 UdNrH = TaskEx(%Qt_Presmod).UpdownNumbers(0) UdNrL = TaskEx(%Qt_Presmod).UpdownNumbers(1) END IF Task(%Qt_Presmod).freq = Slider(slnr).value ' commands per second. END IF pres = 0 '14 '%False updo = %TRue MM_Qt_On %MM_Qt_Motor Task(%Qt_Presmod).tog = %True END IF IF ISFALSE wou.aan THEN ' driehoeksgolfgenerator: IF updo > %False THEN INCR pres INCR pres ' stijgtijd 2x sneller dan daaltijd ' ter kompensatie van de inertie IF pres >= UDCtrl(UdNrH).value THEN pres = UDctrl(UdNrH).value updo = %False END IF ELSE DECR pres IF pres =< UDctrl(UDnrL).value THEN updo = %True END IF Controller Qt.channel, 7, pres Qt.ctrl(7) = pres ' frekwentie van de modulatie: Task(%Qt_Presmod).freq = (Slider(slnr).value + 1) / 2 ELSE ' driehoeksgolfgenerator: IF updo > %False THEN INCR pres INCR pres ' stijgtijd 2x sneller dan daaltijd ' ter kompensatie van de inertie IF pres >= wou.maxpres THEN pres = wou.maxpres updo = %False END IF ELSE DECR pres IF pres =< wou.minpres THEN updo = %True END IF Controller Qt.channel, 7, pres Qt.ctrl(7) = pres END IF END SUB SUB Qt_Presmod_UD0 () ' ud ctrl voor de maximale druk LOCAL udnr AS DWORD LOCAL udnrL AS DWORD LOCAL n AS LONG LOCAL nL AS LONG udnr = TaskEx(%Qt_Presmod).UpdownNumbers(0) udnrL = TaskEX(%Qt_Presmod).UpdownNumbers(1) n = UDCtrl(udnr).value nl = UDCtrl(udnrL).value IF n > 127 THEN UDctrl(udnr).value = 127 n = 127 END IF IF n < nl THEN UDctrl(udnr).value = nl n = nl END IF SetDlgItemText Task(%Qt_PresMod).hparam, %GMT_TEXT0_ID + 16, STR$(n) END SUB SUB Qt_PresMod_UD1 () ' ud ctrl voor de minimale druk LOCAL udnr AS DWORD LOCAL udnrH AS DWORD LOCAL n AS LONG LOCAL nH AS LONG udnr = TaskEx(%Qt_Presmod).UpdownNumbers(1) udnrH = TaskEX(%Qt_Presmod).UpdownNumbers(0) n = UDCtrl(udnr).value nH = UDCtrl(udnrH).value IF n > nH THEN UDctrl(udnr).value = nH n = nH END IF IF n < %False THEN UDctrl(udnr).value = %False n = %False END IF SetDlgItemText Task(%Qt_PresMod).hparam, %GMT_TEXT0_ID + 17, STR$(n) END SUB SUB Wouwel () ' Godfried-Willem Raes' eerste stuk voor Qt. ' %Qt_gw1 ' sends commands to the pic test tasks, here used as objects. ' problem: we get out of timers!!! ' official premiere 07.03.2008 - Mierezaal konservatorium ' written 16-20.05.2007 ' highly critical code: persistent timer problems under Windows. STATIC starttijd AS DWORD STATIC looptijd AS DWORD STATIC cnt AS DWORD LOCAL i AS DWORD LOCAL n AS CUR STATIC fac AS SINGLE IF ISFALSE Task(%Qt_gw1).tog THEN cnt = %Qt_K1 starttijd = timeGetTime Task(%Qt_gw1).freq = 1 Task(%Qt_gw1).tog = %True END IF looptijd = timeGetTime - starttijd ' in ms ' IF ISFALSE Task(%Qt_Presmod).tog THEN ' Task(%Qt_Presmod).freq = 14 ' starttask %Qt_PResmod ' END IF IF ISFALSE (looptijd\1000) MOD wou.period THEN ' om de 5 sekonden -met 6 = 1'12": alle taken spelen SELECT CASE wou.sectioncounter CASE %False IF ISFALSE Task(cnt).tog THEN Task(cnt).freq = 3.9 * (2^ ((cnt-%Qt_K1)/ 12)) ' kromatische ritmes Task(cnt).level = 5 + ((cnt - %Qt_K1) * 2) Starttask cnt END IF INCR cnt IF cnt > %Qt_Q6 THEN Wou.sectioncounter = 1 Controller Qt.channel, 7, 16 + ((cnt - %Qt_K1) * 7 ) ' tot 93 druk qt.ctrl(7) = 16 + ((cnt - %Qt_K1) * 7 ) controller qt.channel, 8, qt.ctrl(7) ' dim spotje. CASE 1 Controller Qt.channel, 7, %MM_Qt_Motor ' normale druk controller qt.channel, 8, 127 'IF ISFALSE wou.flag2 THEN ' luchtdrukmodulatie sektie ' IF wou.maxpres > wou.minpres THEN ' wou.maxpres = MAX(wou.maxpres -6, wou.minpres) cnt = %Qt_k1 ' ELSE wou.sectioncounter = 2 ' END IF play qt.channel, 120, 127 ' bim box led's CASE 2 wou.dex = wou.dex + 1 ' increment probability index wou.tc = 36 ' beter een spektraalfaktor bepalen zo dat we de hele qt tessituur met 12 noten vullen... wou.k(1) = wou.tc wou.sectioncounter = 3 Play qt.channel, 35, 127 ' blauw lage windlade Play qt.channel+1, 35, 127 CASE 3 wou.dex = wou.dex + 1 n = FindQtSpeknoot (36, 47, 0.5) IF FRAC(n) = 0.5 THEN wou.q(1) = INT(n) ELSE wou.k(1) = n IF ISFALSE wou.q(1) THEN stoptask %Qt_Q1 IF ISFALSE wou.k(1) THEN stoptask %Qt_K1 wou.sectioncounter = 4 CASE 4 wou.dex = wou.dex + 1 n = FindQtSpeknoot (48, 59, 0.5) IF FRAC(n) = 0.5 THEN wou.q(2) = INT(n) ELSE wou.k(2) = n IF ISFALSE wou.q(2) THEN stoptask %Qt_Q2 'else starttask %Qt_Q2 IF ISFALSE wou.k(2) THEN stoptask %Qt_K2 'else starttask %Qt_K2 play qt.channel, 110, 127 wou.sectioncounter = 5 CASE 5 wou.dex = wou.dex + 1 n = FindQtSpeknoot (48, 59, 0.5) IF FRAC(n) = 0.5 THEN wou.q(2) = INT(n) ELSE wou.k(2) = n IF ISFALSE wou.q(2) THEN stoptask %Qt_Q2 ELSE starttask %Qt_Q2 IF ISFALSE wou.k(2) THEN stoptask %Qt_K2 ELSE starttask %Qt_K2 play qt.channel +1, 111, 127 wou.sectioncounter = 6 CASE 6 wou.dex = wou.dex + 1 n = FindQtSpeknoot (60, 71, 0.5) IF FRAC(n) = 0.5 THEN wou.q(3) = INT(n) ELSE wou.k(3) = n IF ISFALSE wou.q(3) THEN stoptask %Qt_Q3 ' ELSE starttask %Qt_Q3 IF ISFALSE wou.k(3) THEN stoptask %Qt_K3 ' ELSE starttask %Qt_K3 play qt.channel, 111, 127 wou.sectioncounter = 7 CASE 7 wou.dex = wou.dex + 1 n = FindQtSpeknoot (60, 71, 0.5) IF FRAC(n) = 0.5 THEN wou.q(3) = INT(n) ELSE wou.k(3) = n IF ISFALSE wou.q(3) THEN stoptask %Qt_Q3 ELSE starttask %Qt_Q3 IF ISFALSE wou.k(3) THEN stoptask %Qt_K3 ELSE starttask %Qt_K3 wou.sectioncounter = 8 CASE 8 wou.dex = wou.dex + 1 n = FindQtSpeknoot (72, 83, 0.5) IF FRAC(n) = 0.5 THEN wou.q(4) = INT(n) ELSE wou.k(4) = n IF ISFALSE wou.q(4) THEN stoptask %Qt_Q4 ' ELSE starttask %Qt_Q4 IF ISFALSE wou.k(4) THEN stoptask %Qt_K4 ' ELSE starttask %Qt_K4 wou.sectioncounter = 9 CASE 9 wou.dex = wou.dex + 1 n = FindQtSpeknoot (72, 83, 0.5) IF FRAC(n) = 0.5 THEN wou.q(4) = INT(n) ELSE wou.k(4) = n IF ISFALSE wou.q(4) THEN stoptask %Qt_Q4 ELSE starttask %Qt_Q4 IF ISFALSE wou.k(4) THEN stoptask %Qt_K4 ELSE starttask %Qt_K4 wou.sectioncounter = 10 CASE 10 wou.dex = wou.dex + 1 n = FindQtSpeknoot (84, 95, 0.5) IF FRAC(n) = 0.5 THEN wou.q(5) = INT(n) ELSE wou.k(5) = n IF ISFALSE wou.q(5) THEN stoptask %Qt_Q5 ' ELSE starttask %Qt_Q5 IF ISFALSE wou.k(5) THEN stoptask %Qt_K5 ' ELSE starttask %Qt_K5 wou.sectioncounter = 11 CASE 11 wou.dex = wou.dex + 1 n = FindQtSpeknoot (84, 95, 0.5) IF FRAC(n) = 0.5 THEN wou.q(5) = INT(n) ELSE wou.k(5) = n IF ISFALSE wou.q(5) THEN stoptask %Qt_Q5 ELSE starttask %Qt_Q5 IF ISFALSE wou.k(5) THEN stoptask %Qt_K5 ELSE starttask %Qt_K5 wou.sectioncounter = 12 CASE 12 wou.dex = wou.dex + 1 n = FindQtSpeknoot (96, 108, 0.5) IF FRAC(n) = 0.5 THEN wou.q(6) = INT(n) ELSE wou.k(6) = n IF ISFALSE wou.q(6) THEN stoptask %Qt_Q6 'ELSE starttask %Qt_Q6 IF ISFALSE wou.k(6) THEN stoptask %Qt_K6 'ELSE starttask %Qt_K6 wou.sectioncounter = 13 CASE 13 wou.dex = wou.dex + 1 n = FindQtSpeknoot (96, 108, 0.5) IF FRAC(n) = 0.5 THEN wou.q(6) = INT(n) ELSE wou.k(6) = n IF ISFALSE wou.q(6) THEN stoptask %Qt_Q6 ELSE starttask %Qt_Q6 IF ISFALSE wou.k(6) THEN stoptask %Qt_K6 ELSE starttask %Qt_K6 wou.sectioncounter = 14 CASE 14 wou.period = 1 wou.dex = wou.dex + 1 controller qt.channel, 8, wou.dex * 5 IF WOU.dex >= 24 THEN wou.sectioncounter = 15 fac = 0.5 ' op het eind van deze sektie krijgen we het spektrum akkoord CASE 15 ' laat spektrum evolueren naar %Stringspec met veranderlijke faktor wou.period = 2 wou.dex = 24 'MIN(wou.dex + 1, 24) fac = fac + 0.27 n = FindQtSpeknoot (qt.lowtes, qt.hightes, fac) SELECT CASE n CASE < qt.lowtes controller qt.channel, 123, %False ' all notes off controller qt.channel+1, 123, %False wou.tc = wou.tc + 7.5 ' gebeurt nooit!!! IF wou.tc >= qt.lowtes + 12 THEN wou.tc = wou.tc - 12 IF FRAC(wou.tc) = 0.5 THEN wou.q(1) = FIX(wou.tc) IF ISFALSE Task(%Qt_Q1).tog THEN starttask %Qt_Q1 ELSE wou.k(1) = FIX(wou.tc) IF ISFALSE Task(%Qt_K1).tog THEN starttask %Qt_K1 END IF EXIT SUB CASE 36 TO 47.6 IF FRAC(n) = 0.5 THEN wou.q(1) = FIX(n) ELSE wou.k(1) = FIX(n) CASE 48 TO 59.6 IF FRAC(n) = 0.5 THEN wou.q(2) = FIX(n) ELSE wou.k(2) = FIX(n) CASE 60 TO 71.6 IF FRAC(n) = 0.5 THEN wou.q(3) = FIX(n) ELSE wou.k(3) = FIX(n) CASE 72 TO 83.6 IF FRAC(n) = 0.5 THEN wou.q(4) = FIX(n) ELSE wou.k(4) = FIX(n) CASE 84 TO 95.6 IF FRAC(n) = 0.5 THEN wou.q(5) = FIX(n) ELSE wou.k(5) = FIX(n) CASE 96 TO 108 IF FRAC(n) = 0.5 THEN wou.q(6) = FIX(n) ELSE wou.k(6) = FIX(n) END SELECT FOR i = 0 TO 11 IF ISFALSE i MOD 2 THEN ' gewone noten K IF wou.k((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF ELSE ' kwarttonen IF wou.q((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF END IF NEXT i IF fac > 4 THEN wou.sectioncounter = 16 IF ISFALSE Task(%Qt_Q6).tog THEN Task(%Qt_Q6).freq = Task(%Qt_K6).freq ' patch IF ISFALSE wou.q(6) THEN wou.tc = wou.tc + 7.5 IF wou.tc >= qt.lowtes + 12 THEN wou.tc = wou.tc - 12 n = FindQtSpeknoot (qt.hightes-12, qt.hightes, fac) IF FRAC(n) THEN wou.q(6) = FIX(n) IF ISFALSE wou.q(6) THEN FOR i = 5 TO 1 STEP -1 IF wou.q(i) THEN wou.q(6) = wou.q(i) + (12 * (6-i)) EXIT FOR END IF NEXT i END IF IF ISFALSE Task(%Qt_Q6).tog THEN starttask %Qt_Q6 Task(%Qt_Q6).freq = 16 END IF CASE 16 ' insert ' modulatie sektie: ' met +7.5 hebben we slechts 1 van de drie cirkels (na 8 transpo's zijn we rond) ' +6.5 zou een volledige cirkel opleveren. wou.tc = wou.tc + 7.5 IF wou.tc >= qt.lowtes + 12 THEN wou.tc = wou.tc - 12.0 IF FRAC(wou.tc) = 0.5 THEN wou.q(1) = FIX(wou.tc) IF ISFALSE Task(%Qt_Q1).tog THEN starttask %Qt_Q1 ELSE wou.k(1) = FIX(wou.tc) IF ISFALSE Task(%Qt_K1).tog THEN starttask %Qt_K1 END IF n = FindQtSpeknoot (qt.lowtes, 47.6, fac) IF FRAC(n) = 0.5 THEN IF FRAC(wou.tc) = 0 THEN wou.q(1) = FIX(n) ELSE IF FRAC(wou.tc) = 0.5 THEN wou.k(1) = FIX(n) END IF n = FindQtSpeknoot (48, 59.6, fac) IF FRAC(n) = 0.5 THEN wou.q(2) = FIX(n) ELSE wou.k(2) = FIX(n) n = FindQtSpeknoot (60, 71.6, fac) IF FRAC(n) = 0.5 THEN wou.q(3) = FIX(n) ELSE wou.k(3) = FIX(n) n = FindQtSpeknoot (72, 83.6, fac) IF FRAC(n) = 0.5 THEN wou.q(4) = FIX(n) ELSE wou.k(4) = FIX(n) n = FindQtSpeknoot (84, 95.6, fac) IF FRAC(n) = 0.5 THEN wou.q(5) = FIX(n) ELSE wou.k(5) = FIX(n) n = FindQtSpeknoot (96, 108, fac) IF FRAC(n) = 0.5 THEN wou.q(6) = FIX(n) ELSE wou.k(6) = FIX(n) ' n = FindQtSpeknoot (qt.lowtes, qt.hightes, fac) ' SELECT CASE n ' CASE 36 TO 47.6 ' IF FRAC(n) = 0.5 THEN wou.q(1) = FIX(n) ELSE wou.k(1) = FIX(n) ' CASE 48 TO 59.6 ' IF FRAC(n) = 0.5 THEN wou.q(2) = FIX(n) ELSE wou.k(2) = FIX(n) ' CASE 60 TO 71.6 ' IF FRAC(n) = 0.5 THEN wou.q(3) = FIX(n) ELSE wou.k(3) = FIX(n) ' CASE 72 TO 83.6 ' IF FRAC(n) = 0.5 THEN wou.q(4) = FIX(n) ELSE wou.k(4) = FIX(n) ' CASE 84 TO 95.6 ' IF FRAC(n) = 0.5 THEN wou.q(5) = FIX(n) ELSE wou.k(5) = FIX(n) ' CASE 96 TO 108 ' IF FRAC(n) = 0.5 THEN wou.q(6) = FIX(n) ELSE wou.k(6) = FIX(n) ' case else ' exit sub ' END SELECT FOR i = 0 TO 11 IF ISFALSE i MOD 2 THEN ' gewone noten K IF wou.k((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF ELSE ' kwarttonen IF wou.q((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF END IF NEXT i IF wou.tc = 36 THEN wou.sectioncounter = 17 CASE 17 ' laat taak ritmes terug uiteenlopen, volgens deelfaktoren van de spektraalnoten ' wou.monometric moet hier %True zijn. IF wou.k(6) THEN Task(%Qt_K6).freq = Task(%Qt_Q6).freq / ( (NF2F(wou.q(6) + 0.5) / NF2F(wou.k(6)))) END IF wou.sectioncounter = 18 CASE 18 IF wou.q(5) THEN Task(%Qt_Q5).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.q(5)+0.5))) END IF wou.sectioncounter = 19 CASE 19 IF wou.k(5) THEN Task(%Qt_K5).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k(5)))) END IF wou.sectioncounter = 20 CASE 20 IF wou.q(4) THEN Task(%Qt_Q4).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.q(4)+0.5))) END IF wou.sectioncounter = 21 CASE 21 IF wou.k(4) THEN Task(%Qt_K4).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k(4)))) END IF wou.sectioncounter = 22 CASE 22 IF wou.q(3) THEN Task(%Qt_Q3).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.q(3)+0.5))) END IF wou.sectioncounter = 23 CASE 23 IF wou.k(3) THEN Task(%Qt_K3).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k(3)))) END IF wou.sectioncounter = 24 CASE 24 IF wou.q(2) THEN Task(%Qt_Q2).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.q(2)+0.5))) END IF wou.sectioncounter = 25 CASE 25 IF wou.k(2) THEN Task(%Qt_K2).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k(2)))) END IF wou.sectioncounter= 26 CASE 26 IF wou.q(1) THEN Task(%Qt_Q1).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.q(1)+0.5))) END IF wou.sectioncounter = 27 CASE 27 IF wou.k(4) THEN Task(%Qt_K1).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k(1)))) END IF wou.sectioncounter = 28 CASE 28 ' konvergeer spekfak wou.period = 3 fac = MAX(fac - 0.4, 1.0) n = FindQtSpeknoot (qt.lowtes, 47.6, fac) IF FRAC(n) = 0.5 THEN wou.q(1) = FIX(n) ELSE wou.k(1) = FIX(n) n = FindQtSpeknoot (48, 59.6, fac) IF FRAC(n) = 0.5 THEN wou.q(2) = FIX(n) ELSE wou.k(2) = FIX(n) n = FindQtSpeknoot (60, 71.6, fac) IF FRAC(n) = 0.5 THEN wou.q(3) = FIX(n) ELSE wou.k(3) = FIX(n) n = FindQtSpeknoot (72, 83.6, fac) IF FRAC(n) = 0.5 THEN wou.q(4) = FIX(n) ELSE wou.k(4) = FIX(n) n = FindQtSpeknoot (84, 95.6, fac) IF FRAC(n) = 0.5 THEN wou.q(5) = FIX(n) ELSE wou.k(5) = FIX(n) n = FindQtSpeknoot (96, 108, fac) IF FRAC(n) = 0.5 THEN wou.q(6) = FIX(n) ELSE wou.k(6) = FIX(n) ' n = FindQtSpeknoot (qt.lowtes, qt.hightes, fac) ' SELECT CASE n ' CASE < qt.lowtes, > qt.hightes ' ' hier kunnen we nooit komen... ' 'wou.tc = wou.tc + 7.5 ' 'IF wou.tc > qt.lowtes + 12 THEN wou.tc = wou.tc - 12 ' controller qt.channel, 123, %False ' all notes off ' wou.tc = wou.tc + 7.5 ' IF wou.tc >= qt.lowtes + 12 THEN wou.tc = wou.tc - 12 ' IF FRAC(wou.tc) = 0.5 THEN ' wou.q(1) = FIX(wou.tc) ' IF ISFALSE Task(%Qt_Q1).tog THEN starttask %Qt_Q1 ' ELSE ' wou.k(1) = FIX(wou.tc) ' IF ISFALSE Task(%Qt_K1).tog THEN starttask %Qt_K1 ' END IF ' EXIT SUB ' CASE 36 TO 47.6 ' IF FRAC(n) = 0.5 THEN wou.q(1) = FIX(n) ELSE wou.k(1) = FIX(n) ' CASE 48 TO 59.6 ' IF FRAC(n) = 0.5 THEN wou.q(2) = FIX(n) ELSE wou.k(2) = FIX(n) ' CASE 60 TO 71.6 ' IF FRAC(n) = 0.5 THEN wou.q(3) = FIX(n) ELSE wou.k(3) = FIX(n) ' CASE 72 TO 83.6 ' IF FRAC(n) = 0.5 THEN wou.q(4) = FIX(n) ELSE wou.k(4) = FIX(n) ' CASE 84 TO 95.6 ' IF FRAC(n) = 0.5 THEN wou.q(5) = FIX(n) ELSE wou.k(5) = FIX(n) ' CASE 96 TO 108 ' IF FRAC(n) = 0.5 THEN wou.q(6) = FIX(n) ELSE wou.k(6) = FIX(n) ' END SELECT IF ISFALSE Task(%Qt_Q6).tog THEN Task(%Qt_Q6).freq = Task(%Qt_K6).freq ' patch wou.tc = wou.tc + 7.5 IF wou.tc >= qt.lowtes + 12 THEN wou.tc = wou.tc - 12 n = FindQtSpeknoot (qt.hightes-13, qt.hightes, fac) IF FRAC(n)> 0.3 AND FRAC(n) < 0.6 THEN wou.q(6) = FIX(n) ELSE wou.q(6) = %False END IF FOR i = 0 TO 11 IF ISFALSE i MOD 2 THEN ' gewone noten K IF wou.k((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i Task(%Qt_K1 + 1).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k((i\2)+1)))) ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF ELSE ' kwarttonen IF wou.q((i\2)+1) THEN IF ISFALSE Task(%Qt_K1 + i).tog THEN starttask %Qt_K1 + i Task(%Qt_K1 + 1).freq = Task(%Qt_Q6).freq / ((NF2F(wou.q(6) + 0.5) / NF2F(wou.k((i\2)+1)))) ELSE IF Task(%Qt_K1 + i).tog THEN stoptask %Qt_K1 + i END IF END IF NEXT i IF fac <= 1 THEN wou.sectioncounter = 29 cnt = 0 CASE 29 wou.period = 1 FOR i = %Qt_K1 TO %Qt_Q6 Task(i).freq = Task(i).freq * 0.9 NEXT i INCR cnt IF cnt = 10 THEN wou.sectioncounter = 30 CASE 30 FOR i = %Qt_K1 TO %Qt_Q6 Task(i).freq = Task(i).freq * 0.9 NEXT i qt.ctrl(7) = qt.ctrl(7) - 1 Controller qt.channel, 7, qt.ctrl(7) IF qt.ctrl(7) < wou.minpres THEN wou.sectioncounter = 31 controller qt.channel, 8, qt.ctrl(7) ' licht cnt = %Qt_K1 CASE 31 wou.period = 2 IF Task(cnt).tog THEN Stoptask cnt END IF INCR cnt IF cnt > %Qt_Q6 THEN wou.sectioncounter = 32 CASE 32 controller qt.channel, 123, %False controller qt.channel + 1, 123, %False stoptask %qt_gw1 END SELECT END IF ' om de sekonde: IF wou.sectioncounter > 1 THEN ' vanzodra alle taken zijn ingeschakeld. IF ISFALSE wou.monometric THEN FOR i = %Qt_K6 TO %Qt_K1 STEP -1 ' hier worden de wouweltaken monometrisch: de frekwentie konvergeert naar het snelste tempo. IF Task(i).tog THEN IF Task(i).freq < Task(%Qt_Q6).freq THEN Task(i).freq = Task(i).freq * (2^(1/12)) IF task(i).freq > Task(%Qt_Q6).freq THEN Task(i).freq = Task(%Qt_Q6).freq : EXIT FOR END IF END IF NEXT i FOR i = %Qt_K1 TO %Qt_K6 IF Task(i).freq <> task(%Qt_Q6).freq THEN wou.monometric = %False ELSE wou.monometric = %True NEXT i END IF END IF SetDlgItemText gh.cockpit, %GMT_msg1, STR$(wou.sectioncounter) 'SetDlgItemText gh.cockpit, %GMT_msg2, STR$(wou.tc) END SUB SUB Wouwel_Stop () LOCAL i AS DWORD MM_Qt_Off %MM_Lights FOR i = %Qt_k1 TO %Qt_Q6 IF Task(i).tog THEN StopTask i NEXT i wou.aan = %False MM_Qt_Off END SUB SUB Wouwel_Start () LOCAL i AS DWORD ' all other tasks must stop!!! ' no other apps should be running. We are at the upper limit of available timers in this piece!!! FOR i = %Qt_k1 TO 63 IF Task(i).tog THEN StopTask i NEXT i wou.minpres = 35 ' 20 '16 wou.maxpres = 127 Wou.aan = %TRue wou.flag1 = %False wou.flag2 = %False wou.period = 5 wou.dex = 1.0 wou.tc = qt.lowtes wou.sectioncounter = %False END SUB FUNCTION FindQtSpeknoot (BYVAL lowlim AS CUR, BYVAL hilim AS CUR, BYVAL factor AS SINGLE) AS CUR ' specific function for wouwel. Not intended for general use. LOCAL n AS SINGLE LOCAL i AS DWORD LOCAL noot AS CUR STATIC lastnoot AS CUR REDIM nt(0) AS LOCAL CUR LOCAL s AS LONG s = -1 i = 1 noot = %False DO n = SpectralNoteF(wou.tc, i, factor, %StringSpec) IF ISFALSE n THEN noot = %False: EXIT DO IF n >= lowlim THEN IF n <= hilim THEN SELECT CASE FRAC(n) CASE <= 0.1 noot = FIX(n) INCR s REDIM PRESERVE nt(s) nt(s) = noot CASE >= 0.9 noot = FIX(n) + 1 INCR s REDIM PRESERVE nt(s) nt(s) = noot CASE 0.4 TO 0.6 noot = FIX(n)+ 0.50 ' kwarttoon!!! INCR s REDIM PRESERVE nt(s) nt(s) = noot END SELECT ELSEIF n<= hilim + 12 THEN SELECT CASE FRAC(n) CASE <= 0.1 noot = FIX(n-12) INCR s REDIM PRESERVE nt(s) nt(s) = noot CASE >= 0.9 noot = FIX(n-12) + 1 INCR s REDIM PRESERVE nt(s) nt(s) = noot CASE 0.4 TO 0.6 noot = FIX(n-12)+ 0.50 ' kwarttoon!!! INCR s REDIM PRESERVE nt(s) nt(s) = noot END SELECT ELSEIF n>= 127 THEN noot = %False EXIT DO END IF END IF INCR i LOOP UNTIL n >= hilim + 12 'noot ' if noot = lastnoot then ' ' zoek naar een alternatief indien mogelijk ' n = SpectralNoteF(wou.tc, i, factor, %StringSpec) ' if (n>=lowlim) and (n <=hilim) then ' SELECT CASE FRAC(n) ' CASE <= 0.1 ' noot = FIX(n) ' CASE >= 0.9 ' noot = FIX(n) + 1 ' CASE 0.4 TO 0.6 ' noot = FIX(n)+ 0.50 ' END SELECT ' end if ' end if IF s > 0 THEN ' kies een noot uit de berekende mogelijkheden noot = nt(RND(1) * s) END IF lastnoot = noot FUNCTION = noot END FUNCTION SUB Akafest () '%qt_gw2 ' coding started 04.09.2007 ' written for the opening of the academic year 2007 of the Ghent College. ' Part 2 in the suite 'Cuties for Qt', commisioned by Muzikon. ' this piece requires a polymetric playing task ' Harmonically it is extended with helmholtz functions STATIC cnt AS LONG ' STATIC QH AS QHarmType ' Af.Qh.vel: 256 places! - now global ' STATIC section AS LONG ' now in type STATIC i AS CUR 'STATIC tik AS DWORD STATIC t AS DWORD STATIC n1 AS CUR ' for HH_ functions STATIC n2 AS CUR STATIC n3 AS CUR STATIC n4 AS CUR STATIC d AS SINGLE STATIC oldsection AS LONG LOCAL retval AS LONG IF ISFALSE Task(%qt_gw2).tog THEN DIM ni(4) AS STATIC CUR DIM no(4) AS STATIC CUR oldsection = %False n1 = %False n2 = %False n3 = %False n4 = %False Af.Qh.vel = NUL$(256) ' startakkoord: AddNote2Qhar Af.Qh, 36.0 ,64 Af.section = %False cnt = %False Controller Qt.channel, 7, %MM_Qt_Motor Task(%qt_gw2).tog = %True Task(%qt_gw2).freq = 1.3 i = 0 t = TimegetTime SetDlgItemText gh.Cockpit, %GMT_MSG1, "Akademische Feestouverture" SetDlgItemText gh.Cockpit, %GMT_MSG2, "section: " & STR$(Af.section) SetDlgItemText gh.Cockpit, %GMT_TEXT_TEMPO, STR$(App.tempo) ' ' ' Af.section = 10 ' n1 = 36 ' ' END IF IF (TimegetTime - t) < 4000 THEN EXIT SUB ' otherwize we have not enough wind... IF ISFALSE Task(%Akafest_Play).swit THEN starttask %Akafest_Play SELECT CASE Af.section CASE %False ' start: add octaves to chord AddNote2QHar Af.Qh, 36 + (i/2), 64 i = i + 24 '12 IF 36 + (i/2) > 108 THEN 'i >= 144 THEN '72 THEN i = 14 '7 - prepare fifths for the next section INCR Af.section END IF CASE 1 ' section1: add fifths AddNote2QHar Af.Qh, 36 + (i/2), 64 '36 + i, 64 i = i + 24 IF 36 + (i/2) > 108 THEN INCR Af.section i = 9.5 ' prepare sevenths for next section END IF ' at the end we must have only octaves and fifths CASE 2 ' add quartertone sevenths (9.5) AddNote2Qhar Af.Qh, 36 + i, 64 i = i + 12 IF (36 + i) > 108 THEN INCR Af.section END IF CASE 3 ' logfile "do qharmod -----------" ' modify chord such as to become dissonant in steps retval = QharMod (Af.Qh, -1,%use_fuzzypsy) 'use_velo ) ' logfile "retval:" + STR$(retval) IF ISFALSE retval THEN INCR Af.section CASE 4 ' chord is dissonant on entry now ' new we let it become consonant again: ' logfile "do qharmod -----------" retval = QharMod (Af.Qh, +1,%use_fuzzypsy) '%use_velo) IF ISFALSE retval THEN INCR Af.section ' logfile "retval:" + STR$(retval) CASE 5 ' end of first process - chord is consonant again. ' slierten aan IF ISFALSE Task(%Akafest_P3).swit THEN StartTask %Akafest_P3 ' slierten task(%qt_gw2).freq = 0.3 INCR Af.section cnt = %False d = 0 CASE 6 ' new 10.02.2008 ' - now we apply the new helmholtz functions... ' first the diads - in twenty steps Af.Qh.vel = NUL$(256) n1 = 36 + ((cnt * 7) MOD 60) n2 = %False d = HH_Diad (50,n1,n2, 1 - (cnt/20.0)) ' thisgives us n2 AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n1 - 12 <= 48 THEN AddNote2Qhar Af.Qh, n1-24, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 task(%qt_gw2).freq = 1 INCR cnt IF cnt > 20 THEN INCR Af.section: cnt = %False : d= 0 IF cnt > 6 THEN IF Task(%Akafest_P3).swit THEN stoptask %Akafest_P3 ' slierten uit END IF CASE 7 ' apply the triads. We start from consonance here ' we work in 24 steps Af.Qh.vel = NUL$(256) 'n3 = %False IF n1 > 60 THEN n1 = n1 - 12 IF n2 > 72 THEN n2 = n2 - 12 d = HH_TRiad (50, n1,n2,n3, cnt/24.0) ' n1 and n2 given... AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 Task(%qt_gw2).freq = 1.2 n1 = n2 IF n1 > 60 THEN n1 = n1 - 24 n2 = n3 IF n2 > 60 THEN n2 = n2 - 12 n3 = %False INCR cnt IF cnt > 24 THEN INCR Af.section : cnt = %False ' at the end here we are dissonant again CASE 8 ' same triads but inverse with only a single note given: ' we progress from dissonant to consonant in 36 steps Af.Qh.vel = NUL$(256) n3 = %False d = HH_TRiad (50, n1,n2,n3, 1 - (cnt/36.0)) ' n1 and n2 given... AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 Task(%qt_gw2).freq = 1.4 n1 = n2 IF n1 > 60 THEN n1 = n1 - 24 n2 = %False n3 = %False INCR cnt ' test slierten insert... IF ISFALSE cnt MOD 5 THEN IF ISFALSE Task(%Akafest_P3).swit THEN starttask %Akafest_P3 ELSE IF Task(%Akafest_P3).swit THEN stoptask %Akafest_P3 END IF IF cnt > 36 THEN INCR Af.section : cnt = %False CASE 9 ' apply the tetrads, starting from consonance ' we apply the function first with one note given. ' we move in 48 steps Af.Qh.vel = NUL$(256) IF cnt THEN n1 = n2 IF n1 > 60 THEN n1 = n1 - 24 n2 = %False n3 = %False n4 = %False d = HH_Tetrad (50, n1,n2,n3,n4, cnt/48.0) ' n1 given... AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 AddNote2Qhar Af.Qh, n4, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 IF n4 <= 84 THEN Addnote2Qhar Af.Qh, n4+12, 64 IF n4 >= 72 THEN ADDnOTE2qHAR Af.Qh, n4-12, 64 Task(%qt_gw2).freq = 1.5 INCR cnt IF cnt > 48 THEN INCR Af.section : cnt = %False CASE 10 ' on entry we are dissonant, so we go to consonant again: ' now in 25 steps Af.Qh.vel = NUL$(256) IF cnt THEN n1 = n2 IF n1 > 60 THEN n1 = n1 - 24 n2 = %False n3 = %False n4 = %False d = HH_Tetrad (50, n1,n2,n3,n4, 1 - (cnt/25.0)) ' n1 given... AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 AddNote2Qhar Af.Qh, n4, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 IF n4 <= 84 THEN Addnote2Qhar Af.Qh, n4+12, 64 IF n4 >= 72 THEN ADDnOTE2qHAR Af.Qh, n4-12, 64 Task(%qt_gw2).freq = 1.6 INCR cnt IF cnt > 25 THEN INCR Af.section cnt = %False END IF CASE 11 ' now we try out the chord building procedure HH_Chord_Progres ' logfile "case 11 cnt" + STR$(cnt) ' logfile "old chord" + STR$(n1) + STR$(n2) + STR$(n3) + STR$(n4) IF ISFALSE cnt THEN n1 = 36.5 + (n2 MOD 12) n2 = %False n3 = %False n4 = %false d = HH_Tetrad (50, n1,n2,n3,n4, 0) ' consonant on entry - this works... ELSE ' put previous chord in ni() ni(0) = n1 ni(1) = n2 ni(2) = n3 ni(3) = n4 ' assign a goal for the chord: - this is where it went wrong at first!!! IF n2 > 72 THEN no(0) = 36 + (n2 MOD 12) ELSE no(0) = n2 END IF ' IF n2 THEN no(0) = n2 ' added 13.02 ' IF ISFALSE no(0) THEN no(0) = n3 'IF ISFALSE no(0) THEN no(0) = n4 ' IF ISFALSE no(0) THEN MSGBOX "WRONG- no goal": logfile "goal error" 'no(0) = n2 ' test IF no(0) - n1 > 6 THEN no(0) = no(0) - 12 IF no(0) - n1 < -6 THEN no(0) = no(0) + 12 IF no(0) < 36 THEN no(0) = 36 + (no(0) MOD 12) d = HH_Chord_Progres (50, ni(), no(), cnt / 30) 'dit kan blijkbaar akoorden met verdubbelingen in retourneren?! ' logfile "chord progress done, d=" + STR$(d) + " raw res:" + STR$(no(0))+ STR$(no(1))+ STR$(no(2))+ STR$(no(3)) ' check the parallel 5th removal procedure: d = MinPar5ths (50, ni(), no()) ' new 12.02.2008 ' logfile "minpart5th res:" + STR$(no(0))+ STR$(no(1))+ STR$(no(2))+ STR$(no(3)) n1 = no(0) n2 = no(1) n3 = no(2) n4 = no(3) no(1) = %False no(2) = %False no(3) = %False END IF ' play it: 'SetDlgItemText gh.Cockpit, %GMT_MSG1, STR$(n1) & STR$(n2) & STR$(n3) & STR$(n4) ' for debug only Af.Qh.vel = NUL$(256) AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 AddNote2Qhar Af.Qh, n4, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 IF n4 <= 84 THEN Addnote2Qhar Af.Qh, n4+12, 64 IF n4 >= 72 THEN ADDnOTE2qHAR Af.Qh, n4-12, 64 Task(%qt_gw2).freq = 1.5 INCR cnt IF cnt > 30 THEN INCR Af.section cnt = 0 END IF ' will be dissonant at the end CASE 12 ' same with triads - starting dissonant IF ISFALSE cnt THEN n1 = 36 + (n1 MOD 12) n2 = %False n3 = %False d = HH_Triad (50, n1,n2,n3, 1) ' dissonant on entry ELSE ' put previous chord in ni() ni(0) = n1 ni(1) = n2 ni(2) = n3 ni(3) = %False ' not used. ' assign a goal for the chord: no(0) = n2 ' test IF no(0) - n1 > 6 THEN no(0) = no(0) - 12 IF no(0) - n1 < -6 THEN no(0) = no(0) + 12 IF no(0) < 48 THEN DO no(0) = no(0) + 12 LOOP UNTIL no(0) > 48 END IF IF no(0) > 84 THEN DO no(0) = no(0) - 12 LOOP UNTIL no(0) < 84 END IF no(1) = %False no(2) = %False d = HH_Chord_Progres (50, ni(), no(), 1 - (cnt / 30)) ' ' minimize parallel 5ths d = MinPar5ths (50, ni(), no()) n1 = no(0) n2 = no(1) n3 = no(2) no(1) = %False no(2) = %False no(3) = %False END IF ' play it: Af.Qh.vel = NUL$(256) AddNote2Qhar Af.Qh, n1, 64 AddNote2Qhar Af.Qh, n2, 64 AddNote2Qhar Af.Qh, n3, 64 IF n1 >= 48 THEN AddNote2Qhar Af.Qh, n1 - 12, 64 IF n2 >= 60 THEN AddNote2Qhar Af.Qh, n2 - 12, 64 IF n1 <= 84 THEN AddNote2Qhar Af.Qh, n1+12, 64 IF n2 <= 96 THEN addNote2Qhar Af.Qh, n2+12, 64 IF n3 <= 72 THEN AddNote2Qhar Af.Qh, n3+12, 64 IF n3 >= 60 THEN addNote2Qhar Af.Qh, n3-12, 64 IF n3 <= 84 THEN Addnote2Qhar Af.Qh, n3+12, 64 IF n2 >= 72 THEN ADDnOTE2qHAR Af.Qh, n2-12, 64 Task(%qt_gw2).freq = 1.4 INCR cnt IF cnt > 30 THEN INCR Af.section cnt = 0 END IF CASE 13 ' same with diads starting consonant IF ISFALSE cnt THEN n1 = n2 IF n1 > 48 THEN DO n1 = n1 - 12 LOOP UNTIL n1 < 48 END IF n2 = %False n3 = %False n4 = %False d = HH_Diad (50, n1,n2, 0) ' consonant on entry ELSE ' put previous chord in ni() ni(0) = n1 ni(1) = n2 ni(2) = %False ' not used ni(3) = %False ' not used. ' assign a goal for the chord: no(0) = n2 ' test IF no(0) - n1 > 6 THEN no(0) = no(0) - 12 IF no(0) - n1 < -6 THEN no(0) = no(0) + 12 no(1) = %False no(2) = %False d = HH_Chord_Progres (50, ni(), no(), cnt / 30) d = MinPar5ths (50, ni(), no()) n1 = no(0) n2 = no(1) no(1) = %False no(2) = %False no(3) = %False END IF ' play it: Af.Qh.vel = NUL$(256) n3 = n1 MOD 12 ' = (FIX(n1) MOD 12) + FRAC(n1) n4 = n2 MOD 12 ' = (FIX(n2) MOD 12) + FRAC(n2) ' shepard: FOR i = 36 TO 96 STEP 12 AddNote2Qhar Af.Qh, i + n3, 64 AddNote2Qhar Af.Qh, i + n4, 64 NEXT i Task(%qt_gw2).freq = 1.2 INCR cnt IF cnt > 30 THEN INCR Af.section cnt = 0 END IF CASE 14 ' diads again, from dissonant to consonant IF ISFALSE cnt THEN n1 = n2 IF n1 > 48 THEN n1 = (36 + (n1 MOD 12)) END IF n2 = %False n3 = %False n4 = %False d = HH_Diad (50, n1,n2, 1) ' dissonant on entry IF ISFALSE Task(%Akafest_P3).swit THEN StartTask %Akafest_P3 ' slierten aan ELSE ' put previous chord in ni() ni(0) = n1 ni(1) = n2 ni(2) = %False ' not used ni(3) = %False ' not used. ' assign a goal for the chord: no(0) = n2 ' test IF no(0) - n1 > 6 THEN no(0) = no(0) - 12 IF no(0) - n1 < -6 THEN no(0) = no(0) + 12 no(1) = %False no(2) = %False d = HH_Chord_Progres (50, ni(), no(), 1 - (cnt / 30)) d = MinPar5ths (50, ni(), no()) n1 = no(0) n2 = no(1) no(1) = %False no(2) = %False no(3) = %False END IF ' play it: Af.Qh.vel = NUL$(256) n3 = n1 MOD 12 ' = (FIX(n1) MOD 12) + FRAC(n1) n4 = n2 MOD 12 '= (FIX(n2) MOD 12) + FRAC(n2) ' shepard: FOR i = 36 TO 96 STEP 12 AddNote2Qhar Af.Qh, i + n3, 64 AddNote2Qhar Af.Qh, i + n4, 64 NEXT i Task(%qt_gw2).freq = 1.1 INCR cnt IF cnt > 30 THEN INCR Af.section cnt = 0 END IF CASE 15 ' fermata 'StopTask %Akafest_Play - niet nodig, want beide taken zijn ekskluzief IF ISFALSE Task(%Akafest_P3).swit THEN StartTask %Akafest_P3 ' slierten IF ISFALSE Task(%Akafest_P2).swit THEN StartTask %Akafest_P2 Task(%qt_gw2).freq = 0.2 Controller Qt.channel, 7, 127 INCR Af.section CASE 16 ' wind uitschakelen? Controller Qt.channel, 7, 0 StopTask %qt_gw2 END SELECT IF Af.section <> oldsection THEN SetDlgItemText gh.Cockpit, %GMT_MSG2, "section: " & STR$(Af.section) oldsection = Af.section END IF END SUB SUB Akafest_Play () ' polymetric playing procedure STATIC cnt AS LONG STATIC root1 AS LONG STATIC root2 AS LONG STATIC root3 AS LONG IF ISFALSE Task(%Akafest_Play).tog THEN cnt =0 IF Task(%Akafest_P2).tog THEN Stoptask %Akafest_P2 ' stop de aangehouden akkoorden indien aktief root1 = 4 root2 = 6 root3 = 10 Task(%Akafest_Play).tog = %True END IF Task(%Akafest_Play).freq = Task(%qt_gw2).freq * 30 ' check this... ' ' playing section: ' ' note: The qhar string is 256 bytes long ' ' the range for qt is 73 to 217, so 1-72 and 218-256 are out of range. ' ' one thirth of the ambitus equals (217-73) / 3 = 48 ' ' kl: this way, some chords of the progression are not played at all ' thats we we now place it in a separate task, faster than the chord generator... SELECT CASE Af.section ' bepaling van de metrische faktoren CASE < 4 root1 = 4 root2 = 6 root3 = 10 CASE < 8 root1 = 5 root2 = 7 root3 = 11 CASE < 12 root1 = 4 root2 = 5 root3 = 7 CASE ELSE root1 = 4 root2 = 6 root3 = 10 END SELECT IF ISFALSE cnt MOD root1 THEN ' ' play highest thirth of ambitus Qt.Qhar(1).vel = NUL$(169) & RIGHT$(Af.Qh.vel,87) QInstrumPlay Qt ' play function to be checked!!! ELSEIF cnt MOD root1 = 2 THEN Qt.Qhar(1).vel = NUL$(256) QInstrumplay Qt END IF IF ISFALSE cnt MOD root2 THEN ' ' play central thirth of ambitus Qt.Qhar(1).vel = NUL$(121) + MID$(Af.Qh.vel,48,48) + NUL$(87) QInstrumPlay Qt ELSEIF cnt MOD root2 = 3 THEN Qt.Qhar(1).vel = NUL$(256) QInstrumPlay Qt END IF IF ISFALSE cnt MOD root3 THEN ' play lowest thirth of ambitus 'Qtq.Qhar(1).vel = LEFT$(Af.Qh.vel,121) + NUL$(135) 'QInstrumPlay Qtq ' plays on Krum... Qt.Qhar(1).vel = LEFT$(Af.Qh.vel,121) + NUL$(135) QInstrumPlay Qt ELSEIF cnt MOD root3 = 5 THEN 'Qtq.Qhar(1).vel = NUL$(256) 'Qinstrumplay Qtq Qt.Qhar(1).vel = NUL$(256) Qinstrumplay Qt END IF INCR cnt END SUB SUB Akafest_P2 () ' aanhouden akkoorden IF ISFALSE Task(%Akafest_P2).tog THEN IF Task(%Akafest_Play).tog THEN stoptask %Akafest_Play Task(%Akafest_P2).tog = %True END IF Task(%Akafest_P2).freq = Task(%qt_gw2).freq * 10 ' playing section: Qt.Qhar(1).vel = Af.Qh.vel QInstrumplay Qt END SUB SUB Akafest_Slierten () STATIC cnt AS LONG STATIC nr AS LONG STATIC nn AS CUR STATIC oldnote AS CUR ' Af.qnoot STATIC oldqnote AS CUR DIM n(24) AS STATIC CUR ' kwarttoons diatoniek, stijgende ladders tussengeweven in de gespeelde ' harmonische konstellaties/ Task(%Akafest_P3).freq = Task(%qt_gw2).freq * 20 'IF Qt.Qhar(1).vel = NUL$(256) THEN IF Af.Qh.vel = NUL$(256) THEN cnt = %False IF oldnote THEN NoteOff Qt.channel, oldnote : oldnote = %False IF oldqnote THEN noteoff Qtq.channel, oldqnote : oldqnote = %False Af.qnoot = %False EXIT SUB ELSE IF ISFALSE cnt THEN IF GetNrNotesInQHar (Af.Qh) >= 2 THEN Af.Qhd.vel = Af.Qh.vel 'Qt.Qhar(1).vel ' reduce Af.Qhd to essential chord nr = ReduceQHar (Af.Qhd, n()) ELSE IF oldnote THEN NoteOff Qt.channel, oldnote : oldnote = %False IF oldqnote THEN noteoff Qtq.channel, oldqnote : oldqnote = %False Af.qnoot = %False EXIT SUB END IF ' play chord in arpeggio with 2.5 intervals in betweensteps IF oldqnote THEN noteoff qtq.channel, oldqnote : oldqnote = %False IF oldnote THEN noteoff qt.channel, oldnote: oldnote = %False IF FRAC (n(cnt)) THEN Play Qtq.channel, FIX(n(cnt)), 32 oldqnote = FIX(n(cnt)) ELSE Play Qt.channel, n(cnt), 32 oldnote = n(cnt) END IF af.qnoot = n(cnt) nn = n(0) INCR cnt ELSE ' play chord in scales & arpeggio with 2.5 intervals in betweensteps IF UBOUND(n) > cnt THEN IF n(cnt+1) > (nn + 2.5) THEN 'n(cnt) + 2.5 THEN nn = nn + 2.5 'n(cnt) + 2.5 ELSE nn = n(cnt+ 1) INCR cnt END IF ELSE nn = n(cnt) cnt = %False END IF IF oldqnote THEN noteoff qtq.channel, oldqnote : oldqnote = %False IF oldnote THEN noteoff qt.channel, oldnote: oldnote = %False IF FRAC(nn) THEN Play Qtq.channel, FIX(nn), 32 Oldqnote = FIX(nn) ELSE Play Qt.channel, nn, 32 Oldnote = nn END IF af.qnoot = nn END IF 'incr cnt END IF END SUB SUB Akafest_Slierten_Stop () ' eventueel klinkende noot uitschakelen. IF af.qnoot THEN IF FRAC(af.qnoot) THEN Noteoff Qtq.channel, FIX(af.qnoot) ELSE Noteoff Qt.channel, af.qnoot END IF af.qnoot = %False END IF END SUB SUB Akafest_Stop () StopTask %Akafest_Play StopTask %Akafest_P2 StopTask %Akafest_P3 MM_Qt_Off %MM_Notes MM_Qt_Off %MM_Lights MM_Qt_Off %MM_Qt_Motor END SUB SUB Akafest_Start () LOCAL i AS DWORD ' all other tasks must stop!!! ' no other apps should be running. FOR i = 0 TO 63 IF i <> %qt_gw2 THEN IF Task(i).tog THEN StopTask i END IF NEXT i Controller Qt.channel, 66, %True MM_Qt_On %MM_Lights Progchange Qt.channel, 122 Progchange Qtq.channel, 122 END SUB ' ---QTree--- Triad study for Qt ----------------------------------------------------------------------- SUB QTree () ' Deel 3 uit de suite 'Cuties for Qt' een opdrachtwerk voor Muzikon. ' Hier lopen we de kwintencirkel af in juiste kwinten. We spelen slechts de op kwarttonen afgeronde ' toonhoogtes. ' We voegen bij elke (hier ingekorte) cyclus een van de vier mogelijke tertsen toe. ' Alle drieklanken worden als shepard tonen gespeeld, in alle oktaven van Qt. ' Er is geen user-interaktie. ' Voor uitvoeringen van dit stuk moet de midi-file versie worden gebruikt. We brachten immers enkele ' extras en korrekties aan in de harmonie. STATIC startfreq AS SINGLE STATIC freq AS SINGLE STATIC n0 AS CUR STATIC n1 AS CUR STATIC n2 AS CUR STATIC t0 AS CUR STATIC t1 AS CUR STATIC t2 AS CUR STATIC velo AS LONG STATIC SPEED AS SINGLE STATIC thirth AS LONG STATIC cnt AS LONG STATIC section AS LONG ' static cyclelength as long ' static Qh0 as Qharmtype ' static Qh1 AS Qharmtype LOCAL i AS DWORD ' local a as dword LOCAL b AS DWORD LOCAL noot AS LONG LOCAL tfreq AS SINGLE LOCAL hinote AS CUR IF ISFALSE Task(%QTree).tog THEN thirth = 6 ' 5-8 is het bereik SPEED = 20 b = 0 i = 0 velo = 82 section = 1 '%False cnt = %False startfreq = N2F(Qt.lowtes) ' 36 freq = startfreq n2 = F2NF(freq) n1 = n2 n0 = n1 Task(%Qtree).tog = %True ' AddNote2Qhar Qh0,Qt.lowtes, velo ' AddNote2Qhar Qh0,Qt.lowtes + 7, velo ' AddNote2Qhar Qh0,Qt.lowtes + 3, velo ' 3 = (thirth /2) ' GetPsiQChord Qh0 END IF n0 = n1 ' n0 = oldnote n1 = n2 t0 = t1 ' t0 = old third t1 = t2 IF cnt THEN freq = freq * (3!/2!) ' zuivere kwinten IF freq > (startfreq * 2) THEN freq = freq / 2 IF F2Qt(freq) = 36.00 THEN INCR b ' count nr. of C's IF b THEN INCR section SELECT CASE section CASE 1 ' done on init terts = 6 CASE 2 ' terts 5 b = 0 cnt = 1 CASE 3 b = 0 cnt = 1 ' terts = 8 CASE 4 b = 0 cnt =1 'tremulanten aan: Controller Qt.channel, 67, 127 Controller Qt.channel, 68, 127 Controller Qt.channel, 11, 96 Controller Qt.channel, 12, 96 ' terts = 7 CASE 5 b = 0 Controller Qt.channel, 67, %False Controller Qt.channel, 68, %False END SELECT ' cyclelength = cnt SetDlgItemText gh.cockpit, %GMT_msg1, "section:" & STR$(section) END IF 'qh1.vel = NUL$(256) END IF SetDlgItemText gh.Cockpit, %GMT_msg2, STR$(cnt) n2 = F2NF(freq) ' nieuwe basisnoot ' now calculate the triads on n1: ' exponent is 6,7,8 of 9 IF n1 THEN ' n1 is de vorige basisnoot, blijft liggen IF n1 < n2 THEN tfreq = NF2F(n1) * (2^(thirth/ 24)) ' gelijkzwevend kwarttoons t2 = F2NF(tfreq) ELSE tfreq = NF2F(n2) * (2^(thirth/ 24)) ' gelijkzwevend kwarttoons t2 = F2NF(tfreq) END IF END IF IF n0 THEN ' oudste noot uitschakelen, in alle oktaven: IF (FRAC(n0) > 0.25) AND (FRAC(n0) < 0.75) THEN noot = FIX(n0) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n0) >= 0.75 THEN noot = FIX(n0) + 1 DO NoteOff Qt.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n0) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' vorige terts uitschakelen: IF t1 THEN IF (FRAC(t1) > 0.25) AND (FRAC(t1) < 0.75) THEN noot = FIX(t1) DO NoteOff Qt.channel+1, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(t1) >= 0.75 THEN noot = FIX(t1) + 1 DO NoteOff Qt.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(t1) DO NoteOff QT.channel, noot noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF ' n1 blijft nu klinken... ' n2 voegen we toe: IF (FRAC(n2) > 0.25) AND (FRAC(n2) < 0.75) THEN noot = FIX(n2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(n2) >=0.75 THEN noot = FIX(n2) + 1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(n2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF ' en nu nog toevoeging van de nieuwe terts: IF t2 THEN IF (FRAC(t2) > 0.25) AND (FRAC(t2) < 0.75) THEN noot = FIX(t2) DO Play Qt.channel+1, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSEIF FRAC(t2) >= 0.75 THEN noot = FIX(t2) + 1 DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes ELSE noot = FIX(t2) DO Play QT.channel, noot, velo noot = noot + 12 LOOP UNTIL noot > Qt.hightes END IF END IF 'GetPsiQChord Qh1 ' melody line: - added only for passing to other melody treatment tasks hinote = 0 IF n2 > hinote THEN hinote = n2 IF n1 > hinote THEN hinote = n1 IF t2 > hinote THEN hinote = t2 Task(%Qtree).duur = cnt Task(%Qtree).pan = ROUND((hinote * 2),0) ' 0-255 '--------------- SELECT CASE section CASE 1 thirth = 6 ' minor IF cnt = %False THEN ' eerste akkoord lang! Task(%Qtree).freq = 0.2 ELSE SPEED = 5 + (5 * ((11 + (cnt MOD 12)) / 11)) 'speed should double for each cycle ' drieledig ritme 2:1 IF ISFALSE cnt MOD 2 THEN Task(%Qtree).freq = SPEED / 24 ELSE Task(%Qtree).freq = SPEED / 12 END IF END IF CASE 2 thirth = 5 IF cnt = 1 THEN Task(%Qtree).freq = 0.5 ELSE SPEED = 10 + (10 * ((41 + (cnt MOD 42)) / 41)) ' daktyl IF ISFALSE cnt MOD 3 THEN Task(%Qtree).freq = SPEED / 24 ELSE Task(%Qtree).freq = SPEED / 12 END IF END IF CASE 3 thirth = 8 IF cnt = 1 THEN Task(%Qtree).freq = 0.6 ELSE SPEED = 6 + (6 * ((12 + (cnt MOD 13)) / 12)) ' vierde + 3 achtsten IF ISFALSE cnt MOD 4 THEN Task(%Qtree).freq = SPEED / 24 '9 ELSE Task(%Qtree).freq = SPEED / 12 '12 END IF END IF CASE 4 thirth = 7 ' major IF cnt = 1 THEN Task(%QTree).freq = 0.5 ELSE SPEED = 24 - (12 * ((42 + (cnt MOD 43)) / 42)) 'ritardando ' binair - marsch : vierde gepunt + achtste. IF ISFALSE cnt MOD 2 THEN Task(%Qtree).freq = SPEED / 3 ' lang op even counts ELSE Task(%Qtree).freq = SPEED / 1 ' kort op oneven counts END IF END IF CASE ELSE SLEEP 5000 'SetDlgItemText gh.Cockpit, %GMT_msg2, STR$(n0) & str$(n1) & str$(n2) StopTask(%Qtree) END SELECT IF Task(%Qtree).freq < 0.1 THEN task(%Qtree).freq = 0.1 INCR cnt END SUB SUB Qtree_start () LOCAL i AS DWORD SetDlgItemText gh.cockpit, %GMT_msg1, "section 1" ' all other tasks must stop!!! FOR i = 0 TO 63 IF i <> %Qtree THEN IF Task(i).tog THEN StopTask i END IF NEXT i Controller Qt.channel, 66, %True MM_Qt_On %MM_Lights OR %MM_Qt_Motor Progchange Qt.channel, 122 Progchange Qtq.channel, 122 END SUB SUB Qtree_stop () MM_Qt_Off %MM_Lights MM_Qt_Off ' does not switch of wind. END SUB '-------------------------- Terry Riley '-------------------------- Keyboard Studies: Untitled Organ SUB Qt_Riley_1 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley).tog THEN MM_Qt_ON %MM_Motor OR %MM_Wind ' fade in DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 56: mel(1) = 55 : mel(2) = 58 : mel(3) = 53 Slider(0).value = 10 ' cockpit SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Task(%Qt_Riley).freq = slider(0).value Task(%Qt_Riley).tog = %True cnt = %False END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(3) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > 3 THEN cnt = 0 Task(%Qt_Riley).freq = slider(0).value END SUB SUB Qt_Riley_2 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+1).tog THEN DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 55: mel(1) = 53 : mel(2) = 56 : mel(3) = 58 Task(%Qt_Riley+1).freq = slider(0).value Task(%Qt_Riley+1).tog = %True cnt = %False END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(3) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > 3 THEN cnt = 0 Task(%Qt_Riley+1).freq = slider(0).value END SUB SUB Qt_Riley_3 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+2).tog THEN DIM mel(0 TO 5) AS STATIC BYTE mel(0) = 56: mel(1) = 55 : mel(2) = 58 : mel(3) = 53 : mel(4) = 58: mel(5) = 53 Task(%Qt_Riley+2).freq = slider(0).value cnt = %False Task(%Qt_Riley+2).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+2).freq = slider(0).value END SUB SUB Qt_Riley_4 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+3).tog THEN DIM mel(0 TO 7) AS STATIC BYTE mel(0) = 56: mel(1) = 55 : mel(2) = 58 : mel(3) = 53 : mel(4) = 58: mel(5) = 56 : mel(6)= 60 : mel(7) = 55 Task(%Qt_Riley+3).freq = slider(0).value cnt = %False Task(%Qt_Riley+3).tog = %True END IF IF cnt > 0 THEN IF mel(cnt-1) <> 60 THEN NoteOff Qt.channel, mel(cnt-1) ' noot moet blijven hangen END IF ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+3).freq = slider(0).value END SUB SUB Qt_Riley_5 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+4).tog THEN NoteOff Qt.channel, 60 DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 53: mel(1) = 62 : mel(2) = 65 : mel(3) = 60 Task(%Qt_Riley+4).freq = slider(0).value cnt = %False Task(%Qt_Riley+4).tog = %True END IF IF cnt > 0 THEN 'IF mel(cnt-1) <> 60 THEN NoteOff Qt.channel, mel(cnt-1) ' noot moet blijven hangen 'END IF ELSE 'NoteOff Qt.channel, mel(UBOUND(mel)) ' nu moet deze blijven hangen END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+4).freq = slider(0).value END SUB SUB Qt_Riley_6 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+5).tog THEN 'NoteOff Qt.channel, 60 - moeten blijven hangen !!! Play Qt.channel, 60, 30 DIM mel(0 TO 2) AS STATIC BYTE mel(0) = 63: mel(1) = 62 : mel(2) = 65 Task(%Qt_Riley+5).freq = slider(0).value cnt = %False Task(%Qt_Riley+5).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+5).freq = slider(0).value END SUB SUB Qt_Riley_7 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+6).tog THEN NoteOff Qt.channel, 60 Play Qt.channel, 62, 30 '- moet hangen DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 60: mel(1) = 63 : mel(2) = 65 : mel(3) = 63 Task(%Qt_Riley+6).freq = slider(0).value cnt = %False Task(%Qt_Riley+6).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+6).freq = slider(0).value END SUB SUB Qt_Riley_8 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+7).tog THEN NoteOff Qt.channel, 62 DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 61: mel(1) = 60 : mel(2) = 63 : mel(3) = 58 Task(%Qt_Riley+7).freq = slider(0).value cnt = %False Task(%Qt_Riley+7).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+7).freq = slider(0).value END SUB SUB Qt_Riley_9 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+8).tog THEN DIM mel(0 TO 2) AS STATIC BYTE mel(0) = 60: mel(1) = 61 : mel(2) = 60 Task(%Qt_Riley+8).freq = slider(0).value cnt = %False Task(%Qt_Riley+8).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+8).freq = slider(0).value END SUB SUB Qt_Riley_10 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+9).tog THEN DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 63: mel(1) = 65 : mel(2) = 62 : mel(3) = 60 Task(%Qt_Riley+9).freq = slider(0).value cnt = %False Task(%Qt_Riley+9).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+9).freq = slider(0).value END SUB SUB Qt_Riley_11 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+10).tog THEN DIM mel(0 TO 2) AS STATIC BYTE mel(0) = 63: mel(1) = 65 : mel(2) = 62 Task(%Qt_Riley+10).freq = slider(0).value cnt = %False Task(%Qt_Riley+10).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+10).freq = slider(0).value END SUB SUB Qt_Riley_12 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+11).tog THEN DIM mel(0 TO 5) AS STATIC BYTE mel(0) = 63: mel(1) = 62 : mel(2) = 65 : mel(3) = 63 : mel(4) = 62 : mel(5) = 60 Task(%Qt_Riley+11).freq = slider(0).value cnt = %False Task(%Qt_Riley+11).tog = %True END IF IF cnt > 0 THEN IF mel(cnt-1) <> 65 THEN ' die moet hangen NoteOff Qt.channel, mel(cnt-1) END IF ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+11).freq = slider(0).value END SUB SUB Qt_Riley_13 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+12).tog THEN NoteOff Qt.channel, 65 DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 67: mel(1) = 65 : mel(2) = 68 : mel(3) = 70 Task(%Qt_Riley+12).freq = slider(0).value cnt = %False Task(%Qt_Riley+12).tog = %True END IF IF cnt > 0 THEN IF mel(cnt-1) <> 65 THEN ' die moet hangen NoteOff Qt.channel, mel(cnt-1) END IF ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+12).freq = slider(0).value END SUB SUB Qt_Riley_14 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+13).tog THEN Play Qt.channel, 65, 30 ' blijft hangen DIM mel(0 TO 2) AS STATIC BYTE mel(0) = 68: mel(1) = 67 : mel(2) = 70 Task(%Qt_Riley+13).freq = slider(0).value cnt = %False Task(%Qt_Riley+13).tog = %True END IF IF cnt > 0 THEN IF mel(cnt-1) <> 65 THEN ' die moet hangen NoteOff Qt.channel, mel(cnt-1) END IF ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+13).freq = slider(0).value END SUB SUB Qt_Riley_15 () STATIC cnt AS WORD IF ISFALSE Task(%Qt_Riley+14).tog THEN NoteOff Qt.channel, 65 DIM mel(0 TO 3) AS STATIC BYTE mel(0) = 68: mel(1) = 67 : mel(2) = 70 : mel(3) = 65 Task(%Qt_Riley+14).freq = slider(0).value cnt = %False Task(%Qt_Riley+14).tog = %True END IF IF cnt > 0 THEN NoteOff Qt.channel, mel(cnt-1) ELSE NoteOff Qt.channel, mel(UBOUND(mel)) END IF Play Qt.channel, mel(cnt), 30 INCR cnt IF cnt > UBOUND(mel) THEN cnt = 0 Task(%Qt_Riley+14).freq = slider(0).value END SUB SUB Qt_Riley_1_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 1 END SUB SUB Qt_Riley_2_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 2 END SUB SUB Qt_Riley_3_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 3 END SUB SUB Qt_Riley_4_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 4 END SUB SUB Qt_Riley_5_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 5 END SUB SUB Qt_Riley_6_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 6 END SUB SUB Qt_Riley_7_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 7 END SUB SUB Qt_Riley_8_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 8 END SUB SUB Qt_Riley_9_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 9 END SUB SUB Qt_Riley_10_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 10 END SUB SUB Qt_Riley_11_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 11 END SUB SUB Qt_Riley_12_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 12 END SUB SUB Qt_Riley_13_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 13 END SUB SUB Qt_Riley_14_stop () Controller Qt.channel, 123, %False StartTask %Qt_Riley + 14 END SUB SUB Qt_Riley_15_stop () MM_Qt_Off %MM_Wind END SUB