processing – john locke http://gracefulspoon.com/blog adventures in architecture Fri, 29 May 2015 12:22:24 +0000 en-US hourly 1 https://wordpress.org/?v=6.5.2 3DP – SOUNDWAVE http://gracefulspoon.com/blog/2015/05/29/3dp-soundwave/ http://gracefulspoon.com/blog/2015/05/29/3dp-soundwave/#comments Fri, 29 May 2015 12:22:24 +0000 http://gracefulspoon.com/blog/?p=3849  

Building off of previous work that looked at real-time sound visualization, the intention of this exercise was to create a series of physical objects that legibly conveyed the transformation of sound into a landscape. Four specific indicative moments of recorded sound were rendered as a topographic form in Processing, then 3d printed. Any piece of real-time or recorded sound would work, however, these prototypes were chosen because they highlight special snippets or short moments during signature songs that could warrant further observation of the ordered or chaotic underlying sound structure. Once printed, each piece creates a striking object that allows for ease of visual comparison.

 

The four selections shown here include:

 

1) “Young Americans” – David Bowie. The brief pause at 4:19. (youtube link) Also, per Jennifer Egan in A Visit to the Goon Squad: “This is a lost opportunity. Hell, it would’ve been so easy to draw out the pause after ‘…break down and cry…’ to a full second, or 2, or 3, but Bowie must’ve chickened out for some reason.”

 

2) “Ride of the Valkyries” – Richard Wagner. The introduction of the main theme including the arrival of the brass instruments. (youtube link)

 

3) “Mood Indigo” – Duke Ellington. Jimmy Hamilton’s introduction on the clarinet. (youtube link)

 

4) “Sonified Starlight” – NASA. Translation of light waves emanating from star KIC 7671081B into an audible pattern via NASA’s Kepler Input Catalog. (soundcloud link)

 

Lastly, drop me a line if you’d be interested in your own 3D printed soundwave.

 
 

3D-PRINTS-01b

3D-PRINTS-KEPLER

“Sonified Starlight” – NASA. Translation of light waves emanating from star KIC 7671081B into an audible pattern via NASA’s Kepler Input Catalog. (soundcloud link)

 

3D-PRINTS-BOWIE

“Young Americans” – David Bowie. The brief pause at 4:19. (youtube link)

 

3D-PRINTS-VALKRIE

“Ride of the Valkyries” – Richard Wagner. The introduction of the main theme including the arrival of the brass instruments. (youtube link)

 

3D-PRINTS-MOOD-INDIGO-C

“Mood Indigo” – Duke Ellington. Jimmy Hamilton’s introduction on the clarinet. (youtube link)

 

WAVE01-FINAL-WEBMOODINDIGO01-FINAL-WEBKEPLER-FINAL-WEBBOWIE-FINAL-WEB

3D-PRINTS-VALKRIES-AXO-BW3D-PRINTS-MOOD-INDIGO-AXO-BW3D-PRINTS-KEPLER-AXO-BW3D-PRINTS-BOWIE-AXO

]]>
http://gracefulspoon.com/blog/2015/05/29/3dp-soundwave/feed/ 1
soundwave graphics http://gracefulspoon.com/blog/2010/10/24/soundwave-graphics/ http://gracefulspoon.com/blog/2010/10/24/soundwave-graphics/#comments Sun, 24 Oct 2010 15:54:15 +0000 http://gracefulspoon.com/blog/?p=1760 comp01

comp01

comp01

comp01

comp01

comp01

 

Working on a series of comparative analysis of New York groups with Jackie.

]]>
http://gracefulspoon.com/blog/2010/10/24/soundwave-graphics/feed/ 8
interactive elevator installation http://gracefulspoon.com/blog/2009/05/24/interactive-elevator-installation/ http://gracefulspoon.com/blog/2009/05/24/interactive-elevator-installation/#respond Sun, 24 May 2009 21:03:50 +0000 http://gracefulspoon.com/blog/?p=497 living01
For our living architecture course, we created an interactive light installation in the elevator of Avery Hall, controllable by anyone with a cell phone and a twitter account. The simplified process includes texting an emotion to twitter from any cellular phone using the #livarch hashtag. That tweet is then picked up by a realtime search, fed through our twitterfeed rss, then added to our own twitter account. For a more detailed explanation, see this previous post on getting multiple twitter users onto one twitter feed. That emotion is then directed to our pachube feed and sent through processing to an arduino microcontroller that controls the color and pulsing of the individual leds. The installation non-invasively attaches to the surface of the elevator via magnets. Allowing it to be placed on any metal surface, such as a building exterior, furniture, or a vehicle.

 

