Nu op het Weblog

Nu op het fotoblog

Nu op het Videoblog

Nu op het Muziekblog

Nu op het Kookblog

Nu op het Liveblog

22 april 2009

Hamlet project (fase 1.1)

Wat bepaald humeur? Dat is de vraag die ik in deze fase van het Hamlet project probeer te beantwoorden.

In de eerste versie van dit project had ik nog het idee om de uiteindelijke tekstvoordracht te laten beïnvloeden door "stemming". Ik kwam er al snel achter dat die ambitie iets te groot was. Stemming kan namelijk zoveel zijn, agressief, passief, optimistisch, pessimistisch, romantisch, etc, etc. Ik heb besloten eerst aan de gang te gaan met humeur.

Als ik bij mijzelf naga wat voor humeur ik kan hebben dan is dat in te delen in "goed", "slecht" en iets wat ik "onbestemd" noem. Waar wordt dat "goede", "slechte" of "onbestemde" door bepaald? Een goede nachtrust, een welgemeende kus en "ik hou van je", die nieuw gekochte kleren die ik aan heb?

Het probleem met dat soort "humeur" bepalende zaken is dat de computer er niet door wordt beïnvloed. Ik vermoed dat mijn computer liever aanstaat dan dat het een "nachtrust" heeft. Ik heb ook nog nooit gemerkt dat een computer zich veel gelegen laat liggen aan een zin als "ik hou van je". Mijn computer trekt het zich evenmin aan als ik weer eens tegen hem loop te vloeken en te tieren als ik iets doms gedaan heb, en de schuld daarvoor liever bij de computer leg. Laat staan dat mijn computer een goed humeur krijgt van nieuwe kleren.

Ik moest iets hebben dat het "humeur" van de computer kan bepalen. Mijn humeur wordt weleens bepaald door het nieuws. Mijn computer kan redelijk eenvoudig de website van b.v de Volkskrant inlezen. In deze tweede fase van het Hamlet project wil ik dan ook mijn computer een krant te lezen geven die het "humeur" bepaald.

Bij mij is het zo dat de artikelen in b.v De Volkskrant een andere uitwerking hebben op mijn humeur dan die in De Telegraaf. Wat bepaald welke krant iemand leest? Na een beetje onderzoek blijken dat factoren als geslacht, opleidingsniveau, sociale afkomst, economische situatie en nog een paar van dat soort demografische gegevens hier een rol in spelen.

In eerste instantie moest ik dus een "script" schrijven die een "persoon" creëert met bepaalde demografische kenmerken. Die kenmerken hebben dan later weer invloed op het opleidingsniveau van die "persoon", het opleidingsniveau is weer van invloed op de krant die iemand leest, de krant die de persoon heeft gelezen is van invloed op het humeur, het humeur is van invloed op de manier waarop een stuk tekst voorgedragen wordt.

In het script dat ik tot nu toe heb geschreven wordt er een persoon aangemaakt met bepaalde demografische kenmerken. Die kenmerken zullen later invloed hebben op het opleidingsniveau, etc, etc.

Mijn streven is om een werkend script volgende week online te hebben. Onderstaande filmpje laat zien dat het script redelijk in staat is om een willekeurig persoon aan te maken met bepaalde demografische gegevens.





Ik ben er mij bewust van dat dit script nog veel tekortkomingen heeft. Lees het script als u meer wilt weten hoe bepaalde zaken invloed hebben op elkaar en hoe toeval en kansen een rol spelen. Bepaalde dingen kunnen handiger gescript worden maar ik moet een afweging maken tussen "redelijk" menselijk leesbaar zijn, en onbegrijpelijke computertaal.



-- DEMOGRAFISCHE GEGEGEVENS ACTEUR

(*
Creeer een lege array om de hieronder gegenereerde gegegevens in op te slaan.
*)

set gegevensActeur to {}

(*
Vraag of het stuk tekst door een specifiek geslacht moet worden voorgedragen. Er kan ook gekozen worden om dit door de computer zelf te laten bepalen.
*)

set geslachtActeur to the button returned of (display dialog "De tekst moet voorgedragen worden door een:" with title "Kies geslacht acteur" buttons {"MAN", "VROUW", "Bepaal het zelf"} default button 1)

-- FUNCTIE CREEER EEN persoon MET HET GESLACHT

on creeerEenPersoonMetHetGeslacht()

(*
De verhouding tussen mannen en vrouwen in Nederland is grotendeels 50% tegen 50%. De computer heeft dus alleen de keus tussen Man en Vrouw.
*)

set geslacht_array to {"MAN", "VROUW"}

set a to count geslacht_array
set b to random number from 1 to a
set c to item b of geslacht_array
return c

end creeerEenPersoonMetHetGeslacht

