Hand puppet video to experiment with how the fabric can move in order to later apply it to an automated motion.

We decided to set up the fabric in a way that it would have the potential for many different configurations while it moved. We wanted it to create a circle which we were able to realize to some degree by attaching two corners together in the middle with one string and the remaining two corners had a string attached to each one.

Different starting positions concluded in different movements, the fabric would fold in different ways based on how it was positioned initially. This is seen in the difference between the first clip and the second, the position of the fabric is inverted in order to show a different performance.

Once we decided what general motion we wanted to execute, this code was applied:

#---- methods to process MIDI messages -------------------------------------
    def note_on(self, channel, key, velocity):
        """Process a MIDI Note On event."""
        log.debug("ControlLogic received note on: %d, %d", key, velocity)
        row, col, bank = self.decode_mpd218_key(key)

        # Each column maps to a specific winch.
        # Rows 0 and 1 move forward, rows 2 and 3 move backward.
        # The middle rows make small motions, the outer rows make larger motions.
        delta = 5 * velocity if row <= 1 else -5 * velocity
        if row == 0 or row == 3:
            delta = delta * 8

        if bank == 0 or bank == 1: # bank A or B directly control the winches
            if col == 0:
                self.winches.increment_target(1,delta)
                self.winches.increment_target(2,-delta)
                self.winches.increment_target(3,delta)
            else:
                self.winches.increment_target(col, delta)
            self.winch_dir[col] = 1 if delta > 0 else -1 if delta < 0 else 0
            self.pulsing[col] = 0 # reset pulsing on this winch

        else: # bank C pads instead invoke the metronome oscillation
            self.pulsing[col] = delta//8
            log.debug("Pulsing array now %s", self.pulsing)

Specifically, these lines were changed:

if bank == 0 or bank == 1: # bank A or B directly control the winches
            if col == 0:
                self.winches.increment_target(1,delta)
                self.winches.increment_target(2,-delta)
                self.winches.increment_target(3,delta)
            else:
                self.winches.increment_target(col, delta)

We added a behavior on the first column of the midi pad to control the 3 other axes in unison, with the middle axis going the opposite direction from the rest.

if bank == 0 or bank == 1: # bank A or B directly control the winches
            if col == 0:
                self.winches.increment_target(1,delta)
                self.winches.increment_target(2,-delta)
                self.winches.increment_target(3,delta)
            else:
                self.winches.increment_target(col, delta)