' *************************************************** ' * < V I B I > * ' * an automated vibraphone by Godfried-Willem Raes * ' *************************************************** ' 16.09.2001: first creation of this module. ' 05.10.2001: Hardware tests with all pc boards. ' 09.10.2001: Vibi played its very first scales... ' 12.10.2001: new vibi_holdup added in dll. ' 22.10.2001: afgewerkt. ' 05.11.2001: tests on handshaking hardware ' 11.11.2001: composed. - commisioned by Paul Koek. ' 14.11.2001: this piece expanded to become for 5 to 6 automats and optional musicians ' 19.11.2001: ready. ' 20.11.2001: changing cockpit implemented. (changed in DLL) ' 10.02.2002: to be changed: use only pointer to vibi srructure here! ' 21.06.2002: all code for paradiso should be moved to technofaustus... ' THIS IS THE LAST VERSION WHERIN PARADISO IS INTEGRATED '%gwr_only = %True %vbt0 = 32 ' start-up task for ' following tasks may be overwritten: (They are created only when needed) %vbt1 = 17 ' 'Vibes' for 5 tasks: 18,19,20,21,22 - %vbt2 = %vbt1 + 1 ' can be used as environmental music, musique d'ameublement. %vbt3 = %vbt1 + 2 %vbt4 = %vbt1 + 3 %vbt5 = %vbt1 + 4 ' motor task for 'Vibes' for . %vbt6 = %vbt1 + 5 ' piperola & harma task... %tvp0 = 33 ' start-up task for - score 5'00" / ca.10' ' following tasks may be overwritten: (They are created when is started) %tvp1 = 0 ' vibi %tvp2 = 1 ' vibi %tvp12 = 24 ' Vibi %tvp3 = 2 ' Harma %tvp4 = 25 ' Klung %tvp5 = 26 ' motor task for 'Vibes' %tvp6 = 4 ' Piperola / Bourdonola %tvp7 = 3 ' Player piano %tvp8 = 27 ' real musicians %tvp9 = 28 ' ending task. TYPE ParadisoType DWORD duur AS DWORD ' in seconds spekfak AS SINGLE ' spectral modulation factor oTc AS INTEGER ' previous fundamental section AS DWORD ' = duur / 12 marker(0 TO 20) AS DWORD ' markers for score clock AS DWORD ' synchronisation clock v1flag AS DWORD ' vibi part1 signal v2flag AS DWORD ' vibi part2 signal v3flag AS DWORD ' harma part signal v6flag AS DWORD ' piperola part signal v7flag AS DWORD ' player piano signal endflag AS DWORD ' set when the second part is to start END TYPE GLOBAL Vibi AS VibiType ' GLOBAL pV AS VibiType PTR 'GLOBAL Piperola AS musician GLOBAL Harmonium AS musician GLOBAL Paradiso AS ParadisoType DECLARE FUNCTION Init_Vibi () AS LONG DECLARE SUB Vibi_Start_Button () DECLARE SUB Vibi_Motoren_Test () ' task 48 DECLARE SUB Vibi_Scale_Test () ' task 49 DECLARE SUB Vibi_Holdup_Test () ' task 50 DECLARE SUB Vibi_Repeat_Test () ' task 51 DECLARE SUB Vibi_ScaleDamp_Test () ' task 52 #IF %DEF(%gwr_only) DECLARE SUB Handshaketest () ' task 54 - do not try this out! #ENDIF DECLARE SUB Vibi_t0 () DECLARE SUB Vibi_t1 () DECLARE SUB Vibi_t2 () DECLARE SUB Vibi_t3 () DECLARE SUB Vibi_t4 () DECLARE SUB Vibi_t5 () DECLARE SUB Vibi_t6 () DECLARE SUB Vibes_Start () DECLARE SUB Vibes_Stop () DECLARE SUB v_tvp0 () ' expanded to DECLARE SUB v_tvp1 () ' vibi proc 1 DECLARE SUB v_tvp2 () ' vibi proc 2 DECLARE SUB v_tvp12 () ' vibi task DECLARE SUB v_tvp3 () ' harma task DECLARE SUB v_tvp4 () ' klung task DECLARE SUB v_tvp5 () ' vibi motor task DECLARE SUB v_tvp6 () ' piperola task DECLARE SUB v_tvp7 () ' piano task DECLARE SUB v_tvp8 () ' = musicians DECLARE SUB v_tvp9 () ' = Paradiso-stop DECLARE SUB v_tvp9End () ' deletes cockpit elements at the end of paradiso DECLARE SUB v_tvpInit () DECLARE SUB Paradise_DrawMelody (BYVAL n1 AS BYTE, BYVAL n2 AS BYTE,BYVAL n3 AS BYTE) FUNCTION Init_Vibi () AS LONG LOCAL note AS BYTE LOCAL retval AS LONG LOCAL m AS ASCIIZ * 30 LOCAL CockpitLayo AS CockpitLabels ReadCockpitLabelsFromFile $VibiIni, CockpitLayo ' ... Vibi.channel = %Vibi_Channel ' 10 (= Harma channel + 1) Vibi.listentask = %ppListen ' the midi listen tasks resides in the dll retval = Vibi_Init_DLL (gh, Vibi) ' publish pointer to Vibi structure to dll and initialize hardware '... ' prepare the cockpit tasks: IF hMidiI(0) THEN Task(Vibi.listentask).naam = "Listen" Task(Vibi.listentask).channel = Vibi.channel Task(Vibi.listentask).freq = 997 m = UCASE$("Vibi_Listen") Task(Vibi.Listentask).cptr = GetProcAddress(gh.gnh,m) ' set to dll: Vibi_Listen for real machine control. Task(Vibi.ListenTask).flags = %DLL_TASK ELSE #IF %DEF(%gwr) ErrorMidiIn #ENDIF END IF ' vibes for Task(%vbt0).naam = "" Task(%vbt0).cptr = CODEPTR(Vibi_t0) Task(%vbt0).freq = 5 Task(%vbt0).Har.vel = STRING$(128,0) TaskEX(%vbt0).startCptr = CODEPTR(Vibes_Start) ' creates the cockpit TaskEX(%vbt0).stopCptr =CODEPTR(Vibes_Stop) IF hMidiO(0) THEN ' / Task(%tvp0).naam ="Paradiso" Task(%tvp0).cptr = CODEPTR(v_tvp0) Task(%tvp0).freq = 2 TaskEX(%tvp0).stopCptr =CODEPTR(v_tvp9) ' this becomes a task, it can make an ending. TaskEX(%tvp0).startCptr = CODEPTR(v_tvpInit) ' creates the cockpit END IF ' hardware testcode: Task(48).freq = 50 Task(48).naam = "Motors" Task(48).cptr = CODEPTR(Vibi_Motoren_Test) Task(49).freq = 47 Task(49).naam ="Scales" Task(49).cptr = CODEPTR(Vibi_Scale_Test) Task(50).freq = 48 Task(50).naam ="HoldUp" Task(50).cptr = CODEPTR(Vibi_Holdup_Test) Task(51).freq = 4 Task(51).naam ="Repeat" Task(51).cptr = CODEPTR(Vibi_Repeat_Test) Task(52).freq = 30 Task(52).naam = "ScalDamp" Task(52).cptr = CODEPTR(Vibi_ScaleDamp_Test) #IF %DEF(%gwr_only) Task(54).freq = 100 Task(54).naam = "PrtTst" Task(54).cptr = CODEPTR(Handshaketest) #ENDIF ' end hardware testcode. 'delete unnecessary buttons IF ISFALSE hMidiI(0) THEN ButnSW(0).tag = "" ButnSW(0).cptr = %False END IF IF ISFALSE hMidiO(0) THEN ButnOS(0).tag = "" ButnOS(0).cptr = %False END IF ButnSW(1).tag = "START" ButnSW(1).cptr = CODEPTR(Vibi_Start_Button) ButnSW(2).tag = "" ButnSW(3).tag = "" ButnSW(4).tag = "" 'ButnSW(5).tag = "" - melody window needed for paradiso ButnSW(6).tag = "" ButnSW(7).tag = "" ButnSW(8).tag = "" ButnSW(9).tag = "" ButnSW(10).tag = "" IF hMidiO(0) THEN ButnSW(11).tag = "MiSim" ButnSW(11).cPtr = CODEPTR(Vibi_Midi_Sim) ELSE ButnSW(11).tag = "" END IF ButnOS(10).tag ="N-Off" ButnOS(10).cptr = CODEPTR(Vibi_AllNotesOff) ButnOS(11).tag ="D-Off" ButnOS(11).cptr = CODEPTR(Vibi_AllDampersOff) App.id = %ID_VIBI ' return true if init successfull: FUNCTION = %True END FUNCTION SUB Vibi_Start_Button () STATIC tog AS BYTE IF ButnSW(1).Flag THEN SetDlgItemText gh.Cockpit, App.butnSWparam, "Stop" App.MTstart = %True StartTask App.MTSpeedTaskNr IF ISFALSE tog THEN IF hMidiI(0) THEN ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) ' SxThread END IF StartTask App.RuntimeTasknr App.tstart = timeGetTime ' start the chronometerfunction tog = %True END IF ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "Cont" END IF END SUB SUB Vibi_Midi_Sim () ' implemented only for Paradiso. IF ButnSW(11).Flag THEN Vibi.simulator = %KlungSimMid ProgChange Vibi.channel,%ID_VIBRAPHONE ' gm patch SetDlgItemText gh.Cockpit, App.butnSWparam, "MidiOFF" ELSE Vibi.simulator = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "Midi ON" END IF END SUB ' tests for hardware: SUB Vibi_Motoren_Test () STATIC NrSl AS LONG STATIC id AS LONG STATIC oldspeed0 AS BYTE STATIC oldspeed1 AS BYTE STATIC slnr() AS INTEGER STATIC TaskParamLabels() AS ASCIIZ*8 LOCAL i AS LONG IF ISFALSE NrSL THEN id = 48 ' tasknumber NrSl = 2 DIM Slnr(0 TO 1) AS STATIC INTEGER DIM TaskParamLabels(0 TO 1) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Mot0" TaskParamLabels(1)="Mot1" IF Task(id).hParam = %Null THEN MakeTaskParameterDialog BYVAL id,NrSl, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 1 slnr(i) = TaskEX(id).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT END IF IF Slider(Slnr(0)).value <> oldspeed0 THEN Vibi_Motor 0, Slider(Slnr(0)).value * 2 ' dll proc. - the real resolution is 8 bits, not seven as used here. oldspeed0 = Slider(Slnr(0)).value END IF IF Slider(Slnr(1)).value <> oldspeed1 THEN Vibi_Motor 1, Slider(Slnr(1)).value * 2 oldspeed1 = Slider(Slnr(1)).value END IF Task(id).freq = 4 END SUB SUB Vibi_Scale_Test () ' using damper-pulse coding. STATIC id AS INTEGER STATIC note AS BYTE LOCAL n AS BYTE LOCAL i AS LONG LOCAL velo AS BYTE STATIC tim AS DWORD STATIC timvals() AS DWORD STATIC slnr() AS INTEGER IF ISFALSE id THEN id = 49 ' tasknumber Task(id).har.vel = STRING$(128,0) note = 60 DIM timvals(60 TO 97) AS STATIC DWORD ' create sliders: DIM Slnr(0 TO 3) AS STATIC INTEGER DIM TaskParamLabels(0 TO 3) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Velo" ' attack force for beaters TaskParamLabels(1)="Duur" ' duration for sustained notes, time before damping TaskParamLabels(2)="Damp" ' damping force TaskParamLabels(3)="Freq" ' speed IF Task(id).hParam = %Null THEN MakeTaskParameterDialog BYVAL id,4, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 3 slnr(i) = TaskEX(id).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT END IF tim = Timegettime velo = Slider(slnr(2)).value FOR n = 60 TO 96 IF timvals(n) THEN IF tim > timvals(n) THEN IF velo THEN Vibi_Damp n, velo DelNote2Har Task(id).har, n Timvals(n) = %False END IF END IF END IF NEXT n ' note on's: velo = Slider(Slnr(0)).value IF velo THEN AddNote2Har Task(id).Har, note, velo Vibi_Beat note, velo Timvals(note) = tim + (Slider(Slnr(1)).value * 20) ' in milliseconds - range: 1/Task().freq to 2.5 sec. ELSE Timvals(note) = %False END IF INCR note IF note > 96 THEN note = 60 Task(id).freq = Slider(Slnr(3)).value / 4! IF Task(id).freq < 0.2 THEN Task(id).freq = 0.2 END SUB SUB Vibi_ScaleDamp_Test () ' task 52 STATIC id AS INTEGER STATIC note AS BYTE LOCAL n AS BYTE LOCAL i AS LONG LOCAL velo AS BYTE LOCAL dempduur AS BYTE STATIC tim AS DWORD STATIC timvals() AS DWORD STATIC slnr() AS INTEGER IF ISFALSE id THEN id = 52 ' tasknumber Task(id).har.vel = STRING$(128,0) note = 60 DIM timvals(60 TO 97) AS STATIC DWORD ' create sliders: DIM Slnr(0 TO 4) AS STATIC INTEGER DIM TaskParamLabels(0 TO 4) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Velo" ' attack force for beaters TaskParamLabels(1)="Duur" ' duration for sustained notes, time before damping TaskParamLabels(2)="Damp" ' damping force TaskParamLabels(3)="Dtim" ' damping time TaskParamLabels(4)="Freq" ' speed IF Task(id).hParam = %Null THEN MakeTaskParameterDialog BYVAL id,5, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 4 slnr(i) = TaskEX(id).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT END IF tim = Timegettime velo = Slider(slnr(2)).value dempduur = Slider(slnr(3)).value FOR n = 60 TO 96 IF timvals(n) THEN IF tim > timvals(n) THEN IF velo THEN Vibi_HoldUp n, velo, dempduur DelNote2Har Task(id).har, n Timvals(n) = %False ELSE DelNote2Har Task(id).har,n Timvals(n) = %False END IF END IF END IF NEXT n ' note on's: velo = Slider(Slnr(0)).value tim = Timegettime IF velo THEN AddNote2Har Task(id).Har, note, velo Vibi_Beat note, velo Timvals(note) = tim + (Slider(Slnr(1)).value * 20) ' in milliseconds - range: 1/Task().freq to 2.5 sec. ELSE Timvals(note) = %False END IF INCR note IF note > 96 THEN note = 60 Task(id).freq = Slider(Slnr(4)).value / 4! IF Task(id).freq < 0.2 THEN Task(id).freq = 0.2 END SUB SUB Vibi_Holdup_Test () ' test voor de demper hold's STATIC id AS INTEGER STATIC note AS BYTE LOCAL i AS BYTE IF ISFALSE id THEN id = 50 ' tasknumber Task(id).har.vel = STRING$(128,0) note = 60 ' create sliders: DIM Slnr(0 TO 2) AS STATIC INTEGER DIM TaskParamLabels(0 TO 2) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Force" ' pushing force for dampers TaskParamLabels(1)="Duur" ' pushing time for dampers TaskParamLabels(2)="Freq" IF Task(id).hParam = %Null THEN MakeTaskParameterDialog BYVAL id,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 2 slnr(i) = TaskEX(id).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT END IF Vibi_HoldUp note, Slider(Slnr(0)).value, Slider(slnr(1)).value INCR note IF note > 96 THEN note = 60 Task(id).freq = Slider(Slnr(2)).value / 12! IF Task(id).freq < 4 THEN Task(id).freq = 4 END SUB SUB Vibi_Repeat_Test () ' test for maximum repeat frequency on individual notes. STATIC id AS INTEGER LOCAL note AS BYTE LOCAL velo AS BYTE LOCAL i AS LONG IF ISFALSE id THEN id = 51 ' tasknumber ' create sliders: DIM Slnr(0 TO 2) AS STATIC INTEGER DIM TaskParamLabels(0 TO 2) AS STATIC ASCIIZ*8 TaskParamLabels(0)="Note" ' note for iteration TaskParamLabels(1)="Velo" TaskParamLabels(2)="Freq" IF Task(id).hParam = %Null THEN MakeTaskParameterDialog BYVAL id,3, Slider(),0,UdCtrl(), TaskParamLabels() END IF FOR i = 0 TO 2 slnr(i) = TaskEX(id).SliderNumbers(i) 'get slidernumber given in GMT-code Slider(Slnr(i)).value = 0 SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value NEXT END IF Task(id).freq = Slider(Slnr(2)).value / 8! ' tot 16Hz IF Task(id).freq < 1 THEN Task(id).freq = 1 note = Slider(Slnr(0)).value IF note THEN note = 60 + (note MOD 38) ELSE EXIT SUB END IF velo = Slider(Slnr(1)).value IF velo THEN Vibi_Beat note, velo ELSE EXIT SUB END IF END SUB #IF %DEF(%gwr_only) SUB Handshaketest () ' do not run this under any circumstances when connected to an actual automat!!! STATIC id AS LONG STATIC b AS BYTE STATIC c AS BYTE LOCAL retval AS LONG ' task 54 for research only. IF ISFALSE id THEN id = 54 ' tasknumber END IF Ni_16BitOut 1,c,b INCR b INCR c INCR c Task(id).freq = 1 + (Slider(0).value * 16) '16 Word/sec to 2048 Words/sec END SUB #ENDIF SUB Vibi_t0 () ' meta-task for by Godfried-Willem Raes, october 2001. STATIC denscnt AS BYTE STATIC dynacnt AS BYTE LOCAL seconds AS DWORD IF ISFALSE Task(%vbt0).tog THEN IF Task(%vbt1).tog THEN stoptask %vbt1 IF Task(%vbt2).tog THEN stoptask %vbt2 IF Task(%vbt3).tog THEN stoptask %vbt3 IF Task(%vbt4).tog THEN stoptask %vbt4 IF Task(%vbt5).tog THEN stoptask %vbt5 Slider(0).tag = "Dens" Slider(1).tag = "Dyna" SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 14, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 15, Slider(1).tag Slider(0).value = 1 denscnt = 1 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(1).value = 10 dynacnt = 10 SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID + 10, " for vibi, harma and piperola" Task(%vbt0).tog = %True App.tstart = timeGetTime starttask App.runtimetasknr App.komposduur = 390'was 675 = 11'25" EXIT SUB END IF Task(%vbt0).freq = 0.15 ' scoring for automatic build up at start and stop... seconds = ((timegettime-App.tstart) \ 1000) SELECT CASE seconds CASE >= App.Komposduur '675 StopTask %vbt0 EXIT SUB 'IF hMidi(0) THEN ' IF Task(%vbt6).tog THEN stoptask %vbt6 'END IF CASE >= App.Komposduur * 0.98518 '665 IF task(%vbt1).tog THEN stoptask %vbt1 task(%vbt0).freq = 1.5 CASE > = App.Komposduur * 0.9674 '653 IF task(%vbt2).tog THEN stoptask %vbt2 task(%vbt0).freq = 1.1 CASE >= App.Komposduur * 0.9451 '638 IF task(%vbt3).tog THEN stoptask %vbt3 Task(%vbt0).freq = 0.9 CASE >= App.Komposduur * 0.91852 '620 IF task(%vbt4).tog THEN stoptask %vbt4 Task(%vbt0).freq = 0.6 CASE >= App.Komposduur * 0.8888 '600 IF task(%vbt5).tog THEN stoptask %vbt5 Task(%vbt0).freq = 0.6 CASE >= App.Komposduur * 0.22222'150 Task(%vbt0).freq = seconds / App.Komposduur 'was: (seconds/1000) '0.15Hz to 0.6Hz CASE >= App.Komposduur * 0.1 '67 IF ISFALSE Task(%vbt5).tog THEN starttask %vbt5 CASE >= App.Komposduur * 0.08148 '55 IF ISFALSE Task(%vbt4).tog THEN starttask %vbt4 CASE >= App.Komposduur * 0.058259 '40 IF ISFALSE Task(%vbt3).tog THEN starttask %vbt3 CASE >= App.Komposduur * 0.0326 '22 IF hMidiO(0) THEN IF ISFALSE Task(%vbt6).tog THEN starttask %vbt6 END IF IF ISFALSE Task(%vbt2).tog THEN starttask %vbt2 CASE > =0 IF ISFALSE Task(%vbt1).tog THEN starttask %vbt1 END SELECT dynacnt = (seconds \2) AND &H7F ' was (seconds \ 3) AND &H7F ' - minumum duration for 1 cycle = 381" = 6'21" IF dynacnt < 2 THEN dynacnt = 2 denscnt = (seconds \3) AND &H7F ' was (seconds \ 5) AND &H7F ' - minimum duration for 1 cycle = 635" = 10'35" IF denscnt <1 THEN denscnt = 1 IF Slider(0).value <> denscnt THEN slider(0).value = denscnt SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value END IF IF Slider(1).value <> dynacnt THEN slider(1).value = dynacnt SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value END IF END SUB SUB Vibes_Start () stoptask App.runtimetasknr ' creates the cockpit tasks on startup Task(%vbt1).naam = "ViTim1" Task(%vbt1).freq = 1 Task(%vbt1).cptr = CODEPTR(Vibi_t1) Task(%vbt1).Har.vel = STRING$(128,0) Task(%vbt2).naam = "ViTim2" Task(%vbt2).freq = 1 Task(%vbt2).cptr = CODEPTR(Vibi_t2) Task(%vbt2).Har.vel = STRING$(128,0) Task(%vbt3).naam = "ViTim3" Task(%vbt3).freq = 1 Task(%vbt3).cptr = CODEPTR(Vibi_t3) Task(%vbt3).Har.vel = STRING$(128,0) Task(%vbt4).naam = "ViTim4" Task(%vbt4).freq = 1 Task(%vbt4).cptr = CODEPTR(Vibi_t4) Task(%vbt4).Har.vel = STRING$(128,0) Task(%vbt5).naam = "ViMots" Task(%vbt5).freq = 1 Task(%vbt5).cptr = CODEPTR(Vibi_t5) Task(%vbt5).Har.vel = STRING$(128,0) IF hMidiO(0) THEN ' for harma & piperola in Task(%vbt6).naam = "PipHar" Task(%vbt6).freq = 3 Task(%vbt6).cptr = CODEPTR(Vibi_t6) Task(%vbt6).Har.vel = STRING$(128,0) Task(%vbt6).flags = %MIDI_TASK END IF ChangeCockpitTasks %vbt0 END SUB SUB Vibes_Stop () ' stopcode for IF Task(%vbt1).tog THEN stoptask %vbt1 IF Task(%vbt2).tog THEN stoptask %vbt2 IF Task(%vbt3).tog THEN stoptask %vbt3 IF Task(%vbt4).tog THEN stoptask %vbt4 IF Task(%vbt5).tog THEN stoptask %vbt5 IF hMidiO(0) THEN IF task(%vbt6).tog THEN stoptask %vbt6 InstrumAllNotesOff Piperola InstrumAllnotesOff Harmonium END IF END IF Slider(0).tag = "---" Slider(1).tag = "---" SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 14, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 15, Slider(1).tag ' delete the tasks from the cockpit: Task(%vbt1).naam = "" Task(%vbt1).cptr = %False Task(%vbt2).naam = "" Task(%vbt2).cptr = %False Task(%vbt3).naam = "" Task(%vbt3).cptr = %False Task(%vbt4).naam = "" Task(%vbt4).cptr = %False Task(%vbt5).naam = "" Task(%vbt5).cptr = %False Task(%vbt6).naam = "" Task(%vbt6).cPtr = %False ChangeCockpitTasks -1 '%vbt0 ' parameter= calling task, otherwize the check in the task gets lost. stoptask App.runtimetasknr END SUB SUB Vibi_t1 () LOCAL demping AS BYTE LOCAL note AS BYTE LOCAL velo AS BYTE STATIC oldnote AS BYTE STATIC oldvelo AS BYTE IF ISFALSE task(%vbt1).tog THEN task(%vbt1).tog = %True DO note = 60 + (RND(1) * 37) IF IsNoteInHar (Task(%Vbt1).Har, note) THEN note = %False LOOP UNTIL note > %False demping = 60 + (oldvelo /2) IF oldnote THEN Vibi_HoldUp oldnote, demping, 64 DelNote2Har Task(%Vbt1).Har, oldnote oldnote = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '120) ' cockpit slider 1 = dynamics IF Velo > 120 THEN velo = 120 Vibi_Beat note, velo AddNote2Har Task(%Vbt1).Har, note, velo oldnote = note oldvelo = velo Task(%vbt1).Freq = 0.05 + (RND(1) * Slider(0).value / 32!) '2) ' cockpit slider 0 = density END SUB SUB Vibi_t2 () LOCAL demping AS BYTE LOCAL note AS BYTE LOCAL velo AS BYTE STATIC oldnote AS BYTE IF ISFALSE task(%vbt2).tog THEN task(%vbt2).tog = %True DO note = 60 + (RND(1) * 37) IF IsNoteInHar (Task(%Vbt1).Har, note) THEN note = %False LOOP UNTIL note > %False demping = 18 + (RND(1) * 80) IF oldnote THEN Vibi_HoldUp oldnote, demping, 64 DelNote2Har Task(%Vbt1).Har, oldnote oldnote = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '126) IF velo > 120 THEN velo = 120 Vibi_Beat note, velo AddNote2Har Task(%Vbt1).Har, note, velo oldnote = note Task(%vbt2).Freq = 0.05 + (RND(1) * Slider(0).value/ 32!) '* 2) END SUB SUB Vibi_t3 () LOCAL demping AS BYTE LOCAL note AS BYTE LOCAL velo AS BYTE STATIC oldnote AS BYTE IF ISFALSE task(%vbt3).tog THEN task(%vbt3).tog = %True DO note = 60 + (RND(1) * 37) IF IsNoteInHar (Task(%Vbt1).Har, note) THEN note = %False LOOP UNTIL note > %False demping = 18 + (RND(1) * 64) IF oldnote THEN Vibi_HoldUp oldnote, demping ,64 DelNote2Har Task(%Vbt1).Har, oldnote oldnote = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '126) IF velo > 120 THEN velo = 120 Vibi_Beat note, velo AddNote2Har Task(%Vbt1).Har, note, velo oldnote = note Task(%vbt3).Freq = 0.05 + (RND(1) * Slider(0).value / 32!) '2) END SUB SUB Vibi_t4 () LOCAL demping AS BYTE LOCAL note AS BYTE LOCAL velo AS BYTE STATIC oldnote AS BYTE IF ISFALSE task(%vbt4).tog THEN task(%vbt4).tog = %True DO note = 60 + (RND(1) * 37) IF IsNoteInHar (Task(%Vbt1).Har, note) THEN note = %False LOOP UNTIL note > %False demping = 16 + (RND(1) * 80) IF oldnote THEN Vibi_HoldUp oldnote, demping ,64 DelNote2Har Task(%Vbt1).Har, oldnote oldnote = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '126) IF velo > 120 THEN velo =120 Vibi_Beat note, velo AddNote2Har Task(%Vbt1).Har, note, velo oldnote = note Task(%vbt4).Freq = 0.05 + (RND(1) * Slider(0).value / 32!) '2) END SUB SUB Vibi_t5 () ' motor control task... LOCAL n AS BYTE LOCAL nrdiat AS BYTE LOCAL nrkrom AS BYTE STATIC oldkrom AS BYTE STATIC olddiat AS BYTE IF ISFALSE task(%vbt5).tog THEN task(%vbt5).tog = %True FOR n = 60 TO 96 SELECT CASE n MOD 12 CASE 0,2,4,5,7,9,11 IF IsNoteInHar (Task(%Vbt1).Har, n) THEN INCR nrdiat CASE ELSE IF IsNoteInHar (Task(%Vbt1).Har, n) THEN INCR nrkrom END SELECT NEXT n IF nrdiat <> olddiat THEN Vibi_Motor 0, RND(1) * 240 '124 olddiat = nrdiat END IF IF nrkrom <> oldkrom THEN Vibi_Motor 1, RND(1) * 240 '124 oldkrom = nrkrom END IF Task(%vbt5).freq = 1.5 + RND(1) END SUB SUB Vibi_t6 () ' piperola & harma task - plays the difference tones between the strongest 2 vibraphone pitches. ' we also use harma, for fractional pitches here... LOCAL note AS INTEGER LOCAL pipflag AS BYTE LOCAL notefrac AS SINGLE STATIC note1 AS BYTE ' oldnote for piperola STATIC note2 AS BYTE ' oldnote for Harma LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE STATIC pipduur AS DWORD STATIC harduur AS DWORD IF ISFALSE Task(%vbt6).tog THEN GetInstrumentParams Piperola, %ID_PIPEROLA GetInstrumentParams Harmonium, %ID_HARMA Task(%vbt6).channel = 2 Task(%vbt6).tog = %True Task(%vbt6).freq = 4 ProgChange Harmonium.channel,&B00001111 Play Harmonium.channel,28,127 ' motor ON Modemess Harmonium.channel,7,8 ' motor low value END IF IF Pipduur THEN IF TimegetTime > Pipduur THEN ' note off piperola noteoff Piperola.channel, note1 note1 = %False pipduur = %False END IF END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off harma noteoff Harmonium.channel, note2 note2 = %False Harduur = %False END IF END IF Task(%vbt6).Har.vel = Task(%vbt1).Har.vel FillHarType Task(%vbt6).Har fillHarType Task(%vbt1).har note = GetStrongest(Task(%vbt1).Har,1) ' returns 0-11 IF note = -1 THEN EXIT SUB DelShNo2Har Task(%vbt6).Har,note fillHarType Task(%vbt6).Har note = GetStrongest(Task(%vbt6).Har,1) IF note = -1 THEN EXIT SUB DelShNo2Har Task(%vbt6).Har,note fillHarType Task(%vbt6).Har Task(%vbt5).har.vel = CommonHar$(Task(%vbt1).Har,Task(%vbt6).Har) ' this now contains only the weakest notes... Task(%vbt6).Har.vel = AbsDifHar$(Task(%vbt1).Har,Task(%vbt5).Har) ' returns the notes in vbt1 that are NOT also in vbt5 ' so now we should have isolated the 2 strongest notes in their original position... ' lets now retrieve these two notes: nv = GetHighestNote (Task(%vbt6).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) DelNote2Har Task(%vbt6).Har, hi_note END IF nv = GetHighestNote (Task(%vbt6).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) 'DelNote2Har Task(%vbt6).Har, lo_note END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN EXIT SUB notefrac = F2NF(dif) IF notefrac =< %False THEN EXIT SUB SELECT CASE notefrac CASE < piperola.lowtes pipflag = %False note = FIX(notefrac) CASE ELSE SELECT CASE FRAC(notefrac) CASE < 0.25 '33 note = FIX(notefrac) pipflag = %True CASE > 0.75 '66 note = FIX(notefrac) + 1 pipflag = %True CASE ELSE ' quartertones for harma... note = FIX(notefrac) + 1 pipflag = %False END SELECT END SELECT IF pipflag THEN IF note > piperola.hightes THEN DO note = note - 12 LOOP UNTIL note < piperola.hightes END IF IF note < piperola.lowtes THEN DO note = note + 12 LOOP UNTIL note > piperola.lowtes END IF ELSE ' harma case... ' here we can use the average velo value to steer the motor! IF note > harmonium.hightes THEN DO note = note - 12 LOOP UNTIL note < harmonium.hightes END IF IF note < harmonium.lowtes THEN DO note = note + 12 LOOP UNTIL note > harmonium.lowtes END IF END IF IF note1 THEN IF note <> note1 THEN noteoff Piperola.channel,note1 note1 = %False ELSE EXIT SUB END IF END IF IF note2 THEN IF note <> note2 THEN noteoff Harmonium.channel, note2 note2 = %False ELSE EXIT SUB END IF END IF IF pipflag THEN IF note <> note1 THEN Play Piperola.channel,note,64 pipduur = Timegettime + 150 + (RND(1) * 3000) note1 = note END IF ELSE Modemess Harmonium.channel,7,(lo_velo + hi_velo)/ 2 ' motor pressure IF note <> note2 THEN Play Harmonium.channel,note,MAX(lo_velo,hi_velo) IF note < 48 THEN harduur = TimegetTime + 1000 + (RND(1) * 6000) ELSE harduur = Timegettime + 500 + (RND(1) * 4000) END IF note2 = note END IF END IF Task(%vbt6).freq = 4 END SUB SUB Vibi_AllNotesOff () LOCAL i AS BYTE FOR i = 60 TO 96 Vibi_NoteOff i NEXT i END SUB SUB Vibi_AllDampersOff () LOCAL i AS BYTE FOR i = 60 TO 96 Vibi_DampOff i NEXT i END SUB ' ************************************************ ' * * ' ************************************************ SUB v_tvpInit () ' called by its codepointer on starting Paradiso. StopTask App.runtimeTasknr ' / - cockpit tasks Task(%tvp1).naam = "ParVib1" Task(%tvp1).cptr = CODEPTR(v_tvp1) Task(%tvp1).freq = 4 Task(%tvp1).flags = %HIDDEN_TASK Task(%tvp2).naam ="ParVib2" Task(%tvp2).cptr = CODEPTR(v_tvp2) Task(%tvp2).freq = 2 Task(%tvp2).flags = %HIDDEN_TASK Task(%tvp12).naam = "ParaVib" Task(%tvp12).freq = 200 Task(%tvp12).cptr = CODEPTR(v_tvp12) Task(%tvp3).naam ="ParaHar" Task(%tvp3).cptr = CODEPTR(v_tvp3) Task(%tvp3).freq = 2 Task(%tvp3).flags = %HIDDEN_TASK Task(%tvp4).naam ="ParKlung" Task(%tvp4).cptr = CODEPTR(v_tvp4) Task(%tvp4).freq = 2 Task(%tvp5).naam ="ParMots" Task(%tvp5).cptr = CODEPTR(v_tvp5) Task(%tvp5).freq = 4 Task(%tvp6).naam ="ParaPip" ' expansion tasks for Task(%tvp6).cptr = CODEPTR(v_tvp6) Task(%tvp6).flags = %MIDI_TASK OR %HIDDEN_TASK Task(%tvp6).freq = 10 Task(%tvp7).naam ="Par-Pia" Task(%tvp7).cptr = CODEPTR(v_tvp7) Task(%tvp7).freq = 10 Task(%tvp7).flags = %MIDI_TASK OR %HIDDEN_TASK Task(%tvp8).naam ="Musician" Task(%tvp8).cptr = CODEPTR(v_tvp8) Task(%tvp8).freq = 20 Task(%tvp8).flags = %MIDI_TASK Task(%tvp9).naam = "Ending" Task(%tvp9).cptr = CODEPTR(v_tvp9) Task(%tvp9).freq = 4 TaskEX(%tvp9).stopCptr =CODEPTR(v_tvp9End) ChangeCockpitTasks %tvp0 ' new initialisation of the cockpitwindow (DLL procedure in g_main) END SUB SUB v_tvp0 () ' meta-task for by Godfried-Willem Raes, november 11-19th 2001. STATIC dynacnt AS BYTE LOCAL seconds AS DWORD LOCAL msg AS tagMSG LOCAL m AS ASCIIZ * 40 IF ISFALSE Task(%tvp0).tog THEN IF Task(%tvp1).tog THEN stoptask %tvp1 IF Task(%tvp2).tog THEN stoptask %tvp2 IF Task(%tvp3).tog THEN stoptask %tvp3 IF Task(%tvp4).tog THEN stoptask %tvp4 IF Task(%tvp5).tog THEN stoptask %tvp5 IF task(%tvp7).tog THEN stoptask %tvp7 Task(%tvp1).pan = %False ' used as activation switch Task(%tvp2).pan = %False Task(%tvp3).pan = 127 ' for harma App.globton = 0 Paradiso.duur = 384 '360 '420 '300 ' may become 420 (7 minutes) Paradiso.section = Paradiso.duur / 12 ' now 32 Paradiso.otc = %False Paradiso.SpekFak = %True Paradiso.v1flag = %False Paradiso.v2flag = %False Paradiso.v3flag = %False Paradiso.v6flag = %False Paradiso.v7flag = %False Paradiso.Marker(0) = %False Paradiso.Marker(1) = Paradiso.duur / 15 ' =20 Paradiso.Marker(2) = Paradiso.duur / 12 ' harma bourdon ON Paradiso.Marker(3) = Paradiso.duur / 10 ' =30 Paradiso.Marker(4) = Paradiso.duur / 5 '= 60 (was oorspronkelijk 120) harma on Paradiso.Marker(5) = Paradiso.duur * 2 / 5 ' = 120 piperola on Paradiso.Marker(6) = Paradiso.duur / 2 ' = 150 piano on Paradiso.Marker(7) = Paradiso.duur * 2 / 3 ' = 200 (was oorspronkelijk 210) klung on Paradiso.Marker(10) = Paradiso.duur - (Paradiso.duur / 10) ' 29/30 ' %tvp1 off (vibi) 290 Paradiso.Marker(11) = Paradiso.duur - (Paradiso.duur / 12) ' 59/60 ' %tvp2 off (vibi) 295 Paradiso.Marker(12) = Paradiso.duur - (Paradiso.duur / 15) 'klung off * 89/90 ' 297 Paradiso.Marker(17) = Paradiso.duur - (Paradiso.duur / 30) '%tvp2 aan (vibi) Paradiso.Marker(18) = Paradiso.duur - (Paradiso.duur / 60) '%tvp1 aan (vibi) Paradiso.Marker(19) = Paradiso.duur Paradiso.Marker(20) = Paradiso.duur + (Paradiso.duur / 60) ' einde App.komposduur = 600 'Paradiso.duur+ ending App.tstart = timeGetTime starttask App.runtimetasknr Slider(0).tag = "----" Slider(1).tag = "Dyna" SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 14, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 15, Slider(1).tag Slider(0).value = 1 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(1).value = 10 dynacnt = 10 SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID + 10, " for automats and musicians" SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID + 11, "Tonal base = " & STR$(App.globton) ' create the melody window automatically on startup: IF ISFALSE gh.melpat THEN msg.hWnd = gh.Cockpit msg.message = %WM_COMMAND msg.wParam = %GMT_BUTNSW_ID + 5 msg.lParam = %Null DispatchMessage msg END IF m = " - Score for Musicians" IF gh.MelPat THEN SendMessage gh.MelPat, %WM_SETTEXT,0,VARPTR(m) END IF Paradise_Drawmelody 48 + App.Globton,60 + App.Globton,72 + App.Globton ' verschijnt nog niet! (moet ook niet) Task(%tvp0).tog = %True EXIT SUB END IF ' scoring seconds = ((timegettime-App.tstart) \ 1000) SELECT CASE seconds CASE >= Paradiso.Marker(20) Vibi_Motor 2, %False StopTask %tvp0 ' case >= Paradiso.Marker(19) ' Starttask %tvp4 ' klung on CASE >= Paradiso.Marker(18) Task(%tvp1).pan = %False CASE >= Paradiso.Marker(17) Task(%tvp2).pan = %False CASE >= Paradiso.Marker(12) '297 StopTask %tvp4 ' klung off CASE >= Paradiso.Marker(11) '295 Task(%tvp2).pan = 127 CASE >= Paradiso.Marker(10) '290 Task(%tvp1).pan = 127 ' vibi off CASE >= Paradiso.Marker(7) '210 IF ISFALSE Task(%tvp4).tog THEN starttask %tvp4 ' klung on CASE >= Paradiso.Marker(6) ' player piano on IF ISFALSE Paradiso.v7flag THEN Paradiso.v7flag = %True CASE >= Paradiso.Marker(5) ' 120 ' piperola on IF ISFALSE Paradiso.v6flag THEN paradiso.v6flag = %True CASE >= Paradiso.Marker(4) Task(%tvp3).pan = %False ' harma on with note part CASE >= Paradiso.Marker(3) '30 IF ISFALSE Task(%tvp5).tog THEN starttask %tvp5 ' motors CASE >= Paradiso.Marker(2) IF ISFALSE Paradiso.v3flag THEN Task(%tvp3).pan = 127 ' bourdon on harma Paradiso.v3flag = %True END IF CASE >= Paradiso.Marker(1) '20 IF ISFALSE Paradiso.v2flag THEN Paradiso.v2flag = %True CASE > =Paradiso.Marker(0) '0 IF ISFALSE Task(%tvp12).tog THEN Paradiso.clock = %False Paradiso.v1flag = %True starttask %tvp12 END IF END SELECT 'Paradiso.SpekFak: IF seconds < Paradiso.duur + 2 THEN IF (seconds / Paradiso.section) - (seconds \ Paradiso.section) > 0.75 THEN ' het laatste kwart van elk grondtooncyclus ' wordt besteed aan voorbereiding van de modulatie. Paradiso.SpekFak = %SubDomSpec ELSE Paradiso.SpekFak = %True END IF App.globton = ((seconds \ Paradiso.section) * 5) MOD 12 ' 12 modulations in fourths... IF App.globton <> Paradiso.oTc THEN SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID + 11, "Tonality= " & STR$(App.globton) Paradiso.oTc = App.Globton END IF dynacnt = (seconds / Paradiso.duur) * 127 ' crescendo IF dynacnt < 1 THEN dynacnt = 1 IF dynacnt > 127 THEN dynacnt = 127 Task(%tvp0).freq = 1 + ((seconds / Paradiso.duur) * 3) '5) ' sempre accellerando 1-> 4x App.Tempo = Task(%tvp0).freq * 60 ELSE Paradiso.SpekFak = %True dynacnt = 127 Task(%tvp0).freq = 4 END IF IF Slider(1).value <> dynacnt THEN slider(1).value = dynacnt SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value END IF END SUB SUB v_tvp1 () ' Paradiso ' = %tvp1 ' 19.11.2001 - no longer a task! LOCAL demping AS BYTE LOCAL note1 AS BYTE LOCAL note2 AS BYTE LOCAL velo AS BYTE STATIC oldnote1 AS BYTE STATIC oldnote2 AS BYTE STATIC oldvelo AS BYTE STATIC cnt AS DWORD IF ISFALSE task(%tvp1).tog THEN IF oldnote1 THEN Vibi_NoteOff oldnote1 IF oldnote2 THEN Vibi_NoteOff oldnote2 oldnote1 = %False oldnote2 = %False oldvelo = %False cnt = %False task(%tvp1).tog = %True END IF DO 'note1 = SpectralNote(60+App.globton,RND(1)*8,Paradiso.SpekFak) IF App.Globton < 7 THEN note1 = SpectralNote(60+App.globton,cnt + (RND(1)*(8-cnt)),Paradiso.SpekFak) ELSE note1 = SpectralNote(48+App.globton,cnt + (RND(1)*(8-cnt)),Paradiso.SpekFak) END IF IF IsNoteInHar (Task(%tvp0).Har, note1) THEN note1 = %False 'IF note1 > 96 THEN note1 = %False LOOP UNTIL note1 > %False DO 'note2 = SpectralNote(60+App.Globton,RND(1)*8,Paradiso.SpekFak) note2 = SpectralNote(60+App.Globton,cnt + (RND(1)*(8-cnt)),Paradiso.SpekFak) IF IsNoteInHar (Task(%tvp0).Har, note2) THEN note2 = %False IF note2 = note1 THEN note2 = %False 'IF note2 > 96 THEN note2 = %False LOOP UNTIL note2 > %False demping = 30 + (oldvelo/2) '60 + (oldvelo /2) IF oldnote1 THEN IF ISFALSE Vibi.simulator THEN Vibi_HoldUp oldnote1, demping, 64 ELSE NoteOff Vibi.channel,oldnote1 END IF DelNote2Har Task(%tvp1).Har, oldnote1 DelNote2Har Task(%tvp0).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN IF ISFALSE Vibi.simulator THEN Vibi_HoldUp oldnote2, demping, 64 ELSE NoteOff Vibi.channel, oldnote2 END IF DelNote2Har Task(%tvp1).Har, oldnote2 DelNote2Har Task(%tvp0).Har, oldnote2 oldnote2 = %False END IF Velo = 1 + (RND(1) * Slider(1).value) ' cockpit slider 1 = dynamics IF Velo > 120 THEN velo = 120 IF Task(%tvp1).pan < 127 THEN IF ISFALSE Vibi.simulator THEN Vibi_Beat note1, velo * 2 / 3 'velo/2 ELSE Play Vibi.channel, note1, velo END IF END IF oldnote1 = note1 AddNote2Har Task(%tvp1).Har, note1, velo AddNote2Har Task(%tvp0).Har, note1, velo IF Task(%tvp1).pan < 127 THEN IF ISFALSE Vibi.simulator THEN Vibi_Beat note2, velo * 2 / 3 'velo/2 ELSE Play Vibi.channel, note2, velo END IF END IF oldnote2 = note2 AddNote2Har Task(%tvp1).Har, note2, velo AddNote2Har Task(%tvp0).Har, note2, velo oldvelo = velo INCR cnt IF cnt > 3 THEN cnt = 0 END SUB SUB v_tvp2 () ' vibi task 2 Paradiso ' 19.11.2001: changed - no longer a real task. LOCAL demping AS BYTE LOCAL note1 AS BYTE LOCAL note2 AS BYTE LOCAL velo AS BYTE STATIC oldnote1 AS BYTE STATIC oldnote2 AS BYTE STATIC oldvelo AS BYTE STATIC cnt AS DWORD ' basisharmoniek IF ISFALSE task(%tvp2).tog THEN IF oldnote1 THEN Vibi_NoteOff oldnote1 IF oldnote2 THEN Vibi_NoteOff oldnote2 oldnote1 = %False oldnote2 = %False oldvelo = %False cnt = %False task(%tvp2).tog = %True END IF DO 'note1 = SpectralNote(48+App.globton,RND(1)*16,Paradiso.SpekFak) note1 = SpectralNote(48+App.globton,cnt + (RND(1)*(16-cnt)),Paradiso.SpekFak) IF IsNoteInHar (Task(%tvp0).Har, note1) THEN note1 = %False IF note1 > 96 THEN note1 = %False IF cnt > %False THEN DECR cnt END IF LOOP UNTIL note1 > %False DO 'note2 = SpectralNote(48+App.globton,RND(1)*16,Paradiso.SpekFak) note2 = SpectralNote(48+App.globton,cnt + (RND(1)*(16-cnt)),Paradiso.SpekFak) IF IsNoteInHar (Task(%tvp0).Har, note2) THEN note2 = %False IF note2 = note1 THEN note2 = %False IF note2 > 96 THEN note2 = %False ' gives endless loops without this construction... IF cnt > %False THEN DECR cnt END IF LOOP UNTIL note2 > %False demping = 40 + (oldvelo/2) '60 + (oldvelo /2) IF oldnote1 THEN IF ISFALSE Vibi.simulator THEN Vibi_HoldUp oldnote1, demping, 64 ELSE NoteOff Vibi.channel, oldnote1 END IF DelNote2Har Task(%tvp0).Har, oldnote1 DelNote2Har Task(%tvp2).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN IF ISFALSE Vibi.simulator THEN Vibi_HoldUp oldnote2, demping, 64 ELSE NoteOff Vibi.channel, oldnote2 END IF DelNote2Har Task(%tvp0).Har, oldnote2 DelNote2Har Task(%tvp2).har, oldnote2 oldnote2 = %False END IF Velo = 1 + (RND(1) * Slider(1).value) ' cockpit slider 1 = dynamics IF Velo > 127 THEN velo = 127 IF Task(%tvp2).pan < 127 THEN IF ISFALSE Vibi.simulator THEN Vibi_Beat note1, velo * 2/3 'velo/2 ELSE Play Vibi.channel, note1, velo END IF END IF oldnote1 = note1 AddNote2Har Task(%tvp0).Har, note1, velo AddNote2Har Task(%tvp2).Har, note1, velo IF Task(%tvp2).pan < 127 THEN IF ISFALSE Vibi.simulator THEN Vibi_Beat note2, velo * 2/3 'velo/2 ELSE Play Vibi.channel, note2, velo END IF END IF oldnote2 = note2 AddNote2Har Task(%tvp0).Har, note2, velo AddNote2Har Task(%tvp2).Har, note2, velo oldvelo = velo INCR cnt IF cnt > 7 THEN cnt = %False END SUB SUB v_tvp12 () ' combines tvp1,tvp2,tvp3 and tvp7 in order to get a better synchronisation. IF ISFALSE Task(%tvp12).tog THEN Task(%tvp1).tog = %False Task(%tvp2).tog = %False Paradiso.clock = %False Task(%tvp12).tog = %True END IF IF Paradiso.v1flag THEN IF ISFALSE Paradiso.clock MOD 6 THEN v_tvp1 ' vibi part 1 END IF END IF IF Paradiso.v2flag THEN IF ISFALSE Paradiso.clock MOD 4 THEN v_tvp2 END IF ' vibi part 2 END IF IF paradiso.v3flag THEN IF ISFALSE Paradiso.clock MOD 12 THEN v_tvp3 ' harma END IF END IF IF paradiso.v6flag THEN IF ISFALSE Paradiso.clock MOD 3 THEN v_tvp6 ' piperola END IF END IF IF Paradiso.v7flag THEN IF ISFALSE Paradiso.clock MOD 2 THEN v_tvp7 ' piano END IF END IF IF Paradiso.clock THEN IF ISFALSE Paradiso.clock MOD 48 THEN Play %Troms_channel,24 + App.Globton,Slider(1).value '80 ' troms END IF END IF INCR Paradiso.clock Task(%tvp12).Freq = (App.tempo * 6) / 60 END SUB SUB v_tvp3 () ' harma task Paradiso ' = %tvp3 'plays the difference tones between the 2 vibraphone pitches in the first vibe part. LOCAL note AS INTEGER STATIC oldnote AS BYTE ' oldnote for Harma LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE STATIC harduur AS DWORD STATIC oldtc AS BYTE IF ISFALSE Task(%tvp3).tog THEN GetInstrumentParams Harmonium, %ID_HARMA Task(%tvp3).channel = Harmonium.channel ProgChange Harmonium.channel,&B00001111 ' registers on Play Harmonium.channel,28,127 ' motor ON Modemess Harmonium.channel,7,8 ' motor low value Task(%tvp3).tog = %True END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off harma noteoff Harmonium.channel, oldnote oldnote = %False Harduur = %False END IF END IF nv = GetHighestNote (Task(%tvp1).Har,60,108) ' 96 IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) END IF nv = GetLowestNote (Task(%tvp1).Har,60,108) ' 96 IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN EXIT SUB note = F2N(dif) ' here we can use the average velo value to steer the motor! IF note > harmonium.hightes THEN DO note = note - 12 LOOP UNTIL note =< harmonium.hightes END IF IF note < harmonium.lowtes THEN DO note = note + 12 LOOP UNTIL note >= harmonium.lowtes END IF IF oldnote THEN IF note <> oldnote THEN noteoff Harmonium.channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF Modemess Harmonium.channel,7,15 OR ((lo_velo + hi_velo)/ 2) ' motor pressure IF Task(%tvp3).pan < 127 THEN IF note <> oldnote THEN Play Harmonium.channel,note,MAX(lo_velo,hi_velo) IF note < 48 THEN harduur = TimegetTime + 1000 + (RND(1) * 6000) ELSE harduur = Timegettime + 500 + (RND(1) * 4000) END IF oldnote = note END IF END IF ' bourdon: IF (App.globton MOD 12) <> (oldtc MOD 12) THEN noteoff Harmonium.channel, oldtc note = App.Globton DO note = note + 12 LOOP UNTIL note > 28 play Harmonium.channel,note, 120 play %Troms_CHannel,24 + App.Globton + 1, 127 ' troms... oldtc = note END IF ' Task(%tvp3).freq = (App.tempo / 60)/2 END SUB SUB v_tvp4 () ' klung task Trio Paradiso ' = %tvp4 ' - plays the difference tones between the 2 vibraphone pitches in the second vibe part. LOCAL note AS INTEGER LOCAL notefrac AS SINGLE STATIC oldnote AS BYTE ' oldnote for Klung LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE STATIC harduur AS DWORD STATIC oldtc AS BYTE IF ISFALSE Task(%tvp4).tog THEN Task(%tvp4).channel = %Klung_Channel Task(%tvp4).tog = %True Task(%tvp4).freq = (App.tempo / 60) * 2 END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off Klung noteoff %Klung_Channel, oldnote oldnote = %False Harduur = %False END IF END IF ' lets now retrieve these two notes: nv = GetHighestNote (Task(%tvp2).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) END IF nv = GetLowestNote (Task(%tvp2).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN EXIT SUB note = F2N(dif) IF note =< %False THEN EXIT SUB IF note > 69 THEN DO note = note - 12 LOOP UNTIL note <= 69 END IF IF note < 49 THEN DO note = note + 12 LOOP UNTIL note >= 49 END IF IF oldnote THEN IF note <> oldnote THEN noteoff %Klung_Channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF IF note <> oldnote THEN Play %Klung_channel,note,MAX(lo_velo,hi_velo) harduur = Timegettime + (1000/ Task(%tvp4).freq * (2/3)) oldnote = note END IF Task(%tvp4).freq = (App.tempo / 60) * 3 END SUB SUB v_tvp5 () ' vibi motor task Paradiso ' = %tvp5 ' motor control task... LOCAL n AS BYTE LOCAL nrdiat AS BYTE LOCAL nrkrom AS BYTE STATIC oldkrom AS BYTE STATIC olddiat AS BYTE IF ISFALSE task(%tvp5).tog THEN task(%tvp5).tog = %True FOR n = 60 TO 96 SELECT CASE n MOD 12 CASE 0,2,4,5,7,9,11 IF IsNoteInHar (Task(%tvp0).Har, n) THEN INCR nrdiat CASE ELSE IF IsNoteInHar (Task(%tvp0).Har, n) THEN INCR nrkrom END SELECT NEXT n ' note: vibi plays maximum 4 notes simultaneaously, so nrdiat and nrkrom cannot exceed 4 IF ISFALSE Vibi.simulator THEN IF nrdiat <> olddiat THEN Vibi_Motor 0, (GetPromil% * nrdiat)/16 'RND(1) * 240 olddiat = nrdiat END IF IF nrkrom <> oldkrom THEN Vibi_Motor 1, (GetPromil% * nrkrom)/ 16 'RND(1) * 240 oldkrom = nrkrom END IF ELSE ' send midi code for vibi controll... END IF Task(%tvp5).freq = (App.tempo / 120) END SUB SUB v_tvp6 () ' part for piperola / bourdonola ' = %tvp6 ' - plays the difference tones between the upper vibraphone pitch in the first vibe part and the upper vibe pitch in the ' second part. LOCAL note AS INTEGER LOCAL notefrac AS SINGLE STATIC oldnote AS BYTE ' oldnote for Harma LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE STATIC harduur AS DWORD STATIC oldtc AS BYTE IF ISFALSE Task(%tvp6).tog THEN GetInstrumentParams Piperola, %ID_PIPEROLA Task(%tvp6).channel = Piperola.channel Task(%tvp6).tog = %True ' Task(%tvp6).freq = (App.tempo / 60) * 2 END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off noteoff Piperola.channel, oldnote oldnote = %False Harduur = %False ' evt doen: else exit sub, dan hebben we rustiger noten... EXIT SUB END IF END IF ' lets retrieve the two notes: nv = GetHighestNote (Task(%tvp1).Har,60,108) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) END IF nv = GetHighestNote (Task(%tvp2).Har,60,108) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN EXIT SUB note = F2N(dif) IF note <= %False THEN EXIT SUB note = note + 12 IF note > piperola.hightes THEN DO note = note - 12 LOOP UNTIL note < piperola.hightes END IF IF note < piperola.lowtes THEN DO note = note + 12 LOOP UNTIL note > piperola.lowtes END IF IF oldnote THEN IF note <> oldnote THEN noteoff piperola.channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF IF note <> oldnote THEN Play Piperola.channel,note,MAX(lo_velo,hi_velo) harduur = Timegettime + 250 + (RND(1) * 3000) ' makes rubato... oldnote = note END IF 'Task(%tvp6).freq = (App.tempo/60) * 2 END SUB SUB v_tvp7 () ' part for player piano ' = %tvp7 ' - plays the difference tones between the lowest vibraphone pitch in the first vibe part and the lowest vibe pitch in the ' second part. ' changed to sync with vibraphone... 18.11.2001 LOCAL note AS INTEGER STATIC oldnote AS BYTE LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE STATIC harduur AS DWORD STATIC oldtc AS BYTE IF ISFALSE Task(%tvp7).tog THEN Task(%tvp7).channel = 0 Task(%tvp7).tog = %True 'Task(%tvp7).freq = (App.tempo / 60) * 3 END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off IF oldnote THEN noteoff Task(%tvp7).channel, oldnote oldnote = %False END IF Harduur = %False ELSE EXIT SUB END IF END IF ' isolate the 2 notes in their original position... nv = GetLowestNote (Task(%tvp1).Har,21,108) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) END IF nv = GetLowestNote (Task(%tvp2).Har,21,108) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN ' note = F2N(dif) note = App.Globton + 12 ELSE ' note = App.Globton + 12 note = F2N(dif) END IF IF note <= %False THEN note = App.Globton + 12 END IF IF note > 108 THEN DO note = note - 12 LOOP UNTIL note =< 108 END IF IF note < 21 THEN DO note = note + 12 LOOP UNTIL note >= 21 END IF IF oldnote THEN IF note <> oldnote THEN noteoff Task(%tvp7).channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF IF note <> oldnote THEN Play Task(%tvp7).channel,note,(lo_velo + hi_velo)/2 harduur = Timegettime + (40000/App.tempo) '(2000 /Task(%tvp7).freq) oldnote = note END IF 'Task(%tvp7).freq = (App.tempo / 60) * 3 END SUB SUB v_tvp8 () ' score task for live musicians LOCAL note AS INTEGER STATIC oldnote AS BYTE LOCAL nv AS INTEGER LOCAL hi_note AS BYTE LOCAL hi_velo AS BYTE LOCAL lo_note AS BYTE LOCAL lo_velo AS BYTE LOCAL dif AS SINGLE IF ISFALSE Task(%tvp8).tog THEN Task(%tvp8).channel = 1 ' for dummy demo - evt. vox humanola Task(%tvp8).tog = %True Task(%tvp8).freq = (App.tempo / 60) /4 END IF ' isolate the lowest vibi note in part 1 and the highest in part 2: nv = GetLowestNote (Task(%tvp1).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) END IF nv = GetHighestNote (Task(%tvp2).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) END IF dif = DifTone(hi_note,lo_note) IF dif = %False THEN EXIT SUB note = F2N(dif) IF note > 89 THEN DO note = note - 12 LOOP UNTIL note =< 89 END IF IF note < 55 THEN DO note = note + 12 LOOP UNTIL note >= 55 END IF IF oldnote THEN IF note <> oldnote THEN noteoff Task(%tvp8).channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF IF note <> oldnote THEN Play Task(%tvp8).channel,note,(lo_velo + hi_velo)/2 Paradise_DrawMelody hi_note, lo_note, note oldnote = note END IF Task(%tvp8).freq = (App.tempo / 60) / 4 ' niet in sync! END SUB SUB v_tvp9 () ' ending for trio paradiso STATIC note1 AS INTEGER STATIC note2 AS INTEGER STATIC note3 AS INTEGER STATIC note4 AS INTEGER STATIC note5 AS INTEGER STATIC note6 AS INTEGER STATIC note7 AS INTEGER STATIC note8 AS INTEGER STATIC note9 AS INTEGER STATIC cnt AS LONG STATIC b AS INTEGER STATIC q AS SINGLE IF ISFALSE Task(%tvp9).tog THEN 'IF Task(%tvp1).tog THEN stoptask %tvp1 'IF Task(%tvp2).tog THEN stoptask %tvp2 IF Task(%tvp12).tog THEN stoptask %tvp12 IF Task(%tvp3).tog THEN stoptask %tvp3 IF Task(%tvp4).tog THEN stoptask %tvp4 IF Task(%tvp5).tog THEN stoptask %tvp5 IF Task(%tvp6).tog THEN stoptask %tvp6 IF Task(%tvp7).tog THEN stoptask %tvp7 IF Task(%tvp8).tog THEN stoptask %tvp8 ' Paradise_DrawMelody App.globton + 70, App.Globton+79, App.Globton + 88 Vibi_AllNotesOff 'InstrumAllNotesOff Piperola, hMidiO(0) InstrumAllnotesOff Harmonium Vibi_AllDampersOff Slider(0).tag = "---" Slider(1).tag = "---" SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 14, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID+ 15, Slider(1).tag Task(%tvp9).tog = %True cnt = %False b = 6 Task(%tvp9).level = 120 Paradiso.SpekFak = 1! Paradiso.endflag = %False Task(%tvp9).freq = (App.tempo / 60) * 2 Starttask %tvp9 Play Harmonium.channel,36 + App.Globton,Task(%tvp9).level Modemess Harmonium.channel,7,127 ' motor max value END IF IF Task(%tvp9).level THEN IF ISFALSE cnt MOD 2 THEN note1 = SpectralNote(48+App.globton,RND(1)*16,Paradiso.SpekFak) IF ISFALSE Vibi.simulator THEN Vibi_Beat note1, Task(%tvp9).level * 2/3 '/2 ELSE Play Vibi.channel, note1, Task(%tvp9).level END IF ELSEIF ISFALSE cnt MOD 3 THEN note2 = SpectralNote(48+App.globton,2 + (RND(1)*(Task(%tvp9).level/8)), Paradiso.SpekFak) IF note2 <> note1 THEN IF ISFALSE Vibi.simulator THEN Vibi_Beat note2, Task(%tvp9).level * 2/3 '/2 ELSE Play Vibi.channel, note2, Task(%tvp9).level END IF END IF ELSEIF ISFALSE cnt MOD 5 THEN IF note3 THEN NoteOff Piperola.channel, note3 note3 = %False END IF IF Task(%tvp9).level > 20 THEN note3 = SpectralNote(36+App.globton,5 + (RND(1) *27),Paradiso.SpekFak) Play Piperola.channel,note3, 64 END IF ELSEIF ISFALSE cnt MOD 7 THEN ' player piano IF note4 THEN NoteOff 0,note4 note4 = SpectralNote(24+App.globton, RND(1) * (Task(%tvp9).level /4),Paradiso.SpekFak) IF note4 > 108 THEN DO note4 = note4 - 12 LOOP UNTIL note4 =< 108 END IF IF note4 < 21 THEN DO note4 = note4 + 12 LOOP UNTIL note4 >= 21 END IF Play 0,note4,12 + (Task(%tvp9).level/2) ELSEIF ISFALSE cnt MOD 11 THEN IF note6 THEN NoteOff %Klung_Channel,note6 note6 = SpectralNote(36+App.Globton, 1 + (RND(1)*10),Paradiso.Spekfak) Play %Klung_Channel,note6,Task(%tvp9).level ELSEIF ISFALSE cnt MOD 13 THEN IF note5 THEN NoteOff Harmonium.channel,note5 note5 = SpectralNote(36+App.globton,4 + (RND(1) * 27),Paradiso.SpekFak) Play Harmonium.channel,note5,60 + (Task(%tvp9).level/2) END IF IF ISFALSE cnt MOD 9 THEN IF note7 THEN NoteOff Harmonium.channel,note7 note7 = SpectralNote(24 + App.Globton, (RND(1) * Task(%tvp9).level /4),Paradiso.Spekfak) IF note7 <> 36 + App.Globton THEN Play Harmonium.channel,note7,60 + (Task(%tvp9).level/2) ELSE note7 = App.Globton + 48 Play Harmonium.channel,note7,60 + (Task(%tvp9).level/2) END IF END IF IF ISFALSE cnt MOD 8 THEN ' player piano IF note8 THEN NoteOff 0,note8 note8 = SpectralNote(36+App.globton, 1+ (RND(1) * 32),Paradiso.SpekFak) IF note8 > 108 THEN DO note8 = note8 - 12 LOOP UNTIL note4 =< 108 END IF IF note8 < 21 THEN DO note8 = note8 + 12 LOOP UNTIL note8 >= 21 END IF Play 0,note8,12 + Task(%tvp9).level/2 END IF IF ISFALSE cnt MOD 6 THEN IF note9 THEN NoteOff Piperola.channel, note9 note9 = SpectralNote(48 + App.Globton,Task(%tvp9).level /4,Paradiso.Spekfak) Play Piperola.channel, note9,64 END IF IF ISFALSE cnt MOD 12 THEN ' musicians... IF gh.melpat THEN Paradise_DrawMelody 48+(note9 MOD 48), 48+(note8 MOD 48), note7 END IF END IF IF ISFALSE cnt MOD b THEN Play %Troms_Channel, 47 - (cnt MOD 24),Task(%tvp9).level b = b+ (b/2) END IF ' vibi motors: IF ISFALSE cnt MOD 32 THEN IF (1000 - GetPromil) >= 0 THEN Vibi_Motor 0, (1000 - GetPromil%) * 2 / 3 END IF END IF IF ISFALSE cnt MOD 36 THEN IF (1000 - GetPromil) >= 0 THEN Vibi_Motor 1, (1000 - GetPromil%) * 2 / 3 END IF END IF IF Paradiso.SpekFak > 0.5 THEN Paradiso.Spekfak = Paradiso.Spekfak - 0.00028 '3 ELSE Paradiso.Spekfak = 0.5 END IF Task(%tvp9).level = INT(255! * (Paradiso.Spekfak - 0.5!)) ' diminuendo INCR cnt ELSE SELECT CASE Paradiso.endflag CASE %False note1 = %False note2 = %False Play 0,24,25 ' piano IF note4 THEN NoteOff 0,note4 'IF note6 THEN NoteOff %Klung_Channel,note6 IF note8 THEN NoteOff 0,note8 Modemess Harmonium.channel,7,0 ' motor off Task(%tvp9).freq = 0.2 ' 5 seconds hold Paradiso.endflag = %True CASE %True Paradise_DrawMelody 54, 68, 72 ' 54 printed as 42 IF note3 THEN NoteOff Piperola.channel, note3 IF note5 THEN NoteOff Harmonium.channel,note5 IF note7 THEN NoteOff Harmonium.channel,note7 IF note9 THEN NoteOff Piperola.channel, note9 NoteOff Harmonium.channel, App.Globton + 36 NoteOff 0,24 SetDlgItemText gh.Cockpit, %GMT_TEXT0_ID + 11, "END" StopTask %tvp9 END SELECT END IF END SUB SUB v_tvp9End () ' called by the stop codepointer of v_tvp9 Stoptask App.runtimetasknr Task(%tvp1).naam = "" Task(%tvp1).cptr = %False Task(%tvp2).naam ="" Task(%tvp2).cptr = %False Task(%tvp12).naam = "" Task(%tvp12).cptr = %False Task(%tvp3).naam ="" Task(%tvp3).cptr = %False Task(%tvp4).naam ="" Task(%tvp4).cptr = %False Task(%tvp5).naam ="" Task(%tvp5).cptr = %False Task(%tvp6).naam ="" Task(%tvp6).cptr = %False Task(%tvp7).naam ="" Task(%tvp7).cptr = %False Task(%tvp8).naam ="" Task(%tvp8).cptr = %False Task(%tvp9).naam = "" Task(%tvp9).cptr = %False TaskEX(%tvp9).stopCptr = %False ChangeCockpitTasks %tvp9 END SUB SUB Paradise_DrawMelody (BYVAL n1 AS BYTE, BYVAL n2 AS BYTE, BYVAL n3 AS BYTE) ' proportional time notation on G-clef/F-clef system ' LOCAL timescale AS SINGLE LOCAL hDC AS LONG ' LOCAL i AS BYTE LOCAL horpos AS WORD LOCAL newpos AS WORD ' LOCAL hBrush AS LONG LOCAL hPen AS LONG LOCAL hOldPen AS LONG LOCAL WndRect AS FOURLONGS LOCAL x AS INTEGER LOCAL y AS INTEGER STATIC tog AS BYTE STATIC systeem() AS StaffType STATIC cnt AS DWORD IF ISFALSE tog THEN GetWindowRect gh.melpat, WndRect x = (GetSystemMetrics(%SM_CXSCREEN)) ' horizontale resolutie in pixels (bvb. 1024) y = (GetSystemMetrics(%SM_CYSCREEN)) ' vertikale resolutie in pixels (bvb. 768) SetWindowPos gh.melpat, %NULL, 1, 1, (x-10)/2,y /3, %SWP_NOACTIVATE DIM systeem(0 TO 1) systeem(0).hor = staff.hor systeem(1).hor = staff.hor systeem(0).ver = staff.ver systeem(1).ver = staff.ver + 90 systeem(0).length = staff.length * 0.45 '2/5 '7/12 '4/7 systeem(1).length = staff.length * 0.45 '2/5 '4/7 systeem(0).clef = "G2" systeem(1).clef = "F4" systeem(0).lijnafstand = staff.lijnafstand systeem(1).lijnafstand = staff.lijnafstand systeem(0).akkoordraster = staff.akkoordraster systeem(1).akkoordraster = staff.akkoordraster systeem(0).nh = staff.nh systeem(1).nh = staff.nh systeem(0).nb = staff.nb systeem(1).nb = staff.nb cnt = %False tog = %True END IF IF n1 > 89 THEN n1 = n1-12 IF n2 > 89 THEN n2 = n2-12 IF n3 > 89 THEN n3 = n3-12 hDC = GetDC(gh.Melpat) hPen = CreatePen (%PS_SOLID,1, 0 ) 'BLACK ' hBrush = CreateSolidBrush(&HFFFFFF)'WHITE ' hBrush = CreateSolidBrush (&H00FE0000) ' blue hOldPen = SelectObject(hDC, hPen) ' SelectObject hDC, hBrush DrawBlankBar systeem(0), hDC,(systeem(0).hor), systeem(0).hor + systeem(0).length DrawBlankBar systeem(1), hDC,(systeem(1).hor), systeem(1).hor + systeem(1).length DrawClef systeem(0), hDC, systeem(0).hor DrawClef systeem(1), hDC, systeem(1).hor horpos = systeem(0).hor + systeem(0).akkoordraster ' grondtoon newpos = ShowNote (systeem(1), hDC, (60+ App.Globton), horpos) ' bug in shownote ! horpos = newpos + systeem(0).akkoordraster IF n1 > 59 THEN newpos = ShowNote (systeem(0), hDC, n1, horpos) ELSE newpos = ShowNote (systeem(1), hDC, 12+n1, horpos) END IF horpos = newpos + Systeem(0).akkoordraster IF n2 > 59 THEN newpos = ShowNote (systeem(0), hDC, n2, horpos) ELSE newpos = ShowNote (systeem(1), hDC, 12+n2, horpos) END IF horpos = newpos + Systeem(0).akkoordraster IF n3 > 59 THEN newpos = ShowNote (systeem(0), hDC, n3, horpos) ELSE newpos = ShowNote (systeem(1), hDC, 12+n3, horpos) END IF horpos = newpos + systeem(0).akkoordraster ' extra spektraal noot: n3 = SpectralNote(36+ App.Globton,cnt MOD 32,Paradiso.Spekfak) IF n3 >= 89 THEN n3 = n3 - 12 IF n3 < 89 THEN IF n3 > 59 THEN newpos = ShowNote (systeem(0), hDC, n3, horpos) ELSE newpos = ShowNote (systeem(1), hDC, 24+n3, horpos) END IF horpos = newpos + systeem(0).akkoordraster END IF ' bugtest: ' newpos = Shownote (systeem(1),hDC,48,horpos) ' komt op 36 te liggen ' horpos = newpos + systeem(0).akkoordraster '---- barlines are not required: ' DrawBarline systeem(0), hDC, horpos ' DrawBarline systeem(1), hDC, horpos ' DeleteObject hBrush SelectObject hDC, hOldPen DeleteObject hPen ReleaseDC gh.Melpat, hDC INCR cnt END SUB '[EOF]