<Terug naar inhoudstafel kursus>


1090:

Toepassingsvoorbeeld 1

Ontwikkeling van een programma voor de realisatie van de ringmodulator- partij bij 'Trajet' van Luc Brewaeys.

Probeemanalyse :

In de partituur zijn voor de sinustonen die naar de ringmodulator worden gevoerd slechts 5 toonhoogten voorgeschreven. De uiterste noten kunnen evenwel niet op een klavier worden gespeeld. Hier ligt het dus voor de hand een komputer in te zetten, en de komputertoetsen te programmeren voor de gevraagde noten.

Het programma, geschreven in Microsoft Quick-Basic V4.5, ziet eruit alsvolgt:

'Trajet.bas last update 20/04/1989

'----------------------------------

'programma voor de sturingssignalen van de ringmodulator

'beide kanalen van de FB01 geven hetzelfde sinus-signaal

CLS

DEFINT A - Z

LOCATE 25, 1

PRINT "Godfried-Willem RAES-Experimental Music-Software-1989"

LOCATE 1, 10

PRINT "Programma voor Toshiba T1000 & Logos Midi-poort op &H378"

LOCATE 2, 10

PRINT " ' T R A J E T '"

LOCATE 3, 10

PRINT " komponist: Luc BREWAEYS "

LOCATE 4, 5

FOR I = 0 TO 74: PRINT CHR$(219); : NEXT I

DP = &H378: CP = DP + 1: SP = DP + 2: SH = INP(SP)

'T1000-printerpoort adressen waarop het Midi-interface zit

LOCATE 6, 10

PRINT "TOETS-KODERING :"

LOCATE 7, 10

PRINT "Sol#=1 Mi=2 Re=3 La=4 Mib=5 +=Luider -=Stiller "

LOCATE 8, 1

FOR I = 0 TO 79: PRINT CHR$(205); : NEXT I

LOCATE 10, 10

INPUT "Set output-level sine-waves (1-127) ?", VOLUME

VOLUME = VOLUME MOD 128

IF VOLUME < 1 THEN VOLUME = 64 GOSUB BLANK

BANK = 6: ' sine wave is in bank 6

VOICE = 47: ' sine-wave is voice 47 on FB01

LOCATE 10, 10

INPUT "Set Memory protect ON or OFF (0 or1)?", MEMPROT

MEMPROT = MEMPROT MOD 2

IF MEMPROT < 0 THEN MEMPROT = 0

GOSUB BLANK

LOCATE 10, 10

INPUT "Set Configuration to nr.0-16 ( 1 ! )?", CONFIG

CONFIG = CONFIG MOD 17

IF CONFIG < 1 THEN CONFIG = 1

GOSUB BLANK

 

PARAMETER = &H21: 'memory protect on/off switch

GEGEVENS = MEMPROT: GOSUB SYSEX3

PARAMETER = &H22: 'configuration number

GEGEVENS = CONFIG: GOSUB SYSEX3

'send Ascii-codes for Trajet to FB01 display

PARAMETER = 0: GEGEVENS = 84: GOSUB SYSEX3

PARAMETER = 1: GEGEVENS = 114: GOSUB SYSEX3

PARAMETER = 2: GEGEVENS = 97: GOSUB SYSEX3

PARAMETER = 3: GEGEVENS = 106: GOSUB SYSEX3

PARAMETER = 4: GEGEVENS = 101: GOSUB SYSEX3

PARAMETER = 5: GEGEVENS = 116: GOSUB SYSEX3

PARAMETER = 6: GEGEVENS = 32: GOSUB SYSEX3

PARAMETER = 7: GEGEVENS = 32: GOSUB SYSEX3

FOR I = 0 TO 1

PARAMETER = &H4: ' VOICE-BANK

GEGEVENS = BANK: GOSUB SYSEX

NEXT I

FOR I = 0 TO 1

PARAMETER = &H5: ' Instrument nummer

GEGEVENS = VOICE: GOSUB SYSEX

NEXT I

FOR I = 0 TO 1

PARAMETER = 0: 'number of notes

GEGEVENS = 1: GOSUB SYSEX

NEXT I

FOR I = 0 TO 1

PARAMETER = &HA: 'LFO disable

GEGEVENS = 0: GOSUB SYSEX

NEXT I

 

PARAMETER = &H9: 'panning

GEGEVENS = 0: I = 0: GOSUB SYSEX

GEGEVENS = 127: I = 1: GOSUB SYSEX

GOSUB MIDIINIT

 

'********* START SPEEL-ROUTINE **********************************

LOCATE 19, 5

FOR I = 0 TO 74: PRINT CHR$(219); : NEXT I

LOCATE 20, 5

PRINT "cijfertoetsen 1-5 zijn de verschillende voorgeschreven noten"

LOCATE 21, 5

PRINT "de spatiebalk schakelt de noot terug uit. "

 

TSTKEY:

I = 0

K$ = INKEY$

IF K$ = "1" THEN NOTE = 20: N$ = "Sol#": GOSUB SPEEL

IF K$ = "2" THEN NOTE = 40: N$ = "Mi ": GOSUB SPEEL

IF K$ = "3" THEN NOTE = 62: N$ = "Re ": GOSUB SPEEL

IF K$ = "4" THEN NOTE = 81: N$ = "La ": GOSUB SPEEL

