Dr.Godfried-Willem RAES

Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie

Hogeschool Gent

Departement Muziek en Drama


Inhoudstafel

1065:

Programmavoorbeeld: Random Music

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