DECLARE SUB AllNotesOff () '**************************************************************************** '* PRIMES * '* Dr.Godfried-Willem RAES * '**************************************************************************** ' Primes - partituurgenerator - versie 7 ' 16.12.1988: Start original composition program ' 29.02.1992: aangepast voor Toshiba T1000 - internal midi-versie ' 03.06.1992: aangepast voor Notebook 80386 03/06/92 & extern midi-interface ' midi-userfunction added ' 16.04.1993 : adapted for use with MPU401 or Musiquest interfaces ' het array TES%(5,2) omvat de tessituurgegevens voor het ensemble ' het array NC(5) bevat de centrum-tessituurnoot van elk instrument ' het array NM$(128) bevat de nootnaam-equivalenten van de midi-getallen ' 20.05.1995 : recovered after system crash on 04.05.1995 ' Midi-routines updated. ' 31.07.1995 : Adapted for use with player-piano ' MiPlay moved to sub ' 10.08.1995: Concert performance on player-piano + Proteus 3. ' 11.02.1996: Code adapted for proteus3 + player-piano conbination ' Now uses commandstring option. (PP for player piano) ' 14.02.1996: Week van de Hedendaagse Muziek - versie met player-piano REM $DYNAMIC DEFINT A-W CONST Lpptes% = 21: ' tessituur player-piano CONST Hpptes% = 108: ' id. COMMON SHARED Tes%(), Nc%(), p%(), Nrp%, Hcn%, Lcn%, Mcn%, Nm$(), Rt%() COMMON SHARED NotTot% COMMON SHARED Dp% COMMON SHARED Bevel$ ' P%() bevat priemgetallen van 0 tot 127 - ' PL%() bevat EEN PRIEMTOONLADDER DECLARE SUB INSTRUMENTATIE (Tes%(), Nc%(), Hcn%, Lcn%, Mcn%) DECLARE SUB PRIEM (p%, Range%) DECLARE SUB NOOTNAAM (Nm$()) DECLARE SUB RITME (Rt%(), NotTot%) DECLARE SUB FB01 () DECLARE SUB Uit (byte%) DECLARE SUB Miplay () DECLARE SUB Playpian () DIM SHARED Nm$(128) DIM SHARED Rt%(5) ' het array RT%(5) bevat de ritmische gegevens voor de noten CALL RITME(Rt%(), NotTot%) Bevel$ = COMMAND$ IF Bevel$ = "PP" THEN Dp% = &H330: GOTO INITUART INITIALIZE: CLS : DEFINT A-W LOCATE 10, 5: PRINT "Hardware set-up menu: "; LOCATE 12, 10: PRINT "1.- MPU-401 on &H330 (default)"; LOCATE 13, 10: PRINT "2.- T1000 on &H2FA"; LOCATE 14, 10: PRINT "3.- Logotronics on &H3F8"; LOCATE 15, 10: PRINT "4.- Logotronics on &H300"; LOCATE 16, 10: PRINT "5.- Logotronics on &H310"; LOCATE 18, 30: PRINT "Keuze?"; DO: k$ = INKEY$: LOOP UNTIL k$ >= "1" AND k$ < "6" SELECT CASE VAL(k$) CASE 1 Dp% = &H330 CASE 2 Dp% = &H2FA CASE 3 Dp% = &H3F8 CASE 4 Dp% = &H300 CASE 5 Dp% = &H310 END SELECT IF Dp% = 0 THEN Dp% = &H330 INITUART: IF Dp% = &H330 THEN SHELL "C:\bc7\bom\mpuuart.exe" CLS CALL NOOTNAAM(Nm$()) DIM SHARED N%(NotTot%, 5) DIM SHARED Tes%(5, 2) DIM SHARED Nc%(4) DIM SHARED Nv%(5) CALL INSTRUMENTATIE(Tes%(), Nc%(), Hcn%, Lcn%, Mcn%) Tes%(5, 1) = Tes%(4, 1): Tes%(5, 2) = Tes%(4, 2): ' piano=2-stemmig Nc% = Mcn% DIM SHARED Pl%(127) GOSUB PRIMLAD RESTORE MENU2: IF Bevel$ = "PP" THEN k = 3: GOTO SkipMenu2 CLS LOCATE 10, 10: PRINT "PRIMES - MENU Nr.2 : " LOCATE 12, 25: PRINT "1.- Calculate new score " LOCATE 13, 25: PRINT " start from scratch " LOCATE 14, 25: PRINT "2.- Use existing score-file" LOCATE 15, 25: PRINT " expert-system mode " LOCATE 16, 25: PRINT " This file should be :" LOCATE 17, 25: PRINT " PRIMES.XPT" LOCATE 18, 25: PRINT "3.- playback existing score-file" LOCATE 19, 25: PRINT " without reprocessing [***] " LOCATE 20, 25: PRINT "9.- Quit " LOCATE 21, 40: INPUT "KEUZE ? "; k SkipMenu2: IF k < 1 OR k > 9 THEN GOTO MENU2: IF k = 9 THEN END IF (k = 1) OR (k = 3) THEN EXPERT = 0 IF k = 2 THEN EXPERT = -1 IF k > 3 THEN GOTO MENU2 IF k = 1 AND EXPERT = 0 THEN GOTO SCORE ELSE ' read score from file ERASE N% XP$ = "primes.xpt" XPL$ = "primes.lop" OPEN XPL$ FOR INPUT AS #2 IF NOT EOF(2) THEN INPUT #2, t% IF NOT EOF(2) THEN INPUT #2, LOP CLOSE #2 'step 2 : dimensioneer array en lees er de file in NotTot% = t% DIM N%(NotTot%, 5) i% = 0: t% = 0: q = 0 OPEN XP$ FOR INPUT AS #1 WHILE NOT EOF(1) IF i% = 0 AND q > 0 THEN t% = t% + 1 INPUT #1, N%(t%, i%): q = q + 1: i% = i% + 1: i% = i% MOD 6 WEND CLOSE #1 LOCATE 22, 10: PRINT " number of notes in file = "; NotTot% LOCATE 23, 10: PRINT " Expert-system loop number="; LOP q = 0 IF EXPERT = -1 THEN GOTO FILTER3 ELSE GOTO MENU3 END IF '***********************************************************fill score-array SCORE: CLS LOCATE 10, 10: PRINT " Calculating new score... " LOCATE 12, 10: PRINT " please wait ! " FOR i% = 1 TO 5: N%(0, i%) = Mcn%: NEXT i%: ' beginnoot t% = 0 CALL RITME(Rt%(), NotTot%) FOR i% = 1 TO 5: GOSUB PARTIJ: NEXT i% 'nu werden de partijen horizontaal beschreven op gefilterd op speelbaarheid FILTER3: PRINT " F I L T E R 3 " 'hier wordt de eerste partituurversie aan estetische kriteria onderworpen 'filter 3 vertikale kriteria (harmoniereeks op de gemeenschappelijk inge- 'zette noten door minstens drie instrumenten) ' stap 1 : kopieer partituur in akkoordreeks CH%(t%,i%) IF EXPERT = -1 THEN DIM Ch%(NotTot% + 1, 5) ELSE DIM Ch%(NotTot * 2, 5) LUS = 0: CHANGE = 0 STRT3: ' geen veranderingen in het eerste vijfde v/h stuk FOR t% = 0 TO NotTot% \ 5 FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN Ch%(t%, i%) = N%(t%, i%) IF N%(t%, i%) = 0 THEN Ch%(t%, i%) = N%(t% - 1, i%) IF N%(t%, i%) = -1 THEN Ch%(t%, i%) = 0 NEXT i% NEXT t% FOR t% = NotTot% \ 5 TO NotTot% SamTot% = 0: NulTot% = 0 FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN Ch%(t%, i%) = N%(t%, i%) SamTot% = SamTot% + 1 END IF IF N%(t%, i%) = 0 THEN Ch%(t%, i%) = Ch%(t% - 1, i%) IF N%(t%, i%) = -1 THEN Ch%(t%, i%) = 0 NulTot% = NulTot% + 1 END IF NEXT i% IF SamTot% < 3 THEN GOTO EFF3: IF SamTot% >= 3 AND t% > NotTot% \ 5 THEN GOSUB CHORD Ja = 0 IF ((B AND Cis) AND G) THEN Ja = -1 IF ((B AND Cis) AND F) THEN Ja = -1 IF ((B AND E) AND Gis) THEN Ja = -1 IF ((B AND F) AND (Dis OR G)) THEN Ja = -1 IF ((A AND Dis) AND Fis) THEN Ja = -1 IF ((Cis AND (F OR Fis)) AND A) THEN Ja = -1 IF ((Gis AND Cis) AND E) THEN Ja = -1 IF ((G AND B) AND (F OR G)) THEN Ja = -1 IF ((Cis AND E) AND (G OR Gis)) THEN Ja = -1 IF ((Cis AND F) AND (G OR Gis)) THEN Ja = -1 IF ((E AND (G OR Gis)) AND B) THEN Ja = -1 IF ((Dis AND F) AND (A OR B)) THEN Ja = -1 IF ((Dis AND G) AND (A OR B)) THEN Ja = -1 IF ((Dis AND Gis) AND B) THEN Ja = -1 IF ((E AND G) AND A) THEN Ja = -1 IF Ja = -1 THEN GOTO EFF3 IF Ja = 0 AND CHANGE MOD 9 = 0 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 3 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 3 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% + 3 IF N%(t%, 5) > 0 THEN N%(t%, 4) = Mcn% - 3 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 1 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 13 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% + 7 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 7 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% - 19 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% + 1 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 2 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 3 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% - 3 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 19 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% - 1 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 13 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 3 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 19 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% + 2 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 17 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% - 2 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 5 CHANGE = CHANGE + 1: PRINT "change"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 4 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 3 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 17 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% + 19 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% + 3 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 5 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 11 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% - 1 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 11 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% + 5 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 23 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 6 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 7 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 17 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% - 5 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 19 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 7 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 5 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% + 2 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 19 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% + 2 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 3 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE GOTO EFF3: ELSEIF Ja = 0 AND CHANGE MOD 9 = 8 THEN IF N%(t%, 1) > 0 THEN N%(t%, 1) = Mcn% + 7 IF N%(t%, 2) > 0 THEN N%(t%, 2) = Mcn% + 2 IF N%(t%, 3) > 0 THEN N%(t%, 3) = Mcn% - 13 IF N%(t%, 4) > 0 THEN N%(t%, 4) = Mcn% + 2 IF N%(t%, 5) > 0 THEN N%(t%, 5) = Mcn% - 19 CHANGE = CHANGE + 1: PRINT "CHANGE"; CHANGE END IF EFF3: END IF NEXT t% LUS = LUS + 1 PRINT " Lus filter 3 = "; LUS: ' for debug IF LUS < 2 THEN CHANGE = 0: GOTO STRT3 PRINT "Array-kopie gemaakt - filter 3 doorlopen": 'for debug flow '**************************************************************************** FILTER4: 'stap 2 analyseer de harmonie IF EXPERT = 0 THEN t% = NotTot% \ 3 IF EXPERT = -1 AND LOP <= 2 THEN t% = NotTot% \ 3 IF EXPERT = -1 AND LOP > 2 THEN t% = NotTot% * (LOP - 2) \ LOP DO GOSUB CHORD AKKOORDSTUDIE: GEVAL1: '******************************************************************** IF ((B AND Cis) AND G) THEN PRINT " G E V A L 1 ! " ' kijk per stem naar de volgende te spelen noot en maak er b,dis,gis van i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1 IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%): ' zoek volgende noot in die stem LOOP WHILE Nv%(i%) <= 0 ' nu staat de naam van de volgende noot in kanaal i% in Nv%(i%) IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5)) THEN 'volgende noot is goed dus laat de noot staan i% = i% + 1: ' ga naar volgende kanaal GOTO LFC1 ELSE 'bestaat er wel een speelbare nieuwe noot ? Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 3) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 2) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 5) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja = 0 THEN N%(q, i%) = Mcn% + 2: i% = i% + 1: GOTO LFC1 IF Ja THEN NWNT1: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) < Tes%(i%, 1)) OR (Nv%(i%) > Tes%(i%, 2)) THEN GOTO NWNT1: IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5) THEN IF q >= NotTot% THEN N%(NotTot%, i%) = Nv%(i%): EXIT DO N%(q, i%) = Nv%(i%) ELSE GOTO NWNT1 END IF 'zoek een nieuwe noot en schrijf ze weg in array N%(t%,i%) END IF i% = i% + 1 LFC1: IF q > NotTot% THEN EXIT DO END IF LOOP ELSEIF (((A OR B) AND Dis) AND Fis) THEN : 'geval 2 ************************************** GEVAL2: PRINT " GEVAL2" i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1 IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%): ' zoek volgende noot in die stem LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2)) THEN i% = i% + 1: ' ga naar volgende kanaal GOTO LFC2 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) + 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) - 2) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 2) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja = 0 THEN N%(q, i%) = Mcn% - 2: i% = i% + 1: GOTO LFC2 IF Ja THEN NWNT2: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2) THEN IF q > NotTot% THEN q = NotTot% N%(q, i%) = Nv%(i%) ELSE GOTO NWNT2 END IF END IF i% = i% + 1 LFC2: END IF LOOP ELSEIF ((Gis AND Cis) AND E) THEN GEVAL3: PRINT "G E V A L 3 " i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1: IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%) LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5)) THEN i% = i% + 1 GOTO LFC3 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 3) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12)) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 3) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 5) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja = 0 THEN N%(q, i%) = Mcn%: i% = i% + 1: GOTO LFC3 IF Ja THEN NWNT3: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5) THEN IF q > NotTot% THEN q = NotTot% N%(q, i%) = Nv%(i%) ELSE GOTO NWNT3 END IF END IF i% = i% + 1 LFC3: END IF LOOP ELSEIF ((Fis AND A) AND Cis) THEN GEVAL4: PRINT "G E V A L 4" i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1: IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%) LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5)) THEN i% = i% + 1 GOTO LFC4 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 1) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 1) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 5) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn% - 1: i% = i% + 1: GOTO LFC4 IF Ja THEN NWNT4: Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 5) THEN IF q > NotTot% THEN q = NotTot% N%(q, i%) = Nv%(i%) ELSE GOTO NWNT4 END IF END IF i% = i% + 1 LFC4: END IF LOOP ELSEIF ((G AND B) AND F) THEN GEVAL5: ' maak volgende noten A,CIS,FIS PRINT "G e v a l 5" i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1: IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%) LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2)) THEN i% = i% + 1 GOTO LFC5 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) - 1) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 2) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn% - 1: i% = i% + 1: GOTO LFC5 IF Ja THEN NWNT5: Nv%(i%) = Pl%(RND(1) * NtNr%) IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2) THEN IF q >= NotTot% THEN q = NotTot% N%(q, i%) = Nv%(i%) ELSE GOTO NWNT5 END IF END IF i% = i% + 1 LFC5: END IF LOOP ELSEIF ((Cis AND E) AND Fis) THEN GEVAL6: PRINT "G E V A L 6" i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1: IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%) LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 1)) THEN i% = i% + 1 GOTO LFC6 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 1) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) - 3) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn% + 1: i% = i% + 1: GOTO LFC6 IF Ja THEN NWNT6: Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 1) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 3) THEN IF q > NotTot% THEN q = NotTot% N%(q, i%) = Nv%(i%) ELSE GOTO NWNT6 END IF END IF i% = i% + 1 LFC6: END IF LOOP GEVAL7: '******************************************************************** ELSEIF ((B AND Cis) AND F) THEN PRINT " G E V A L 7 ! " ' kijk per stem naar de volgende te spelen noot en maak er cis,fis,a van i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1 IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%): ' zoek volgende noot in die stem LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3)) THEN i% = i% + 1: ' ga naar volgende kanaal GOTO LFC7 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12)) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 3) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn%: i% = i% + 1: GOTO LFC1 IF Ja THEN NWNT7: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) < Tes%(i%, 1)) OR (Nv%(i%) > Tes%(i%, 2)) THEN GOTO NWNT7: IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3) THEN IF q >= NotTot% THEN N%(NotTot%, i%) = Nv%(i%): EXIT DO N%(q, i%) = Nv%(i%) ELSE GOTO NWNT7 END IF END IF i% = i% + 1 LFC7: IF q > NotTot% THEN EXIT DO END IF LOOP GEVAL8: '******************************************************************** ELSEIF ((Dis AND Gis) AND B) THEN PRINT " G E V A L 8 ! " ' kijk per stem naar de volgende te spelen noot en maak er cis,e,gis van i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1 IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%): ' zoek volgende noot in die stem LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2)) THEN i% = i% + 1: ' ga naar volgende kanaal GOTO LFC8 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) - 2) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 2) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn% - 2: i% = i% + 1: GOTO LFC8 IF Ja THEN NWNT8: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) < Tes%(i%, 1)) OR (Nv%(i%) > Tes%(i%, 2)) THEN GOTO NWNT8: IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 2) THEN IF q >= NotTot% THEN N%(NotTot%, i%) = Nv%(i%): EXIT DO N%(q, i%) = Nv%(i%) ELSE GOTO NWNT8 END IF END IF i% = i% + 1 LFC8: IF q > NotTot% THEN EXIT DO END IF LOOP GEVAL9: '******************************************************************** ELSEIF ((Cis AND Gis) AND F) THEN PRINT " G E V A L 9 ! " ' kijk per stem naar de volgende te spelen noot en maak er cis,e,fis,a van i% = 1 DO IF i% > 5 THEN EXIT DO q = t% DO q = q + 1 IF q > NotTot% THEN EXIT DO Nv%(i%) = N%(t%, i%): ' zoek volgende noot in die stem LOOP WHILE Nv%(i%) <= 0 IF ((Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3)) THEN i% = i% + 1: ' ga naar volgende kanaal GOTO LFC9 ELSE Ja = 0 FOR Nq = Tes(i%, 1) TO Tes(i%, 2): ' zoek binnen de tessituurgrens FOR Nqt = 0 TO NtNr%: ' zoek binnen de toonladder IF (Nq = Pl%(Nqt)) THEN IF ((Nq MOD 12) = (Mcn% MOD 12) - 5) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) - 2) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12)) THEN Ja = -1 IF ((Nq MOD 12) = (Mcn% MOD 12) + 3) THEN Ja = -1 END IF NEXT Nqt NEXT Nq IF Ja THEN PRINT " er bestaat een alternatieve noot ! " IF Ja = 0 THEN N%(q, i%) = Mcn% - 2: i% = i% + 1: GOTO LFC9 IF Ja THEN NWNT9: ' zoek de nieuwe noot Nv%(i%) = Pl%(RND(1) * NtNr) IF (Nv%(i%) < Tes%(i%, 1)) OR (Nv%(i%) > Tes%(i%, 2)) THEN GOTO NWNT9: IF (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 5) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) - 2) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12)) OR (Nv%(i%) MOD 12 = (Mcn% MOD 12) + 3) THEN IF q >= NotTot% THEN N%(NotTot%, i%) = Nv%(i%): EXIT DO N%(q, i%) = Nv%(i%) ELSE GOTO NWNT9 END IF END IF i% = i% + 1 LFC9: IF q > NotTot% THEN EXIT DO END IF LOOP END IF EF4: GOSUB TESFIL: ' check tessituur ! q = q - t% IF t% < NotTot% THEN IF q < 1 THEN q = 1 IF q < 12 THEN t% = t% + q ELSE t% = t% + 11 IF t% > NotTot% THEN t% = NotTot% PRINT t%; END IF LOOP WHILE t% < NotTot% FILTER5: '*************************** FILTER 5 *************************************** 'RITMIEK PRINT " Filter 5 : ritmiek " ERASE Ch% IF EXPERT = 0 THEN DIM Ch%(NotTot% * 2, 5) ELSE DIM Ch%(NotTot%, 5) t% = 0: TQ = 0 FOR t% = 0 TO NotTot% SamTot% = 0: NulTot% = 0 FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN SamTot% = SamTot% + 1 IF N%(t%, i%) < 0 THEN NulTot% = NulTot% + 1 IF EXPERT = -1 THEN SamTot% = 1: NulTot% = 1 NEXT i% IF SamTot% = 5 THEN q = 23: N%(t%, 0) = SamTot% IF SamTot% = 4 THEN q = 19: N%(t%, 0) = SamTot% IF NulTot% = 5 THEN q = 17: N%(t%, 0) = NulTot% IF NulTot% = 4 THEN q = 13: N%(t%, 0) = NulTot% FOR i% = 1 TO 5: Ch%(TQ, i%) = N%(t%, i%): NEXT i% IF SamTot% > 3 OR NulTot% > 3 THEN Ch%(TQ, 0) = q FOR C = TQ + 1 TO TQ + q FOR i% = 1 TO 5 IF Ch%(TQ, i%) > 0 THEN Ch%(C, i%) = 0: ' houdt noot aan IF Ch%(TQ, i%) = 0 THEN Ch%(C, i%) = -1: ' schakel noot uit IF Ch%(TQ, i%) < 0 THEN Ch%(C, i%) = -1: ' rust blijft rust NEXT i% NEXT C TQ = TQ + q + 1 ELSE TQ = TQ + 1 END IF NEXT t% IF TQ > NotTot% THEN TQ = NotTot% FOR i% = 1 TO 5: Ch%(TQ, i%) = -1: NEXT i%: ' stilte na laatste noot ! PRINT " de partituur is nu "; TQ; " tellen lang" ERASE N% NotTot% = TQ: ' het nieuwe aantal tijden komt terug in NOTTOT% DIM N%(NotTot% + 1, 5): ' het nieuwe partituurarray wordt gedimensioneerd FOR t% = 0 TO NotTot% N%(t%, 0) = Ch%(t%, 0) FOR i% = 1 TO 5 N%(t%, i%) = Ch%(t%, i%) IF N%(t%, i%) > 0 THEN IF (N%(t%, i%) >= Tes(i%, 1)) AND (N%(t%, i%) <= Tes(i%, 2)) THEN N%(t%, i%) = Ch%(t%, i%) ELSE IF N%(t%, i%) < Tes(i%, 1) THEN ' noot is te laag j = 0 DO WHILE j < NtNr IF (N%(t%, i%) MOD 12 = Pl%(j) MOD 12) AND (Pl%(j) >= Tes(i%, 1)) AND (Pl%(j) <= Tes(i%, 2)) THEN N%(t%, i%) = Pl%(j): EXIT DO ELSE j = j + 1 END IF LOOP IF j >= NtNr THEN N%(t%, i%) = -1 ELSE ' noot is te hoog j = NtNr DO WHILE j > 0 IF (N%(t%, i%) MOD 12 = Pl%(j) MOD 12) AND (Pl%(j) <= Tes(i%, 2)) AND (Pl%(j) >= Tes(i%, 1)) THEN N%(t%, i%) = Pl%(j): EXIT DO ELSE j = j - 1 END IF LOOP IF j = 0 THEN N%(t%, i%) = -1 END IF END IF END IF NEXT i% NEXT t% ERASE Ch%: ' het kopij-array mag weg nu ... ' einde filter 5 *********************************************************** 'filter6 - opkuisfilter FILTER6: FOR t% = 0 TO NotTot% FOR i% = 1 TO 5 IF (N%(t%, i%) = -1) AND (t% < NotTot%) THEN IF N%(t% + 1, i%) = 0 THEN N%(t% + 1, i%) = -1 END IF NEXT i% NEXT t% 'voorlaatste noot in array : N%(NotTot% - 1, 1) = Mcn% + 17 N%(NotTot% - 1, 2) = Mcn% + 2 N%(NotTot% - 1, 3) = Mcn% - 31 N%(NotTot% - 1, 4) = Mcn% + 2 N%(NotTot% - 1, 5) = Mcn% - 2 '************************menu : play-array of print-score of print parts ... MENU3: CLS IF Bevel$ = "PP" THEN k$ = "1": GOTO SkipMenu3: LOCATE 10, 10: PRINT " PRIMES - MENU Nr.3 : " LOCATE 12, 10: PRINT " 1.- Midi-simulator [***] " LOCATE 13, 10: PRINT " 2.- Partituur naar file schrijven " LOCATE 14, 10: PRINT " 3.- Partituur uitprinten " LOCATE 15, 10: PRINT " 4.- Partij 1 printen " LOCATE 16, 10: PRINT " 5.- Partij 2 printen " LOCATE 17, 10: PRINT " 6.- Partij 3 printen " LOCATE 18, 10: PRINT " 7.- Partij 4 printen " LOCATE 19, 10: PRINT " 8.- Save score-array for expert " LOCATE 20, 10: PRINT " 9.- Programma verlaten " LOCATE 21, 40: PRINT "KEUZE ? "; DO: k$ = INKEY$: LOOP UNTIL VAL(k$) > 0 AND VAL(k$) <= 9 SkipMenu3: SELECT CASE VAL(k$) CASE 1 Miplay CASE 2 F$ = "PRIMES.SCR" GOSUB PARTITUUR CASE 3 F$ = "LPT1:" GOSUB PARTITUUR CASE 4, 5, 6, 7 Part = VAL(k$) - 3 k = VAL(k$) GOSUB PARTS CASE 8 GOSUB SVEARR CASE 9 END END SELECT END PARTITUUR: OPEN F$ FOR OUTPUT AS #1 FOR t% = 0 TO NotTot% FOR i% = 5 TO 1 STEP -1: 'lage instrumenten onderaan ! - fluit boven IF N%(t%, i%) > 0 THEN PRINT #1, Nm$(N%(t%, i%)); N%(t%, i%), : GOTO ESCR IF N%(t%, i%) < 0 THEN PRINT #1, " ", : GOTO ESCR IF N%(t%, i%) = 0 THEN IF N%(t% - 1, i%) >= 0 THEN PRINT #1, " | ", ELSE PRINT #1, " ", END IF END IF ESCR: NEXT i% IF N%(t%, 0) <= 0 THEN IF (t% MOD 4) = 0 THEN PRINT #1, " * " ELSE PRINT #1, " " ELSE PRINT #1, t% + 1; " "; N%(t%, 0) END IF NEXT t% PRINT #1, DATE$, TIME$, " Godfried-Willem RAES " CLOSE #1 RETURN PARTS: i% = Part F$ = "C:\BC7\PRIMES\PART_" + CHR$(48 + i%) + ".SCR" OPEN F$ FOR OUTPUT AS #1 FOR t% = 0 TO NotTot% IF N%(t%, i%) > 0 THEN PRINT #1, Nm$(N%(t%, i%)); IF N%(t%, i%) = 0 THEN PRINT #1, " = "; IF N%(t%, i%) = -1 THEN PRINT #1, " 0 "; NEXT t% PRINT #1, " " CLOSE #1 RETURN 'subroutine die initieel partij na partij berekent en in het array schrijft PARTIJ: t% = 1: C = 0 DO UNTIL t% > NotTot% IF (t% MOD Rt%(i%)) THEN N%(t%, i%) = 0: ' houdt noot aan t% = t% + 1: ' tel 1 tijd verder GOTO EINDELUS ELSE OPN: q% = RND(1) * NtNr N%(t%, i%) = Pl%(q%) IF N%(t%, i%) < Tes(i%, 1) OR N%(t%, i%) > Tes(i%, 2) THEN GOTO OPN 'filteralgoritme voor verloop kompositie OPBOUW: IF (t% < NotTot% \ 11) THEN IF RND(1) * 2 > 1 THEN s = -1 ELSE s = 1 N%(t%, i%) = Mcn% + (RND(1) * s) GOTO FILTER2: ELSEIF t% < (NotTot% \ 9) THEN IF RND(1) * 2 > 1 THEN s = 1 ELSE s = -1 N%(t%, i%) = Mcn% + (RND(1) * s * 2) GOTO FILTER2: ELSEIF t% < (NotTot% \ 7) THEN IF RND(1) * 2 > 1 THEN s = 1 ELSE s = -1 N%(t%, i%) = Mcn% + (RND(1) * s * 3) GOTO FILTER2: ELSEIF C < NtNr / 2 THEN IF t% MOD (Rt(i%) ^ 2) = 0 THEN C = C + 1 IF RND(1) * 2 > 1 THEN s = -1 ELSE s = 1 q = RND(1) * C * s N%(t%, i%) = Pl%((NtNr / 2) + q) GOTO FILTER2: ELSEIF (t% < NotTot% \ 5) AND ((N%(t%, i%) > Hcn%) OR (N%(t%, i%) < Lcn%)) THEN Range% = (Hcn% - Lcn%) / 2 CALL PRIEM(p%, Range%) N%(t%, i%) = Mcn% + p% GOTO FILTER2: ELSEIF (t% < (NotTot% * 2) \ 5) AND ((N%(t%, i%) > Hcn% + 7) OR (N%(t%, i%) < Lcn% - 7)) THEN Range% = ((Hcn% - Lcn%) / 2) + 7 CALL PRIEM(p%, Range%) N%(t%, i%) = Mcn% + p% GOTO FILTER2: ELSEIF (t% = (NotTot% * 4) \ 7) THEN IF RND(1) * 10 > 5 THEN s = -1 ELSE s = 1 q = i% MOD 13 IF q MOD 2 = 0 THEN q = q + 1 IF q = 9 THEN q = 17 N%(t%, i%) = Mcn% + (s * q) GOTO FILTER2: ELSEIF (t% < (NotTot% * 4) \ 7) AND ((N%(t%, i%) > Hcn% + 11) OR (N%(t%, i%) < Lcn% - 11)) THEN Range% = ((Hcn% - Lcn%) / 2) + 11 CALL PRIEM(p%, Range%) N%(t%, i%) = Mcn% + p% GOTO FILTER2: ELSEIF (t% < (NotTot% * 7) \ 11) AND ((N%(t%, i%) > Hcn% + 18) OR (N%(t%, i%) < Lcn% - 18)) THEN Range% = ((Hcn% - Lcn%) / 2) + 18 CALL PRIEM(p%, Range%) N%(t%, i%) = Mcn% + p% GOTO FILTER2: ELSEIF (t% < (NotTot% * 5) \ 7) THEN Range% = ((Tes%(i%, 2) - Tes%(i%, 1)) / 2) CALL PRIEM(p%, Range%) N%(t%, i%) = Mcn% + p% GOTO FILTER2: ELSEIF (t% < (NotTot% * 6) \ 7) THEN Range% = ((Tes%(i%, 2) - Tes%(i%, 1)) / 2) CALL PRIEM(p%, Range%) IF Range% > Mcn% THEN N%(t%, i%) = Mcn% + ABS(p%) IF Range% = Mcn% THEN N%(t%, i%) = Mcn% + p% IF Range% < Mcn% THEN N%(t%, i%) = Mcn% - ABS(p%) GOTO FILTER2: ELSEIF t% < NotTot% THEN Range% = Hcn% - Mcn% CALL PRIEM(p%, Range%) IF ((Tes%(i%, 2) - Tes%(i%, 1)) / 2) > Mcn% THEN N%(t%, i%) = Mcn% + ABS(p%) ELSE N%(t%, i%) = Mcn% - ABS(p%) END IF FILTER2: END IF GOSUB TESFIL END IF EINDEFILTER: t% = t% + Rt(i%) CALL RITME(Rt(), NotTot%) IF t% > NotTot% THEN EXIT DO EINDELUS: LOOP 'voorlaatste noot in array : N%(NotTot% - 1, 1) = Mcn% + 17 N%(NotTot% - 1, 2) = Mcn% + 2 N%(NotTot% - 1, 3) = Mcn% - 31 N%(NotTot% - 1, 4) = Mcn% + 2 N%(NotTot% - 1, 5) = Mcn% - 2 RETURN PRIMLAD: 'deze subroutine maakt het priemtoonladder array rond NC% als centrale noot 'en retourneert deze in het array PL%() . Het aantal noten waaruit deze 'toonladder bestaat komt in de variabele NTNR terecht. i% = Nc%: RESTORE ' initiele index van de centrale noot is het nootgetal zelf DO WHILE Pl%(i%) <= 127 AND i% < 128 READ Pk: IF Nc% + Pk > 127 THEN EXIT DO Pl%(i%) = Nc% + Pk: i% = i% + 1 LOOP RESTORE: i% = Nc% DO WHILE Pl%(i%) >= 0 AND i% >= 0 READ Pk: IF Nc% - Pk < 0 THEN EXIT DO Pl%(i%) = Nc% - Pk: i% = i% - 1: IF i% < 0 THEN EXIT DO LOOP 'elimineer alle nullen : j = 0 FOR i% = 0 TO 127 IF Pl%(i%) > 0 THEN Pl%(j) = Pl%(i%): j = j + 1 NEXT i% FOR i% = j TO 127: Pl%(i%) = 0: NEXT i% NtNr = j - 1 RETURN CHORD: C = 0: Cis = 0: D = 0: Dis = 0: E = 0: F = 0: Fis = 0: G = 0: Gis = 0: A = 0: Bes = 0: B = 0 FOR i% = 1 TO 5 IF Ch%(t%, i%) = 0 THEN GOTO STP2: IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 6 THEN C = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 5 THEN Cis = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 4 THEN D = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 3 THEN Dis = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 2 THEN E = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) - 1 THEN F = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) THEN Fis = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) + 1 THEN G = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) + 2 THEN Gis = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) + 3 THEN A = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) + 4 THEN Bes = -1 IF Ch%(t%, i%) MOD 12 = (Mcn% MOD 12) + 5 THEN B = -1 STP2: NEXT i% RETURN TESFIL: ' filter voor de speelbaarheid van de berekende noten door de ' gegeven instrumenten IF i% > 5 THEN RETURN IF t% > NotTot% THEN RETURN IF (N%(t%, i%) < Tes%(i%, 1)) OR (N%(t%, i%) > Tes%(i%, 2)) THEN N%(t%, i%) = -1 IF N%(t%, 5) > N%(t%, 4) THEN SWAP N%(t%, 5), N%(t%, 4) RETURN SVEARR: ' save array as binary file to disk - for use in expert-system mode XP$ = "primes.xpt" XPL$ = "primes.lop" OPEN XP$ FOR OUTPUT AS #1 OPEN XPL$ FOR INPUT AS #2 IF NOT EOF(2) THEN INPUT #2, A: ' vorig notentotaal IF NOT EOF(2) THEN INPUT #2, LOP: ' aantal maal dat de expert loop werd doorlopen CLOSE #2 OPEN XPL$ FOR OUTPUT AS #2 PRINT #2, NotTot%; LOP + 1 CLOSE #2 FOR t% = 0 TO NotTot%: FOR i% = 0 TO 5 PRINT #1, N%(t%, i%); NEXT i%: NEXT t% PRINT #1, CLOSE #1 RETURN 'priemgetallen van 0 tot 127: (34 stuks) DATA 0,1,2,3,5,7,11,13,17,19,23 DATA 29,31,37,41,43,47,53,57,59,61,67,71,73,79 DATA 83,89,97,101,103,107,109,113,127 REM $STATIC DEFSNG A-W ' SUB AllNotesOff SHARED Drum%, Snare%, Mikan%, Perc% Uit 144 + Drum%: Uit Snare%: Uit 0 FOR i% = Lpptes% TO Hpptes% Uit 144 + Mikan%: Uit i%: Uit 0 NEXT i% FOR i% = 0 TO 127 Uit 144 + Perc%: Uit i%: Uit 0 NEXT i% END SUB DEFINT A-Z SUB FB01 DIM voice(8): DIM bank(8): DIM volume(8): DIM pan(8): DIM nme(8): DIM lfo(8) FBMENU: CLS LOCATE 10, 10: PRINT " FB01-Menu : " LOCATE 12, 10: PRINT " 1.- Flute-Oboe-Bass-Piano (Cheops)" LOCATE 13, 10: PRINT " 2.- Piano Only - Midi Channels 1-5 " LOCATE 14, 10: PRINT " 3.- Manual settings on FB01 " LOCATE 16, 10: INPUT " Choice ? "; KF IF KF = 1 THEN Fb$ = "CHEOPS" IF KF = 2 THEN Fb$ = "PIANO" IF KF = 3 THEN GOTO FBOK IF KF > 3 OR KF < 1 THEN GOTO FBMENU 'memory protect OFF parameter = &H21 gegevens = 0 GOSUB sx3 'config nr. parameter = &H22 IF Fb$ = "CHEOPS" THEN gegevens = 11 ELSE gegevens = 12 GOSUB sx3 ' titel op display nme(0) = ASC("P"): nme(1) = ASC("r"): nme(2) = ASC("i%"): nme(3) = ASC("m") nme(4) = ASC("e"): nme(5) = ASC("s"): nme(6) = ASC(" "): nme(7) = ASC(" ") FOR parameter = 0 TO 7 gegevens = nme(parameter) GOSUB sx3 NEXT parameter 'sturing via sysex1 - voices fb01 voice(1) = 15: bank(1) = 0: volume(1) = 127: 'flute pan(1) = 0: lfo(1) = 0 voice(2) = 17: bank(2) = 0: volume(2) = 112: 'oboe - voice 39 bank 4 ook mogelijk pan(2) = 127: lfo(2) = 0 voice(3) = 24: bank(3) = 4: volume(3) = 118: 'cello1 pan(3) = 64: lfo(3) = 0 voice(4) = 5: bank(4) = 0: volume(4) = 120: 'piano voice(5) = 5: bank(5) = 0: volume(5) = 127: 'piano pan(4) = 64: pan(5) = 64: lfo(4) = 0: lfo(5) = 0 voice(6) = 47: bank(6) = 5: volume(6) = 127: ' snaredrum pan(6) = 127 IF Fb$ = "PIANO" THEN FOR i% = 1 TO 5 bank(i%) = 0: volume(i%) = 127: voice(i%) = 5: lfo(i%) = 0 NEXT i% pan(1) = 0: pan(2) = 0: pan(3) = 0: pan(4) = 127: pan(5) = 127 END IF FOR i% = 1 TO 6 parameter = &H4 gegevens = bank(i%) GOSUB sx1 parameter = &H5 gegevens = voice(i%) GOSUB sx1 parameter = &H0: ' number of notes gegevens = 1 GOSUB sx1 parameter = &H9: 'panning gegevens = pan(i%) GOSUB sx1 parameter = &HA: 'lfo gegevens = lfo(i%) GOSUB sx1 parameter = &H8 gegevens = volume(i%) GOSUB sx1 NEXT i% GOTO FBOK: ' einde FB01 installatieprogramma********************************* sx1: Uit (&HF0): Uit (&H43): Uit (15 + i%): ' i% begint vanaf 1 ! Uit (&H15): ' parameter group Uit (parameter): Uit (gegevens): Uit (&HF7) RETURN sx3: Uit (&HF0): Uit (&H43): Uit (&H75): Uit (0) Uit (&H10): Uit (parameter): Uit (gegevens): Uit (&HF7) RETURN FBOK: END SUB DEFSNG X-Z SUB INSTRUMENTATIE (Tes%(), Nc(), Hcn, Lcn, Mcn%) STATIC 'berekening van de muzikale mogelijkheden en grenzen van het ensemble STRUM: DO IF Bevel$ = "PP" THEN i% = 1: EXIT DO CLS 'TES%(x,y)= tessituur van instrument x ( vier instrumenten) ' instrument 4= piano , of polyfoon-instrument ' y=1 is de laagste noot ' y=2 is de hoogste noot LOCATE 10, 10: PRINT " Ensemble-menu " LOCATE 11, 10: PRINT " 1.- CHEOPS [***] " LOCATE 12, 10: PRINT " 2.- te bepalen " LOCATE 13, 10: INPUT " Keuze-cijfer "; i% LOOP UNTIL (i% > 0) AND (i% < 3) CLS IF i% = 2 THEN GOTO VARENS IF i% = 1 THEN OPEN "CHEOPS.DTA" FOR INPUT AS #1 FOR i% = 1 TO 4: INPUT #1, Tes%(i%, 1): NEXT i% FOR i% = 1 TO 4: INPUT #1, Tes%(i%, 2): NEXT i% CLOSE #1 GOTO REKCEN END IF VARENS: FOR i% = 1 TO 4 LOCATE 10, 10: PRINT "Lowest note of instrument "; i%; " ? "; : INPUT Tes%(i%, 1) Tes%(i%, 1) = Tes%(i%, 1) MOD 128 GOSUB BLANK NEXT i% FOR i% = 1 TO 4 LOCATE 10, 10: PRINT "Highest note of instrument "; i%; " ? "; : INPUT Tes%(i%, 2) Tes%(i%, 2) = Tes%(i%, 2) MOD 128 GOSUB BLANK NEXT i% LOCATE 10, 10: PRINT " Want to save ensemble-data ? (Y/N)": INPUT k$ IF k$ = "Y" OR k$ = "y" THEN LOCATE 11, 10: INPUT " filename ? ", F$ OPEN F$ FOR OUTPUT AS #1 FOR i% = 1 TO 4: PRINT #1, Tes%(i%, 1): NEXT i% FOR i% = 1 TO 4: PRINT #1, Tes%(i%, 2): NEXT i% CLOSE #1 CLS END IF GOSUB BLANK REKCEN: 'bereken de centrale noot voor ieder instrument afzonderlijk FOR i% = 1 TO 4 Nc(i%) = ((Tes%(i%, 2) - Tes%(i%, 1)) \ 2) + Tes%(i%, 1) NEXT i% 'bereken de midden-tessituurnoot voor het hele ensemble Nc(0) = 0 FOR i% = 1 TO 4 Nc(0) = Nc(0) + Nc(i%) NEXT i% Nc(0) = Nc(0) \ 4 'ga na of deze mid-tessituurnoot door alle instrumenten kan gespeeld worden A = 0 FOR i% = 1 TO 4 IF Nc(0) >= Tes%(i%, 1) AND Nc(0) <= Tes%(i%, 2) THEN A = A + 1 NEXT i% IF A > 1 THEN GOTO GEMTES ELSE PRINT "Geen overlappende tessituur in dit ensemble !" PRINT " Andere tessituren kiezen ? (1) " PRINT " Ensemble niettemin behouden ? (2) " PRINT " Programma verlaten ? (3) " LOCATE 18, 10: INPUT " KEUZE ", k$ IF k$ = "2" THEN Lcn% = 0: Mcn% = 0: Hcn% = 0 GOTO STRUMEND: END IF IF k$ = "1" THEN CLS : GOTO STRUM IF k$ = "3" THEN END RETURN END IF GEMTES: 'bepaal de laagste en de hoogste gemeenschappelijke noot van het ensemble N = 0 TSTNN: N = N + 1 IF N >= Tes%(1, 1) AND N >= Tes%(2, 1) AND N >= Tes%(3, 1) AND N >= Tes%(4, 1) AND N <= Tes%(1, 2) AND N <= Tes%(2, 2) AND N <= Tes%(3, 2) AND N <= Tes%(4, 2) THEN Lcn% = N ELSE GOTO TSTNN N = 127 TSTNM: N = N - 1 IF N <= Tes%(1, 2) AND N <= Tes%(2, 2) AND N <= Tes%(3, 2) AND N <= Tes%(4, 2) AND N >= Tes%(1, 1) AND N >= Tes%(2, 1) AND N >= Tes%(3, 1) AND N >= Tes%(4, 1) THEN Hcn% = N ELSE GOTO TSTNM LOCATE 12, 10: PRINT "Lowest Common note ="; Lcn LOCATE 13, 10: PRINT "Highest Common note="; Hcn Mcn% = ((Hcn% - Lcn) \ 2) + Lcn LOCATE 14, 10: PRINT "Medium common note= "; Mcn% LOCATE 15, 10: PRINT "Centernote of ensemble range="; Nc(0) GOTO STRUMEND: BLANK: LOCATE 10, 1: PRINT SPACE$(79); : RETURN STRUMEND: IF Bevel$ = "PP" THEN LOCATE 17, 10: PRINT " Calculating a score for 'Primes'. Please wait ... " EXIT SUB END IF LOCATE 17, 10: PRINT " Waiting for any key to continue ... " k$ = INKEY$: IF k$ = "" THEN GOTO STRUMEND LOCATE 17, 10: PRINT " Calculating a score for 'Primes'. Please wait ... " END SUB DEFSNG A-W SUB Miplay DO CLS IF Bevel$ = "PP" THEN k$ = "4": EXIT DO LOCATE 10, 10: PRINT "Playback instrument or synthesizer choice:"; LOCATE 11, 20: PRINT "1.- FB01 "; LOCATE 12, 20: PRINT "2.- Proteus 3 "; LOCATE 13, 20: PRINT "3.- Player-Piano solo "; LOCATE 14, 20: PRINT "4.- Player-piano & Proteus3 percussion [***]"; LOCATE 15, 40: INPUT "Choice nr? "; k$ LOOP UNTIL (k$ >= "1") AND (k$ <= "4") SELECT CASE VAL(k$) CASE 1 FB01 Fb% = 1 Emu% = 0 PlPi% = 0 CASE 2 Fb% = 0 Emu% = 1 PlPi% = 0 ' instrumentatie proteus: Uit (&HC0): Uit (15): ' pan flute Uit (&HC1): Uit (35): ' shakuhachi Uit (&HC2): Uit (56): ' pizz bas Uit (&HC3): Uit (26): ' Oud Uit (&HC4): Uit (43): ' shamisen Uit (&HC5): Uit (89): ' shakers CASE 3 Fb% = 0 Emu% = 0 PlPi% = 1 ' player piano: channel Mikan% Playpian EXIT SUB CASE 4 Fb% = 0 Emu% = 0 PlPi% = 1 Playpian EXIT SUB END SELECT ' speelroutine voor synthesizers: RitMod = -1 LOCATE 16, 10: INPUT "Tempo ? (3-6) ", mm% LOCATE 18, 10: PRINT "Klaar om te starten ? (Y/N)"; DO: k$ = INKEY$: LOOP UNTIL UCASE$(k$) = "Y" DIM Vn%(5) FOR t% = 0 TO NotTot% 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! Uit (181): Uit (&H7B): Uit (0): ' all notes off on channnel 5 Uit (149): Uit (Mcn%): Uit (64 + NulTot% * 6): ' note on channel 5 (144+5) END IF FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN Uit (175 + i%): Uit (&H7B): Uit (0) Uit (143 + i%): Uit (N%(t%, i%)): Uit (90 + SamTot% * 4) Vn%(i%) = N%(t%, i%) ELSE IF N%(t%, i%) = -1 THEN Uit (127 + i%): Uit (Vn%(i%)): Uit (0) END IF END IF NEXT i% IF SamTot% = 5 THEN RitMod = RitMod + 1: RitMod = RitMod MOD 4 SELECT CASE RitMod CASE 0, 2 Maat% = mm% CASE 1 Maat% = (mm% * 2) \ 3 CASE 3 Maat% = (mm% * 3) \ 2 END SELECT SOUND 20000, Maat% NEXT t% 'einde SOUND 20000, 70 'alles uit FOR i% = 1 TO 5 Uit (127 + i%): Uit (N%(NotTot%, i%)): Uit (0) NEXT i% ERASE Vn% END SUB SUB NOOTNAAM (Nm$()) ' subprogramma NOOTNAAM - maakt een array met nootnamen ' conversie van midi-getallen in nootstrings van de vorm F#5 FOR i% = 0 TO 127 IF i% MOD 12 = 0 OR i% MOD 12 = 1 THEN Nm$(i%) = "C" IF i% MOD 12 = 2 THEN Nm$(i%) = "D" IF i% MOD 12 = 3 OR i% MOD 12 = 4 THEN Nm$(i%) = "E" IF i% MOD 12 = 5 OR i% MOD 12 = 6 THEN Nm$(i%) = "F" IF i% MOD 12 = 7 OR i% MOD 12 = 8 THEN Nm$(i%) = "G" IF i% MOD 12 = 9 THEN Nm$(i%) = "A" IF i% MOD 12 = 10 OR i% MOD 12 = 11 THEN Nm$(i%) = "B" NEXT i% FOR i% = 0 TO 127 TWEE: IF i% MOD 12 = 3 OR i% MOD 12 = 10 THEN Nm$(i%) = Nm$(i%) + "b" ELSE IF i% MOD 12 = 1 OR i% MOD 12 = 6 OR i% MOD 12 = 8 THEN Nm$(i%) = Nm$(i%) + "#" ELSE Nm$(i%) = Nm$(i%) + "_" END IF END IF NEXT i% FOR i% = 0 TO 127 Nm$(i%) = Nm$(i%) + CHR$(48 + (i% \ 12)) NEXT i% END SUB SUB Playpian ' speelroutine voor Player-Piano: CLS LOCATE 2, 10: PRINT "Dr.Godfried-Willem RAES - "; LOCATE 3, 10: PRINT "*****************************************************"; RitMod = -1 IF Bevel$ = "PP" THEN ' default parameters: Mikan% = 0 Drum% = 1 Perc% = 2 mm% = 3 Maat% = mm% mF% = 24 ELSE LOCATE 5, 5: PRINT "INITIALISATION PARAMETER MENU:"; LOCATE 10, 10: INPUT "Midi Channel to use for player piano? (0-15)[0]"; Mikan% IF Mikan% > 15 THEN Mikan% = 15 IF Mikan% < 0 THEN Mikan% = 0 LOCATE 11, 10: INPUT "Midi Channel to use for proteus percussion [Pr3=2]"; Perc% LOCATE 12, 10: INPUT "Midi Channel to use for snare drum? (0-15)[Pr3=1]"; Drum% IF Drum% < 0 THEN Drum% = 0 IF Drum% > 15 THEN Drum% = 15 IF Drum% = Mikan% THEN Drum% = (Mikan% + 1) AND 15 LOCATE 13, 10: INPUT "Tempo ? (3-6) [3] ", mm% IF mm% < 1 THEN mm% = 3 IF mm% > 9 THEN mm% = 9 Maat% = mm% LOCATE 14, 10: INPUT "minimum aanslagwaarde? (8-90) [24]"; mF% IF mF% > 90 THEN mF% = 90 IF mF% < 1 THEN mF% = 1 END IF LOCATE 15, 10 PRINT "Interactivity keys: + - x / for tempo"; LOCATE 16, 10 PRINT " < > for dynamics"; LOCATE 18, 10: PRINT "Klaar om te starten ? (Y/N)"; DO: k$ = INKEY$: LOOP UNTIL UCASE$(k$) = "Y" LOCATE 20, 25: PRINT "Teller="; LOCATE 18, 10: PRINT "Performing for Player-Piano..."; Begintijd! = TIMER '********************set proteus 3 to snaredrum sounds: Uit 192 + Perc%: Uit 58: ' preset 58 - pitching perc. Uit 192 + Drum%: Uit 18: ' preset 18 - noot 57 ' of: preset 8, noot 38 Snare% = 57: ' otherwize use Mcn% '******************************************************* DIM Toets%(Lpptes% TO Hpptes%): ' for future improvement DIM Vn%(0 TO 5) FOR t% = 0 TO NotTot% 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! Uit 144 + Drum%: Uit Snare%: Uit 0 Uit 144 + Drum%: Uit Snare%: Uit 64 + (NulTot% * 6) END IF ' partituurspeellus: FOR i% = 1 TO 5 IF N%(t%, i%) > 0 THEN IF Vn%(i%) > 0 THEN IF Toets%(Vn%(i%)) THEN Uit 144 + Mikan%: Uit Vn%(i%): Uit 0 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 Uit 144 + Perc%: Uit N%(t%, i%): Uit Aanslag% IF Aanslag% < 8 THEN Aanslag% = 8 IF Toets%(N%(t%, i%)) = 0 THEN Uit 144 + Mikan%: Uit N%(t%, i%): Uit 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 Uit 144 + Perc%: Uit Vn%(i%): Uit 0 ' notes-off for player-piano: IF Toets%(Vn%(i%)) THEN Uit 144 + Mikan%: Uit Vn%(i%): Uit 0 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 SOUND 20000, Maat% SELECT CASE INKEY$ CASE "" LOCATE 20, 35: PRINT t%; CASE "<" mF% = mF% + 1: IF mF% > 90 THEN mF% = 90 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE ">" mF% = mF% - 1: IF mF% < 1 THEN mF% = 1 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE "+" Maat% = Maat% - 1: IF Maat% < 1 THEN Maat% = 1 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE "-" Maat% = Maat% + 1: IF Maat% > 18 THEN Maat% = 18 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE "X", "x" Maat% = Maat% / 2: IF Maat% < 1 THEN Maat% = 1 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE "/" Maat% = Maat% * 2: IF Maat% > 18 THEN Maat% = 18 LOCATE 24, 20: PRINT "Dyna="; mF%; " Pulsduur= "; Maat%; " "; CASE " " SLEEP 1 CASE "*" AllNotesOff END END SELECT NEXT t% 'einde SLEEP 4 'alles uit AllNotesOff ERASE Vn% Sekonden% = TIMER - Begintijd! Minuten% = Sekonden% \ 60 Sekonden% = Sekonden% MOD 60 LOCATE 25, 20: PRINT "Duration of this performance="; Minuten%; "'"; Sekonden%; "s"; SLEEP 5 END SUB DEFINT A-W SUB PRIEM (p%, Range%) 'real-time priemgenerator q% = p% ZOEKPRIEM: p% = RND(1) * Range% IF p% = 0 THEN GOTO ZOEKPRIEMEND N = 0 FOR i% = 2 TO p% - 1 IF p% MOD i% = 0 THEN N = N + 1 NEXT i% IF N > 0 THEN GOTO ZOEKPRIEM IF p% = ABS(q%) THEN GOTO ZOEKPRIEM IF RND(1) * 2 > 1 THEN s = 1 ELSE s = -1 p% = p% * s ZOEKPRIEMEND: END SUB SUB RITME (Rt%(), NotTot%) DIM R(5): DIM RNS(5) '1= fluit - rootritmegetal =3 '2= hobo - rootritmegetal =5 '3= kontrabas - rootritmegetal =11 '4= piano rechts - rootritmegetal =7 '5= piano links - rootritmegetal =2 R(1) = 3: R(2) = 5: R(3) = 11: R(4) = 7: R(5) = 2 NotTot% = R(1) * R(2) * R(3) * R(4) * R(5) FOR i% = 1 TO 5 IF RND(1) * 10 > 6 THEN Rt(i%) = R(i%) ELSE Rt(i%) = 1 NEXT i% Gp = Rt%(1) * Rt%(2) * Rt%(3) * Rt%(4) * Rt%(5): ' goedel-product DO UNTIL Gp = NotTot j = 0 FOR i% = 1 TO 5 IF Gp MOD R(i%) THEN j = j + 1: RNS(j) = R(i%) NEXT i% ' in RNS(J) staan nu J niet gebruikte root-priemgetallen voor ritme j = 1 FOR i% = 5 TO 1 STEP -1 IF Rt%(i%) = 1 THEN IF RND(1) * 10 > 5 THEN Rt%(i%) = RNS(j): j = j + 1 END IF NEXT i% Gp = Rt%(1) * Rt%(2) * Rt%(3) * Rt%(4) * Rt%(5) LOOP END SUB DEFSNG A-W SUB Uit (byte%) SELECT CASE Dp% CASE &H330 ' MPU401 of Musicquest interface WHILE INP(&H331) < 128: dummy% = INP(&H330): WEND WAIT &H331, 64, 64: OUT &H330, byte% CASE &H2FA DO: LOOP UNTIL INP(&H2FB) AND 64: OUT &H2FA, byte% ' interne midi-poort T1000 CASE ELSE OUT Dp%, byte%: OUT Dp% + 2, 0: ZZ# = ZZ# ^ ZZ#: OUT Dp% + 2, 1 ' volgende instruktie stamt wellicht nog van een ouder Versie 1 interface!!! ' ze loopt in elk geval niet met interface V2.0 ' WHILE INP(DP% + 1) AND 32: WEND WHILE INP(Dp% + 1) AND 128: WEND END SELECT END SUB