The lights within the elevator respond to the mood of the user. For instance, if a student texted “happy #livarch” the space within the elevator would begin to slowly pulse with a greenish/blue hue. However, if another student sent “angry #livarch” the first light will quickly flash a bright red. There are twelve lights total and show the collective mood of the twelve most recent users.

 

In this way, the elevator becomes a living representation of the collective mood of the building, but it is also hoped that a feedback loop can be created, a loop that actually influences the mood of those that ride the elevator. The emotion felt in the lobby will be altered by the time you reach the sixth floor. And that new emotion becomes what gets texted back to the elevator.

 

Lastly, future installations will be physically located away from the target user. For instance, Avery’s mood will be projected to the elevator in Uris Hall and vice versa. In this manner, we can both create a new form of pen-pal with distant locations, but also hope that our mood, whether angry, sad, happy or nervous, will both manifest itself in a new form of architecture, but also have an effect on the greater world around us.

 

The project team also included Talya Jacobs and Guanghong Ou.
See more for video and code:

 

living02c

living02b

living02

living03

living03b

living04

living05

living06

Super-Long Source Code:
The main thing to remember is in arduino to load the ‘standard firmata’ library and in processing to use the EEML language d.getStringValue(0); to make sure the value of stream id 0 is a word, or string, rather than a numeric value.

import processing.serial.*;
import cc.arduino.*;

import eeml.*;

Serial port; //Create object from Serial class

Arduino arduino;

String myValue;

String Led1Status;
String Led2Status;
String Led3Status;
String Led4Status;
String Led5Status;
String Led6Status;

String turnAngry = “angry”;
String turnAngryLiv = “angry_#livarch”;

String turnCalm = “calm”;
String turnCalmLiv = “calm_#livarch”;

String turnRelaxed = “relaxed”;
String turnRelaxedLiv = “relaxed_#livarch”;

String turnNervous = “nervous”;
String turnNervousLiv = “nervous_#livarch”;

String turnHappy = “happy”;
String turnHappyLiv = “happy_#livarch”;

String turnSad = “sad”;
String turnSadLiv = “sad_#livarch”;

DataIn dIn;

int value = 0;
int x = 0;
//int waitTime= 30; // 10ms delay

int Led1Red = 13;
int Led1Green = 2;
int Led1Blue = 3;

int Led2Red = 4;
int Led2Green = 5;
int Led2Blue = 6;

int Led3Red = 7;
int Led3Green = 8;
int Led3Blue = 9;

int Led4Red = 10;
int Led4Green = 11;
int Led4Blue = 12;

int Led5Red = 14;
int Led5Green = 15;
int Led5Blue = 16;

int Led6Red = 17;
int Led6Green = 18;
int Led6Blue = 19;

void setup()
{
frameRate(200);

println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[0], 115200);

dIn = new DataIn(this, “http://www.pachube.com/api/1499.xml”, “fe2ac5cde083af08a353b9862a8d65b4d62caf94a40bfa5e6ea90f82f244f0ac”, 50000);
println(Serial.list());

arduino.pinMode(Led6Red, Arduino.OUTPUT);
arduino.pinMode(Led6Green, Arduino.OUTPUT);
arduino.pinMode(Led6Blue, Arduino.OUTPUT);
}

