Wednesday, April 30, 2008

ProSound Game Boy


I finally got off my lazy bottom and did the ProSound mod on an old grey. Just the plain internal one, nothing fancy. I personally don't see the point of going to the effort of drilling a second hole and placing a second 3.5mm stereo socket, but that's just me. Surely the most useful five minutes I have ever spent.

It's actually kind of eerie not hearing any noise when I press stop on LSDJ.

Tuesday, April 29, 2008

Hardware Encapsulation

So, we all know the term encapsulation from software stuff, like a chunk of code that you use again and again - eventually you just write it into a reusable function. Or a series of Max/MSP objects that are used many times in the same fashion within a patch, to the point where it is simply more efficient to make a separate external patcher file that has those objects in it.

But what about hardware? There are certain things and connections that I feel I breadboard again and again and it really annoys me when I can't find a certain resistor or capacitor or diode or whatever when I make these structures. So I have decided to simply "encapsulate" a few parts of circuits and connectors and then use pin headers to connect to breadboards as needed. It's more effort now, but it should make future breadboarding less annoying in general.

MIDI Input Circuit

8-Bit R2R DAC

Game Boy DMG 4-Wire Sync Connector

2 Female DB9 Connector

Male DB9 Connector

Female DB9 Connector


15 Pin Female VGA Connector

15 Pin Male VGA Connector


Picaxe Serial Download Header

Monday, April 28, 2008

Sync Tank: Let's Sync 15 Game Boys to MIDI or Pots


I was thinking today about how to make a sync device that has all the features that i want and none that i don't want. So i prototyped a working version of a device which can synchronise multiple Game Boys running LSDJ.

Features so far:
• synchronise up to 15 Game Boys running LSDJ in slave mode.
• two methods of sync: MIDI clock or via an internally generator clock.
• synchronise to an external MIDI clock (from around 35 to over 200 beats per minute when using a DMG).
• synchronise to an internal tempo that is set by two controls.
• one control is for coarse tempo control.
• one control is for fine tempo control.
• requires only a few external components
• potential fun.


Also, you might be interested in these great projects by other people, which all have different features from mine and from each other.

• Trash80's Arduinoboy:
http://code.google.com/p/arduinoboy/

• Gijs Master Clock Generator:
http://gieskes.nl/master-clock-generator/

• Firestarter's LSDJMC2:
http://www.firestarter-music.de/lsdj/

• Oliver W's Nanoloop MIDI Sync Cable:
http://www.nanoloop.de/midi.html



Sync Tank Schematic
Arduino:
• PORTD refers to digital I/O 0 - 7
• PORTB refers to digital I/O 8 - 12
• PORTC refers to analog inputs 0 - 5

Game Boy Connection (for each Game Boy):
• Pin numbering is the same as found on this page.




Sync Tank Arduino Code

The code can be downloaded here:
http://milkcrate.com.au/_other/downloads/projects/sync_tank/code/

dot.AY, TTFM&TF and Hidden Village show last night

We all played at the de la Catessen gallery last night. The turn out was better than expected, considering the weather. Everyone played really well - TTFM&TF with his fun and catchy melodic driven set and dot.AY with his nice and glitchy style. I think that our set (Hidden Village) went okay - of course, things can always be improved but overall it was quite okay.

Thanks to everyone who came along, Alex and Tom for making the trip from interstate and a warm thank you to Luke Altmann for having us at his wonder venue on a winter-like Sunday evening.


TTFM&TF

dot.AY

Hidden Village

dot.AY, TTFM&TF, Cloud Sparrow and little-scale

Saturday, April 26, 2008

Ping Sans Max

This is a follow-on from the previous post, and shows how to send PING))) ultrasonic sensor data via MIDI continuous controller messages, avoiding the use of Max/MSP or any other intermediate software layer. Of course, this requires a MIDI to USB or similar hardware interface.

The Arduino board and PING))) sensor still require a power source. This can be via the USB cable (as in this example) or potentially a mains AC/DC transformer or a suitable battery.

Hardware Connections

You will need
• 1 x PING))) sensor
• 1 x Arduino board
• A breadboard
• Some jumper wires
• A USB A to B cable
• A 220Ω resistor
• Three alligator clips
• A 5 pin DIN connector

Please note that an older NG board was used in this demonstration, but a Diecimilia board etc. should of course be fine as well.


Breadboarding the Circuit

1. Here we have the basic breadboard set up next to the Arduino. Note the way that the breadboard is structured - the vertical blue and red columns are electrically linked as long, single lines, and the horizontal half-rows of five points are electrically linked.



