Dr.Godfried-Willem RAES

Kursus Experimentele Muziek: Boekdeel 1: Algoritmische Kompositie

Hogeschool Gent : School of Arts


<Terug naar inhoudstafel kursus>    <Basic>

1040

PROGRAMMEREN

Zelf leren programmeren: eerste praktijkvoorbeelden

1.Het Hardware platform

Hoewel voor deze eerste inleiding in principe kan gebruik gemaakt worden van eender welke hardware-konfiguratie en komputerfamilie waarvoor een Basic Interpreter en Compiler bestaat: (Zowel Atari-computers, Amigas (Commodore), MacIntosh (Apple), Power PC's als IBM-PC's en de vele klonen ervan zijn bruikbaar), kunnen we er vandaag niet langer onderuit te onderkennen dat eigenlijk alleen voor de PC's van het IBM-type met een windows operating system, professionele Basic software voorhanden is.

De keuze van deze hardware is beslist niet ingegeven vanuit overwegingen inzake kwaliteit van deze of gene machine, maar uitsluitend vanuit het oogpunt van beschikbaarheid en penetratiegraad in kringen van musici en komponisten. Een overigens erg tijdafhankelijk gegeven, want in Europa was tussen 1987 en 1992 de Atari1024ST, beslist de meest verspreidde muziekkomputer, terwijl dat in de US beslist de MacIntosh was; vandaag, 1997, is de IBM beslist ook op deze scene het meest in gebruik, terwijl de Atari opvolger -de Falcon- nooit veel sukses heeft gekend). In de USA blijft de Mac alsnog relatief wijdverbreid, hoewel ook daar de Wintel-PC aan een snelle opmars bezig lijkt te zijn. Het Windows platform neemt thans 95% van de wereldmarkt op het gebied van de operating systems in personal computers in beslag.

