'********************************************************************* '* * '* Paradiso * '* music for the Walpurgisnacht act * '* Godfried-Willem Raes * '********************************************************************* ' INTERACTION: NONE ' 22.06.2002: all hardware vibi coding replaced with midi controlls. ' 06.11.2002: bug reported by kl at presentation in Lille: Harma port 0 instead of 3 ' 26.11.2002: revisited for Enschede 28.11.2002 ' 29.05.2003: adapted to new controls on piperola and vox humanola robots. ' 16.09.2003: reconsidered for Den Haag. - no interactive code in here. ' 20.09.2003: uses one of the cockpit sliders!!! ' 26.01.2005: adapted to g_mm kode ' 17.05.2005: adapted to new Harma ' 15.08.2005: rechecked for vibi controllers ' 24.09.2005: check. Starts by playing vibi with the dampers only! ' 04.12.2005: adapted to new hardware. ' 2 testruns performed. ' 13.09.2006: checked for performance on 14.09 concert. ' vibi dynamic slightly raised. ' 14.04.2007: checked for Vilnius. ' crashes on Xi... ' 11.06.2009: to be rechecked with new libs and compils. ' 24.10.2012: Performance with Emilie De Vlam. ' 15.08.2017: checked again. Harma needs more wind... DECLARE FUNCTION Init_Paradiso () AS DWORD DECLARE SUB Paradiso_ButnSW_StartStop () 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 Paradise_DrawMelody (BYVAL n1 AS BYTE, BYVAL n2 AS BYTE,BYVAL n3 AS BYTE) FUNCTION Init_Paradiso () AS DWORD LOCAL m AS ASCIIZ * 35 LOCAL i AS LONG App.Komposduur = Read_Duration_From_File ($faustini, "Paradiso") ' new function in g_file.dll 15.10.2003 ' App.komposduur = 600 ' added 30.11.2002 App.tempo = 60 ' recalculated as soon as started. ButnSW(1).tag0 = "Start" ' start/stop toggle SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 1, ButnSW(1).tag0 ButnSW(1).flag = %False ' reset ButnSW(1).cptr = CODEPTR(Paradiso_ButnSW_StartStop) ' start / stop the running act ' delete previously existing tasks...: FOR i = 16 TO 48 RemoveCockpitTask i NEXT i ' / 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. ' - 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) FaustPatches "paradiso" ' proc. in faust.inc m = "" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr SetDlgItemText gh.Cockpit, %GMT_MSG1, "Walpurgisnacht scene" SetDlgItemText gh.Cockpit, %GMT_MSG2, "--" MM_HarmO_Off %MM_Motor MM_AllLightsOn %MM_Red ' added 24.10.2012 FUNCTION = %True END FUNCTION SUB Paradiso_ButnSW_StartStop () LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL cptr AS DWORD ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID IF ButnSW(Buttonnr).flag THEN SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "STOP" IF ISFALSE Task(%tvp0).swit THEN IF Task(%tvp0).cptr THEN StartTask %tvp0 ' 30.11.2002 END IF END IF ELSE ' FOR i = %tvp0 TO %tvp9 ' - cannot be stopped safely ' IF Task(i).cptr THEN ' IF Task(i).swit THEN StopTask i ' END IF ' NEXT i StopTask %tvp0 StopTask %tvp1 StopTask %tvp2 StopTask %tvp3 StopTask %tvp4 StopTask %tvp5 StopTask %tvp6 StopTask %tvp7 StopTask %tvp8 StopTask %tvp9 SELECT CASE Sonar_Radar CASE 0'%False 'Sonar_DAQ %False cptr = GetProcAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%false) CASE 1'%True cptr = GetProcAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) 'Radar_DAQ %False END SELECT SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "CONT" END IF App.butnSWparam = %False 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.MTStart = %True App.tstart = timeGetTime promil %True runtime %True Slider(0).tag = "----" Slider(1).tag = "Dyna" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, 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_MSG1, " for automats and musicians" SetDlgItemText gh.Cockpit, %GMT_MSG2, "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) MM_Vibi_Off %MM_Motor 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 MM_Piperola_On MM_Bourdonola_On END IF 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 vibi 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 MM_Harma_On %MM_Lights ' 15.09.2006 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_MSG2, "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 Release Vibi.channel,oldnote1, 84 IF oldnote2 THEN Release Vibi.channel,oldnote2, 84 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, %ExpSpec) ' bug note1 = SpectralNote(60+App.globton,cnt + (RND(1)*(8-cnt)),1,Paradiso.SpekFak) ' good. ELSE note1 = SpectralNote(48+App.globton,cnt + (RND(1)*(8-cnt)),1,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)),1,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 ' we must set dampmode %False and sustain must be false IF demping <> Paradiso.demping THEN IF Paradiso.sustain <> %False THEN ModeMess Vibi.channel, &H40, %False ' sets sustain = %False Paradiso.sustain = %False Vibi.ctrl(64) = %False END IF ' remmed 15.08.2005 ' IF Paradiso.dampmode <> %False THEN ' ModeMess Vibi.channel, &H41, %False 'sets dampmode = %False ' Paradiso.dampmode = %False ' END IF ' ModeMess Vibi.channel, 23, demping ' ModeMess Vibi.channel, 24, 64 ' sets damptime Controller Vibi.channel, 24, %True ' enable note off + release value Vibi.ctrl(24) = %True Paradiso.demping = demping END IF 'Play Vibi.Channel, oldnote1, %False Release Vibi.channel, oldnote1, demping DelNote2Har Task(%tvp1).Har, oldnote1 DelNote2Har Task(%tvp0).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN IF demping <> Paradiso.demping THEN IF Paradiso.sustain <> %False THEN ModeMess Vibi.channel, &H40, %False ' sets sustain = %False Paradiso.sustain = %False Vibi.ctrl(64) = %False END IF Controller Vibi.channel, 24, %True ' enable note off + release value Vibi.ctrl(24) = %True Paradiso.demping = demping END IF Release Vibi.Channel, oldnote2, demping 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 velo = MIN(127,velo) IF Task(%tvp1).pan < 127 THEN mPLAY Vibi.channel, note1, velo '* 2/3 '*2/3 removed kl for originals concert END IF oldnote1 = note1 AddNote2Har Task(%tvp1).Har, note1, velo AddNote2Har Task(%tvp0).Har, note1, velo IF Task(%tvp1).pan < 127 THEN mPLAY Vibi.channel, note2, velo '* 2/3 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 MM_Vibi_On IF oldnote1 THEN Release Vibi.channel, oldnote1, 84 IF oldnote2 THEN Release Vibi.channel, oldnote2, 84 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)),1,Paradiso.SpekFak) ', %ExpSpec) 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)),1, Paradiso.SpekFak) ', %ExpSpec) 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 demping <> Paradiso.demping THEN IF Paradiso.sustain <> %False THEN ModeMess Vibi.channel, &H40, %False ' sets sustain = %False Paradiso.sustain = %False Vibi.ctrl(64) = %False END IF 'IF Paradiso.dampmode <> %False THEN ' ModeMess Vibi.channel, &H41, %False 'sets dampmode = %False ' Paradiso.dampmode = %False 'END IF 'ModeMess Vibi.channel, 23, demping 'ModeMess Vibi.channel, 24, 64 ' sets damptime 'Paradiso.demping = demping IF vibi.ctrl(24) <> %True THEN Controller Vibi.channel, 24, %True ' enable note off + release value Vibi.ctrl(24) = %True END IF Paradiso.demping = demping END IF Release Vibi.Channel, oldnote1, demping DelNote2Har Task(%tvp0).Har, oldnote1 DelNote2Har Task(%tvp2).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN IF demping <> Paradiso.demping THEN IF Paradiso.sustain <> %False THEN ModeMess Vibi.channel, &H40, %False ' sets sustain = %False Paradiso.sustain = %False Vibi.ctrl(64) = %False END IF IF vibi.ctrl(24) <> %True THEN Controller Vibi.channel, 24, %True ' enable note off + release value Vibi.ctrl(24) = %True END IF Paradiso.demping = demping END IF Release Vibi.Channel, oldnote2, demping 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 velo = MIN(127,velo) IF Task(%tvp2).pan < 127 THEN mPLAY Vibi.channel, note1, velo '* 2/3 END IF oldnote1 = note1 AddNote2Har Task(%tvp0).Har, note1, velo AddNote2Har Task(%tvp2).Har, note1, velo IF Task(%tvp2).pan < 127 THEN mPLAY Vibi.channel, note2, velo '* 2/3 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 mPLAY 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 ProgChange Harma.channel,&B00001111 ' registers on ' default set to port 3 (same as piano port) Controller Harma.channel, 66, 127 ' motor power ON Harma.ctrl(66) = %True Controller Harma.channel, 7, 30 ' changed to 25, was 8 with the former hardware. ' 15.08.2017: changed to 30 Harma.ctrl(7) = 30 Task(%tvp3).tog = %True END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off harma noteoff Harma.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 > harma.hightes THEN DO note = note - 12 LOOP UNTIL note =< harma.hightes END IF IF note < harma.lowtes THEN DO note = note + 12 LOOP UNTIL note >= harma.lowtes END IF IF oldnote THEN IF note <> oldnote THEN noteoff Harma.channel, oldnote oldnote = %False ELSE EXIT SUB END IF END IF Harma.ctrl(7) = MIN(MAX(40,((lo_velo + hi_velo)/ 2)),125) ' motor pressure - new harma 2005 ' 15.08.2017: upper limit was 100, now changed to 125 Controller Harma.channel,7, Harma.ctrl(7) ' to be tested: MIN(MAX(30,((lo_velo + hi_velo)), 100) IF Task(%tvp3).pan < 127 THEN IF note <> oldnote THEN mPLAY Harma.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 Harma.channel, oldtc note = App.Globton DO note = note + 12 LOOP UNTIL note > 28 mPLAY Harma.channel,note, 120 mPLAY 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 MM_Klung_On ' 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 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 oldnote = %False ELSE EXIT SUB END IF END IF IF note <> oldnote THEN ' maybe we can drop this condition now, ' unless we have key pressure implemented. mPLAY 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 nrdiat <> olddiat THEN Controller Vibi.channel, 20, (GetPromil% * nrdiat)/32 ' midi range is 0-127 !!! olddiat = nrdiat END IF IF nrkrom <> oldkrom THEN Controller Vibi.channel, 21, (GetPromil% * nrkrom)/32 oldkrom = nrkrom 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 MM_Piperola_ON MM_Bourdonola_On 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 mPLAY 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).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 = App.Globton + 12 ELSE 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 mPLAY Task(%tvp7).channel,note,(lo_velo + hi_velo)/3 ' was /2 voor pp1, nu op pp2 - 12.2005 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 mPLAY 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 - in vibi code, that was correct InstrumAllNotesOff Vibi MM_Harma_Off %MM_Notes ' Vibi_AllDampersOff ' SHOULD BECOME A CONTROLLER: Paradiso.sustain = %True Vibi.ctrl(64) = %True Controller Vibi.channel, &H40, Paradiso.sustain Slider(0).tag = "---" Slider(1).tag = "---" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, 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 ' ??? mPLAY Harma.channel,36 + App.Globton,Task(%tvp9).level Controller Harma.channel,7,96 ' motor high value Harma.ctrl(7) = 96 END IF IF Task(%tvp9).level THEN IF ISFALSE cnt MOD 2 THEN note1 = SpectralNote(48+App.globton,RND(1)*16,Paradiso.SpekFak, %ExpSpec) ' ok mPLAY Vibi.channel, note1, Task(%tvp9).level '* 2/3 ' o.k. - sustain is ON ELSEIF ISFALSE cnt MOD 3 THEN note2 = SpectralNote(48+App.globton,2 + (RND(1)*(Task(%tvp9).level/8)), Paradiso.SpekFak, %ExpSpec) IF note2 <> note1 THEN mPLAY Vibi.channel, note2, Task(%tvp9).level' * 2/3 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, %ExpSpec) mPLAY 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, %Expspec) 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 mPLAY Piano.channel,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, %ExpSpec) mPLAY Klung.Channel,note6,Task(%tvp9).level ELSEIF ISFALSE cnt MOD 13 THEN IF note5 THEN NoteOff Harma.channel,note5 note5 = SpectralNote(36+App.globton,4 + (RND(1) * 27),Paradiso.SpekFak, %ExpSpec) mPLAY Harma.channel,note5,60 + (Task(%tvp9).level/2) END IF IF ISFALSE cnt MOD 9 THEN IF note7 THEN NoteOff Harma.channel,note7 note7 = SpectralNote(24 + App.Globton, (RND(1) * Task(%tvp9).level /4),Paradiso.Spekfak, %Expspec) IF note7 <> 36 + App.Globton THEN mPLAY Harma.channel,note7,60 + (Task(%tvp9).level/2) ELSE note7 = App.Globton + 48 mPLAY Harma.channel,note7,60 + (Task(%tvp9).level/2) END IF END IF IF ISFALSE cnt MOD 8 THEN ' player piano IF note8 THEN NoteOff Piano.channel ,note8 ' was bug: channel was zero! ,corrected 29.05.2003 note8 = SpectralNote(36+App.globton, 1+ (RND(1) * 32),Paradiso.SpekFak, %ExpSpec) 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 mPLAY Piano.channel,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, %ExpSpec) mPLAY 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 mPLAY 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 ModeMess Vibi.Channel,20, (1000 - GetPromil%) * 2 / 3 END IF END IF IF ISFALSE cnt MOD 36 THEN IF (1000 - GetPromil) >= 0 THEN ' Vibi_Motor ModeMess Vibi.Channel,21, (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 mPLAY Piano.channel,24,25 ' piano IF note4 THEN NoteOff Piano.channel,note4 IF note8 THEN NoteOff Piano.channel,note8 Controller Harma.channel,7,20 ' motor almost off Harma.ctrl(7) = 20 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 MM_Piperola_Off MM_Bourdonola_Off IF note5 THEN NoteOff Harma.channel,note5 IF note7 THEN NoteOff Harma.channel,note7 IF note9 THEN NoteOff Piperola.channel, note9 NoteOff Harma.channel, App.Globton + 36 NoteOff Piano.channel,24 SetDlgItemText gh.Cockpit, %GMT_MSG2, "END" StopTask %tvp9 END SELECT END IF END SUB SUB v_tvp9End () ' called by the stop codepointer of v_tvp9 'Stoptask App.runtimetasknr Runtime %False 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 ' reset the vibi controllers: MM_Vibi_Off 'Paradiso.sustain = %False 'ModeMess Vibi.channel,&H40, Paradiso.sustain 'Paradiso.dampmode = %False 'ModeMess Vibi.channel, &H41, Paradiso.dampmode 'Paradiso.demping = 80 'ModeMess Vibi.channel, 23, Paradiso.demping 'ModeMess Vibi.channel, 24, 64 ' damping time ' ChangeCockpitTasks %tvp9 MM_Harma_Off %MM_Lights ' 10.12.2004 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, %ExpSpec) 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]