Abstract/ Conceptual overview
Installation version
There is now an initial installation version as a parody of the boat trip.

New Version (long term)
This new version will get rid of the electronic components and will be focus on the interaction with the people in the boat. A jourey experience will be created based on sonic materials. There is not a team of sound artist producing sounds but the boat itsef reacting to the interaction with the visitors.

Old version
Which is the voice of a ship in the high seas? For a long time I have being attracted by the poetics of old ships, especially since I arrived to Seattle a year and a half ago. The motivation behind The Voice of The Ship is to generate an original sonic experience where the object that “sings” is a ship.
Customized software and a piece of hardware will be created for generating this experience. The flowchart of the work is as follow: A collection of contact microphones will be set in different resonating structures of a ship. Close to each microphone a solenoid will be placed enforcing the generation of sound. With the software, the “player” will control the activity of the solenoids and also the transformations of the signal coming from the microphones. The “composition” will be broadcast in two speakers located in the deck of the ship.
A team of sound artist will be invited to produce material that will be performed in a short trip to the high seas where the passengers will be at the same time the listeners.
DIARY
- April 27
I went to the port. I find several people interested in the idea. All need for the fuel. You can see pictures of the posible boats at www.hugosolis.net/image/tid/21
- May 14
I went with Robley to see a ship in Bainbridge Island. It's and ideal ship. Robley wrote "The boats dimensions are 65' x 20' with a 9' draft, hailbut schooner. It packs a 55,000 lb faberglass fish hold. It has two motors; a diesel catepillar main engine and a northern lights auxiliary. It sleeps seven bunks with lots of room, could probably hold up to 20 people". You can see the Silver Wave at www.hugosolis.net/image/tid/21
- June 2
The boat experience has been postoned. An alternative installation version will be developed for the class. The main experience will be created later.
Time plan
Week 1
Logistics and presentation document
Week 2
Electronics designed
Week 3
Electronics and Hardware acquisition and prototyping
Week 4
Software development
Week 5
Hardware production
Week 6
Testing and problem solving
Week 7
Presentation Planning and Performance
Historical Background
Alvin Curran, Maritime Rites http://www.youtube.com/watch?v=x0ejBVBOv-s
David Tudor, Sea Tails http://www.getty.edu/art/exhibitions/sea_tails/
Bill Fontana, Objective Sounds http://resoundings.org/Pages/Objective%20Sound.html
Bibliography and References
MUSE LINKS
Ben-Tal, Oded, and Jonathan Berger 1954-. "Creative Aspects of Sonification." Leonardo 37.3 (2004): 229-33. http://muse.jhu.edu/journals/leonardo/v037/37.3ben_tal.pdf .
Black, Tim. "L2K Ring Project and Ship to Ship." Leonardo 36.5 (2003): 365-. http://muse.jhu.edu/journals/leonardo/v036/36.5black.pdf .
Bouju, Jacky, and Jocelyne Rotily. "Nommo--the Spirit of Water--in the Dogon World." Leonardo 36.4 (2003): 279-80. http://muse.jhu.edu/journals/leonardo/v036/36.4bouju.pdf .
Cage, John. "Imaginary Landscapes." Leonardo 35.5 (2002): 562-. http://muse.jhu.edu/journals/leonardo/v035/35.5cage02.pdf .
Fane, Lawrence, 1933-. "The Invented World of Mariano Taccola: Revisiting a Once-Famous Artist-Engineer of 15th-Century Italy." Leonardo 36.2 (2003): 135-43. http://muse.jhu.edu/journals/leonardo/v036/36.2fane.pdf .
"Interpreting the Soundscape Contributors' Notes." Leonardo Music Journal 16 (2007): 71-6. http://muse.jhu.edu/journals/leonardo_music_journal/v016/16.1cd_contrib_nts.pdf .
Lawler-Dormer, Deborah, and Rachael Rakena 1969-. "The New Zealand Container." Leonardo 39.4 (2006): 301-3. http://muse.jhu.edu/journals/leonardo/v039/39.4lawler-dormer.pdf .
Le Prado, Cecile. "Le Triangle d'Incertitude." Leonardo 35.5 (2002): 562-. http://muse.jhu.edu/journals/leonardo/v035/35.5le.pdf .
Mandelbrojt, Jacques, and Lucie Prod'homme. "Music, Colors and Movements of Water." Leonardo 36.4 (2003): 282-3. http://muse.jhu.edu/journals/leonardo/v036/36.4mandelbrojt01.pdf .
Nodoka, Ui, and Odile Brock. "Wave Rings." Leonardo 36.4 (2003): 283-4. http://muse.jhu.edu/journals/leonardo/v036/36.4nodoka.pdf .
Perloff, Nancy Lynn. "Hearing Spaces: David Tudor's Collaboration on Sea Tails." Leonardo Music Journal 14 (2004): 31-9. http://muse.jhu.edu/journals/leonardo_music_journal/v014/14.1perloff01.pdf .
Polli, Andrea. "Atmospherics/Weather Works : A Spatialized Meteorological Data Sonification Project." Leonardo 38.1 (2005): 31-6. http://muse.jhu.edu/journals/leonardo/v038/38.1polli.pdf .
Risset, Jean-Claude. "Sud." Leonardo 35.5 (2002): 563-. http://muse.jhu.edu/journals/leonardo/v035/35.5risset.pdf .
Roh, Soh Yeong. "The Seoul Container." Leonardo 39.4 (2006): 299-301. http://muse.jhu.edu/journals/leonardo/v039/39.4roh.pdf .
Sturm, Bob L. "Pulse of an Ocean: Sonification of Ocean Buoy Data." Leonardo 38.2 (2005): 143-9. http://muse.jhu.edu/journals/leonardo/v038/38.2sturm.pdf .
Teruggi, Daniel, 1952-. "Fugitives Voix." Leonardo 35.5 (2002): 562-. http://muse.jhu.edu/journals/leonardo/v035/35.5teruggi.pdf .
Viola, Bill, 1951-. "David Tudor: The Delicate Art of Falling." Leonardo Music Journal 14 (2004): 49-56. http://muse.jhu.edu/journals/leonardo_music_journal/v014/14.1viola.pdf .
Westerkamp, Hildegard, 1946-. "India Sound Journal." Leonardo 35.5 (2002): 562-. http://muse.jhu.edu/journals/leonardo/v035/35.5westerkamp.pdf .
Wishart, Trevor. "Two Women." Leonardo 35.5 (2002): 562-. http://muse.jhu.edu/journals/leonardo/v035/35.5wishart.pdf .
BOOKS
Hegarty, Paul. Noisemusic :A History. New York: Continuum, 2007. http://www.loc.gov/catdir/toc/ecip0720/2007024836.html .
LaBelle, Brandon. Background Noise :Perspectives on Sound Art. New York: Continuum International, 2006.
Licht, Alan. Sound Art :Beyond Music, between Categories. New York, N.Y.: Rizzoli International Publications, 2007.
Wishart, Trevor, and Simon Emmerson. On Sonic Art. New and revis ed. Vol. 12. Amsterdam: Harwood Academic Publishers, 1996.
COLLEGUES RECOMENDATIONS
Alvin Curran, Maritime Rites http://www.youtube.com/watch?v=x0ejBVBOv-s
Gavin Bryars, The Sinking of the Titanic http://www.gavinbryars.com/Pages/titanic_point.html
Ulysses and the Sirens, a classic ancient greek myth from the Odyssey http://en.wikipedia.org/wiki/Siren#Encounters_with_the_Sirens
E la nave va, Federico Fellini http://en.wikipedia.org/wiki/And_the_Ship_Sails_On
Rachel's, The Sea and the Bells http://www.touchandgorecords.com/bands/album.php?id=71
Drawing restraint by Matthew Barney
State diagram

