Thursday, May 1, 2014

MysticTarot22 in Action!

MTarot22 from Juli.C. on Vimeo.

MysticTarot22 stills in action

Background of MysticTarot22

The Background Music is from the Band of Neil Taylor, who was also the main programmer for this project. Neil also set up the positioning of the piece. Your Tarot Card reader is Julie Johnson, who also did film editing & rendition. The back of the Tarot card deck is designed by Julie Johnson and the main deck pictures are from the Rider-Waite deck which is not under copyright. The idea of this program was proposed by Julie Johnson who is very interested in the "random" function of Processing being related to the randomness of true to life card-readings. The program shows how emotional and personal synchronicities are not just limited to "real-life" interactions but also extend to the cyber-world.

Wednesday, April 30, 2014

Tarot code

"import processing.core.*; import processing.data.*; import processing.event.*; import processing.opengl.*; import ddf.minim.*; import processing.video.*; import java.util.HashMap; import java.util.ArrayList; import java.io.File; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; public class Tarot3dv extends PApplet { String mType=".mp4"; Minim sounder; AudioPlayer myShuffling, myCardFlip , bgMusic; boolean mouseLock=false; int over=0; // what is the mouse over? CardDeck deck; Card cPast=null; Card cPresent=null; Card cFuture=null; int shuffling=0; Movie mIntro1; Movie mIntro2; Movie mOutro; int vPlaying=0; // lock out mouse while movie playing Movie current; Movie randM[]; int vNext=0; // What movie to play next int INTRO1=0; int INTRO2=20; int IPAST=11; int IPRESENT=12; int IFUTURE=13; int PAST=1; int PRESENT=2; int FUTURE=3; int OUTRO=9; int NOTHING=999; // intros Movie mIPast; Movie mIPresent; Movie mIFuture; // movies for Selected actual cards Movie mvPast; Movie mvPresent; Movie mvFuture; //PImage cn1; //PImage cn2; //card positions int xDeck =50; int xPast=180; int xPresent=330; int xFuture=480; int yCards=360; int cWidth =100; int cHeight=140; float mPast=0; //Controller for moving cards in secs/60? float mPres=0; float mFut=0; float mMax=30; //Max time/60 secs for card movement float yRx = (yCards+cHeight/2); // the y coord for rotating cards around X axis. public void setup() { randM=new Movie[6]; size(700, 520, P3D); //frameRate(30); println ("loading movies"); mIntro1 = new Movie(this, "Vmisc/intro" + mType); mIntro2 = new Movie(this, "Vmisc/ppf" + mType); mOutro = new Movie(this, "Vmisc/outro" + mType); vNext=INTRO1; mIPast = new Movie(this, "Vmisc/past" + mType); mIPresent = new Movie(this, "Vmisc/present" + mType); mIFuture = new Movie(this, "Vmisc/future" + mType); for (int i =0;i<6;i++){ randM[i] = new Movie(this, "Vmisc/r"+ i + mType); } println("creating deck"); deck=new CardDeck(); deck.shuffle(); //cn1=loadImage("Candle_1.jpg"); //cn2=loadImage("Candle_2.jpg"); println("loading sound"); sounder = new Minim(this) ; myShuffling = sounder.loadFile("shuffling-cards-1.mp3") ; myCardFlip = sounder.loadFile("cardFlip.mp3") ; bgMusic = sounder.loadFile("Highline.mp3") ; bgMusic.loop(10); bgMusic.shiftGain(-60, -20, 2000); // decibel volume -80 to 13 println("end setup"); } public void draw() { translate(0,0,0); background(0); fill(18); // Dark gray to mark the space for cards // Movie display the currnet frame from the movie. if ((vPlaying==0 && vNext!=NOTHING) // if theres a movie to play && (mPast==0 && mPres==0 && mFut==0 && shuffling == 0)) // and nothing's moving chooseMovie(); // start it image(current, 30,0, 620, 350); // display a frame of the movie // Candles //image(cn1,30,100,50,100); //image(cn2,width-(30+50),100,50,100); if (vPlaying>0) vPlaying--; // 0= no movie is currently in progress if (mPast>0) mPast--; if (mPres>0) mPres--; if (mFut>0) mFut--; displayTable(); // display everything on the table } // Only come here if nothing is playing and a Next video is selected // Decide which movie to play next and start it public void chooseMovie(){ int r=PApplet.parseInt(random(20)); println("r", r, " next=",vNext); // What do we want to play next... if (vNext==INTRO1) { vNext=NOTHING; current=mIntro1; } else if (vNext==INTRO2) { vNext=NOTHING; current=mIntro2; } else if (vNext==OUTRO) { vNext=NOTHING; current=mOutro; } else if (vNext==PAST ) { if (r<6) current=randM[r]; else{ current=mvPast; vNext=PRESENT;} } else if (vNext==PRESENT ) { if (r<6) current=randM[r]; else{ current=mvPresent; vNext=FUTURE;} } else if (vNext==FUTURE) { if (r<6) current=randM[r]; else{ current=mvFuture; vNext=OUTRO;} } else if (vNext==IPAST) { if (r<6) current=randM[r]; else{ current=mIPast; vNext=-1;} } else if (vNext==IPRESENT) { if (r<6) current=randM[r]; else{ current=mIPresent; vNext=-1;} } else if (vNext==IFUTURE) { if (r<6) current=randM[r]; else{ current=mIFuture; vNext=-1;} } if (vNext == -1) // after a PPF intro might need to start reading if (cPast !=null && cPresent !=null && cFuture != null) // all cards ar laid { vPlaying=40; // give it time to start vNext=PAST; } else vNext=NOTHING; current.stop(); vPlaying=40; // give it time to start current.play(); // switched movies, now play it. } public void mousePressed(){ if (mouseLock) return; // Not a new click so exit if (vPlaying>0) return; // dont respond to clicks while a movie is playing mouseLock=true; over=locateMouse(); if (over==1){ myShuffling.rewind(); myShuffling.play(); deck.shuffle(); shuffling=22; cPast=null; cPresent=null;cFuture=null; vNext=INTRO2; } if (over==2&&cPast==null){ myCardFlip.rewind(); myCardFlip.play(); cPast = deck.deal1(); mvPast = new Movie(this, "CardV/" + cPast.name + mType); vNext = IPAST; mPast=mMax; // take a half second to move. } if (over==3&&cPresent==null){ myCardFlip.rewind(); myCardFlip.play(); cPresent = deck.deal1(); mvPresent = new Movie(this, "CardV/" + cPresent.name + mType); vNext=IPRESENT; mPres=mMax; // take a half second to move. } if (over==4&&cFuture==null){ myCardFlip.rewind(); myCardFlip.play(); cFuture = deck.deal1(); mvFuture = new Movie(this, "CardV/" + cFuture.name + mType); vNext=IFUTURE; mFut=mMax; // take a half second to move. } // if (cPast!=null && cPresent!=null && cFuture!=null) // { // vPlaying=30; // give it half a sec to start // vNext=PAST; // } } public int locateMouse(){ if (mouseY < yCards) return 0; if (mouseY > yCards + cHeight) return 0; if (mouseX > xDeck && mouseX xPast && mouseX<=xPast+cWidth) return 2; //over past if (mouseX > xPresent && mouseX<=xPresent+cWidth) return 3; //over present card if (mouseX > xFuture && mouseX<=xFuture+cWidth) return 4; //over future card return 0; } public void displayTable() { // Display all the foreground features // That is, everything rotated like on a table. pushMatrix(); translate(0,yRx,10); // put the x axis at halfway down the deck rotateX(PI/4); // turn card for 3d displayDeck(); displayCard(cPast, xPast, mPast/mMax); displayCard(cPresent, xPresent, mPres/mMax); displayCard(cFuture, xFuture, mFut/mMax); popMatrix(); } public void displayCard(Card c, float atX, float xFact) // display a card c at position atX or at xFact towards it { if (c==null) { // No card for this slot yet if ((mPast+mPres+mFut)==0) // only show card spot if nothing moving rect(atX,cHeight/-2,cWidth,cHeight); return; } if (xFact>0) // is this card on the move translate(0,0,cHeight/1.5f); // set zaxis closer while turning rotateX((2*PI)-(PI*(xFact))); // turn card axis xFact fraction if (xFact>0.5f) image(deck.backside,xDeck+(int)((atX-xDeck)*(1-(xFact))),(cHeight/-2),cWidth,cHeight); else image(c.cardFace,xDeck+(int)((atX-xDeck)*(1-(xFact))),(cHeight/-2),cWidth,cHeight); } public void displayDeck() // display the card deck { if (shuffling>0) shuffling--; pushMatrix(); for (int i=0;i<22+shuffling;i++) { image(deck.backside,xDeck,(cHeight/-2),cWidth,cHeight); translate(1,0,2); } popMatrix(); } public void mouseReleased(){ mouseLock=false; } // Called every time a new frame is available to read, makes the image available public void movieEvent(Movie m) { int m2=30-vPlaying; //println("time since last frame="+m2); vPlaying=30; // lock out mouse for some frames m.read(); } class Card { int sortkey; //int description; boolean dealt=false; int num; String name; PImage cardFace; float sortSeq; Card(String iName) { name=iName; dealt=false; cardFace=loadImage("cards/" + name+".jpg"); } } class CardDeck { int deckSz=22; // cards in deck //Card cards[]; Card[] cards; PImage backside; CardDeck(){ // initialize the deck by creating all the cards in it. backside=loadImage("cards/Backside.jpg"); cards=new Card [deckSz]; cards[0]= new Card("Fool"); cards[1]= new Card("Magician"); cards[2]= new Card("HighPriestess"); cards[3]= new Card("Empress"); cards[4]= new Card("Emperor"); cards[5]= new Card("Hierophant"); cards[6]= new Card("Lovers"); cards[7]= new Card("Chariot"); cards[8]= new Card("Strength"); cards[9]= new Card("Hermit"); cards[10]= new Card("WheelofFortune"); cards[11]= new Card("Justice"); cards[12]= new Card("HangedMan"); cards[13]= new Card("Death"); cards[14]= new Card("Temperance"); cards[15]= new Card("Devil"); cards[16]= new Card("Tower"); cards[17]= new Card("Star"); cards[18]= new Card("Moon"); cards[19]= new Card("Sun"); cards[20]= new Card("Judgement"); cards[21]= new Card("Universe"); } // Give each card a random number and mark them as not dealt public void shuffle() { for (int i=0; i