(*
Als aangegeven is dat de computer het geslacht zelf moet bepalen creeer deze dan.
*)

if geslachtActeur is "Bepaal het zelf" then
set geslachtActeur to creeerEenPersoonMetHetGeslacht()
set gegevensActeur's end to creeerEenPersoonMetHetGeslacht()
else
set gegevensActeur's end to geslachtActeur
end if

--return demografischeGegevensActeur

-- /FUNCTIE CREEER EEN MENS MET HET GESLACHT

-- FUNCTIE CREEER EEN ETHNISCHE AFKOMST

on creeerEenEthnischeAfkomst()

(*
In deze tweede versie houdt ik het simpel en bepaal ik alleen of iemand van een Nederlandse afkomst is of van buitenlandse afkomst. Het percentage "Allochtonen" loopt in Nederland naar de 20% toe.
*)

set ethnische_afkomst_array to {"AUTOCHTOON", "AUTOCHTOON", "AUTOCHTOON", "AUTOCHTOON", "ALLOCHTOON"}

set a to count ethnische_afkomst_array
set b to random number from 1 to a
set c to item b of ethnische_afkomst_array
return c

end creeerEenEthnischeAfkomst

set gegevensActeur to gegevensActeur & creeerEenEthnischeAfkomst()

--return demografischeGegevensActeur

-- /FUNCTIE CREEER EEN ETHNISCHE AFKOMST

-- FUNCTIE CREEER EEN FINANCIELE GEZINSSITUATIE

on creeerEenFinancieleGezinsSituatie(etnischeAfkomst)

(*
40% van de mensen in Nederland hebben een laag inkomen, 20% een laag gemiddeld inkomen, 20% een hoog gemiddeld inkomen en 20% een hoog inkomen
*)

set inkomens_array_1 to {"LAAG INKOMEN", "LAAG INKOMEN", "LAAG INKOMEN", "LAAG INKOMEN", "LAAG GEMIDDELD INKOMEN", "LAAG GEMIDDELD INKOMEN", "HOOG GEMIDDELD INKOMEN", "HOOG GEMIDDELD INKOMEN", "HOOG INKOMEN", "HOOG INKOMEN"}
set inkomens_array_2 to {"LAAG INKOMEN", "LAAG INKOMEN", "LAAG INKOMEN", "LAAG INKOMEN", "LAAG GEMIDDELD INKOMEN", "HOOG GEMIDDELD INKOMEN", "HOOG INKOMEN"}

if etnischeAfkomst is "AUTOCHTOON" then
set inkomens_array to inkomens_array_1
else if etnischeAfkomst is "ALLOCHTOON" then
set inkomens_array to inkomens_array_2
end if

set a to count inkomens_array
set b to random number from 1 to a
set c to item b of inkomens_array
return c

end creeerEenFinancieleGezinsSituatie

set gegevensActeur to gegevensActeur & creeerEenFinancieleGezinsSituatie(item 2 of gegevensActeur)

-- /FUNCTIE CREEER EEN FINANCIELE GEZINSSITUATIE

-- FUNCTIE CREEER EEN LIEFDEVOLLE OF PROBLEMATSCHE GEZINSSITUATIE

on creeerEenGezinssituatie(etnischeAfkomst, financieleGezinsSituatie)

(*
Creeer een gezinssituatie.
*)

(*
Als iemand uit een gezin komt met een laag inkomen dan is de kans groter dat die persoon in een problematisch gezin opgroeit. Hetzelfde geld voor iemand die opgroeit met ouders van allochtone afkomst.
*)

set gezinssituatie_array_1 to {"VOORBEELD GEZIN", "NORMAAL GEZIN", "NORMAAL GEZIN", "NORMAAL GEZIN", "PROBLEEM GEZIN"}
set gezinssituatie_array_2 to {"VOORBEELD GEZIN", "NORMAAL GEZIN", "NORMAAL GEZIN", "PROBLEEM GEZIN"}

if etnischeAfkomst is "AUTOCHTOON" and financieleGezinsSituatie is "LAAG INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_2
else if etnischeAfkomst is "ALLOCHTOON" and financieleGezinsSituatie is "LAAG INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_2
else if etnischeAfkomst is "AUTOCHTOON" and financieleGezinsSituatie is "LAAG GEMIDDELD INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_1
else if etnischeAfkomst is "ALLOCHTOON" and financieleGezinsSituatie is "LAAG GEMIDDELD INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_2
else if etnischeAfkomst is "AUTOCHTOON" and financieleGezinsSituatie is "HOOG GEMIDDELD INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_1
else if etnischeAfkomst is "ALLOCHTOON" and financieleGezinsSituatie is "HOOG GEMIDDELD INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_1
else if etnischeAfkomst is "AUTOCHTOON" and financieleGezinsSituatie is "HOOG INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_1
else if etnischeAfkomst is "ALLOCHTOON" and financieleGezinsSituatie is "HOOG INKOMEN" then
set gezinssituatie_array to gezinssituatie_array_1
end if