void draw(){
x += 1;
if (x>2){ //Set Time Here
x = 0;
x+= 1;
}

println(x);
if (x == 2) {
//if (Led1Status != myValue){
Led6Status = Led5Status;
Led5Status = Led4Status;
Led4Status = Led3Status;
Led3Status = Led2Status;
Led2Status = Led1Status;
Led1Status = myValue;
//}
}
println(“led2Status: ” + Led1Status);
println(“led2Status: ” + Led2Status);
println(“led3Status: ” + Led3Status);
println(“led4Status: ” + Led4Status);
println(“led5Status: ” + Led4Status);
println(“led6Status: ” + Led4Status);

//——————–IF/THEN-LED5————————————————————-

if((turnAngry.equals(Led5Status)) || (turnAngryLiv.equals(Led5Status))){
angry5();
}
else

if((turnCalm.equals(Led5Status)) || (turnCalmLiv.equals(Led5Status))){
calm5();
}
else

if((turnNervous.equals(Led5Status)) || (turnNervousLiv.equals(Led5Status))){
nervous5();
}
else

if((turnHappy.equals(Led5Status)) || (turnHappyLiv.equals(Led5Status))){
happy5();
}
else

if((turnSad.equals(Led5Status)) || (turnSadLiv.equals(Led5Status))){
sad5();
}

//——————–IF/THEN-LED4————————————————————-

if((turnAngry.equals(Led4Status)) || (turnAngryLiv.equals(Led4Status))){
angry4();
}
else

if((turnCalm.equals(Led4Status)) || (turnCalmLiv.equals(Led4Status))){
calm4();
}
else

if((turnNervous.equals(Led4Status)) || (turnNervousLiv.equals(Led4Status))){
nervous4();
}
else

if((turnHappy.equals(Led4Status)) || (turnHappyLiv.equals(Led4Status))){
happy4();
}
else

if((turnSad.equals(Led4Status)) || (turnSadLiv.equals(Led4Status))){
sad4();
}

//——————–IF/THEN-LED3————————————————————-

if((turnAngry.equals(Led3Status)) || (turnAngryLiv.equals(Led3Status))){
angry3();
}
else

if((turnCalm.equals(Led3Status)) || (turnCalmLiv.equals(Led3Status))){
calm3();
}
else

if((turnNervous.equals(Led3Status)) || (turnNervousLiv.equals(Led3Status))){
nervous3();
}
else

if((turnHappy.equals(Led3Status)) || (turnHappyLiv.equals(Led3Status))){
happy3();
}
else

if((turnSad.equals(Led3Status)) || (turnSadLiv.equals(Led3Status))){
sad3();
}

//——————–IF/THEN-LED2————————————————————-

if((turnAngry.equals(Led2Status)) || (turnAngryLiv.equals(Led2Status))){
angry2();
}
else

if((turnCalm.equals(Led2Status)) || (turnCalmLiv.equals(Led2Status))){
calm2();
}
else

if((turnNervous.equals(Led2Status)) || (turnNervousLiv.equals(Led2Status))){
nervous2();
}
else

if((turnHappy.equals(Led2Status)) || (turnHappyLiv.equals(Led2Status))){
happy2();
}
else

if((turnSad.equals(Led2Status)) || (turnSadLiv.equals(Led2Status))){
sad2();
}

//——————–IF/THEN-LED1————————————————————-

if((turnAngry.equals(Led1Status)) || (turnAngryLiv.equals(Led1Status))){
angry1();
}
else

if((turnCalm.equals(Led1Status)) || (turnCalmLiv.equals(Led1Status))){
calm1();
}
else

if((turnNervous.equals(Led1Status)) || (turnNervousLiv.equals(Led1Status))){
nervous1();
}
else

if((turnHappy.equals(Led1Status)) || (turnHappyLiv.equals(Led1Status))){
happy1();
}
else

if((turnSad.equals(Led1Status)) || (turnSadLiv.equals(Led1Status))){
sad1();
}

//——————–IF/THEN-LED6————————————————————-

if((turnAngry.equals(Led6Status)) || (turnAngryLiv.equals(Led6Status))){
angry6();
}
else

if((turnCalm.equals(Led6Status)) || (turnCalmLiv.equals(Led6Status))){
calm6();
}
else

if((turnNervous.equals(Led6Status)) || (turnNervousLiv.equals(Led6Status))){
nervous6();
}
else

if((turnHappy.equals(Led6Status)) || (turnHappyLiv.equals(Led6Status))){
happy6();
}
else

if((turnSad.equals(Led6Status)) || (turnSadLiv.equals(Led6Status))){
sad6();
}

}

//——————–CALM——–CALM————————————————————–

void calm1(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led1Blue, value); arduino.analogWrite(Led1Green, 130); arduino.analogWrite(Led1Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led1Blue, value);
arduino.analogWrite(Led1Green, 130);
arduino.analogWrite(Led1Red, 0);
delay(25);
}
}

void calm2(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led2Blue, value); arduino.analogWrite(Led2Green, 130); arduino.analogWrite(Led2Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led2Blue, value);
arduino.analogWrite(Led2Green, 130);
arduino.analogWrite(Led2Red, 0);
delay(25);
}
}

