Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie
Hogeschool Gent
Departement Muziek en Drama
Toevalsmuziek met een random-kompositiealgoritme gebruik makend van drie procedures:
REM $DYNAMIC
MAIN:
' eerst worden de gemeenschappelijke variabelen tussen hoofd- en subprogrammas opgegeven :
COMMON SHARED /Arrays/ P() AS INTEGER
COMMON SHARED /strings/ Z$
COMMON SHARED /Algemeen/ I AS INTEGER, J AS INTEGER
COMMON SHARED /test/ b%, EINDE AS INTEGER
'declaraties der subprogrammas
DEFINT A-S
DECLARE SUB WRFIL ()
DECLARE SUB MPLAY ()
DECLARE SUB Uit (b%)
' dimensioneer een array voor een 4-stemmig stuk
DIM P(1000, 8) AS INTEGER
DO UNTIL K = 200
:' er zullen 200 noten in voorkomen
B = 36 + INT(RND(1) * 48)
:' begrens de tessituur voor de noten
Q = INT(RND(1) * 1000)
:' de tijdsstruktuur is willekeurig
S = ((INT(RND(1) * 3)) * 2) + 1
: ' moet 1,3,5, of 7 opleveren !!!
IF S = 1 THEN B = B + 24
:' pas de tessituur aan aan de stemligging
IF S = 3 THEN B = B + 12
:' dit is de alt
IF S = 7 THEN B = B - 12
:' dit is de bas
P(Q, S) = B :' schrijf naar het array
P(Q, S + 1) = 120
:' dynamiek is steeds 120
K = K + 1
LOOP
EINDE = 1000
Z$ = "C:\QB45\LES\RND.BIN" :' bestemming voor de score-file
CALL MPLAY
CLS
LOCATE 10, 10: PRINT " Do you want to save this piece ? (Y/N)"; :
DO: K$ = INKEY$: LOOP UNTIL (K$ = "Y" OR K$ = "y" OR K$ = "N" OR K$ = "n")
PRINT K$
IF K$ = "Y" OR K$ = "y" THEN
CALL WRFIL
ELSE
END
END IF
END
SUB Uit (b%)
'deze procedure gebruikt een konstante als poortadres DP. Het poortadres voor een vroegere 80386 AT in de klas was immers &H338. Dit moet uiteraard aangepast worden aan de aktuele toestand.
'de procedure moet ook aangepast worden aan het gebruikte interface, hier het Logotronics ontwerp.
OUT &H338, b%: OUT &H33A, 0: A$ = "+++ ": OUT &H33A, 1
WHILE INP(&H339) AND 128: WEND
END SUB
SUB MPLAY STATIC
DEFLNG K, T
CLS
DO: K$ = INKEY$: LOOP UNTIL K$ = "":
PRINT " Wil je het muziekstuk horen ? (Y/N) ";
K$ = INPUT$(1)
PRINT K$
IF K$ = "Y" OR K$ = "y" THEN
CLS
LOCATE 16, 10: PRINT " Tempo ( M.M.-getal) ?:";
INPUT MM
TMP# = 60 / (MM * 8):
FOR I = 0 TO EINDE
T0# = TIMER
FOR J = 1 TO 8 STEP 2
IF P(I, J) > 0 THEN
Uit (144 + ((J - 1) \ 2))
Uit (P(I, J))
Uit (P(I, J + 1))
END IF
NEXT J
DO UNTIL (TIMER - T0#) >= TMP#: LOOP
NEXT I
' foefje om alles uit te schakelen ...
FOR I = 0 TO 3
Uit (192 + I)
Uit (14)
NEXT I
END IF
END SUB
DEFSNG K, T
SUB WRFIL STATIC
K = 1: NUL = 0
OPEN Z$ FOR BINARY AS #1
FOR I = 0 TO EINDE
FOR J = 0 TO 15
IF J < 9 THEN
PUT #1, K, P(I, J)
K = K + 1
ELSE
PUT #1, K, NUL
K = K + 1
END IF
NEXT J
NEXT I
CLOSE #1
END SUB
Filedate: [901110]
Terug naar inhoudstafel: <Kursus Index>
Naar homepage Dr.Godfried-Willem RAES