Research Methodology
- Research for similar works
- Negotiations for getting the ship
- Designing of the sonic experience
- Testing, Refinement, Exploration...
- Invite audience
- Documentation
Mechanics


Fabrication Issues

Electronics

Circuit Diagram

Equipment list
- Fishing boat
- Bouyes
- Microphones
- Computer ruuning Juum software
- Custom circuits
Code/ Programming Issues
This is the atmel code for reading the sensors and send it to the serial port.
#include
#define FOSC 1000000 // Clock Speed
#define BAUD 4800
#define MYUBRR FOSC/16/BAUD-1
#define NO 0x30
#define YES 0x31
#define SPACE 0x5F
#define CR 0x0D
void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = (1<
//UCSR0B |= (1<
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<
/* Put data into buffer, sends the data */
UDR0 = data;
}
void init()
{
//set the pull ups resitors (input as default)
PORTB = (1<
PORTC = (1<
PORTD = (1<
//for setting the ADC
//ADMUX = (1<
//ADCSRA |= (1<
}
int main( void )
{
init();
USART_Init(MYUBRR);
while(1){
//order of reading is VERY important it is
//KL
//BH B1 B2 B3
//B4 B5 B6 B7
//BS KR B8 B9 B10
//S
//16 not used
if(PINB & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PIND & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PIND & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PIND & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINB & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINB & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PIND & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PIND & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINB & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINB & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
USART_Transmit(SPACE);
if(PINC & (1<
else USART_Transmit(YES);
//reading ADC in DDC5
//ADCSRA |= (1<
//while (ADCSRA & (1<
//unsigned int adc = ADCH;
//USART_Transmit(adc); //replace this for actual number
USART_Transmit(CR);
}
return 0;
}
This is the code (3 files) for emulating the boat console, it has 13 buttons.
Emulator
package transmiter;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import de.sciss.net.OSCClient;
import de.sciss.net.OSCMessage;
public class Transmiter implements SerialListener, ChangeListener, ItemListener, ActionListener {
private static String IP_ADDRESS = "128.95.92.15";
private static String PORT_NAME = "/dev/ttyUSB0"; // or "COM1"
private Serial mySerial;
OSCClient client;
SocketAddress addrFareAwayG = null;
JFrame frame;
static final int CHECKBOX = 12;
JCheckBox[] checkBoxs = new JCheckBox[CHECKBOX];
JButton buttonH, buttonS;
JSlider slider;
static final int TOTAL_SENSORS = 16;
int values[] = new int[TOTAL_SENSORS];
static final String[] names = new String[]{
"KL",
"BH","B1","B2","B3",
"B4","B5","B6","B7",
"BS","KR","B8","B9","B10",
"S"};
public static void main (String args[]){
boolean simulation = false;
for(int i = 0; i< args.length; i++){
if(args[i].equalsIgnoreCase("-address")) Transmiter.IP_ADDRESS = args[i + 1];
if(args[i].equalsIgnoreCase("-serialPort")) Transmiter.PORT_NAME = args[i + 1];
}
new Transmiter(simulation);
}
public Transmiter(boolean simulation){
mySerial = new Serial(PORT_NAME);
frame = new JFrame();
JFrame.setDefaultLookAndFeelDecorated(true);
JPanel myPanel = new JPanel(new BorderLayout());
frame.setContentPane(myPanel);
int counter = 0;
for(JCheckBox b : checkBoxs){
checkBoxs[counter] = new JCheckBox("B"+counter);
checkBoxs[counter].addItemListener(this);
counter++;
}
checkBoxs[0].setText("KL");
checkBoxs[8].setText("KR");
slider = new JSlider(0,255,127);
slider.setName("S");
slider.addChangeListener(this);
buttonH = new JButton("BH");
buttonH.addActionListener(this);
buttonS = new JButton("BS");
buttonS.addActionListener(this);
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));
leftPanel.add(checkBoxs[0]);
JPanel UpPanel = new JPanel();
//UpPanel.setLayout(new BoxLayout(UpPanel, BoxLayout.PAGE_AXIS));
UpPanel.add(buttonH);
UpPanel.add(checkBoxs[1]);
UpPanel.add(checkBoxs[2]);
UpPanel.add(checkBoxs[3]);
JPanel centerPanel = new JPanel();
//centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
centerPanel.add(checkBoxs[4]);
centerPanel.add(checkBoxs[5]);
centerPanel.add(checkBoxs[6]);
centerPanel.add(checkBoxs[7]);
JPanel buttomPanel = new JPanel();
buttomPanel.setLayout(new BoxLayout(buttomPanel, BoxLayout.PAGE_AXIS));
buttomPanel.add(slider);
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));
rightPanel.add(buttonS);
rightPanel.add(checkBoxs[8]);
rightPanel.add(checkBoxs[9]);
rightPanel.add(checkBoxs[10]);
rightPanel.add(checkBoxs[11]);
JPanel globalCenter = new JPanel(new BorderLayout());
globalCenter.add(UpPanel, BorderLayout.NORTH);
globalCenter.add(centerPanel, BorderLayout.CENTER);
globalCenter.add(buttomPanel, BorderLayout.SOUTH);
myPanel.add(leftPanel, BorderLayout.WEST);
myPanel.add(globalCenter, BorderLayout.CENTER);
myPanel.add(rightPanel, BorderLayout.EAST);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
client.stop();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
}
});
frame.setVisible(true);
frame.setSize(500, 150);
frame.setResizable(false);
frame.setTitle("Console emulator");
frame.validate();
try {
client = OSCClient.newUsing( OSCClient.UDP);
client.setTarget( new InetSocketAddress( IP_ADDRESS, 7400));
client.start();
} catch (IOException e1) {
e1.printStackTrace();
}
if(mySerial != null) mySerial.addSerialListener(this);
}
private void sendData(String type, int value){
System.out.println("SENDING " + type + " " + value);
try {
client.send( new OSCMessage( type, new Object[] {
new Float(value)
}));
} catch (IOException e) {
e.printStackTrace();
}
}
public void dataReceived(String data) {
//System.out.println(data);
String[] splited = data.split("_");
if(splited.length == TOTAL_SENSORS) // check for consistance
for(int i=0;i
try{
int value = Integer.parseInt(splited[i],16);
if(values[i] != value){
values[i] = value;
sendData(names[i],value);
System.out.println(names[i] + " " + value);
}
} catch(NumberFormatException e){
System.out.println("error in digit");
}
}
else System.out.println("error in lecture");
}
public void stateChanged(ChangeEvent e) {
if(e.getSource() == slider) sendData(slider.getName(),slider.getValue());
}
public void itemStateChanged(ItemEvent e) {
for(int i=0;i
if(e.getItemSelectable() == checkBoxs[i])
if (e.getStateChange() == ItemEvent.SELECTED)
sendData(checkBoxs[i].getText(), 1);
else sendData(checkBoxs[i].getText(), 0);
}
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == buttonH) sendData(buttonH.getText(),1);
if(e.getSource() == buttonS) sendData(buttonS.getText(),1);
}
}
Serial Reader
package transmiter;
import gnu.io.*;
import java.util.*;
import java.io.*;
public class Serial {
BufferedReader is;
PrintStream os;
SerialPort port;
Vector listeners;
public void addSerialListener(SerialListener sl){
listeners.add(sl);
}
private void dataReceived(String data){
Enumeration en = listeners.elements();
while(en.hasMoreElements()){
SerialListener sl = (SerialListener) en.nextElement();
sl.dataReceived(data);
}
}
public Serial(String portName){
listeners = new Vector();
//
// Platform specific port name, here a Unix name
//
// NOTE: On at least one Unix JavaComm implementation JavaComm
// enumerates the ports as "COM1" ... "COMx", too, and not
// by their Unix device names "/dev/tty...".
// Yet another good reason to not hard-code the wanted
// port, but instead make it user configurable.
//
String wantedPortName = portName;
//
// Get an enumeration of all ports known to JavaComm
//
Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers();
//
// Check each port identifier if
// (a) it indicates a serial (not a parallel) port, and
// (b) matches the desired name.
CommPortIdentifier portId = null; // will be set if port found
while (portIdentifiers.hasMoreElements())
{
CommPortIdentifier pid = (CommPortIdentifier) portIdentifiers.nextElement();
if(pid.getPortType() == CommPortIdentifier.PORT_SERIAL &&
pid.getName().equals(wantedPortName))
{
portId = pid;
break;
}
}
if(portId == null)
{
System.err.println("Could not find serial port " + wantedPortName);
System.exit(1);
}
//
// Use port identifier for acquiring the port
//
port = null;
try {
port = (SerialPort) portId.open(
"name", // Name of the application asking for the port
10000 // Wait max. 10 sec. to acquire port
);
} catch(PortInUseException e) {
System.err.println("Port already in use: " + e);
System.exit(1);
}
//
// Now we are granted exclusive access to the particular serial
// port. We can configure it and obtain input and output streams.
//
//
// Set all the params.
// This may need to go in a try/catch block which throws UnsupportedCommOperationException
//
try {
port.setSerialPortParams(
4800,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_2,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e1) {
e1.printStackTrace();
}
//
// Open the input Reader and output stream. The choice of a
// Reader and Stream are arbitrary and need to be adapted to
// the actual application. Typically one would use Streams in
// both directions, since they allow for binary data transfer,
// not only character data transfer.
//
is = null;
os = null;
try {
is = new BufferedReader(new InputStreamReader(port.getInputStream(),"ISO-8859-1"));
} catch (IOException e) {
System.err.println("Can't open input stream: write-only");
is = null;
}
try {
os = new PrintStream(port.getOutputStream(), true, "ISO-8859-1");
} catch (IOException e) {
e.printStackTrace();
}
// New Linuxes rely on UNICODE and it is possible you need to specify here the encoding scheme to be used
// for example :
// os = new PrintStream(port.getOutputStream(), true, "ISO-8859-1");
// will ensure that you sent 8 bits characters on your port. Don't know about a modem accepting
// UNICODE data for its commands...
//
// Actual data communication would happen here
// performReadWriteCode();
//
new Thread(){public void run(){
//System.out.println("ready to read");
try {
String data;
while((data = is.readLine()) != null) {
//System.out.println(data);
dataReceived(data);
}
} catch(IOException ex) {
}
}}.start();
}
//
// It is very important to close output/input streams as well as the port.
// Otherwise Java, driver and OS resources are not released.
//
public void close(){
if (is != null)
try {
is.close();
if (os != null) os.close();
if (port != null) port.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Serial s = new Serial("/dev/ttyUSB0");
s.close();
}
}
Serial Listener
package transmiter;
public interface SerialListener {
void dataReceived(String data);
}
Revisions
The project is under a big revison in order to do a first running on the boat at the end of the summer.
Presentation Scenarios



Language of Praise
The sonic experience in the boat has been postponed. The installation version is a minimal reduction that do not try to emulate/reproduce the original experience but reintegrate all the material created into a small parody.