ANTITRUST

What Is The Thing?

A system to comfort, entice, and demand conditions of physical trust.

Three pointy-looking stools around a room, each topped with grass, each with a bit of text and an interactive thing on top of it. One stool has a mirror and a veil, one has an old green telephone, and one has a little child’s microphone with a switch. Interacting with these things makes little bells ring in other locations in the space. The bell sounds come from small speakers in the shapes of cubes hanging from the ceiling. Finally, there is a little oval bed on the floor nearby, with a grass mattress and a pillow. When you lay on the bed, there are little speakers by your ears that immerse you in natural sounds, and little bass speakers in the bed that give you a massage. When people use the things on the stools, it affects the sounds and feelings you get laying in the bed. If all the things on the stools are being used at once, a person in the bed will hear a special bell and will get a quiet secret message.

The stations are positioned around the space, so they can be discovered and interacted with individually, with their effects adding up on the edge of view or hearing. The texts by the stations are printed on small blocks, depicting Helvetica font in a mac os TextEdit window.

The texts:
Phone – you could call them after work to catch up
Microphone – you could give them permission by saying it first
Mirror – you could look them in the eye as they ring you up
Bed – you could get some rest

WHAT DOES THIS LOOK LIKE?
Objects in their natural environment

Objects in their natural environment

Objects in their natural environment, detail

The bed station in use

objects in use

VID_20190926_183515

WHAT WAS THE PROcess?

Step one: I was interested in machines that would have a contemplative, peaceful quality to them, and which would involve a viewer’s physical body. First, I came up with a number of impractical and expensive projects that I didn’t know how to do. A few of those are noted below.

bad ideas that don’t work

Step two: I decided to focus on feeling rather than technology, and see if that resulted in project ideas that were a little easier to build. Thinking about recent moments in my life: at the grocery store, on the phone to a parent, calling a dear friend who I miss but have difficulty reaching out to out of the blue, I thought I could give myself some options for how to live with a little more openness, and hypothetically (working ahead with deductive reasoning) a little more joy.

better ideas that might work

Armed with this functional plan, I got to work. I built the stools with bandsaw and router, cut out the speakers with a mitering tablesaw, and used a CNC router to make the arcs to frame the bed.

This might shock you, but it turns out that having a robot cut plywood for you is easier than cutting it yourself. I ended up adopting a few edits to the design for the handmade pieces along the way as I ran into trouble with hand fabrication. For example, the speakers were initially planned to have a pyramidal shape. Lacking the expertise to make extremely acute bevel cuts in 1/4″ plywood, I ended up going for a cube design. It took some sanding to get the glue stains off, but it more or less worked. I stuffed the boxes with fluff and put a knot in the internal cable for strain relief, and the speakers sounded OK and could hang on their own weight.

Design for the stool legs and the initial, more complex speaker shape (and driver layout) is below. The simpler driver layout meant I didn’t get a true full-range output– maybe a filter above 5k or so– but for the bell sounds, it wasn’t a serious problem for sound quality.

In order to have the simple logic switches on the stools trigger complicated sounds, I decided to use standard theater show control software, and use an arduino as just a trigger machine– like a drum pad on a MIDI controller. The arduino sent particular char values to a computer over the serial port when various logic conditions were met. I made a patch in Max/MSP to interpret the serial data and turn it into MIDI commands, which I then sent to QLab, the industry standard theater-sound program. In QLab, I could level and layer sound, and add effects like reverb to particular bits of audio that needed to be “smoothed out”. Everything needed to be smoothed out.

Another issue: this computer setup is ugly! It needed to be hidden somewhere far, far away. Initially, I thought it would be a good idea to use radio to make the stools wireless and able to go far afield. Instead, as I ran out of time, I noticed that our studio has a lot of XLR cables– so I made all the stools have XLR terminations, so I could use the existing cable to run them, wired, up to fifty feet away. This took some trial and error, as the inevitable impedance drop on the long cable messed up some of the more fragile voltages… For the microphone, I found that the amplifier chip had to be on the computer side of the cable run, or else the XLR wouldn’t properly carry its power supply. Ah well.I used a MOTU USB sound card an a six-channel restaurant power amplifier to get sound around to all the speakers– including to the four speakers down in the bed. That’s three channels: left and right for the ears, and one subwoofer channel split to two speakers, one under the pillow and one under the participant’s right hand (covered with grass of course). The specific rigging and placement for these speakers came from a lot of trial and error! I initially expected the subwoofers to be able to resonate the floor under the bed, but in a concrete basement gallery, this turned out to be wishful thinking. I found that a subwoofer under the head was most effective at making the whole body feel like it was being shaken; but in order to keep it from being overwhelming, I buried it inside extra grass under the pillow. The ultimate effect was that participants thought the hand buzzer was the only one that was active, while still having an immersive full-body experience.

And as for the triggered music, it sounds like this when it’s all playing:

And this is the secret message:

 

HOW DID THIS WORK, LIKE, LITERALLY?

With a microphone –> electret preamplifier; phone –> basic switch; and mirror –> ultrasonic rangefinder for when the “veil” is drawn back.

 

Logic diagram for the monstrosity

arduino – at least how it looks

For the arduino, it’s pretty simple: there are three inputs, on pins of your choosing. All outputs are via Serial back to the computer.

#include <NewPing.h>

const int triggerPin = 12;
const int echoPin = 13;
const int buttonOnePin = 2;
const int micPin = A0;

const int micLimit = 20;
const int pingFar = 20;
const int buttonFilterTime = 3000;
const int pingFilterTime = 3000;
const int micFilterTime = 4000;

bool buttonActive = false;
bool micActive = false;
bool pingActive = false;
char nextCmd;
char lastCmd = 0;

