'**************************************************************************** '* PRIMES 2011 * '* Dr.Godfried-Willem RAES * '* requires score data file primes.scr * '**************************************************************************** ' Include: GMT context. (dowmload from Logos site) ' Include DLL libraries ' Include M&M robot orchestra %Play_Primes = 48 %Primes_ObMod = 49 %Primes_ObVol = 50 %Primes_HeliMod = 51 %Play_Primes_pp = 56 GLOBAL N%() TYPE Primes_Type Nrv AS DWORD nc(0 TO 5) AS DWORD END TYPE DECLARE SUB Read_Primes_File () DECLARE FUNCTION Init_Primes () AS LONG DECLARE SUB Play_Primes () DECLARE SUB Play_Primes_Stop () DECLARE SUB Play_Primes_pp () ' player-piano and percussion version DECLARE SUB Primes_ObMod () ' modulator for Ob sound - FM DECLARE SUB Primes_ObMod_Stop () DECLARE SUB Primes_ObVol () ' AM DECLARE SUB Primes_ObVol_Stop () DECLARE SUB Primes_HeliMod () ' amplitude modulator for Heli sound DECLARE SUB Primes_HeliMod_Stop () FUNCTION Init_Primes () AS LONG LOCAL m AS ASCIZ * 20 LOCAL retval AS SINGLE Init_MM MM_PanicButtonWindow ' prepare cockpit retval = PlayKloks (22,64,2,0,0) ' this initializes the function. Read_Primes_File () Task(%Play_Primes).naam = "Primes_M" Task(%Play_Primes).cptr = CODEPTR(Play_Primes) Task(%Play_Primes).freq = 1 Task(%Play_Primes).flags = %False TaskEX(%Play_Primes).stopcptr = CODEPTR(Play_Primes_Stop) Task(%Primes_ObMod).naam = "Ob_Modul" Task(%Primes_ObMod).cptr = CODEPTR(Primes_ObMod) Task(%Primes_ObMod).freq = 2 Task(%Primes_ObMod).flags = %False TaskEX(%Primes_ObMod).stopcptr = CODEPTR(Primes_ObMod_Stop) ' we use the cockpit sliders for Ob modulation control: Slider(0).value = 112 ' multiplied by two in the procedure SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value ' vibrato speed SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, "Ob-speed" Slider(1).value = 28 ' divided by two in the procedure SendMessage Slider(1).h, %TBM_SETPOS,%True, Slider(1).value ' vibrato depth SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER1, "Ob-depth" Task(%Primes_ObVol).naam = "Ob_Vol" Task(%Primes_ObVol).cptr = CODEPTR(Primes_ObVol) Task(%Primes_ObVol).freq = 10 Task(%Primes_ObVol).flags = %False TaskEX(%Primes_ObVol).stopcptr = CODEPTR(Primes_ObVol_Stop) Task(%Primes_HeliMod).naam = "Heli_Mod" Task(%Primes_HeliMod).cptr = CODEPTR(Primes_HeliMod) Task(%Primes_HeliMod).freq = 12 Task(%Primes_HeliMod).flags = %False TaskEX(%Primes_HeliMod).stopcptr = CODEPTR(Primes_HeliMod_Stop) Task(%Play_Primes_pp).naam = "Primes_P" Task(%Play_Primes_pp).cptr = CODEPTR(Play_Primes_pp) Task(%Play_Primes_pp).freq = 1 Task(%Play_Primes_pp).flags = %False logfile "Primes" & DATE$ m = "'Primes_2011'" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) FUNCTION = %True END FUNCTION SUB Read_Primes_File () ' reads the data file LOCAL fnr AS LONG fnr = FREEFILE LOCAL i% LOCAL t% LOCAL q AS INTEGER LOCAL xp$ DIM N%(2310,5) 'GLOBAL ' read score data from file XP$ = "gw_enseko\primes\primes.xpt" OPEN XP$ FOR INPUT AS fnr WHILE NOT EOF(fnr) IF (i% = 0) AND (q > 0) THEN INCR t% INPUT #fnr, N%(t%, i%): q = q + 1: i% = i% + 1 i% = i% MOD 6 WEND CLOSE #fnr END SUB SUB Play_Primes () STATIC ritmod AS INTEGER STATIC mm%,maat% STATIC t% LOCAL Samtot%, Nultot%, i% STATIC Vn%() LOCAL Taskparamlabels() AS ASCIIZ * 8 STATIC slnr AS LONG STATIC udnr AS LONG ' plays the N%() array on the M&M orchestra IF ISFALSE Task(%Play_Primes).tog THEN IF ISFALSE Task(%Play_Primes).hParam THEN DIM TaskParamLabels(2) TaskParamLabels(0)="heli7" TaskParamLabels(1)="heli17" TaskParamLabels(2)="speed" ' tempo 3 - 6 MakeTaskParameterDialog %Play_Primes,2, Slider(),1,UdCtrl(), TaskParamLabels() slnr = TaskEX(%Play_Primes).SliderNumbers(0) Slider(slnr).value = 12 '24 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr+1).value = 40 '64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Heli.ctrl(7) = slider(slnr).value Heli.ctrl(17) = slider(slnr+1).value IF udnr = %False THEN udnr = TaskEX(%Play_Primes).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Primes_UD0) ' tempo UDctrl(udnr).value = 3 UDctrl(udnr).minval = 3 UDctrl(udnr).maxval = 6 UDctrl(udnr).stap = 1 END IF END IF Ritmod = -1 mm% = UDctrl(udnr).value '3 DIM Vn%(5) ' vorige noot t% = 0 ' reset counter MM_Qt_On MM_Ob_On MM_Heli_On MM_Heli_On %MM_Yellow MM_Ob_On %MM_Yellow MM_Qt_On %MM_Blue ' controllers: Controller Heli.channel, 7, Heli.ctrl(7) Controller Heli.channel, 17, Heli.ctrl(17) Heli.ctrl(18) = 100 Controller Heli.channel, 18, Heli.ctrl(18) Heli.ctrl(19) = 110 Controller Heli.channel, 19, Heli.ctrl(19) Ob.ctrl(17) = 127 Controller Ob.channel, 17, Ob.ctrl(17) Ob.ctrl(18) = 90 Controller Ob.channel, 18, Ob.ctrl(18) Ob.ctrl(19) = 115 Controller Ob.channel, 19, Ob.ctrl(19) ' tuning is send with MM_Ob_On Progchange Piano.channel, %False ' no lookups in use here!!! Task(%Play_Primes).tog = %True EXIT SUB ' make sure we have wind for Qt... END IF IF Slider(slnr).value <> Heli.ctrl(7) THEN Heli.ctrl(7) = slider(slnr).value Controller Heli.channel, 7, Heli.ctrl(7) END IF IF Slider(slnr+1).value <> Heli.ctrl(17) THEN Heli.ctrl(17)= slider(slnr+1).value Controller Heli.channel, 17, Heli.ctrl(17) END IF SamTot% = 0 NulTot% = 0 FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN SamTot% = SamTot% + 1: ' aantal te spelen noten op t% IF N%(t%, i%) < 0 THEN SamTot% = SamTot% - 1 IF N%(t%, i%) = -1 THEN NulTot% = NulTot% + 1: ' aantal uit te schakelen noten NEXT i% IF NulTot% > 2 THEN ' snaredrum or shakers! Controller Snar.channel, 11, 127 ' snares on Snar.ctrl(11) = 127 mPlay Snar.channel, 60+ Nultot%, 36 +(Nultot% * 6) ELSE IF Snar.ctrl(11) THEN Controller Snar.channel, 11, %False ' snares off Snar.ctrl(11) = %False END IF END IF FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN SELECT CASE i% CASE 1 ' fluit IF Vn%(1) THEN mPlay Qt.channel, Vn%(1), %False Vn%(1) = %False END IF mPlay Qt.channel, N%(t%,1), 24 + (Samtot% * 4) Vn%(1) = N%(t%,1) CASE 2 ' hobo IF Vn%(2) THEN stoptask %Primes_ObVol stoptask %Primes_ObMod ' te testen. evt. mag vibrato doorlopen in ' gebonden noten. In dat geval moet deze taak niet gestopt worden. END IF mPlay Ob.channel, N%(t%,2), MIN(100 + (Samtot% * 3), 127) Vn%(2) = N%(t%,2) IF ISFALSE Task(%Primes_ObMod).swit THEN starttask %Primes_ObMod END IF IF ISFALSE Task(%Primes_ObVol).swit THEN starttask %Primes_ObVol END IF CASE 3 ' kontrabas IF N%(t%,3) >=60 THEN mPlay Heli.channel, N%(t%,3), 24 + (Samtot% * 3) ELSE mPlay Heli.channel, N%(t%,3), MIN(36 + (Samtot% * 4), 127) END IF IF ISFALSE Task(%Primes_HeliMod).swit THEN starttask %Primes_HeliMod END IF Vn%(3) = N%(t%,3) CASE 4,5 ' piano IF Vn%(i%) THEN mPlay Piano.channel, Vn%(i%), %False Vn%(i%) = %False END IF mPlay Piano.channel, N%(t%,i%), MIN(56 + (Samtot% *4), 127) Vn%(i%) = N%(t%,i%) END SELECT ELSE IF N%(t%, i%) = -1 THEN SELECT CASE i% CASE 1 NoteOff Qt.channel, Vn%(1) Vn%(1) = %False CASE 2 IF Task(%Primes_ObMod).swit THEN stoptask %Primes_ObMod END IF IF Task(%Primes_ObVol).swit THEN stoptask %Primes_ObVol END IF NoteOff Ob.channel, Vn%(2) Vn%(2) = %False CASE 3 IF Task(%Primes_HeliMod).swit THEN stoptask %Primes_HeliMod END IF NoteOff Heli.channel, Vn%(3) Vn%(3) = %False CASE 4,5 NoteOff Piano.channel, Vn%(i%) Vn%(i%) = %False END SELECT END IF END IF NEXT i% IF SamTot% = 5 THEN RitMod = RitMod + 1: RitMod = RitMod MOD 4 mm% = UDctrl(udnr).value SELECT CASE RitMod CASE 0, 2 Maat% = mm% CASE 1 Maat% = (mm% * 2) \ 3 CASE 3 Maat% = (mm% * 3) \ 2 END SELECT SetDlgItemText gh.Cockpit, %GMT_MSG1, "Counter=" & STR$(t%) Task(%Play_Primes).freq = 1!/ (Maat% * 0.0549) IF t% >= UBOUND(N%(1)) - 1 THEN Task(%Play_Primes).freq = 0.20 ' slotnoot INCR t% IF t% > UBOUND(N%(1)) THEN stoptask %PLay_Primes END SUB SUB Play_Primes_Stop () MM_Ob_Off MM_Heli_Off MM_Troms_Off ' dekt ook snar MM_Qt_Off MM_Qt_Off %MM_Motor MM_Piano_Off 'einde END SUB SUB Primes_UD0 () ' callback on parameter UpDowns tempo LOCAL value AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%Play_Primes).UpdownNumbers(0) value = UDCtrl(udnr).value IF value > 6 THEN UDctrl(udnr).value = 6 : value = 6 IF value < 3 THEN UDCTRL(udnr).value = 3 : value = 3 SetDlgItemText Task(%Play_Primes).hparam, %GMT_TEXT0_ID + 16, "M=" & STR$(value) END SUB SUB Primes_ObMod () 'vibrato modulator voor STATIC cnt AS LONG STATIC b AS LONG STATIC s AS INTEGER STATIC md AS INTEGER ' modulatie diepte IF ISFALSE Task(%Primes_ObMod).tog THEN cnt = %False b = 64 ' reset waarde voor de pitchbend s = 1 ' sign voor op en neer 'md = 16 ' modulatie diepte in 0.7 cents units md = Slider(1).value / 2 ' we delen om 7bit overflows te vermijden Bend Ob.channel, 0, 64 ' reset bij elke start ' we use the cockpit sliders for parameter control: speed & depth ' initialisation is in the primes init code. Task(%Primes_ObMod).tog = %TRue END IF IF ISFALSE cnt THEN Task(%Primes_ObMod).freq = 2 ' het vibrato start pas na 500ms INCR cnt EXIT SUB ELSE Task(%Primes_ObMod).freq = Slider(0).value * 2 ' vibrato snelheid END IF INCR cnt IF s > 0 THEN INCR b IF b > 64 + md THEN s = -1 ELSE DECR b IF b < 64 - md THEN s = +1 END IF Bend Ob.channel, 0, b END SUB SUB Primes_ObMod_Stop () Bend Ob.channel, 0, 64 ' reset pitchbend aan het eind van het vibrato. END SUB SUB Primes_ObVol () ' decrescendo after note on, using ctrl.17 STATIC cnt AS LONG STATIC minval AS DWORD IF ISFALSE Task(%Primes_ObVol).tog THEN minval = 64 cnt = Ob.ctrl(17) Task(%Primes_ObVol).tog = %TRue ' taskfrequency fixed to 10Hz END IF DECR cnt DECR cnt IF cnt > minval THEN Controller Ob.channel, 17, cnt ELSE EXIT SUB END IF END SUB SUB Primes_ObVol_Stop () Controller Ob.channel, 17, Ob.ctrl(17) ' 127 END SUB SUB Primes_HeliMod () STATIC b AS LONG IF ISFALSE Task(%Primes_HeliMod).tog THEN b = Heli.ctrl(7) ' beginwaarde controller Task(%Primes_HeliMod).tog = %TRue END IF Task(%Primes_HeliMod).freq = 24 INCR b IF b <= 127 THEN Controller Heli.channel, 7, b ELSE EXIT SUB END IF END SUB SUB Primes_HeliMod_Stop () Controller Heli.channel, 7, Heli.ctrl(7) ' reset controller to slider value END SUB ' ----------------------------------------------------------------------------------------- SUB Play_Primes_PP () LOCAL i%, samtot%, nultot%, aanslag% LOCAL retval AS SINGLE STATIC ritmod AS LONG STATIC mm%, maat%, mF% , t% STATIC Vn%() STATIC Toets%() ' speelroutine voor Player-Piano: IF ISFALSE task(%Play_Primes_pp).tog THEN REDIM Toets%(Piano.lowtes TO Piano.hightes) ' for future improvement REDIM Vn%(0 TO 5) 'static RitMod = -1 mm% = 3 Maat% = mm% mF% = 24 t% = 0 Task(%Play_Primes_pp).tog = %True END IF SamTot% = 0 NulTot% = 0 FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN SamTot% = SamTot% + 1: ' aantal te spelen noten op t% IF N%(t%, i%) < 0 THEN SamTot% = SamTot% - 1 IF N%(t%, i%) = -1 THEN NulTot% = NulTot% + 1: ' aantal uit te schakelen noten NEXT i% IF NulTot% > 2 THEN ' snaredrum or shakers! Controller Snar.channel, 11, 127 ' snares on Snar.ctrl(11) = 127 mPlay Snar.channel, 60+ Nultot%, 48 +(Nultot% * 6) ELSE IF Snar.ctrl(11) THEN Controller Snar.channel, 11, %False Snar.ctrl(11) = %False END IF END IF ' partituurspeellus: FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN IF Vn%(i%) > 0 THEN IF Toets%(Vn%(i%)) THEN mPlay Piano.channel, Vn%(i%), %False Toets%(Vn%(i%)) = 0 END IF 'Uit 144 + Perc%: Uit Vn%(i%): Uit 0 END IF Aanslag% = mF% + (SamTot% * 4) IF Aanslag% > 127 THEN Aanslag% = 127 ' vertaald naar: Llor, Belly, Vacca, Vitello retval = PlayKloks (N%(t%,i%),Aanslag%,5, 0,0) ' ... else: IF ISFALSE retval THEN IF N%(t%,i%) >= 55 THEN mPlay Puff.channel, N%(t%,i%), MIN(aanslag%, 48) ELSE mPlay Troms.channel, 24 + (N%(t%,i%) MOD 24), Aanslag% END IF END IF IF Aanslag% < 8 THEN Aanslag% = 8 IF Toets%(N%(t%, i%)) = 0 THEN mPlay Piano.channel, N%(t%,i%), Aanslag% Toets%(N%(t%, i%)) = Aanslag% Vn%(i%) = N%(t%, i%) ELSE ' wanneer de toets reeds ingedrukt was, ' laat ze dan gewoon ingedrukt zijn. END IF ELSE ' -1 wordt hier gebruikt voor uit te ' schakelen noten: IF N%(t%, i%) = -1 THEN ' notes-off for player-piano: IF Toets%(Vn%(i%)) THEN mPlay Piano.channel, Vn%(i%), %False Toets%(Vn%(i%)) = 0 END IF END IF END IF NEXT i% IF SamTot% = 5 THEN RitMod = (RitMod + 1) MOD 4 SELECT CASE RitMod CASE 0, 2 Maat% = mm% CASE 1 Maat% = (mm% * 2) \ 3 CASE 3 Maat% = (mm% * 3) \ 2 END SELECT END IF Task(%Play_Primes_pp).freq = 1!/ (Maat% * 0.0549) INCR t% IF t% > UBOUND(N%(1)) THEN stoptask %Play_Primes_pp END SUB