2. Place the Ping))) sensor onto the breadboard. Note that the sensor has three pins. When looking at the front of the sensor, these three pins are marked GND (ground), 5V (the power supply) and SIG (the data signal pin).



3. Set up the power bussing for the breadboard. Make a connection between the 5V pin on the Arduino board and the red vertical line. The red vertical line is now the supply voltage bus. Make a connection between the GND pin on the Arduino board and the blue vertical line. The blue vertical line is now the ground bus.



4. Connect the data signal (marked SIG) pin of the PING))) sensor to digital pin 7 of the Arduino board.



5. Connect the power supply pin (marked 5V) of the PING))) sensor to the red vertical line (the power supply bus).



6. Connect the ground pin (marked GND) of the PING))) sensor to the blue vertical line (the ground bus).



7. Connect one of the 220Ω resistor to the red vertical line (the power supply bus). The 220Ω resistor used in this example had a rating of 5% and 0.25W. However, other resistors with different ratings (for example 2% or 1% tolerance etc) are suitable.



8. Connect one end of an alligator lead (red) to pin 4 of the 5 pin DIN connector.




8. Connect the other end of the alligator lead (red) to the other leg of the 220Ω resistor.



9. Connect one end of an alligator lead (yellow) to pin 5 of the 5 pin DIN connector.



10. Connect the other end of the alligator lead (yellow) to the TX pin (digital pin 1) of the Arduino board).



11. Connect one end of an alligator lead (green) to pin 2 of the 5 pin DIN connector.



12. Connect the other end of the alligator lead (green) to the blue vertical line (the ground bus).




Software Setup

Upload the sketch to the Arduino board
1) Download the code from here:
http://milkcrate.com.au/_other/downloads/ping/MIDI_output/

2) Open the Arduino software. Version 010 was used for this demonstration.

3) Paste the code into a new sketch.

4) Verify the code by going to Sketch > Verify.

5) Make sure the Arduino board is connected to the computer.

6) Select the correct serial port by going to Tools > Serial Port. The Arduino should come up as /dev/tty.usbserial-A4---

7) Upload the sketch by going to File > Upload to I/O Board. Depending on the type of Arduino board you have, you might need to physically press the reset button while you execute this command.

8) The RX and TX LED's on the Arduino board should flash, indicating the upload process.


Editing the Arduino Code (if Needed)
The three most important variables are the first three defined in the sketch, namely:
• delay_time (int)
• MIDI_channel (byte)
• cc_number (byte)

delay_time sets the length of delay (in ms) between successive read/write cycles. The default is 40 ms. MIDI_channel is the channel (1 - 16) to send the MIDI data on. cc_number is the MIDI continuous controller number (0 - 127) to send the MIDI data on. The default MIDI setup is MIDI channel 1 and controller number 127.

You may wish to edit these values to suite your purposes.


Read the MIDI Data
Setup your environment to read MIDI continuous controller messages on the interface, channel and cc number as dictated by your setup. The closer an object is to the PING))), the lower the MIDI cc data.

Like so...

Thursday, April 24, 2008

Ping Time

Here is a very basic setup for how to connect a Ping))) ultrasonic sensor to a host computer and receive incoming data, converting it to MIDI continuous control messages. In fact, this is probably the simplest I can think of right now in order to get data from Ping))) to elsewhere.

The response of the sensor is so-so, and sometimes I seem to get weird data readings with mine. However, this could either be a) some of the maths scaling that I have added to the Arduino code or b) something in my environment (which is quite cluttered) could be interfering with the sensing mechanism.

Hardware Connections

You will need
• 1 x PING))) sensor
• 1 x Arduino board
• A breadboard
• Some jumper wires
• A USB A to B cable

Please note that an older NG board was used in this demonstration, but a Diecimilia board etc. should of course be fine as well.


Breadboarding the Circuit

1. Here we have the basic breadboard set up next to the Arduino. Note the way that the breadboard is structured - the vertical blue and red columns are electrically linked as long, single lines, and the horizontal half-rows of five points are electrically linked.



2. Place the Ping))) sensor onto the breadboard. Note that the sensor has three pins. When looking at the front of the sensor, these three pins are marked GND (ground), 5V (the power supply) and SIG (the data signal pin).



3. Set up the power bussing for the breadboard. Make a connection between the 5V pin on the Arduino board and the red vertical line. The red vertical line is now the supply voltage bus. Make a connection between the GND pin on the Arduino board and the blue vertical line. The blue vertical line is now the ground bus.



4. Connect the data signal (marked SIG) pin of the PING))) sensor to digital pin 7 of the Arduino board.