set a to count gezinssituatie_array
set b to random number from 1 to a
set c to item b of gezinssituatie_array
return c

end creeerEenGezinssituatie

set gegevensActeur to gegevensActeur & creeerEenGezinssituatie(item 2 of gegevensActeur, item 3 of gegevensActeur)

-- /FUNCTIE CREEER EEN LIEFDEVOLLE OF PROBLEMATSCHE GEZINSSITUATIE

-- /DEMOGRAFISCHE GEGEGEVENS ACTEUR

-- BEPAAL DE KANSEN VAN DE ACTEUR IN HET LEVEN

on kansenGekregenInHetLeven(geslachtActeur, ethnischeAfkomst, financieleGezinsSituatie, gezinssituatie)

(*
Kansen die iemand in het leven heeft gekregen zijn naar mijn mening van invloed of iemand een goede opleiding heeft kunnen genieten of niet. Kansen die je krijgt in het leven zijn afhankelijk van hiervoor in het script bepaalde parameters
*)

set kansen_array_1 to {"GEEN", "WEINIG", "NORMAAL", "VEEL"}
set kansen_array_2 to {"WEINIG", "NORMAAL", "VEEL", "ALLE"}

(*
Dit stukje script moet ik nog uitbreiden. Misschien zelfs helemaal herschrijven. Ik kan niet voor elke situatie een if statement gaan schrijven.
*)

if geslachtActeur is "VROUW" and ethnischeAfkomst is "ALLOCHTOON" and financieleGezinsSituatie is "LAAG INKOMEN" and gezinssituatie is "PROBLEEM GEZIN" then
set kansen_array to kansen_array_1
else if geslachtActeur is "MAN" and ethnischeAfkomst is "AUTOCHTOON" and financieleGezinsSituatie is "HOOG INKOMEN" and gezinssituatie is "VOORBEELD GEZIN" then
set kansen_array to kansen_array_1
else
set kansen_array to kansen_array_1
end if

set a to count kansen_array
set b to random number from 1 to a
set c to item b of kansen_array
return c
end kansenGekregenInHetLeven

set gegevensActeur to gegevensActeur & kansenGekregenInHetLeven(item 1 of gegevensActeur, item 2 of gegevensActeur, item 3 of gegevensActeur, item 4 of gegevensActeur)

-- /BEPAAL DE KANSEN VAN DE ACTEUR IN HET LEVEN

-- BEPAAL FYSIEKE OPLEIDINGSMOGELIJKHEDEN

(*
Het stuk script hieronder bekijkt de fysieke mogelijkheden van de computer en vertaald deze naar scholingsmogelijkheden.
*)

on schoonProcessorSnelheidOp(processorSnelheid)
set text item delimiters of AppleScript to " GHz"
set processorSnelheid to text items of processorSnelheid
return item 1 of processorSnelheid
end schoonProcessorSnelheidOp

on schoonWerkgeheugenOp(werkgeheugen)
set text item delimiters of AppleScript to " GB"
set werkgeheugen to text items of werkgeheugen
return item 1 of werkgeheugen
end schoonWerkgeheugenOp

on schoonBesturingsSysteemOp(besturingssysteem)
set text item delimiters of AppleScript to " Mac OS X "
set besturingssysteem to text items of besturingssysteem
return item 2 of besturingssysteem
end schoonBesturingsSysteemOp

on schoonBesturingsSysteemVersieOp(besturingssysteem)
set text item delimiters of AppleScript to " "
set besturingssysteem to text items of besturingssysteem
return item 1 of besturingssysteem
end schoonBesturingsSysteemVersieOp

on schoonBesturingsSysteemIteratieOp(besturingssysteem)
set text item delimiters of AppleScript to "."
set besturingssysteem to text items of besturingssysteem
return item 1 of besturingssysteem & "." & item 2 of besturingssysteem
end schoonBesturingsSysteemIteratieOp