int serialvalue;
int started = 0;
int pingDist = 0;
int micVal = 0;
NewPing sonar(triggerPin,echoPin,500);

//time measures for filtering
long timeElapsed = 0;
long buttonTime = 0;
long micTime = 0;
long pingTime = 0;

char currCmd, prevCmd;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(buttonOnePin, INPUT);
}

void loop() {
  //get sensor data
  int buttonOne = digitalRead(buttonOnePin);
  micVal = analogRead(micPin);
  micVal = abs(micVal-512);
  pingDist = sonar.ping_cm();

  //open serial connection, wait for input before sending
  if(Serial.available()){
    serialvalue = Serial.read();
    started = 1;
    }
  //send trigger char to serial if sensor conditions met
  
  if(started){

    timeElapsed = millis();
    buttonActive = (timeElapsed-buttonTime)<buttonFilterTime;
    pingActive = (timeElapsed-pingTime)<pingFilterTime;
    micActive = (timeElapsed-micTime)<micFilterTime;

    //Serial.println(micVal);
    Serial.println(pingDist);
    
    if(buttonOne==HIGH && !buttonActive) {
      buttonTime = timeElapsed;
      Serial.write('A');
    } else if (buttonOne==HIGH){
      buttonTime = timeElapsed;
    }
  
    if (pingDist!=0 && pingDist>pingFar && !pingActive) {
      pingTime = timeElapsed;
      Serial.write('B');
    } else if (pingDist!=0 && pingDist>pingFar){
      pingTime = timeElapsed;
    }
  
    if (micVal>micLimit && !micActive) {
      micTime = timeElapsed;
      Serial.write('C');
    } else if (micVal>micLimit){
      micTime = timeElapsed;
    }

    if (buttonActive && micActive && !pingActive) nextCmd = 'D';
    else if (buttonActive && pingActive && !micActive) nextCmd = 'E';
    else if (pingActive && micActive && !buttonActive) nextCmd = 'F';
    else if (buttonActive && micActive && pingActive) nextCmd = 'G';
    else nextCmd = 0;

    if (nextCmd != lastCmd) Serial.write(nextCmd);
    lastCmd = nextCmd;
    Serial.write('\0');
  }


  delay(100);

}

Max Code:

<pre><code>
----------begin_max5_patcher----------
1022.3oc0ZtrjapCDFds8SgJs1mozUtjU4dVkmfSNUJYaEGRgAJPNwoRk28i
QfmaAyzjoAlYicg.yOeRs96VB+qkKnqyOZqnjWP9WxhE+Z4hE9lpaXQ6wKn6
MG2jZp7WFcuspxryRW0btrC6SxRsN+IE2zX9A24V4ssVXba9ZR1tOWZ23ZjT
oXWwVQDBY8W51CthQ9u1eSxVun4q+1+HDm0r4d69Ygs4tPoWe8Utel5akRqa
32KWV+wp+N1b1i9mSZHgKBwgXYfpFx1uT7dIlOaDGfHwhAPLa1HViGwhnPvD
yimMhUHRrZ.DGMaDKQjX1.HNX1HVfGw7PFbh0yFwbDIVN.hUiNwY1ebRo+.3
rbm8jljOQ+RY9dxGMGI7OQI7N6Cjc1Gvdv9.kNt9KtTzamv0onebjt9fykm0
I.7+xDth3lgO04O674+xIbWax1g0.Ip3IfiWzyN5ZyjBht3mezofSGmMI3cA
OlJaJ4CCvTU7vyGCZxeF2meRX+LuZz8Vq498Hws3NbG1aYvOE39c3v84ovP3
V8Tf62hD2p6vcTebGLYbewplPppXg2JiqZJSH9J8kgVO9q0CUy5PQMMsCj85
UqhlSu5zby1lvFDwNzOtFz6FznTO+x.yfmAV87q3v1krACuYu.i2fjwKCtwq
L9oPFmWiC3mGsgjoUFM2fm3xMCXIp8tL8.edFt1uR0d8njWtjxjL2Sx4vR3y
gkAy8b3WgTnrb.gxyd0xEkmhcHaMNC4kE4EGJ3CXnum8dQKU2JvlyC5cuWBo
iZEh4E1LbJRT2TcXT.fw14aeD2jlWgza4Ry32B3dWwqTNWai3dqqLmvYLj16
TkrN1sck.A59fVOItVt7c6RsHYJ2RGChoL856So4Turs7y1Ly5FRXSP1nKZW
WlXRIqIwAWXPmObaaelXdnunqvdiz48lHFfos+zzzjr6+9q8OX0se29jp7Ck
aNqQ6FFRt4QaqsxkjYbImRbey0vaunN61gJTD.gpeymOZgBgPDGAgBfHDFDo
YPTBCglHcTPBFpWI8iWIE.ktW+ad4Vaoep+3KsT2szrIP5tUV73TlCIDJ.iQ
VPSJzXnD.gvvgTBwKVgw7OIn4eXXcIg3FGNFS+.obP2JqFekUcqrb7U9dgYW
KsdBjNpaoCl.oEcKc33Kc8+YOBGaOdXROFd7RPE9fQ1a4TUPhTNUBIfDqhQ9
QHDgQ1QAnL9BLThMYJAPnHDzgGOUDwilLkBlLkzSlRpISIHylDX3DwAMaBkn
bHVdiRMffrlBe3Uf0rKKlhhuaKqZ+4dQo6MeKuoNhU9CSxZNz+9ank1umb95
09VLka9ZhytwcnrYybNF075Jn6yOIb1gjVpOo7uW9+fD.h2C
-----------end_max5_patcher-----------
</code></pre>