5. Connect the power supply pin (marked 5V) of the PING))) sensor to the red vertical line (the power supply bus).



6. Connect the ground pin (marked GND) of the PING))) sensor to the blue vertical line (the ground bus).





Software Setup

The software setup is made up of three main parts:

A) Upload the sketch to the Arduino board (this only has to be done once).
B) Open and set up the Max/MSP patch.
C) Connect to your favourite electronic music making / synthesis environment (SuperCollider, Max/MSP, Ableton Live etc).



A) Upload the sketch to the Arduino board.

1) Download the code from here:
http://milkcrate.com.au/_other/downloads/ping/very_simple/

2) Open the Arduino software. Version 010 was used for this demonstration.

3) Paste the code into a new sketch.

4) Verify the code by going to Sketch > Verify.

5) Make sure the Arduino board is connected to the computer.

6) Select the correct serial port by going to Tools > Serial Port. The Arduino should come up as /dev/tty.usbserial-A4---

7) Upload the sketch by going to File > Upload to I/O Board. Depending on the type of Arduino board you have, you might need to physically press the reset button while you execute this command.

8) The RX and TX LED's on the Arduino board should flash, indicating the upload process.



B) Open and set up the Max/MSP patch.


1) Make sure the Ping))) circuit is set up and that the Arduino board is plugged into the host computer.

2) Open up the Max/MSP patch in Max/MSP. The patch can be downloaded here:
http://milkcrate.com.au/_other/downloads/ping/very_simple/

3) You may need to adjust the first argument of the serial object, depending on which serial port your Arduino board connects to your computer. Experiment or use a print message connected to the serial object in order to work out which symbol is which serial port.

4) You may wish to adjust the continuous controller number (the argument of the ctlout object).



C) Connect to your favourite environment
By sending the control data along a virtual MIDI path, you can now send the Ping))) data to may other types of places and control other things.

Friday, April 18, 2008

Let's sync Prophet 64 to Nanoloop


I made a little sync cable today so that Nanoloop can control the tempo and synchronise with the Commodore 64 program Prophet 64. At first I tried to make it such that the Prophet 64 controls the Nanoloop tempo, however, the results where not very promising.

Demo video: http://youtube.com/watch?v=Ep3B9gMRWYg

When I first looked into making this sort of cable, I was looking for a 12/24 edge connector. The only place I could find them were Digikey, who charged almost $40 for shipping and handling for 3 x $3 connectors! Well, in the end I decided to order some 22/44 edge connectors from an arcade shop in Sydney. Then, it was simply a matter of somehow getting the connector to the right size. I used brute force and a wire cutter. Well, it works, doesn't it?!

Tuesday, April 15, 2008

Milkcrate #23 "Glass Noir" is now online

Sunday, April 13, 2008

Tomorrow

milkcrate #23.

check the blog for updates.

Arduino Drum Machine

Demo video: http://youtube.com/watch?v=I7CMI_imM68

Today i have made a physical interface for the Arduino drum samples (as seen in a previous post). Two 8-way DIP switches control the beat, a pot controls the sampling rate (and therefore pitch) and another pot controls the time between notes.

The two dip switches work in tandem so that each 1/8th note can have four possibilities (two bits) worth). If the position on the right switch is 0 and the position on the left switch is 0, then nothing is played. If the setup is 1 and 0, then a kick sample is played. If the setup is 0 and 1, then a snare sample is played. If the setup is 1 and 1, then a hi-hat sample is played.

So, for example, the following setup:

___SWITCH__LEFT___ ___SWITCH__RIGHT__
|0 0 1 0 1 0 1 0 | |1 0 1 0 0 0 1 0 |
------------------ ------------------
would give the following drum pattern:
KICK, TACET, HI-HAT, TACET, SNARE, TACET, HI-HAT, TACET
(because on the first 1/8th, the left switch is set to 0 and the right switch is set to 1 etc).

The two DIP switches are connected to the Arduino using 2 x 4021 shift registers. The sketch uses the a modified version of the code found in the ShiftIn tutorial by Carolyn Maw and Tom Igoe. The sound is output via an 8 bit R2R DAC. In fact, I seem to be using these quite a bit so I made myself a semi-hardwired one this morning. This is the board that is connected to PORTD (digital pins 0 - 7) on the Arduino. This is so much easier to deal with than scrounging around for suitable resistor values all the time, and then having to place them on the board.

Additionally, 2 LEDs keep track of timing -- one lights up on every 1/4 beat, and the other lights up at the start of every bar.




