Roles: Luigi Cannatti – Max Patch Programming and Audio Recording
Arnav Luthra – Documentation and Audio Recording
Max Patch Description: Our project utilized jit.cv to read a recorded game of Go and determine the number of pieces in each row. Using this data, we created a step sequencer wherein the number of pieces determines the intensity of the player’s “voice”. We used two different sets of sample banks for the white and black pieces respectively.
Sound recordings: Luigi recorded himself grunting, moaning, and screaming at 11 different levels of intensity. I recorded a few clips of a little sister and then filled in the blanks with a few grunting and breathing samples of my own.
Final Impressions: Overall we were both quite happy with the result. Our original intention with this project was to riff on the stoic nature of Go and I think we accomplished this well. To improve this further, we could have it working with an actual Go board.
Our idea was to play off the intensity surrounding the game of Go. We wanted to increase the intensity using two nostalgic fandoms battling against each other.
The idea behind what I built was to use level meter~ attached to a contact mic to trigger playback from a random bank of samples based on player turn. I also used cv.jit.track to track the position, and displacement of the payer’s hands. Kaitlin also used optical flux to control some parameters of the video.
The hardest part of this patch was programming the turn based logic, and separating the movement and stone play sounds. I wasn’t quite satisfied
Problems encountered: A single contact mic was not quite enough to trigger the samples every time someone put a stone down. We also ended up loosing the tracking dot too frequently and attached it to the players head, which yielded far less satisfying movement results.
For the synthesizer engine of the piece, we used Max MSP. From Dan’s computer, he sent over OSC data to Steven’s machine to synthesize the gameplay. A video of this process can be found above. We used the UDP receive object to grab the data.
The OpenCV information was sent in the form of two arrays. The arrays were 9 binary representations of the columns. For example, the white array would send: “/white/100011101”. A ‘1’ would represent a piece on the go board section, and a ‘0’ would represent no piece on the go board section. The Max code would route the white and black array to different sections, and parse/unpack the arrays into individual messages. The combination of the unpack object, and a simple if statement, would send a “bang” message if a ‘1’ was received. There was 9 different indexes for both arrays, so there needed to be a total of 18 bang message systems. Each of the bangs were sent out to an individual synthesizer. In the code we named them “little_synth”, they were little synthesizers with an oscillator, and an ADSR. The inputs to the abstraction were for a bang message(note on), the pitch number, the attack of the filter, and the decay of the filter.
Each “little synthesizer” has an output that is set at the loading of the patch. The difference between the white group of little synths and the black little synths is the oscillator waveshape that is produced. The white little synths use a square wave to generate their sounds, using the “rect~” object in Max. The black little synths use a saw wave to generate their sounds, using the “phasor~” object in Max. We thought this would be a fun fight between the different waveshapes throughout the Go battle.
The little synths also played in different, yet harmonic keys. Each synth was a chord voicing over many octaves. The white synthesizers played an A minor 7 chord (A C E G) using MIDI pitch numbers, 45, 48, 52, 55, 57, 60, 64, 67, and 69. The black synthesizers played a C 7 chord (C E G Bb) using MIDI pitch numbers, 48, 52, 55, 58, 60, 64, 67, 70, 72. Ideally, the piece would sound more major, or minor, depending on who is winning the game, by having the most amount of pieces on the board. The sound is then all sent to an effects section. In the effects section there is a reverb object (using cverb~), and a delay object (using delay~). These object help liven up the dry synthesizers. The delay object particular helps create space in between each OSC message being received. After the effect section, it is sent to the dac~ object for output.
In the future, one improvement that could be made would be a method of actually calculating the current winner of the game, as it does not necessarily correlate to the number of pieces that player has on the board. It also might be effective to add samples from videogames to add to the theme created by the chiptune-like synths.