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
}