void calm3(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led3Blue, value); arduino.analogWrite(Led3Green, 130); arduino.analogWrite(Led3Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led3Blue, value);
arduino.analogWrite(Led3Green, 130);
arduino.analogWrite(Led3Red, 0);
delay(25);
}
}

void calm4(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led4Blue, value); arduino.analogWrite(Led4Green, 130); arduino.analogWrite(Led4Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led4Blue, value);
arduino.analogWrite(Led4Green, 130);
arduino.analogWrite(Led4Red, 0);
delay(25);
}
}

void calm5(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led5Blue, value); arduino.analogWrite(Led5Green, 130); arduino.analogWrite(Led5Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led5Blue, value);
arduino.analogWrite(Led5Green, 130);
arduino.analogWrite(Led5Red, 0);
delay(25);
}
}

void calm6(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led6Blue, value); arduino.analogWrite(Led6Green, 130); arduino.analogWrite(Led6Red, 0); delay(25); } for(value = 255; value >=0; value –)
{
arduino.analogWrite(Led6Blue, value);
arduino.analogWrite(Led6Green, 130);
arduino.analogWrite(Led6Red, 0);
delay(25);
}
}

//——————–ANGRY——–ANGRY————————————————————–

void angry1(){
arduino.analogWrite(Led1Red,255);
//arduino.analgoWrite(Led1Green, 0);
arduino.analogWrite(Led1Blue, 0);
delay(10);
arduino.analogWrite(Led1Red,0);
//arduino.analgoWrite(Led1Green, 0);
arduino.analogWrite(Led1Blue, 0);
delay(10);
}

void angry2(){
arduino.analogWrite(Led2Red,255);
//arduino.analgoWrite(Led2Green, 0);
arduino.analogWrite(Led2Blue, 0);
delay(10);
arduino.analogWrite(Led2Red,0);
//arduino.analgoWrite(Led2Green, 0);
arduino.analogWrite(Led2Blue, 0);
delay(10);
}

void angry3(){
arduino.analogWrite(Led3Red,255);
//arduino.analgoWrite(Led3Green, 0);
arduino.analogWrite(Led3Blue, 0);
delay(10);
arduino.analogWrite(Led3Red,0);
//arduino.analgoWrite(Led3Green, 0);
arduino.analogWrite(Led3Blue, 0);
delay(10);
}

void angry4(){
arduino.analogWrite(Led4Red,255);
//arduino.analgoWrite(Led4Green, 0);
arduino.analogWrite(Led4Blue, 0);
delay(10);
arduino.analogWrite(Led4Red,0);
//arduino.analgoWrite(Led4Green, 0);
arduino.analogWrite(Led4Blue, 0);
delay(10);
}

void angry5(){
arduino.analogWrite(Led5Red,255);
//arduino.analgoWrite(Led5Green, 0);
arduino.analogWrite(Led5Blue, 0);
delay(10);
arduino.analogWrite(Led5Red,0);
//arduino.analgoWrite(Led5Green, 0);
arduino.analogWrite(Led5Blue, 0);
delay(10);
}

void angry6(){
arduino.analogWrite(Led6Red,255);
//arduino.analgoWrite(Led6Green, 0);
arduino.analogWrite(Led6Blue, 0);
delay(10);
arduino.analogWrite(Led6Red,0);
//arduino.analgoWrite(Led6Green, 0);
arduino.analogWrite(Led6Blue, 0);
delay(10);
}

//——————–Nervous——–Nervous————————————————————–

void nervous1(){
arduino.analogWrite(Led1Green,255);
arduino.analogWrite(Led1Red, 120);
arduino.analogWrite(Led1Blue, 0);
delay(300);
arduino.analogWrite(Led1Green,0);
arduino.analogWrite(Led1Red,120);
arduino.analogWrite(Led1Blue, 0);
delay(300);
}

void nervous2(){
arduino.analogWrite(Led2Green,255);
arduino.analogWrite(Led2Red, 120);
arduino.analogWrite(Led2Blue, 0);
delay(300);
arduino.analogWrite(Led2Green,0);
arduino.analogWrite(Led2Red,120);
arduino.analogWrite(Led2Blue, 0);
delay(300);
}

void nervous3(){
arduino.analogWrite(Led3Green,255);
arduino.analogWrite(Led3Red, 120);
arduino.analogWrite(Led3Blue, 0);
delay(300);
arduino.analogWrite(Led3Green,0);
arduino.analogWrite(Led3Red,120);
arduino.analogWrite(Led3Blue, 0);
delay(300);
}

