Current File : /home/jeshor13/11bsouth.com/HonkSignMockUp/sketch.js
// The goal here is to create a sign oriented to both pedestrians and motorists
//That both collects data on noise poluttion (namely honking) and stores it (in some kind of local or global honk database)
//And displayes a live representation of current and medium term trends in the area
// Initially I'd like this "sign" to live as a webpage that can access the microphone
// of the device and act as a data recorder (or fucntional sign) for anyone who wants to 
// deploy it .
// The concept if fully borne out should be both physical and didgtal versions of the sign

// Location concepts - can access gps and include trends from other devices - 
//collect the data neccesary to create a live heatmap of honking around the globe

// Theme ideas - This could be part of a series of solutions to  "lesser pollution"
// "public signs" that report light pollution, sound pollution (this one), heat pollution, particulate
// crime, saftey (fire, flood, storm, human dangers, etc )



var streetSignSizemmX = 1220 / 2;
var streetSignSizemmY = 1540 / 2;
var nexus7ScreenSizeX = 1824
var nexus7ScreenSizeY = 1200
var mousePressTimer = 0;
var backgroundHonkTimer = 0;
var carHorns = [];
var honkAnalysis;
var ftt;
var soundSampleTimer = 0
var honkCount = 0
var honkCount0 = 0
var displayAreaX = 0
var displayAreaY = 0
var isNexus
var mic;
var analyzer;
var savedEnergyOfSoundSample = []
var savedEnergyOfHonkSoundSample = []

function preload() {
  //Font
  highwayFont = loadFont('highway_gothic/HWYGOTH.TTF')
    //Images
  annoyed = loadImage("pics/Annoyed.png");
  cuteEyesSmile = loadImage("pics/CuteEyesSmile.png");
  deadEyesAndMouth = loadImage("pics/DeadEyesAndMouth.png");
  dissapointedEyebrows = loadImage("pics/DissapointedEyebrows.png");
  flatMouth = loadImage("pics/FlatMouthGrey.png");
  frownSweat = loadImage("pics/FrownSweat.png");
  lightSmile = loadImage("pics/LightSmileGreen.png");
  littleSadMouth = loadImage("pics/LittleSadMouth.png");
  ohNoFace = loadImage("pics/OhNoFace.png");
  sadEyesAndTear = loadImage("pics/SadEyesAndTearBlue.png");
  sadFace = loadImage("pics/SadFace.png");
  smallToothyMoney = loadImage("pics/SmallToothyMoney.png");
  toothySmile = loadImage("pics/ToothySmile.png");
  //Sounds
  carHornsLong = loadSound('sounds/vehicle040.wav');
  carHornsShort = loadSound('sounds/vehicle041.wav');
  carHornsShort2 = loadSound('sounds/vehicle042.wav');
  carHornsLong2 = loadSound('sounds/vehicle043.wav');
  carHornsLong3 = loadSound('sounds/vehicle044.wav');
  carHornOne = loadSound('sounds/vehicle047.wav');

}

function setup() {
  if (displayWidth == nexus7ScreenSizeX && displayHeight == nexus7ScreenSizeY) {
    displayAreaX = nexus7ScreenSizeX - 100
    displayAreaY = nexus7ScreenSizeY
    isNexus = true
  } else {
    displayAreaX = streetSignSizemmX
    displayAreaY = streetSignSizemmY
    isNexus = false
  }
  createCanvas(displayAreaX, displayAreaY)
  background("white")
  carHorns = [carHornsLong, carHornsShort, carHornsShort2,
    carHornsLong2, carHornsLong3, carHornOne
  ];
  ftt = new p5.FFT();
  //honkAnalysis = ftt.analyze()
  // Create an Audio input
  //mic = new p5.AudioIn();
 // mic.start();
}