on bepaalFysiekeMogelijkhedenOpleidingsNiveau()
set haalFysiekeMogelijkHedenVanComputerOp to do shell script "/usr/sbin/system_profiler -detailLevel mini | egrep '(System Version|Processor Name|Processor Speed|Memory): ' | cut -d: -f2-"
set AppleScript's text item delimiters to return
set fysiekeMogelijkheden to text items of haalFysiekeMogelijkHedenVanComputerOp
set AppleScript's text item delimiters to ""
set processor to item 1 of fysiekeMogelijkheden -- Cpu type
set processorSnelheid to item 2 of fysiekeMogelijkheden -- Cpu snelheid
set processorSnelheid to schoonProcessorSnelheidOp(processorSnelheid)
set werkgeheugen to item 3 of fysiekeMogelijkheden -- Werkgeheugen
set werkgeheugen to schoonWerkgeheugenOp(werkgeheugen)
set besturingssysteem to item 4 of fysiekeMogelijkheden -- Besturingssysteem
set besturingssysteem to schoonBesturingsSysteemOp(besturingssysteem)
set besturingssysteem to schoonBesturingsSysteemVersieOp(besturingssysteem)
set besturingssysteem to schoonBesturingsSysteemIteratieOp(besturingssysteem)
set fysiekeOpleidingMogelijkheden to {processor, processorSnelheid, werkgeheugen, besturingssysteem}

set langzame_processor_array to {" Intel Core Duo", " Intel Xeon 5100"}
set snelle_processor_array to {" Intel Core 2 Duo", " Intel Xeon 5400"}
set langzame_processor_snelheid_array to {" 1.5", " 1.66", " 1.83"}
set snelle_processor_snelheid_array to {" 2.0", " 2.16", " 2.4", " 2.42", " 2.66", " 2.8"}
set langzame_werkgeheugen_array to {" 256", " 512", " 1"}
set snelle_werkgeheugen_array to {" 2", " 4", " 8"}
set oude_besturingssysteem_array to {"10.2", "10.3"}
set nieuwe_besturingssysteem_array to {"10.4", "10.5", "10.6"}

--return fysiekeOpleidingMogelijkheden

set score to {}

if item 1 in fysiekeOpleidingMogelijkheden is in langzame_processor_array then
set end of score to 1
else if item 1 in fysiekeOpleidingMogelijkheden is in snelle_processor_array then
set end of score to 2
else
set end of score to 0
end if

if item 2 in fysiekeOpleidingMogelijkheden is in langzame_processor_snelheid_array then
set end of score to 1
else if item 2 in fysiekeOpleidingMogelijkheden is in snelle_processor_snelheid_array then
set end of score to 2
else
set end of score to 0
end if

if item 3 in fysiekeOpleidingMogelijkheden is in langzame_werkgeheugen_array then
set end of score to 1
else if item 3 in fysiekeOpleidingMogelijkheden is in snelle_werkgeheugen_array then
set end of score to 2
else
set end of score to 0
end if

if item 4 in fysiekeOpleidingMogelijkheden is in oude_besturingssysteem_array then
set end of score to 1
else if item 4 in fysiekeOpleidingMogelijkheden is in nieuwe_besturingssysteem_array then
set end of score to 2
else
set end of score to 0
end if

set scoreKansOpGoedOnderwijs to (item 1 of score) + (item 2 of score) + (item 3 of score) + (item 4 of score)

if scoreKansOpGoedOnderwijs < 4 then
set kansOpGoedOnderwijs to "SLECHTE"
else if scoreKansOpGoedOnderwijs > 4 then
set kansOpGoedOnderwijs to "GOEDE"
else if scoreKansOpGoedOnderwijs = 4 then
set kansOpGoedOnderwijs to "MIDDELMATIGE"
end if

return kansOpGoedOnderwijs

end bepaalFysiekeMogelijkhedenOpleidingsNiveau

set gegevensActeur to gegevensActeur & bepaalFysiekeMogelijkhedenOpleidingsNiveau()

-- /BEPAAL FYSIEKE OPLEIDINGSMOGELIJKHEDEN

-- TEST

(*
Hier spuugt het script er de persoon uit.
*)

display dialog "Het geslacht van de acteur is:" & " " & item 1 of gegevensActeur & "

De afkomst van de acteur is:" & " " & item 2 of gegevensActeur & "

De acteur is geboren in een gezin met een:" & " " & item 3 of gegevensActeur & "

De acteur is in een " & item 4 of gegevensActeur & " opgegroeid

De kansen van de acteur waren: " & "" & item 5 of gegevensActeur & "

De acteur heeft " & item 6 of gegevensActeur & " capaciteiten om een goede opleiding te volgen."
-- /TEST

13 april 2009

Postbussen projekt

Postbussen 2

Ik liep laatst door het centrum van Enschede en raakte gefascineerd door de kleur van de TNT postbussen. De dagen erop heb ik zitten bedenken wat ik met die plotseling opgedane fascinatie zou kunnen gaan doen.

In een postbus zie ik mensen die op een betekenis volle wijze met elkaar in contact proberen te komen. Een persoonlijke brief vind ik vaak van meer waarde dan een telefoontje, sms, email of welke moderne manier van communicatie dan ook. Het lijkt alsof op papier gedachten zorgvuldige worden.