Schematic
Notes:
• PORTD pins 1 - 8 refers to digital pins 0 to 7
• PORTB pins 1 - 6 refers to digital pins 8 - 13
• PORTC pins 1 - 6 refers to analog pins 0 - 5



Arduino Code


/* Arduino Drum Machine

by Sebastian Tomczak

13 April 2008

*/

// 4021 Pins


int latchPin = 9;

int dataPin = 10;

int clockPin = 8;


// Working Variables


int delayTime;

byte dipSwitch1;

byte dipSwitch2;

byte beatByte;

int LED1 = 11;

int LED2 = 12;

int LED1_start = 0;

int LED1_end = 7;


// Samples


byte kick[] =

{

127, 80, 42, 5, 165, 242, 241, 233, 128, 73, 48, 22, 127, 69, 55, 113, 151, 183, 209, 217, 223, 228, 233, 215, 161, 117, 91, 76, 65, 49, 37, 31, 31, 48, 83, 120, 146, 166, 183, 198, 206, 210, 209, 199, 178, 145, 111, 88, 78, 73, 69, 67, 72, 80, 88, 97, 109, 124, 137, 150, 163, 171, 174, 172, 168, 160, 144, 125, 114, 110, 108, 104, 104, 106, 109, 110, 112, 117, 124, 129, 135, 142, 145, 145, 143, 140, 137, 132, 128, 125, 122, 119, 118, 119, 119, 119, 118, 118, 120, 124, 126, 129, 132, 135, 137, 137, 135, 132, 131, 130, 129, 128, 126, 126, 124, 123, 121, 120, 120, 122, 123, 124, 126, 128, 129, 130, 130, 131, 131, 131, 130, 130, 130, 129, 129, 128, 126, 125, 125, 124, 124, 124, 124, 125, 126, 126, 128, 128, 128, 129, 129, 129, 129, 129, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 127, 126, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126

};


byte snare[] =

{

127, 215, 65, 212, 56, 102, 135, 122, 51, 201, 220, 46, 175, 80, 152, 95, 123, 116, 184, 155, 59, 122, 100, 161, 143, 173, 101, 155, 97, 73, 112, 98, 176, 96, 140, 77, 134, 109, 132, 149, 112, 149, 97, 161, 98, 151, 98, 155, 149, 112, 157, 103, 133, 106, 167, 97, 166, 108, 129, 124, 136, 146, 124, 136, 129, 150, 94, 130, 105, 141, 146, 128, 129, 99, 150, 121, 141, 99, 142, 116, 131, 114, 118, 143, 127, 143, 115, 144, 120, 137, 109, 129, 131, 139, 129, 113, 144, 119, 145, 117, 135, 129, 134, 136, 124, 130, 130, 139, 121, 136, 121, 132, 128, 127, 126, 122, 130, 126, 138, 120, 136, 122, 131, 123, 130, 128, 127, 128, 118, 132, 125, 131, 122, 131, 125, 131, 122, 126, 128, 126, 129, 121, 129, 123, 132, 129, 127, 131, 123, 128, 125, 130, 123, 131, 123, 128, 131, 129, 128, 126, 125, 124, 131, 121, 124, 129, 130, 126, 124, 126, 127, 130, 125, 126, 128, 126, 128, 126, 126, 126, 126, 125, 128, 126, 126, 126, 126, 126, 126, 125, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 126, 128, 126, 127, 126, 128, 125, 127, 128, 128, 126, 126, 128, 126, 126, 128, 128, 128, 128, 128, 126, 128, 126, 126, 128, 128, 126, 126, 128, 128, 126, 126, 127, 126, 128, 126, 126, 128, 128, 128, 126, 126, 126, 128, 128, 126, 126, 126, 128, 128, 126, 128, 128, 126, 126

};


byte hat[] =


{

127, 128, 225, 217, 99, 38, 61, 153, 152, 144, 133, 73, 122, 144, 65, 188, 87, 170, 164, 111, 122, 151, 114, 88, 174, 77, 140, 92, 122, 141, 156, 124, 121, 123, 126, 133, 132, 139, 119, 120, 127, 141, 130, 122, 129, 127, 132, 121, 139, 118, 130, 131, 129, 132, 130, 134, 126, 128, 130, 126, 122, 132, 129, 127, 131, 126, 128, 127, 126, 125, 127, 125, 128, 125, 128, 128, 127, 127, 126, 127, 128, 128, 128, 127, 127, 127, 127, 127, 128, 127, 127, 126, 127, 127, 128, 127, 128, 126, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 126, 126, 128, 127, 126, 127, 126, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 126, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 126, 126, 127, 126, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 126, 127, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127

};