function draw() {
  signBackground()
  fill("green")
  textAlign(RIGHT);
  text(int(honkCount / 22), 90, 715, displayAreaX - 130)
    // text(int(mic.getLevel() * 100), 90, 745, displayAreaX - 130) // Displays quarter seconds of honking 
  if (honkCount <= 300) {
    image(lightSmile, displayAreaX / 8.5, displayAreaY / 2.9, lightSmile.width - 300, lightSmile.height - 300);
  }
  if (honkCount > 300 && honkCount < 800) {
    image(flatMouth, displayAreaX / 4.5, displayAreaY / 3, flatMouth.width - 280, flatMouth.height - 280);
  }
  if (honkCount >= 800) {
    image(sadEyesAndTear, displayAreaX / 5, displayAreaY / 2.8, sadEyesAndTear.width - 280, sadEyesAndTear.height - 280);
  }

  if (millis() - backgroundHonkTimer > 6000) {
    var i = int(random(0, 4))
    carHorns[i].play();
    backgroundHonkTimer = millis()
  }

  if (millis() - soundSampleTimer > 10) {
    ftt.setInput(mic)
    honkAnalysis = ftt.analyze()
    append(savedEnergyOfSoundSample, ftt.getEnergy(16, 16384))
    append(savedEnergyOfHonkSoundSample, ftt.getEnergy(300, 550))
    var qualityHonkSound = 1
    var qualitySound = 1
    var qualityDiffSound = 1
    var sum = 0
    for (var i = 0; i < savedEnergyOfSoundSample.length; i++) {
      if (savedEnergyOfSoundSample[i] >= 10) {
        sum += savedEnergyOfSoundSample[i]
        qualitySound++
      }
    }
    var avg = sum / qualitySound
    var sumHonk = 0
    for (var i = 0; i < savedEnergyOfHonkSoundSample.length; i++) {
      if (savedEnergyOfHonkSoundSample[i] >= 10) {
        sumHonk += savedEnergyOfHonkSoundSample[i]
        qualityHonkSound++
      }
    }
    var avgHonk = sumHonk / qualityHonkSound
    var sumDiff = 0
    for (var i = 0; i < savedEnergyOfHonkSoundSample.length; i++) {
      if (savedEnergyOfHonkSoundSample[i] - savedEnergyOfSoundSample[i] >= 10) {
        sumDiff += savedEnergyOfHonkSoundSample[i]- savedEnergyOfSoundSample[i]
        qualityDiffSound++
      }
    }
    var avgDiff = sumDiff / qualityDiffSound
    print(ceil(avgHonk - avg) + "," + ceil(avgHonk) + "," + ceil(avg)+ "," + ceil(avgDiff))
    if (avgHonk <= ftt.getEnergy(300, 550) && ftt.getEnergy(16, 16384) >= avg &&
    ftt.getEnergy(300, 550) - ftt.getEnergy(16, 16384) >= avgDiff*0.50 && millis()>6000) {
      honkCount++
     // print(ceil(avgHonk - avg) + "," + ceil(avgHonk) + "," + ceil(avg))
    }
    // if (ftt.getEnergy(16, 16384) > 30) {
    //   honkCount++

    // }

  }
}




function mousePressed() {
  if (millis() - mousePressTimer > 1000) {
    carHornOne.setVolume(0.6);
    carHornOne.play();
    mousePressTimer = millis()
  }
}

function signBackground() {
  fill("white")
  strokeWeight(10)
  rect(25, 25, displayAreaX - 50, displayAreaY - 50)
  fill("black")
  noStroke()
  textFont(highwayFont);
  textSize(110);
  text("Your Honks", 50, 140)
  textSize(66);
  text("Today's Conditions:", 50, 240)
  textSize(55)
  text("Total Honks This Week:", 50, 650)
    //stroke("yellow")
    //strokeWeight(2)
  if (honkCount0 == honkCount) {
    noStroke()
    rect(50, 270, displayAreaX - 100, displayAreaY - 460)
  }
  if (honkCount0 != honkCount) {
    stroke(255, 204, 0)
    strokeWeight(5)
    rect(50, 270, displayAreaX - 100, displayAreaY - 460)
    stroke(0, 0, 0)
    strokeWeight(0)
  }

  //stroke()
  //strokeWeight(10)
  rect(50, 670, displayAreaX - 100, displayAreaY - 720)
  honkCount0 = honkCount
}