Ik ben verder gaan zoeken in de stad wat er zich nog meer rond het fenomeen papieren post afspeelt. Ik kwam allerlei dingen tegen die me erg waardevol leken om iets mee te gaan doen.

Er bestaan twee soorten brievenbussen, die waar de post door de postbode wordt afgeleverd, en die waar de postbode de post op komt halen. Die twee zijn onlosmakelijk met elkaar verbonden. Ik kon daardoor met postbussen erg makkelijk sequenties maken. Een bezorg postbus, een afhaal postbus, een bezorg postbus, .... Het leuke van sequenties is dat ik er automatisch betekenis in probeer te vinden. 1, 2, 4, 6 ... wordt in mijn hoofd meteen aangevuld tot 8, 10, 12, 14.

Bij het bekijken van de afbeelding (op mijn Flickr account kun je een link naar grote versies van de collages vinden):


Postbussen sequentie 1b

zie ik in het linkerdeel een postbus met een deels afgescheurde sticker waardoor alleen nog maar het woord "fascistis" te zien is. Aan de andere sticker te zien heeft de bezitter van deze postbus iets met de kreet "The Big Sell out".

In het rechterdeel van de collage zie ik de kleuren van de Rastafaribeweging. Een beweging die op zijn minst gezegd niet in Nederland is ontstaan, dus door bepaalde mensen in dit land als wezensvreemd ervaren kan worden, als er door die mensen al niet gezegd wordt dat het "Entartet" is.

De TNT postbus heeft een sticker van Sankt Pauli, en een sticker van studentenvereniging Link. Twee dingen die samengebracht met het linker- en rechterdeel in mijn gedachte toevoegen aan de betekenis.

Als ik de sequentie omdraai krijgt het voor mij een andere betekenis:


Postbussen sequentie 1a

Ik probeer met bovenstaande voorbeelden geen waardeoordeel te geven over zaken. Ik heb de foto's samengebracht omdat ik er iets in las.

Wat leest u in:


Postbussen sequentie 2a

?

Een sequentie is een vorm van symmetrie, dus de volgende stap met de sequenties was zo gemaakt (zie afbeelding aan het begin van dit artikel).

Ik heb ook geprobeerd om alle "betekenis" te laten varen, en de symmetrie van de sequentie tot onderwerp te maken.


Postbussen 1

P.S Iets anders wat me opviel is dat er op de postbussen waar de postbode zijn post komt halen meestal geen anti-reclame sticker zit. Ik ben van het model dat je problemen het best bij de bron kunt aanpakken. Dus ik ga binnenkort maar eens een stapeltje stickers halen!

10 april 2009

Hamlet project (evaluatie 1)

Redelijk tevreden over het idee en de eerste schets van wat ik het Hamlet project noem.

Ben er na veelvuldig testen wel achtergekomen dat het misschien geen goed idee is de computer de keus te geven uit verschillende stemmen om een verschil in intonatie aan een tekst mee te geven. Ik ga meer zitten "gokken" wie nu als stem "uitgekozen" wordt, dan dat ik ga lopen luisteren naar subtiele verschillen in de tekst voordracht zelf. Ga het in de volgende versie dan ook weghalen. De keus tussen verschillende stemmen is makkelijk genoeg weer terug te programmeren mocht ik het toch nodig vinden.

Er zit een fout in de code die de internet verbinding test. Als er geen verbinding is zorgt de fout ervoor dat het script bij de verbinding test stopt en niet verder gaat. Oplossing is makkelijk gevonden.

Ook ben ik niet gelukkig met de keus van "stemming" die ik in de code als variabele aan de computer mee geef om de tekstvoordracht te beïnvloeden. Het begrip "stemming" kan namelijk heel veel zijn, ik kan een romantische stemming hebben, een avontuurlijk, angstige en ... vul de rest zelf maar aan. Stemming is dus moeilijk te kwantificeren. Ik denk dat ik de computer eerst met de variabele "humeur" moet laat spelen. Mijn eigen humeur valt terug te brengen tot drie mogelijkheden, "Goed", "Slecht" en iets wat ik als "Onbestemd" zou benoemen. Ga voor het gemak in de volgende versie dus eerst met "humeur" aan de slag. "Stemming" is voorlopig nog een stap te ver.

Ik ga verder met AppleScript om dit project verder te ontwikkelen. Het levert computercode op die makkelijker te volgen is voor een lezer die niets van computercode af weet, dan een stuk Cocoa code. Hierdoor krijgt het een beetje het karakter van een soort computercode gedicht. Applescript is vermoedelijk ook iets flexibeler.