void nervous4(){
arduino.analogWrite(Led4Green,255);
arduino.analogWrite(Led4Red, 120);
arduino.analogWrite(Led4Blue, 0);
delay(300);
arduino.analogWrite(Led4Green,0);
arduino.analogWrite(Led4Red,120);
arduino.analogWrite(Led4Blue, 0);
delay(300);
}

void nervous5(){
arduino.analogWrite(Led5Green,255);
arduino.analogWrite(Led5Red, 120);
arduino.analogWrite(Led5Blue, 0);
delay(300);
arduino.analogWrite(Led5Green,0);
arduino.analogWrite(Led5Red,120);
arduino.analogWrite(Led5Blue, 0);
delay(300);
}

void nervous6(){
arduino.analogWrite(Led6Green,255);
arduino.analogWrite(Led6Red, 120);
arduino.analogWrite(Led6Blue, 0);
delay(300);
arduino.analogWrite(Led6Green,0);
arduino.analogWrite(Led6Red,120);
arduino.analogWrite(Led6Blue, 0);
delay(300);
}

//——————–Happy——–Happy————————————————————–

void happy1(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led1Blue, value); arduino.analogWrite(Led1Green, 255-value); arduino.analogWrite(Led1Red, 0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led1Blue, value);
arduino.analogWrite(Led1Green, 255-value);
arduino.analogWrite(Led1Red, 0);
delay(25);
}
}

void happy2(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led2Blue, value); arduino.analogWrite(Led2Green, 255-value); arduino.analogWrite(Led2Red, 0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led2Blue, value);
arduino.analogWrite(Led2Green, 255-value);
arduino.analogWrite(Led2Red, 0);
delay(25);
}
}

void happy3(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led3Blue, value); arduino.analogWrite(Led3Green, 255-value); arduino.analogWrite(Led3Red, 0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led3Blue, value);
arduino.analogWrite(Led3Green, 255-value);
arduino.analogWrite(Led3Red, 0);
delay(25);
}
}

void happy4(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led4Blue, value); arduino.analogWrite(Led4Green, 255-value); arduino.analogWrite(Led4Red,0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led4Blue, value);
arduino.analogWrite(Led4Green, 255-value);
arduino.analogWrite(Led4Red, 0);
delay(25);
}
}

void happy5(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led5Blue, value); arduino.analogWrite(Led5Green,255-value); arduino.analogWrite(Led5Red, 0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led5Blue, value);
arduino.analogWrite(Led5Green, 255-value);
arduino.analogWrite(Led5Red, 0);
delay(25);
}
}

void happy6(){

for(value = 0; value<=255; value++){ arduino.analogWrite(Led6Blue, value); arduino.analogWrite(Led6Green, 255-value); arduino.analogWrite(Led6Red, 0); delay(25); } for(value = 255; value >=0; value -=15)
{
arduino.analogWrite(Led6Blue, value);
arduino.analogWrite(Led6Green, 255-value);
arduino.analogWrite(Led6Red, 0);
delay(25);
}
}

//——————–Sad——–Sad————————————————————–

void sad1(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led1Blue, value); arduino.analogWrite(Led1Green, 0); arduino.analogWrite(Led1Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led1Blue, 255);
arduino.analogWrite(Led1Green, value);
arduino.analogWrite(Led1Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led1Blue, 255-value); arduino.analogWrite(Led1Green, 255); arduino.analogWrite(Led1Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led1Blue, 120);
arduino.analogWrite(Led1Green, 255-value);
arduino.analogWrite(Led1Red, 0);
delay(10);
}
}

void sad2(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led2Blue, value); arduino.analogWrite(Led2Green, 0); arduino.analogWrite(Led2Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led2Blue, 255);
arduino.analogWrite(Led2Green, value);
arduino.analogWrite(Led2Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led2Blue, 255-value); arduino.analogWrite(Led2Green, 255); arduino.analogWrite(Led2Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led2Blue, 120);
arduino.analogWrite(Led2Green, 255-value);
arduino.analogWrite(Led2Red, 0);
delay(10);
}
}

void sad3(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led3Blue, value); arduino.analogWrite(Led3Green, 0); arduino.analogWrite(Led3Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led3Blue, 255);
arduino.analogWrite(Led3Green, value);
arduino.analogWrite(Led3Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led3Blue, 255-value); arduino.analogWrite(Led3Green, 255); arduino.analogWrite(Led3Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led3Blue, 120 );
arduino.analogWrite(Led3Green, 255-value);
arduino.analogWrite(Led3Red, 0);
delay(10);
}
}