IF K$ = "5" THEN NOTE = 99: N$ = "Mib ": GOSUB SPEEL

IF K$ = "6" THEN NOTE = 32: N$ = "Sol#": GOSUB SPEEL

IF K$ = "7" THEN NOTE = 52: N$ = "Mi ": GOSUB SPEEL

IF K$ = "8" THEN NOTE = 74: N$ = "Re ": GOSUB SPEEL

IF K$ = "9" THEN NOTE = 69: N$ = "La ": GOSUB SPEEL

IF K$ = "0" THEN NOTE = 87: N$ = "Mib ": GOSUB SPEEL

IF K$ = "+" THEN

VOLUME = VOLUME + 3

VOLUME = VOLUME MOD 128

GOSUB MIDIINIT

LOCATE 15, 10: PRINT " Volume = "; VOLUME

END IF

IF K$ = "-" THEN

VOLUME = VOLUME - 3

IF VOLUME < 0 THEN VOLUME = 0

GOSUB MIDIINIT

LOCATE 15, 10: PRINT " Volume = "; VOLUME

END IF

IF K$ = "*" THEN GOSUB EINDE

IF K$ = " " THEN

GOSUB ALLOFF

LOCATE 13, 10: PRINT " noot uitgeschakeld"

END IF

K$ = ""

IF K$ = "" THEN GOTO TSTKEY

 

SPEEL:

LOCATE 12, 10: PRINT " Midi-note number :"; NOTE; " = "; N$; " Toets : "; K$

LOCATE 13, 10: PRINT " "

GOSUB NOTEON:

RETURN

'einde van de eigenlijke partituurvertolkingsroutine

'----------------------------------------------------------------

EINDE:

GOSUB ALLOFF

GOSUB BLANK

LOCATE 23, 10: PRINT " E I N D E "

END

'****************************************************************

'MIDI -stuurroutines

NOTEON:

B = 144: GOSUB SND

B = NOTE: GOSUB SND

B = 127: GOSUB SND

B = 145: GOSUB SND

B = NOTE: GOSUB SND

B = 127: GOSUB SND

RETURN

 

ALLOFF:

B = 176: GOSUB SND

B = &H7B: GOSUB SND

B = 0: GOSUB SND

B = 177: GOSUB SND

B = &H7B: GOSUB SND

B = 0: GOSUB SND

RETURN

 

'routine voor system-exclusives on FB01

SYSEX: 'parameter change by midi-channel table 1+

FOR I = 0 TO 1

B = &HF0: GOSUB SND

B = &H43: GOSUB SND

B = 16 + I: GOSUB SND

B = &H15: GOSUB SND

B = PARAMETER: GOSUB SND

B = GEGEVENS: GOSUB SND

B = &HF7

NEXT I

RETURN

 

SYSEX3:

'parameter change by midi-channel table 3 -System Functions

B = &HF0: GOSUB SND

B = &H43: GOSUB SND

B = &H75: GOSUB SND

B = 0: GOSUB SND: 'system channel 0

B = &H10: GOSUB SND

B = PARAMETER: GOSUB SND

B = GEGEVENS: GOSUB SND

B = &HF7: GOSUB SND

RETURN

 

MIDIINIT:

'set volume to menu-waarde

FOR K = 0 TO 1

B = 176 + K: GOSUB SND

B = &H7: GOSUB SND

B = VOLUME: GOSUB SND

NEXT K

RETURN

'einde midi initialisatieroutine --------------------------------

 

SND:

'op Atari zou deze subroutine worden : OUT 3,B en niets meer !

OUT DP, B: OUT SP, (SH OR 1): Z$ = "_": OUT SP, SH

CHKBUSY:

IF INP(CP) AND 128 THEN RETURN ELSE GOTO CHKBUSY

 

BLANK:

LOCATE 10, 10: FOR I = 0 TO 69: PRINT " ";NEXT I

RETURN


P.S.: Dit programma werd geschreven op 20.04.1989, en nooit verder aangepast aan modernere versies van QB of QBX, laat staat aan de PowerBasic compiler. Ook moet ermee rekening gehouden te worden dat het diende te lopen op een T1000, dus eigenlijk een hele trage XT machine (8088 processor geklokt op 4.7MHz zonder ko-processor) die niet voorzien is van uitbreidingsslots en dus niet kan gebruikt worden in kombinatie met een MPU401 interface.

De reden waarom deze laptop werd gekozen was hierin gelegen dat deze machine absoluut geen geluid maakt: immers door de lichte voeding en het ontbreken van een harddisk, zitten er geen bewegende onderdelen zoals ventilatoren en motoren in. Ook vandaag zijn dergelijke komputers, zo goed als gratis verkrijgbaar, nog best bruikbaar in zulke toepassingen. In oktober 2005 hebben we de oude T1000 nog eens van onder het stog gehaald: de akku was uiteraard volledig stuk, maat mits een externe voeding deed ie het nog perfekt en ook het programma loopt nog steeds naar behoren, als zouden het vandaag wel anders aanpakken...


[Filedate: 20.04.1989]

Terug naar de inhoudstafel <Kursus Index>

Naar volgende programmavoorbeelden:

Luc Brewaeys, <Due Cose>

Alvin Lucier, <Crossing>

Homepage Dr.Godfried-Willem RAES