Enige nadeel van Applescript is dat het vooral geschikt is om procedureel te programmeren. Wat ik voor ogen heb met dit programma is uitermate geschikt voor het objectgeoriënteerd karakter van Cocoa. Ik maak me ook een beetje zorgen over de snelheid waarmee het AppleScript loopt. Voor de volgende versie heb ik dingen in gedachte die het script verlangzamen, ik hoop dat dat niet van invloed is op het vloeiend verlopen van de tekstvoordracht.

Dit is vermoedelijk zo'n experiment waar ik nog uren, weken, maanden, jaren druk mee ben.

7 april 2009

Hamlet project (fase 1)


In deze eerste fase van het "Hamlet project" heb ik er voor gekozen de dingen eerst uit te schetsen met een Applescript.

Ik heb in deze eerste versie nog geen code toegevoegd die bepaalde informatie van het internet haalt om daarmee de "stemming" in het script (dus van de computer) te bepalen. Ik weet nog niet precies wat voor soort informatie ik daarvoor wil gaan gebruiken (weer, beursberichten, filemeldingen). Het is een beetje moeilijk uitleggen maar ik kan de stemming hard coderen of ik kan het zo maken dat bepaalde informatie van invloed is op de mogelijke stemming. Ik ben er nog niet uit wat ik daarmee moet doen. Lees de broncode hierbeneden voor meer informatie.

Ik denk dat ik dit project een Mac only applicatie laat blijven. Het zou te veel moeite zijn dit voor Linux of Windows te implementeren omdat die beide systemen niet de stemmen hebben geïnstalleerd zoals op de Mac. Ik zou het wel kunnen doen door zelf geluidsopnames te gaan maken en daar een programma omheen schrijven die ik als AIR applicatie zou kunnen verspreiden. Dat heeft als nadeel dat de tekst die uitgesproken word hard gecodeerd word, dus alleen "To Be Or Not To Be". Het mooie van dit script is dat je willekeurig ieder stuk tekst kunt laten uitspreken. Een soort van instant acteur met variërende
stemming.

Een zip bestand met het bewerkbare script, een gecompileerde applicatie en een .txt bestand met het Hamlet citaat zijn hier te downloaden.

Meer weten over het Hamlet project? Klik dan op de label (tag) onderaan dit artikel.

De broncode:


-- STEMMINGSAFHANDELING

(*
Hier komen de stukjes code die het internet opgaan om de "stemming" van de acteur of actrice te bepalen. Als de zon schijnt dan zal de "stemming" anders zijn dan wanneer het regent.

Ik moet voor mijzelf nog bepalen hoe ik de stemming ga programmeren. Leg ik in harde code vast dat de computer een slecht humor krijgt als het b.v regent? Of laat ik dit afhankelijk zijn van toeval (een waarde die door de computer zelf bepaald wordt, dus "eigen" keus is?).

Dit is een vraag de ik nog niet beantwoord heb omdat er veel dingen bij komen kijken. Ik persoonlijk wordt chagrijnig als het heel warm is. Een ander wordt daar juist erg blij van. Is dit afhankelijk van lichamelijke zaken of heeft persoonlijkheid er ook mee te maken?

Op dit moment wordt er alleen gekeken of er internetverbinding is. Is er verbinding dan krijgt de computer een stemming 0 als er geen verbinding is dan krijgt de computer stemming 1. Verderop in de code word er een resultaat voor die stemming door toeval bepaald gegeven. Op het ene moment zal de stemming dus een ander resultaat opleveren dan het andere moment.
*)

if (do shell script "ping -c1 google.com") contains "1 packets received" then set internetVerbinding to true

if internetVerbinding is true then
set stemming to 0
else
set stemming to 1
end if

-- /STEMMINGSAFHANDELING

-- TEKSTAFHANDELING

(*
Hier wordt er gevraagd naar het .txt bestand dat voorgedragen moet worden. De tekst wordt "opgeschoond" van karakters die mogelijk problemen kunnen veroorzaken. Daarna worden de aanwezige interpuncties omgezet in een *. De tekst wordt in fragmenten geknipt op de plek waar nu een * staat. Dit levert een array met fragmenten op waar nu een willekeurig gegenereerde interpunctie en adempauze achtergezet kan worden.
*)

set tekstBestand to (choose file with prompt "Kies een bestand:" of type {"public.plain-text"})
open for access tekstBestand
set citaat to (read tekstBestand)
close access tekstBestand

to vervangdeTekst of ingelezenTekst from zoekKarakter to vervangKarakter
set opgeslagenDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to zoekKarakter
set ingelezenTekst to ingelezenTekst's text items
set AppleScript's text item delimiters to vervangKarakter
set ingelezenTekst to ingelezenTekst as Unicode text
set AppleScript's text item delimiters to opgeslagenDelimiters
ingelezenTekst
end vervangdeTekst