void sad4(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led4Blue, value); arduino.analogWrite(Led4Green, 0); arduino.analogWrite(Led4Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led4Blue, 255);
arduino.analogWrite(Led4Green, value);
arduino.analogWrite(Led4Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led4Blue, 255-value); arduino.analogWrite(Led4Green, 255); arduino.analogWrite(Led4Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led4Blue, 120);
arduino.analogWrite(Led4Green, 255-value);
arduino.analogWrite(Led4Red, 0);
delay(10);
}
}

void sad5(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led5Blue, value); arduino.analogWrite(Led5Green, 0); arduino.analogWrite(Led5Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led5Blue, 255);
arduino.analogWrite(Led5Green, value);
arduino.analogWrite(Led5Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led5Blue, 255-value); arduino.analogWrite(Led5Green, 255); arduino.analogWrite(Led5Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led5Blue, 120 );
arduino.analogWrite(Led5Green, 255-value);
arduino.analogWrite(Led5Red, 0);
delay(10);
}
}

void sad6(){

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led6Blue, value); arduino.analogWrite(Led6Green, 0); arduino.analogWrite(Led6Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led6Blue, 255);
arduino.analogWrite(Led6Green, value);
arduino.analogWrite(Led6Red, 0);
delay(10);
}

for(value = 0; value<=255; value+=5){ arduino.analogWrite(Led6Blue, 255-value); arduino.analogWrite(Led6Green, 255); arduino.analogWrite(Led6Red, 0); delay(10); } for(value = 255; value >=0; value -=5)
{
arduino.analogWrite(Led6Blue, 120 );
arduino.analogWrite(Led6Green, 255-value);
arduino.analogWrite(Led6Red, 0);
delay(10);
}
}

void onReceiveEEML(DataIn d){

//set the value of remoteValue to equal the value of stream id 0 of the feed notated by d
String remoteValue = d.getStringValue(0);

myValue = (remoteValue);

}

]]>
http://gracefulspoon.com/blog/2009/05/24/interactive-elevator-installation/feed/ 0
the remix http://gracefulspoon.com/blog/2009/05/03/the-remix/ http://gracefulspoon.com/blog/2009/05/03/the-remix/#respond Sun, 03 May 2009 05:00:51 +0000 http://gracefulspoon.com/blog/?p=444 john_laurent
Mark Collins & Toru Hasegawa, the masterminds behind Proxyarch, and instructors of the course Search: Advanced Algorithmic Design at Columbia, ‘remixed’ the audio waveform code into something much more smooth and elegant. They’re awesome, and there were a lot of super interesting projects from the course which can all be viewed in the video here.

]]>
http://gracefulspoon.com/blog/2009/05/03/the-remix/feed/ 0
visualizing sound in processing http://gracefulspoon.com/blog/2009/04/02/visualizing-sound-in-processing/ http://gracefulspoon.com/blog/2009/04/02/visualizing-sound-in-processing/#comments Fri, 03 Apr 2009 03:33:51 +0000 http://gracefulspoon.com/blog/?p=395 02_waveforms
This was the final applet in motion. Using the minim library for processing, each waveform is generated in realtime as the two sounds play over eachother creating a pretty chaotic sound, but there are some instances of overlapping patterns where the mashup works pretty well. In the third version of the code, the boolean of the two waveforms is generated, producing a new way to visualize the waveforms. View the youtube video here, but I really need to figure out a way to add sound to the video, silence doesn’t do it justice. Charlie Parker, Iggy Pop and Richard Wagner comparison + code:

 

graphs_990

 


01_waveform
02_waveforms1
03_waveforms

import processing.dxf.*;
import ddf.minim.analysis.*;
import ddf.minim.*;
FFT fftLog1;
FFT fftLog2;

Waveform myRects;

Minim minim;
AudioPlayer groove1;
AudioPlayer groove2;

boolean record;

PFont font;
PFont fontoutline;

