<Terug naar inhoudstafel kursus>
1090:
Toepassingsvoorbeeld 1
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