on schoonTekstOp(tekst)
set array to {"{", "}", "(", ")", ":", "'", "\""}
set a to 0
repeat with karakter in array
set a to a + 1
set b to tekst
set c to item a of array
set d to ""
set tekst to vervangdeTekst of b from c to d
end repeat
end schoonTekstOp

on vervangInterpuncties(tekst)
set array to {";", "?", ".", ",", "!"}
set a to 0
repeat with karakter in array
set a to a + 1
set b to tekst
set c to item a of array
set d to " *"
set tekst to vervangdeTekst of b from c to d
end repeat
end vervangInterpuncties

set schoneTekst to schoonTekstOp(citaat)
set tekstZonderInterpuncties to vervangInterpuncties(schoneTekst)

on splitsTekst(tekst)
set text item delimiters of AppleScript to "*"
set tekst to text items of tekst
return tekst
end splitsTekst

set opgesplitseCitaatArray to splitsTekst(tekstZonderInterpuncties)

-- / TEKSTAFHANDELING

-- ACTEURAFHANDELING

(*
Hier wordt er een acteur gegenereerd. Bij het openen van dit script wordt er gevraagd om een geslacht van de acteur op te geven. Immers Hamlet is een stuk voor een man, Julia uit Romeo en Julie is een stuk voor een vrouw. Ik ben er mij van bewust dat bij sommige mensen het je man of vrouw voelen afhankelijk is van stemming. Sommige stukken tekst vragen nu eenmaal dat een specifiek geslacht ze voordraagt. Je kunt wel aangeven dat het geslacht van de acteur word bepaald door de "stemming" van de computer.

Ik heb gekozen om een paar stemmen als keuze mogelijkheid te gebruiken. Ik denk dat een acteur meerdere "stemmen" heeft die hij kan gebruiken. Een man kan een hoge of lage stem gebruiken, deze keus kan afhankelijk zijn van stemming naar mijn mening. Ook kan een acteur een typetje neerzetten vandaar dat ik het ook toelaat voor de computer om een keus te maken uit niet "natuurlijke" stemmen zoals b.v "Bad News" en "Princess".
*)

set geslachtActeur to the button returned of (display dialog "De tekst moet voorgedragen worden door een:" with title "Kies geslacht acteur" buttons {"Man", "Vrouw", "Laat het afhankelijk zijn van je stemming"} default button 1)

on genereerWillekeurigeActeur(geslachtActeur, stemming)
if geslachtActeur is "Man" then
set array_1 to {"Alex", "Albert", "Bad News"}
set array_2 to {"Ralph", "Fred", "Zarvox"}
else if geslachtActeur is "Vrouw" then
set array_1 to {"Agnes", "Kathy", "Princess"}
set array_2 to {"Vicki", "Victoria", "Trinoids"}
else
set array_1 to {"Agnes", "Kathy", "Princess", "Alex", "Albert", "Bad News"}
set array_2 to {"Vicki", "Victoria", "Trinoids", "Ralph", "Fred", "Zarvox"}
end if
if stemming is 0 then
set a to count array_1
set b to random number from 1 to a
set c to item b of array_1
return c
else
set a to count array_2
set b to random number from 1 to a
set c to item b of array_2
return c
end if
end genereerWillekeurigeActeur

set acteur to genereerWillekeurigeActeur(geslachtActeur, stemming)

-- /ACTEURAFHANDELING

-- VOORDRACHTAFHANDELING

(*
Hier worden zaken als adempauzes en interpucties tussen fragmenten tekst afgehandeld. Ik twijfel nog of dat de enige zaken zijn die een goede of slechte voordracht van een tekst bepalen. Bij dit experiment kunnen lichaamstaal en gelaatsuitdrukking natuurlijk (nog?) geen rol spelen. Welke gereedschappen heeft een acteur nog meer dan adempauzes en interpuncties als het sec gaat om een tekst voordraagt? Zal ik nog verder onderzoek naar moeten doen!
*)

on genereerWillekeurigeDuurAdempauze(stemming)
set array_1 to {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.5, 2.0}
set array_2 to {0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.5, 2.0, 2.5}
if stemming is 0 then
set a to count array_1
set b to random number from 1 to a
set c to item b of array_1
return c
else
set a to count array_2
set b to random number from 1 to a
set c to item b of array_2
return c
end if
end genereerWillekeurigeDuurAdempauze

on genereerWillekeurigeInterpunctie(stemming)
set array_1 to {"?", "!", ",", ".", ""}
set array_2 to {"", ",", ".", "!", "?"}
if stemming is 0 then
set a to count array_1
set b to random number from 1 to a
set c to item b of array_1
return c
else
set a to count array_2
set b to random number from 1 to a
set c to item b of array_2
return c
end if
end genereerWillekeurigeInterpunctie

-- /VOORDRACHTAFHANDELING

-- VOORDRACHT