void setup(){
size(1200,600,P3D);
noStroke();
minim = new Minim(this);
groove1 = minim.loadFile(“groove_iggy.mp3”);
groove2 = minim.loadFile(“groove_wagner.mp3”);

groove1.loop();//repeat each song
groove2.loop();

font = loadFont(“HelveticaNeueLT-Bold-18.vlw”);
fontoutline = loadFont(“HelveticaNeueLT-Bold-18.vlw”);

fftLog1 = new FFT(groove1.bufferSize(),groove1.sampleRate()); //create the FFT logarithmic scale
fftLog2 = new FFT(groove2.bufferSize(),groove2.sampleRate());
fftLog1.logAverages(22,4); //adjust numbers to adjust spacing
fftLog2.logAverages(22,4);

float w1 = float ((fftLog1.avgSize()+fftLog2.avgSize())/2);
float x = w1;
float y = 0;
float z = 50;
myRects = new Waveform(x,y,z);

}

void draw(){
background(15);
directionalLight(126,126,126,sin(radians(frameCount)),cos(radians(frameCount)),1);
ambientLight(152,152,152);

for(int i = 0; i < fftLog1.avgSize(); i++){ int w = int(width/fftLog1.avgSize()); float zoom = 1; float jitter = (max(fftLog1.getAvg(i)*200,fftLog2.getAvg(i)*200 )); //jitter in camera influenced by waveform PVector foc = new PVector((myRects.x*.5+jitter*.5), myRects.y+jitter, 0); PVector cam = new PVector(zoom, zoom, -zoom); if (frameCount < 260){ camera(foc.x+cam.x,foc.y+(cam.y-1500*(cos(radians(-frameCount+60)))),foc.z+cam.z-400, foc.x,foc.y,foc.z-100, 0,0,1); //println(-1500*(cos(radians(-frameCount+60)))); } else { camera(foc.x+cam.x,foc.y+(cam.y+1418.278),foc.z+cam.z-400,foc.x,foc.y,foc.z-100,0,0,1); } } fftLog1.forward(groove1.mix); //play each song fftLog2.forward(groove2.mix); myRects.update1(); //update each waveform+boolean myRects.update2(); myRects.update3(); myRects.textdraw1(); //draw z height for song waveforms myRects.textdraw2(); if(record){ beginRaw(DXF, "output.dxf"); } // DXF will export the stuff drawn between here. myRects.plotBoolean(); //create surfaces myRects.plotTrace1(); myRects.plotTrace2(); if(record){ endRaw(); record = false; println("Done DXF~!"); } } void stop() { groove1.close(); // always close Minim audio classes when you finish with them groove2.close(); minim.stop(); // always stop Minim before exiting super.stop(); } class Waveform{ float x,y,z; PVector[] pts1 = new PVector[fftLog1.avgSize()]; PVector[] pts2 = new PVector[fftLog2.avgSize()]; PVector[] pts3 = new PVector[fftLog1.avgSize()]; //needed for boolean waveform PVector[] trace1 = new PVector[0]; PVector[] trace2 = new PVector[0]; PVector[] trace3 = new PVector[0]; //needed for boolean waveform Waveform(float incomingX, float incomingY, float incomingZ){ x = incomingX; y = incomingY; z = incomingZ; } void update1(){ //plot boolean waveform plotB(); } void plotB(){ for(int i = 0; i < fftLog1.avgSize(); i++){ int w = int(width/fftLog1.avgSize()); x = i*w-1050; //adjust the x position of the waveform here y = frameCount*5; z = height/4-fftLog1.getAvg(i)*10; stroke(0); point(x, y, z); pts1[i] = new PVector(x, y, z); //increase size of array trace by length+1 trace1 = (PVector[]) expand(trace1, trace1.length+1); //always get the next to last trace1[trace1.length-1] = new PVector(pts1[i].x, pts1[i].y, pts1[i].z); } } void plotBoolean(){ stroke(255,80); int inc = (fftLog1.avgSize()+fftLog2.avgSize())/2; for(int i=1; i<(trace1.length+trace2.length)/2-inc; i++){ if(i%inc != 0){ beginShape(TRIANGLE_STRIP); float value = (trace1[i].z*100); float m = map(value, -500, 20000, 0, 255); fill(m*2, 125, -m*2, 140); int threshold = 15; if (trace1[i].z220){
textFont(fontoutline, 24);
fill(155);
text(“wagner”,200,500,0);
text(“iggy”,900,500,0);
text(“max(iggy-wagner)”,500,500,0);
}
}
}
void plotTrace1(){
stroke(255,80);
int inc = fftLog1.avgSize();

for(int i=1; i

]]>
http://gracefulspoon.com/blog/2009/04/02/visualizing-sound-in-processing/feed/ 8
iggy wave http://gracefulspoon.com/blog/2009/03/06/iggy-wave/ http://gracefulspoon.com/blog/2009/03/06/iggy-wave/#comments Sat, 07 Mar 2009 03:11:38 +0000 http://gracefulspoon.com/blog/?p=315 dog
“Now I Wanna Be Your Dog” as a 3d landscape. I was using the minim library in processing to visualize the sound level data stream, then exporting out to rhino. Many thanks to the proxyarch team for help with the code.

 

