' *************************************************** ' * < 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. %vbt0 = 32 ' start-up task for %vbt1 = 18 ' teststukje , 5 tasks: 18,19,20,21,22 - 'Vibes' for %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" %tvp1 = 25 ' vibi %tvp2 = 26 ' vibi %tvp3 = 27 ' Harma %tvp4 = 28 ' Klung %tvp5 = 29 ' motor task for 'Vibes' GLOBAL Vibi AS VibiType 'GLOBAL Piperola AS musician GLOBAL Harmonium AS musician 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 DECLARE SUB Handshaketest () ' task 54 - not not try this out! 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_Stop () DECLARE SUB v_tvp0 () ' DECLARE SUB v_tvp1 () DECLARE SUB v_tvp2 () DECLARE SUB v_tvp3 () DECLARE SUB v_tvp4 () DECLARE SUB v_tvp5 () 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).stopCptr =CODEPTR(Vibes_Stop) 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 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 ' Task(%tvp0).naam ="" Task(%tvp0).cptr = CODEPTR(v_tvp0) Task(%tvp0).freq = 2 Task(%tvp1).naam = "3-Vibi0" Task(%tvp1).cptr = CODEPTR(v_tvp1) Task(%tvp1).freq = 4 Task(%tvp2).naam ="3-Vibi1" Task(%tvp2).cptr = CODEPTR(v_tvp2) Task(%tvp2).freq = 2 Task(%tvp3).naam ="3-Harma" Task(%tvp3).cptr = CODEPTR(v_tvp3) Task(%tvp3).freq = 2 Task(%tvp4).naam ="3-Klung" Task(%tvp4).cptr = CODEPTR(v_tvp4) Task(%tvp4).freq = 2 Task(%tvp5).naam ="3-Mots" Task(%tvp5).cptr = CODEPTR(v_tvp5) Task(%tvp5).freq = 4 END IF ' harware 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) Task(54).freq = 100 Task(54).naam = "PrtTst" Task(54).cptr = CODEPTR(Handshaketest) ' 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 = "" ButnSW(6).tag = "" ButnSW(7).tag = "" ButnSW(8).tag = "" ButnSW(9).tag = "" ButnSW(10).tag = "" ButnSW(11).tag = "" 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 ' 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 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 SUB Vibi_t0 () ' meta-task for by Godfried-Willem Raes, october 2001. STATIC starttime AS DWORD 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 Task(%vbt0).tog = %True starttime = timegettime EXIT SUB END IF Task(%vbt0).freq = 0.15 ' scoring for automatic build up at start and stop... seconds = ((timegettime-starttime) \ 1000) SELECT CASE seconds CASE >= 675 StopTask %vbt0 'IF hMidi(0) THEN ' IF Task(%vbt6).tog THEN stoptask %vbt6 'END IF CASE >= 665 IF task(%vbt1).tog THEN stoptask %vbt1 task(%vbt0).freq = 1.5 CASE > = 653 IF task(%vbt2).tog THEN stoptask %vbt2 task(%vbt0).freq = 1.1 CASE >= 638 IF task(%vbt3).tog THEN stoptask %vbt3 Task(%vbt0).freq = 0.9 CASE >= 620 IF task(%vbt4).tog THEN stoptask %vbt4 Task(%vbt0).freq = 0.6 CASE >= 600 IF task(%vbt5).tog THEN stoptask %vbt5 Task(%vbt0).freq = 0.6 CASE >= 150 Task(%vbt0).freq = (seconds/1000) '0.15Hz to 0.6Hz CASE >= 67 IF ISFALSE Task(%vbt5).tog THEN starttask %vbt5 CASE >= 55 IF ISFALSE Task(%vbt4).tog THEN starttask %vbt4 CASE >= 40 IF ISFALSE Task(%vbt3).tog THEN starttask %vbt3 CASE >= 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 \ 3) AND &H7F ' was \ 5 IF dynacnt < 2 THEN dynacnt = 2 denscnt = (seconds \ 5) AND &H7F ' was \ 7 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_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, hMidiO(0) InstrumAllnotesOff Harmonium, hMidiO(0) 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 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_tvp0 () ' ' meta-task for by Godfried-Willem Raes, november 11th 2001. STATIC starttime AS DWORD STATIC denscnt AS BYTE STATIC dynacnt AS BYTE LOCAL seconds AS DWORD 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 App.globton = 0 App.komposduur = 300 'App.tstart = 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 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 Task(%tvp0).tog = %True starttime = timegettime EXIT SUB END IF ' scoring seconds = ((timegettime-starttime) \ 1000) SELECT CASE seconds CASE >= 300 stopTask %tvp3 StopTask %tvp5 Vibi_Motor 2, %False Modemess Harmonium.channel,123,0 ' all notes off harmonium StopTask %tvp0 CASE >= 297 StopTask %tvp4 ' klung off CASE >= 295 StopTask %tvp2 CASE >= 290 StopTask %tvp1 CASE >= 210 IF ISFALSE Task(%tvp4).tog THEN starttask %tvp4 CASE >= 120 IF ISFALSE Task(%tvp3).tog THEN starttask %tvp3 CASE >= 30 IF ISFALSE Task(%tvp5).tog THEN starttask %tvp5 ' motors CASE >= 20 IF ISFALSE Task(%tvp2).tog THEN starttask %tvp2 CASE > =0 IF ISFALSE Task(%tvp1).tog THEN starttask %tvp1 END SELECT App.globton = ((seconds \ 25) * 5) MOD 12 ' modulation... dynacnt = (seconds / 300!) * 127 ' crescendo IF dynacnt < 2 THEN dynacnt = 2 IF dynacnt > 127 THEN dynacnt = 127 Task(%tvp0).freq = 1 + ((seconds / 300!) * 5) App.Tempo = Task(%tvp0).freq * 60 ' 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 v_tvp1 () ' vibi task 1 Trio paradiso ' = %tvp1 LOCAL demping AS BYTE LOCAL note1 AS BYTE LOCAL note2 AS BYTE LOCAL velo AS BYTE LOCAL tmp AS INTEGER STATIC oldnote1 AS BYTE STATIC oldnote2 AS BYTE STATIC oldvelo AS BYTE IF ISFALSE task(%tvp1).tog THEN task(%tvp1).tog = %True DO tmp = N2F(60 + App.globton) * INT((RND(1)*8)) ' boventoon note1 = F2N(tmp) IF IsNoteInHar (Task(%tvp0).Har, note1) THEN note1 = %False LOOP UNTIL note1 > %False DO tmp = N2F(60 + App.globton) * INT((RND(1)*8)) ' boventoon note2 = F2N(tmp) IF IsNoteInHar (Task(%tvp0).Har, note2) THEN note2 = %False IF note2 = note1 THEN note2 = %False LOOP UNTIL note2 > %False demping = 60 + (oldvelo /2) IF oldnote1 THEN Vibi_HoldUp oldnote1, demping, 64 DelNote2Har Task(%tvp1).Har, oldnote1 DelNote2Har Task(%tvp0).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN Vibi_HoldUp oldnote2, demping, 64 DelNote2Har Task(%tvp1).Har, oldnote2 DelNote2Har Task(%tvp0).Har, oldnote2 oldnote2 = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '120) ' cockpit slider 1 = dynamics IF Velo > 120 THEN velo = 120 Vibi_Beat note1, velo AddNote2Har Task(%tvp1).Har, note1, velo AddNote2Har Task(%tvp0).Har, note1, velo Vibi_Beat note2, velo AddNote2Har Task(%tvp1).Har, note2, velo AddNote2Har Task(%tvp0).Har, note2, velo oldnote1 = note1 oldnote2 = note2 oldvelo = velo Task(%vbt1).Freq = App.tempo / 60 END SUB SUB v_tvp2 () ' vibi task 2 Trio Paradiso ' = %tvp2 LOCAL demping AS BYTE LOCAL note1 AS BYTE LOCAL note2 AS BYTE LOCAL velo AS BYTE LOCAL tmp AS INTEGER STATIC oldnote1 AS BYTE STATIC oldnote2 AS BYTE STATIC oldvelo AS BYTE IF ISFALSE task(%tvp2).tog THEN task(%tvp2).tog = %True DO tmp = N2F(48 + App.globton) * INT((RND(1)*16)) ' boventoon note1 = F2N(tmp) IF IsNoteInHar (Task(%tvp0).Har, note1) THEN note1 = %False IF note1 > 96 THEN note1 = %False LOOP UNTIL note1 > %False DO tmp = N2F(48 + App.globton) * INT((RND(1)*16)) ' boventoon note2 = F2N(tmp) 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 = 60 + (oldvelo /2) IF oldnote1 THEN Vibi_HoldUp oldnote1, demping, 64 DelNote2Har Task(%tvp0).Har, oldnote1 DelNote2Har Task(%tvp2).har, oldnote1 oldnote1 = %False END IF IF oldnote2 THEN Vibi_HoldUp oldnote2, demping, 64 DelNote2Har Task(%tvp0).Har, oldnote2 DelNote2Har Task(%tvp2).har, oldnote2 oldnote2 = %False END IF Velo = 1 + (RND(1) * Slider(1).value) '120) ' cockpit slider 1 = dynamics IF Velo > 120 THEN velo = 120 Vibi_Beat note1, velo AddNote2Har Task(%tvp0).Har, note1, velo AddNote2Har Task(%tvp2).Har, note1, velo Vibi_Beat note2, velo AddNote2Har Task(%tvp0).Har, note2, velo AddNote2Har Task(%tvp2).Har, note2, velo oldnote1 = note1 oldnote2 = note2 oldvelo = velo Task(%vbt1).Freq = ((App.tempo / 60) * 2) / 3 END SUB SUB v_tvp3 () ' harma task Trio Paradiso ' = %tvp3 ' harma task - plays the difference tones between the 2 vibraphone pitches in the first vibe 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(%tvp3).tog THEN GetInstrumentParams Harmonium, %ID_HARMA Task(%tvp3).channel = Harmonium.channel Task(%tvp3).tog = %True Task(%tvp3).freq = App.tempo / 2 ProgChange Harmonium.channel,&B00001111 Play Harmonium.channel,28,127 ' motor ON Modemess Harmonium.channel,7,8 ' motor low value END IF IF Harduur THEN IF timegetTime > Harduur THEN ' note off harma noteoff Harmonium.channel, oldnote oldnote = %False Harduur = %False END IF END IF Task(%tvp3).Har.vel = Task(%tvp1).Har.vel ' now we should have isolated the 2 strongest notes in their original position... ' lets now retrieve these two notes: nv = GetHighestNote (Task(%tvp3).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) DelNote2Har Task(%tvp3).Har, hi_note END IF nv = GetHighestNote (Task(%tvp3).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) DelNote2Har Task(%tvp3).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 'note = INT(notefrac) 'FIX(notefrac) + 1 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,(lo_velo + hi_velo)/ 2 ' motor pressure 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 ' 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 oldtc = note END IF Task(%tvp3).freq = App.tempo / 60 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 'GetInstrumentParams Angklung, %ID_KLUNG 'Angklung.channel = %Klung_Channel 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 Task(%tvp4).Har.vel = Task(%tvp2).Har.vel ' now we should have isolated the 2 strongest notes in their original position... ' lets now retrieve these two notes: nv = GetHighestNote (Task(%tvp4).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE hi_note = HIBYT(nv) hi_velo = LOBYT(nv) DelNote2Har Task(%tvp4).Har, hi_note END IF nv = GetHighestNote (Task(%tvp4).Har,60,96) IF nv = -1 THEN EXIT SUB ELSE lo_note = HIBYT(nv) lo_velo = LOBYT(nv) DelNote2Har Task(%tvp4).Har, lo_note 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) * 2 END SUB SUB v_tvp5 () ' vibi motor task Trio 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 IF nrdiat <> olddiat THEN Vibi_Motor 0, RND(1) * 240 olddiat = nrdiat END IF IF nrkrom <> oldkrom THEN Vibi_Motor 1, RND(1) * 240 oldkrom = nrkrom END IF Task(%tvp5).freq = (App.tempo / 120) + RND(1) END SUB SUB v_tvp6 () ' ending for trio paradiso END SUB '[EOF]