(*
Dit stuk code zorgt uiteindelijk voor de voordracht zelf.
*)

repeat with fragment in opgesplitseCitaatArray
say fragment & genereerWillekeurigeInterpunctie(stemming) using acteur
delay genereerWillekeurigeDuurAdempauze(stemming)
end repeat

-- /VOORDRACHT

6 april 2009

Hamlet project (mission statement 1)

Ik wil gaan beginnen om een klein programma te schrijven voor de Mac. Doel is om de bekende kerkhof scène uit de derde act van Hamlet (hier de complete derde act), u weet wel "To Be or not to Be", door de computer te laten citeren. Dit is simpel genoeg met het say command (hier een voorbeeld).

Wat maakt het dat een acteur de ene dag een fantastische voorstelling weggeeft en de andere dag "steekjes" laat vallen? Een regenachtige dag, een verlate trein, een file, de beursstand? Is een computer instaat tot een fantastische voorstelling? Te bedenken dat een fantastische voorstelling afgemeten wordt aan een slechte en visa versa.

Ik wil het dus zo maken dat ik de intonatie van het citaat afhankelijk wil maken van toeval, en op het internet verkrijgbare dynamische parameters (wat voor weer is het, is de trein van x.xx uur vanuit Enschede al naar Hengelo vertrokken, de beursstand etc). Dus bij mooi weer wordt het citaat b.v "To be, or not to be? That is the question?" en bij slecht weer "To be, or not to be! That is the question!"

Mocht het een leuk project worden dan wil ik kijken of ik het programma om kan zetten naar iets dat cross-platform werkt.

3 april 2009

Wim Kamphuis project

Voor de website www.oostkunst.nl heb ik een tijdje geleden een paar video's gemonteerd (hier te vinden). Tijdens een bespreking van de filmpjes kwam chef de redactie van Oostkunst, Paul Hajenius, op het idee dat het misschien erg interessant zou zijn als alle filmpjes op één pagina zouden staan en dat ze dan tegelijk zouden opstarten.

De YouTube filmpjes starten standaard niet automatisch op als je de webpagina opent waar ze op staan, dus moest ik even nadenken hoe dat voor elkaar te krijgen. Ik wist dat het mogelijk is om een Flash Player (wat YouTube gebruikt) automatisch te laten starten bij het openen van een webpagina. De "hack" om de filmpjes simultaan te laten starten was dan ook verbazend éénvoudig.

Het enige wat je moet doen is

&autoplay=1


achter de url van het filmpje in de embed code plakken.

Dus

<object width="425" height="264"><param name="movie" value="http://www.youtube.com/v/N9gBFTFBffw&hl=nl&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/N9gBFTFBffw&hl=nl&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="264"></embed></object>


moet

<object width="425" height="264"><param name="movie" value="http://www.youtube.com/v/N9gBFTFBffw&hl=nl&fs=1&rel=0&autoplay=1"</param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/N9gBFTFBffw&hl=nl&fs=1&rel=0&autoplay=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="264"></embed></object>


worden.

De pagina met het resultaat is hier te vinden.

Mission statement.

Waarom dit kladblog? Een goede vraag die ik voor mijzelf heb beantwoord.

Ik ben iemand die intens geïnteresseerd is in computertechnologie. Ik ben er dan ook veel mee bezig, je zou kunnen zeggen dat ik er 80% van mijn tijd mee bezig ben. Ik ben ook iemand die creatief met die technologie probeert om te gaan. Een mediakunstenaar zou ik me niet willen noemen, maar ik maak dingen die ik zo af en toe graag zou willen tonen.

Daar zit het probleem. Waar moet ik mijn werk tonen? Is er een expositieruimte waar je creatieve computercode kunt tentoonstellen? Vandaar dus dit weblog.

De meeste "kunstenaars" hebben ook de mogelijkheid om hun ateliers te bezoeken. Ik heb een computer, geen atelier. Ik zou het echter wel leuk vinden dat mensen werk in progressie van me kunnen zien, mijn werk kunnen becommentariëren. Ik geloof dat dat erg belangrijk is om op nieuwe ideeën te komen en oude ideeën bevestigd te zien.

De dingen die ik hier zal posten zullen in de vorm van projecten zijn. Projecten waar ik mee bezig ben, en waarmee ik klaar ben. Dat kunnen projecten zijn die verband houden met beeldbewerking, videobewerking, ze kunnen te maken hebben met webdesign of met programmeren. Zo heel af en toe probeer ik ook nog wel eens niet elektronisch iets te maken, die zullen ook hier geplaatst worden, al denk ik dat dat er niet veel meer zullen zijn.

Enfin, ik hoop dat u als argeloos bezoeker iets van nut kunt vinden op dit open elektronische atelier.