EDIT:
Added link to processing app, see it in action (loud rock music will begin playing…so turn it up!)

 

http://gracefulspoon.com/processingapps/singlewave/index.html

 

processingapp


import processing.dxf.*;
import ddf.minim.analysis.*;
import ddf.minim.*;
FFT fftLin;
FFT fftLog;

Waveform myRects;

Minim minim;
AudioPlayer groove;

boolean record;

void setup(){
size(1000, 500, P3D);
noStroke();
minim = new Minim(this);
groove = minim.loadFile(“groove.mp3”);
groove.loop();
background(255);

fftLog = new FFT(groove.bufferSize(), groove.sampleRate());
fftLog.logAverages(22, 4); //adjust spacing here

float w = float(width/fftLog.avgSize());
float x = w;
float y = 0;
float z = 50;
float radius = 10;
myRects = new Waveform(x,y,z,radius);
}

void draw(){
background(0);
directionalLight(126,126,126,sin(radians(frameCount)),cos(radians(frameCount)),1);
ambientLight(102,102,102);

float zoom = 1000;
PVector foc = new PVector(myRects.x*0.5, myRects.y*0.5, 0);
PVector cam = new PVector(zoom*sin(radians(frameCount)), zoom*cos(radians(frameCount)), -zoom);
camera(foc.x+cam.x,foc.y+cam.y,foc.z+cam.z,foc.x,foc.y,foc.z,0,0,1);

//play the song
fftLog.forward(groove.mix);

myRects.update();

if(record){
beginRaw(DXF, “output.dxf”);
}
// DXF will export the stuff drawn between here.

myRects.plotTrace();

if(record){
endRaw();
record = false;
println(“Done DXF~!”);
}
}

void stop() {
// always close Minim audio classes when you finish with them
groove.close();
// always stop Minim before exiting
minim.stop();
super.stop();
}

class Waveform{
float x,y,z;
float radius;

PVector[] pts = new PVector[fftLog.avgSize()];

PVector[] trace = new PVector[0];

Waveform(float incomingX, float incomingY, float incomingZ, float incomingRadius){
x = incomingX;
y = incomingY;
z = incomingZ;
radius = incomingRadius;
}

void update(){
plot();
}

void plot(){
for(int i = 0; i < fftLog.avgSize(); i++){ int w = int(width/fftLog.avgSize()); x = i*w; y = frameCount*5; z = height/4-fftLog.getAvg(i)*10; stroke(0); point(x, y, z); pts[i] = new PVector(x, y, z); trace = (PVector[]) expand(trace, trace.length+1); trace[trace.length-1] = new PVector(pts[i].x, pts[i].y, pts[i].z); } } void plotTrace(){ /* //drawing points for(int i=0; i ]]> http://gracefulspoon.com/blog/2009/03/06/iggy-wave/feed/ 44 processing growth http://gracefulspoon.com/blog/2009/02/28/processing-growth/ http://gracefulspoon.com/blog/2009/02/28/processing-growth/#respond Sat, 28 Feb 2009 19:48:31 +0000 http://gracefulspoon.com/blog/?p=146 growingpoints

 

Looking at simple growth with classes and arrays. Next up, programming more behavior into the system.

]]>
http://gracefulspoon.com/blog/2009/02/28/processing-growth/feed/ 0
Processing to Rhino http://gracefulspoon.com/blog/2009/02/28/processing-to-rhino/ http://gracefulspoon.com/blog/2009/02/28/processing-to-rhino/#respond Sat, 28 Feb 2009 19:12:27 +0000 http://gracefulspoon.com/blog/?p=139 upload011
upload021

 

I was playing around with different processing sketches and different export procedures to get cool images out of rhino. The dxf exporter works great for lines and solids, then once in rhino run a simple grasshopper command to pipe all the curves.

]]>
http://gracefulspoon.com/blog/2009/02/28/processing-to-rhino/feed/ 0