byte crash[] =


{

127, 128, 225, 217, 99, 38, 61, 153, 152, 144, 133, 73, 122, 144, 65, 188, 87, 170, 164, 111, 122, 151, 114, 88, 174, 77, 140, 92, 122, 141, 156, 124, 121, 123, 126, 133, 132, 139, 119, 120, 127, 141, 130, 122, 129, 127, 132, 121, 139, 118, 130, 131, 129, 132, 130, 134, 126, 128, 130, 126, 122, 132, 129, 127, 131, 126, 128, 127, 126, 125, 127, 125, 128, 125, 128, 128, 127, 127, 126, 127, 128, 128, 128, 127, 127, 127, 127, 127, 128, 127, 127, 126, 127, 127, 128, 127, 128, 126, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 126, 126, 128, 127, 126, 127, 126, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 126, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 126, 126, 127, 126, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 126, 127, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127

};


void setup() {

DDRD = B00000000;

pinMode(latchPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, INPUT);

pinMode(LED1, OUTPUT);

pinMode(LED2,OUTPUT);

}


void loop() {

for(int j = 7; j >= 0; j --) {

if(j == LED1_start) {

digitalWrite(LED1, 1);

}


if(j == LED1_end)

{

digitalWrite(LED1, 0);

}

digitalWrite(LED2, 1 - (j % 2));

digitalWrite(latchPin, 1);

delayMicroseconds(20);

digitalWrite(latchPin, 0);

dipSwitch1 = shiftIn(dataPin, clockPin);

dipSwitch2 = shiftIn(dataPin, clockPin);


dipSwitch1 = (dipSwitch1 >> j) & B00000001;

dipSwitch2 = (dipSwitch2 >> j) & B00000001;

beatByte = dipSwitch1 | (dipSwitch2 << 1);

delayTime = analogRead(1) + 1;

playBeat(beatByte);

}

}


// Playback Functions


void playBeat(byte beat) {

if(beat == 0) {

for(int i = 0; i < 256; i ++) {

delayMicroseconds(analogRead(0) + 1);

}

}


else if(beat == 1) {

playKick();

}

else if(beat == 2) {

playSnare();

}

else if(beat == 3) {

playHat();

}

else if(beat == 4) {

playCrash();

}

delay(delayTime);

}


void playKick() {

for(int i = 0; i < 256; i ++) {

PORTD = kick[i];

delayMicroseconds(analogRead(0) + 1);

}

PORTD = 127;

}


void playSnare() {

for(int i = 0; i < 256; i ++) {

PORTD = snare[i];

delayMicroseconds(analogRead(0) + 1);

}

PORTD = 127;

}


void playHat() {

for(int i = 0; i < 256; i ++) {

PORTD = hat[i];

delayMicroseconds(analogRead(0) + 1);

}

PORTD = 127;

}


void playCrash() {

for(int i = 0; i < 256; i ++) {

PORTD = crash[i];

delayMicroseconds(analogRead(0) + 1);

}

PORTD = 127;

}


byte shiftIn(int myDataPin, int myClockPin) {

int i;

int temp = 0;

int pinState;

byte myDataIn = 0;

for (i=7; i>=0; i--)

{

digitalWrite(myClockPin, 0);

delayMicroseconds(2);

temp = digitalRead(myDataPin);

if (temp) {

pinState = 1;

myDataIn = myDataIn | (1 << i);

}

else {

pinState = 0;

}

digitalWrite(myClockPin, 1);

}

return myDataIn;

}

ES: Theory of a Black Hole Remix Live


The YouTube user ES has posted a live remix version of the track Theory of a Black Hole. The clip features some nice live triggering as well as some excellent video projections and a good live setup for the stage. This can be viewed here: http://au.youtube.com/watch?v=gebgu9y682g

Saturday, April 12, 2008

Hidden City Audio Repository


I have uploaded all of the recorded Hidden City audio material that I have in my possession (about three and a half hours at this point in time). This material can be accessed here:

http://hiddencity.milkcrate.com.au/

More material will be added as it becomes available.

Thursday, April 10, 2008

Hidden Village with TTFM+TF and dot.AY

(Very nice poster by Lauren)

We are playing a live show with chiptuners Ten Thousand Free Men and Their Families (Sydney) and dot.AY (Brisbane). Expect some nice visuals as well.

When: April 27th, 7.30pm +
Cost: $3
Where: Gallery de la Catessen (9 Anster Street, Adelaide

Cheap drinks!