Bovendien zijn de besturingssystemen (Desktop en GEM bij Atari, DOS en Windows of zeker Windows op PC's, enz...) van deze konfiguraties uitermate intuitief, wat ons toelaat quasi onmiddellijk met die machines aan de slag te gaan, zonder eerst grondig het besturingssysteem te moeten leren.

Verder in de kursus zal dan ook nagenoeg uitsluitend naar machines behorende tot de zgn. IBM-familie worden verwezen. Hoofdstukken en paragrafen over de ATARI stammen nog uit vroegere jaren. Wel zullen we -naar het eind van hoofdstuk 2 (live elektronika) Basic in talloze verschillende varianten opnieuw ontmoeten, waar we het zullen hebben over de mogelijkheden en toepasssingen van microcontrollers.

Zowat elke moderne (PC) komputerkonfiguratie in bezit van een iet of wat muzikant omvat volgende bestanddelen:

Op CD-ROM of op de harde schijf, of soms ook nog wel op de stilaan antiquarische floppies of ZIP-drives, vinden we software, waaronder een Basic interpreter en/of compiler. Tegenwoordig zijn vergelijkbare komputerbasics beschikbaar voor diverse komputerfamilies.

Zo is er van GFA-Basic zowel de originele Atari versie, als een IBM versie beschikbaar en is er van Microsoft Quickbasic zowel de originele IBM versie als een versie voor de MacIntosh. Visual Basic -minder geschikt voor het leren programmeren- is alleen voor het Intel-PC platform beschikbaar. Maar ook buiten de stal van Bill Gates valt er wat te rapen: Het Amerikaanse Power Basic werkt doorlopende aan uitstekende en erg professionele programmeeromgevingen voor Basic. De DOS compiler is aan versie 3.5 toe, terwijl er ook een 32-bit compiler werd uitegebracht voor het ontwikkelen van programmas onder het Windows 32bit operating system. Ook DLL compilers zijn beschikbaar.

Voor wie helemaal nieuw is in komputergebruik -wat eigenlijk niet meer mag kunnen, aangezien komputergebruik een van de komponenten is geworden van de zgn. eindtermen voor het lager en sekondair onderwijs- , worden eventueel een of maximaal twee praktische en inleidende lessen gewijd aan mondaine zaken zoals:

Hiermee moet iedereen heel goed vertrouwd zijn, wil hij niet struikelen bij eender welke verdere stap in de komputerwereld. De handboeken die bij een komputersysteem horen, moeten goed gelezen worden. Zij zullen niet in de kursus worden behandeld. Deze inleidende lessen zijn uitsluitend bedoeld om je bij de eerste start een duwtje in de rug te geven. De kursus experimentele muziek is beslist geen kursus komputergebruik en informatika, wat immers in het lager en sekundair onderwijs, of in de vrije uren en de studietijd thuishoort. 


BASIC

BASIC kan zich verheugen als komputertaal een der meest (zoniet de meest) verspreidde en ook de meest beschikbare te zijn op zowat alle bestaande machines. De naam van de taal heeft niets te maken met 'basis' maar is een afkorting (akroniem) voor:

Beginners

All-purpose

Symbolic

Instruction

Code

Zij ontstond aan het beroemde Dartmouth College bij Prof.Dr.John Kemeny (New Hampshire) in de vroege jaren zestig (1964) in een poging om een voor zoveel mogelijk mensen toegankelijke taal te ontwerpen om met komputers te leren omgaan. Was de B in Basic zeker voor lange tijd een handikap, dan geldt dit lang niet meer voor de hedendaagse sterk gestruktureerde, uitgewerkte en geoptimaliseerde versies van de taal. De taal heeft overigens een bijzonder ernstige vader, aangezien zij rechtstreeks werd afgeleid van Fortran (FORmula TRANslator), een van de eerste hogere programmeertalen voor zuiver wiskundig werk. Met Fortran heeft zij ook nu nog steeds heel wat gemeenschappelijk. Fortran kode is voor wie met Basic overweg kan relatief gemakkelijk te lezen.

Een van haar belangrijkste eigenschappen is dat zij vaak zowel als INTERPRETER dan als COMPILER op komputers kan lopen, hoewel echte interpreters de laatste jaren toch wel in het vergeetboek lijken te zijn beland.

Een INTERPRETER noemt men een komputertaal die alle opdrachten die erin zijn gesteld sequentieel in machinetaal omzet en onmiddellijk uitvoert. De vertaling naar machinetaal gebeurt elke keer men het programma laat lopen opnieuw. Om die reden heet een INTERPRETER dan ook traag en inefficient te zijn. Het grote voordeel ervan is evenwel dat men programmas interaktief kan ontwikkelen en op elk ogenblik de syntax en uitwerking van een bewering of een bevel in die taal kan testen en nagaan. Een COMPILER daareentegen, vertaalt een BRONCODE (Source-code: het programma zoals de auteur het schreef) vooraleer het te laten lopen , in zijn geheel in machinetaal. De gebruiker kan dan de in machinetaal vertaalde (gekompileerde) versie van het programma laten lopen.

Gold het INTERPRETEREND zijn van Basic vroeger als een van de belangrijkste bezwaren tegen de taal, dan valt dit argument vandaag zeker weg, aangezien alle moderne basics, efficient gekompileerde programmas kunnen genereren. (TurboBasic, Quick Basic Compiler (QB4.5), Basic PDF (QBX V7.1), GFA-Basic, True Basic, Visual Basic, HP-Basic, PowerBasic V3.5, Power Basic DLL compiler, Power Basic Console Compiler, Liberty Basic 1.4).

Gezien de enorm toegenomen snelheid van hedendaagse komputers is het onderscheid compiler/interpreter ook komen te vervagen: onder multitasking windows is het nu immers perfekt mogelijk om in een window een programma te ontwikkelen, terwijl we hetzelfde programma in een ander window compileren en runnen...


Hier volgen -bij wijze van kennismaking, en beslist niet ter vervanging van de essentiele handboeken en/of hulp CD-Roms, enkele van de belangrijkste Basic taalelementen en hun betekenis of uitwerking:


In werkelijk alle Basic dialekten identiek aanwezige elementen zijn aangeduid met @ in de middenkolom. Kommados met betrekking tot de schermopbouw gelden echter niet voor Visual Basic dat wat dat betreft sterk afwijkt van de standaardtaal, gedefinieerd onder DOS. Voor Liberty Basic gelden ze evenmin. Deze interpreter/compiler loopt uitsluitend onder Windows.

- opdrachten: (Commands)

Opdrachten voeren elk een bepaalde taak uit: iets afdrukken op het scherm, een bericht versturen via een poort, het uitvoeren van een programmasprong... Zij staan tegenover funkties, die in tegenstelling tot opdrachten, een waarde retoerneren in de vorm van een of andere variabele (zie verder).

- funkties: (Functions)

- variabelen en konstanten

In Basic bestaat een variabele vanzodra hij wordt gebruikt in een programma. Deklaratie is niet obligaat. Wanneer deklaratie mogelijk is, dan komt dit de leesbaarheid en het onderhoud van het programma zeer ten goede. Omwille daarvan zullen we van de studenten eisen dat ze hun variabelen volledig deklareren vooraan in het programma en, waar toepasselijk, op procedurenivo. Aangezien elke variabele een geheugenplaats blijft bezetten zolang het programma geladen is, dienen we zuinig te zijn met de introduktie van nieuwe variabelen. In de PowerBasic compiler evenals in Visual Basic kan bij de opties het deklareren van variabelen verplicht worden gesteld.

a. numerieke vb. A, NOOT, TEL, HGTRE, ... @

Wanneer geen verdere specifikatie wordt gegeven dan gaan bijna alle interpreters uit van single precision variabelen.

QBX kent Long integers (A&), terwijl GFA Basic evenals PowerBasic toelaat numerieke variabelen als Bytes (8-bits) te deklareren. Een integer in QB beslaat 2 bytes of 16 bits. Powerbasic kent de ruimste mogelijkheden met volgende types:

In Liberty Basic bestaan slechts twee data-types: strings en numbers. Getallen worden intern behandeld in funktie van hun gebruik in een programma. Variabelen kunnen hier niet worden gedeklareerd. Wel kunnen TYPES of STRUCTURES worden gemaakt, vooral dan voor het werken met Windows API en DLL's.

b. strings vb. A$ , NOOT$, TEL$, NAAM$... @

Opmerking : voor zowel numerieke als string- variabelen mag men eender welke naam bedenken. Aan de lengte van de naam zijn soms wel beperkingen gesteld. Ik beveel echter steeds - teneinde ellenlang typwerk te besparen het gebruik van korte maar toch iets zeggende namen aan. Let er echter op dat je nooit namen van variabelen laat beginnen met letterkombinaties die door de komputer ook als Basic instructies zouden kunnen worden begrepen. Slechte namen zijn dus bvb.:

Niet alle compilers zijn echter even intollerant wat dit betreft.

c. arrays (gedimensioneerde variabelen)

De declaratie van arrays verschilt nogal van het ene basic dialect tot het andere.

d. declaraties:

De meeste talen vereisen of laten toe vooraan in het programma de gebruikte variabelen en hun type te deklareren bij middel van instrukties zoals:

Ook hun gebruik en geldigheid/bereikbaarheid binnen het programma kan worden bepaald via instrukties zoals:

e. funkties en uitdrukkingen

a. rekenkundige:

Opmerking: Hogere machtswortels worden in komputertalen steeds uigedrukt onder gebruikmaking van fraktionele exponenten. Zo is de vierkantswortel uit een getal x te noteren als w = x^(1/2). Ingewikkelde berekeningen kunnen trouwens vaak worden uitgevoerd door gebruik te maken van logaritmen! (ondersteund door de komplementaire instrukties LOG en EXP).

b. logische:

Booleaanse vergelijkingen

c. konversies:

d. stringfunkties:

f. voorwaarden beslissingsregels en procedures

g.lussen

De hier gegeven lijst van Basic woorden zijn zo goed als algemeen gangbaar. Sommige verschillen berusten op intrinsieke verschillen in de hardware van de machine zelf. Zo hebben machines met een memory-mapped I/O gebied (68.. familie mikroprocessors zoals de Apple II, Epson HX20 , Vic20 evenmin als hun nazaten zoals de Amiga, Atari, Lisa, MacIntosh ...) uiteraard geen afzonderlijke INP en OUT instruktie, aangezien dit volkomen met PEEK en POKE kan gebeuren. Maar ook los van de hardware verschillen bestaan er in de Basic implementaties van eenzelfde machine en ook van machine tot machine steeds kleine verschillen, waardoor we zolang we een bepaalde machine, of zelfs een bepaalde versie van het Basic programma voor dezelfde machine, niet heel erg goed kennen, in het begin steeds genoodzaakt zijn te programmeren met het boek ('reference manual) aan onze zijde.

Ook syntax kan soms verschillen, en ook hiervoor gebruik je het onontbeerlijke handboek dat hoort bij het gebruikte programma. Kopieer dus nooit zomaar een interpreter/kompiler van iemand, wanneer je niet tevens de kans hebt ook de originele handleidingen en dokumentatie te fotokopieren. Sekundaire literatuur kan zelden of nooit het originele handboek vervangen!

Wanneer je voor een bepaalde machine kunt kiezen uit diverse Basic versies, kies er dan steeds een die ook volgende mogelijkheden geeft:

Dergelijke Basic versies worden echter helaas nooit gratis bij de machine geleverd. Dit is erg te betreuren, omdat dit de ontwikkeling van hoogkwalitatieve programmas in Basic wel in de weg staat. Voor Atari evenals voor de Amiga bestaat zulks onder de naam GFA-basic, voor MS-DOS machines evenals voor de MacIntosh, QuickBasic en PDF-Basic (QBX) (beide van Microsoft) of, voor IBM, Turbo-Basic (Borland) of PowerBasic (PB3.5). Het nieuwe Visual Basic (V6.0) kan ik voor gebruik in deze kursus voorlopig in elk geval niet aanraden, omdat het uitsluitend werkt onder Windows en enerzijds problemen geeft bij het aansturen van specifieke hardware komponenten van het komputersysteem terwijl het anderzijds voor muzikaal gebruik niet erg geschikt is omdat de tijdsinstrukties niet regelmatig genoeg lopen en omdat alles via een vizueel interface moet verlopen. Bij de ontwikkeling van Visual Basic heeft Microsoft de nadruk gelegd op een gemakkelijke en goede hantering van de schermopmaak. Ons oog is echter gauw tevreden: 20 plaatjes per sekonde en we menen reeds een vloeiende beweging.waar te nemen. Voor de klank zijn de snelheidseisen echter heel wat stringenter....

Wie toch in Basic wil programmeren onder Windows, raad ik het gebruik van de DLL compiler van PowerBasic aan. De software en de dokumentatie is voorhanden in de klas. Een nog heel wat eenvoudiger te hanteren alternatief is het shareware programma Liberty Basic, verkrijgbaar via internet en evenzeer voorhanden op de klaskomputers.


3. Enkele algemene 'eigenaardigheden' van Basic

Een programma opgesteld in Basic dient te worden gezien als een syntaktisch korrekt geschreven lijst opdrachten voor de machine, die in hun geschreven volgorde worden afgehandeld: steeds dus van boven naar onder en van links naar rechts, tenzij er natuurlijk sprong instrukties in de lijst zijn opgenomen. Het afhandelen van het programma neemt een bepaalde tijd in beslag, waardoor we alle beweringen gesteld in de taal, als tijdsafhankelijk moeten opvatten. Komputers zijn nu eenmaal sekwentiele machines. Gelijkheidstekens verkrijgen op die manier dan ook een andere betekenis dan die we gewoon zijn uit de (in het onderwijs ten onrechte als statisch opgevatte) wiskunde. Een bewering zoals:

X = X + 1

is vanuit klassiek wiskundige of logische optiek dan ook volslagen onzin. Wanneer we dit echter -en deze interpretatie staat veel dichter bij de werkelijke wereld, waarin alle zijn een zijn is in de tijd- lezen als:

X wordt X + 1

(tegenover het onzinnige X is X + 1 ), dan is de betekenis zonneklaar. Beweringen in Basic zijn dan ook op te vatten als een soort temporele logika (tijdsafhankelijke logika), waarbij de tijd niet mag worden omgekeerd. Uit X wordt X + 1 volgt immers geenszins de bewering dat X + 1 ook X wordt!

Omdat nogal wat traditionalistische wiskundigen en logici toch bezwaren bleven hebben tegen deze meer-dimensionele logika , werden er ook Basic-versies ontwikkeld, waarbij aan deze bezwaren tegemoet werd gekomen. Zo kan men in GFA-Basic bijvoorbeeld beschikken over instrukties zoals:

Maar, ook in GFA blijven de beweringen uit de rechterkolom, syntaktisch en funktioneel volkomen geldig.


4. Een voorbeeld...

Het volgende korte Basic programma zet decimale getallen om in hun binaire voorstelling. Probeer het te analyseren en te begrijpen. Zoek de juiste betekenis van elk statement op in je Basic handboek en pas eventuele kleine wijzigen toe in funktie van de specifieke syntax:

DIM B%(0 TO 7)
INPUT "Byte ? ",Bt%
FOR e% = 7 TO 0 STEP -1
IF Bt% AND 2 ^ e% THEN B%(e%) = 1
PRINT B%(e%);
NEXT e%
PRINT

wanneer we er volgende regel aan toevoegen, geeft het ons bovendien ook nog de hexadecimale voorstelling van het getal:

PRINT HEX$(Bt%)

Zoals het programma er nu uitziet, is het niet 'beveiligd' tegen 'domme' en of foutieve invoer van gegevens. Daarvoor zouden we bvb. volgende regel kunnen invoegen na de INPUT instruktie:

IF Bt% \ 256 >< 0 THEN PRINT " Waarde groter dan 1 byte !"
Bt% = Bt% MOD 256

Een dergelijke voorziening noemt men een filter. Programmas waarin geen filters worden gebruikt zijn voor andere gebruikers dan de auteur meestal volstrekt onbruikbaar en doen in hun handen alleen maar de machine om de haverklap 'hangen'...


5.Introduktie in QBX programmeren voor IBM-PC-achtige machines.

Klaskonfiguratie(s): [20.04.1997]

[sedert het akademiejaar 1998-1999 wordt QBX niet meer gebruikt in onze kursus. Het werd vervangen door Power Basic, maar de hier volgende paragrafen werden aan de veranderingen nog niet aangepast].

Operating system : DOS V7 / Windows 95

Hardware: Pentium IBM-AT kloon - 160MHz

16 MByte memory

VGA-videokaart en kleurscherm

500Mbyte Harddisk , 12 ms access-time

QBX basic staat op de harde schijf onder:

C:\bc7\qbx (dit is de professionele versie van QB)

PowerBasic onder:

C:\PB32\

C:\PB\PBcc\...

1 Floppy disk-drive 1.44MByte 3 1/2"

1 CD-ROM drive, als drive D:

Software : Microsoft QBX V7.1 PDS (professionele versie)

Grosso modo komt dit basic overeen met GFA-basic op de Atari, hoewel het heel wat meer statements kent. Het grootste verschilpunt voor een overstapper is dat we hier wel meerdere instrukties per regel mogen schrijven. De opmaak van het programma anderzijds blijft hier volkomen aan het inzicht van de auteur overgelaten. Gebruik QBX steeds onder MS-DOS binnen Win95. Indien je het niet reeds hebt gedaan: plaats een 'shortcut' naar MS-dos op je desktop waarvan de de 'properties' instelt op maximale dos-autonomie (prevent detection of windows, bitmapped fonts ...)

De beste methode om een programma te schrijven bestaat erin eerst een FLOW-CHART (verloopdiagram) te maken waarin alle stappen zijn opgenomen die het programma dient af te werken om tot het gewenste resultaat te komen. Elk blokje waaruit de flow-chart is opgebouwd kan dan afzonderlijk gekodeerd en getest worden. Een flowchart, bij een niet al te ingewikkeld programma, kan ook in je hoofd bestaan. Improviserend programmeren leidt nooit tot zinnige resultaten. Trek ook steeds een voldoende groot tijdssegment uit vooraleer je aan het programmeren gaat. Programmeren in een verloren halfuurtje maakt veelal meer brokken dan dat het tot konstruktieve bijdragen voert.

Het schrijven van een programma begint dan meestal met een aantal declaraties en algemene instrukties voor de compiler:

vb. : '$DYNAMIC '(maakt het dynamisch gebruik van arrays groter dan 32kByte mogelijk)

COMMON SHARED / Midi-parameters/ B, P() AS INTEGER
COMMON SHARED / Config / DP%,SP%,CP%
DECLARE SUB MIDIPORT ()
DECLARE SUB Uit (byte%)
DECLARE SUB MENU1 ()
DECLARE FUNCTION Min% ()
DEFINT A-K
DEFLNG T
DEFDBL T
...

QBX maakt het namelijk mogelijk een programma volledig modulair op te bouwen. Elke afzonderbare taak kan dan in een afzonderlijk subprogramma (een procedure of een funktie) worden ondergebracht. Het eigenlijke programma kan daardoor uiterst gestruktureerd en leesbaar worden gehouden. Het zou er bvb. kunnen uitzien als:

CALL MIDIPORT
CALL MENU1
DO UNTIL K$="*"
CALL MISEND
K$= INKEY$
LOOP
END

De CALL instruktie kan zelfs -onder bepaalde voorwaarden- geheel worden weggelaten. Zelf geprogrammeerde sub-programmas em funkties gaan dan zowat deel uitmaken van de Basic taal zelf, iets waardoor een zekere verwantschap met FORTH ontstaat. Zoals we verder zullen zien, laat ons dit toe grote stukken eerder geschreven software in nieuwe programmas telkens opnieuw te gebruiken. (cfr. 1060) Opdat dit praktisch mogelijk zou zijn, is het echter absoluut noodzakelijk alle bronkode ook heel goed te dokumenteren. Bij elk variabele wordt daartoe in een kommentaar genoteerd waarvoor hij wordt gebruikt en wordt ook zijn type bepaald als integer, long integer, single precision, double precision, string of date. Bij elke bewerking die niet triviaal is, wordt in woorden aangegeven wat ze geacht wordt te doen, en bij elk programmamodule wordt opgegeven wat de nodige input-kondities en de te verwachten output is. Indien van toepassing moet ook duidelijk worden genoteerd onder welke hardware voorwaarden de module werkt (bvb. wanneer ze gebruik maakt van een midi-kaart in de komputer, dan dient dit te worden opgetekend.).

Het aandachtig bestuderen van enkele goed geschreven modelprogrammas -en ik hoop dat enkele van mijn programmas daarvoor kunnen doorgaan- kan in deze wellicht meer verduidelijken dan deze raadgevingen.


6.Introduktie in PowerBasic voor IBM-PC-achtige machines.

Klaskonfiguratie: [01.10.1997, ook 1998-1999]

Operating system : DOS V7 / Win95/ Win98

Hardware : Pentium IBM-AT kloon - 120MHz

32 MByte memory

VGA-videokaart en kleurscherm

500Mbyte Harddisk , 12 ms access-time

PowerBasic staat op de harde schijf onder:

C:\PB35\PB.EXE

of, voor de console compiler,

C:\PB\CC\PBcc10.exe

1 Floppy disk-drive 1.44MByte 3 1/2"

1 CD-ROM drive, als drive D:

Software : PowerBasic (professionele versie met DLL compilers en toolkits)

Lees eerst en vooral de 'User's Guide' vooraleer je hiermee aan de slag gaat. PowerBasic is in ruime mate kompatibel met BC7 en QB45, maar toch vergt de overdracht van programmas steeds heel wat manuele ingrepen. Zo moeten kondities waarin Boole funkties voorkomen grondig worden bekeken en moeten de deklaraties en metastatements worden aangepast. (COMMON SHARED wordt bvb. PUBLIC enz...). Ook kent PowerBasic meer gereserveerde woorden dan BC7. Een variabele zoals At% of byte% bvb. wordt door PowerBasic niet aanvaard.

We maken zelf erg veel gebruik van deze kompiler, o.m. omdat het de recentste is en dus mee is met de ontwikkeling van de nieuwste hardware (kompilatie voor 80486 en latere processoren bvb., snelle UART's...) en -last but not least- omdat hij in een wereld van komputerdebilizering (Windows), toch het kontakt met de machine in stand houdt.

De kode geleverd door deze kompiler moet in niets onderdoen voor deze geleverd door C of C++kompilers.


Filedate: 970928/98-10-11

Terug naar inhoudstafel kursus: <Index Kursus> Naar homepage dr.Godfried-Willem RAES