Skip to content

Deliverables

GANTT

Changes have been made throughout the project.

BoM (Bill of Materials)

Presentations

Pitch Presentation

Midterm Presentation

Final Presentation

Script + Storyboard

Script

Numbering is for a corresponding pic in the storyboard below.

  1. [Shot of Carlsbad Beach] - “Somewhere Near San Diego, California”

  2. [Shot of going into the home] - My name is Marissa Renteria and I’m an aerospace engineer and a maker. And I suppose a weaver now.

  3. [Shot of room] - Welcome to the studio! I mean it’s my room too but involuntarily it became my studio.

  4. [Shots of my stuff in my room]

  5. [Shot of me being interviewed] - I moved here a couple months ago but I’ve moved a ton. Move 1 out of 100. No, i’m exaggerating. I got interested in the “home” as an idea probably from moving around. i feel like i can be at “home” anywhere I go.

  6. [Shots/Pictures of my experiences with textiles/looms/computers overlaying my interview] - I got interested in weaving and textiles about 3 years ago. I love how versatile they are, both creatively and technically. Their relationship with the modern day computer is what fascinates me the most. It really says a lot about how interconnected things are.

  7. [Shots of things I like] - Home in my opinion is a series of experiences, memories, feelings, sensations, stories that matter to me. It’s a reflection of your “self” really.

  8. [Shots of women in the home] - I think I’m better able to see, appreciate, and build my home when I compare what home used to be for the women in my family. The home has a storied history being a purely domestic space in my grandmother’s and even in my mother’s time.

  9. [Shots of me working on my project] - Voiceover excerpts from calls with grandmother + mother

  10. [Shots of the theremin, playing the theremin] - I find home where I can make and give beauty through craft and technology. And music if I can. And maybe it’s not beautiful! But it’s the opportunity to feel and experience what the women before me couldn’t.

Storyboard

Storyboard 1

Storyboard 2

Take 2 - Script + Moodboard

Revised Script

"Hey how are you? I thought about you so uh I guess I wanted to reach out before things get buried in the ether. I know we don’t always understand each other. We come from different places and times. I often wonder who you would’ve become had you had the chance. Becoming is shitty but it’s also really beautiful.

Like a dream, almost. Maybe every time I participate in the art of becoming, through making, I see you. I learned how to weave. I wove a theremin, with parts of you and me in it. You know what’s cool about a theremin? The difference in frequencies is what makes sound not the frequencies alone. I know you didn’t really get a chance to build a ‘home’, a ‘self’. Thank you for your pains, sorrows, joys, your “selves” as they are. I can only see me by seeing you."

Revised Moodboard

Storyboard Moodboard

Final Presentation

Code

Weaving Pattern Code

Mother-Grandmother Data Python File (Combines 2 data sets of around ~150 characters and converts it to a weaving pattern using an 8 shaft loom, a straight draw-down threading pattern, and a simple advancing twill weave)

import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter

# Your Variables!

EPI = 14
PPI = 15
WIDTH_IN = 5
LENGTH_IN = 20
SHAFTS = 8
MAX_FLOAT = 4

TOTAL_WARPS = EPI * WIDTH_IN
TOTAL_PICKS = PPI * LENGTH_IN

OUTPUT_FILE = "weavingdraft_mothergrandmother.xlsx"

STRUCTURAL_INTERVAL = 10   # distributes conductivity every 10 picks

# Text -> Binary -> 3-Bit Chunks

def text_to_binary(filename):
    with open(filename, "r", encoding="utf-8") as f:
        text = f.read()
    binary_stream = []
    for char in text:
        byte = format(ord(char), "08b")
        binary_stream.extend([int(b) for b in byte])
    return binary_stream

def chunk_bits(bits, size=3):
    chunks = []
    for i in range(0, len(bits), size):
        chunk = bits[i:i+size]
        while len(chunk) < size:
            chunk.append(0)
        chunks.append(chunk)
    return chunks

def chunk_to_value(chunk):
    return int("".join(str(b) for b in chunk), 2)

# Insert .txt data files

chunks_A = chunk_bits(text_to_binary("grandmother.txt"), 3)
chunks_B = chunk_bits(text_to_binary("mother.txt"), 3)

# Setting up the excel file

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Weaving Draft"

warp_color = PatternFill(start_color="580113", end_color="580113", fill_type="solid")
weft_color = PatternFill(start_color="fff79c", end_color="fff79c", fill_type="solid")

threading = [i % SHAFTS for i in range(TOTAL_WARPS)]

BASE_LIFTS = [
    {0,1,2,3},
    {1,2,3,4},
    {2,3,4,5},
    {3,4,5,6},
    {4,5,6,7},
    {5,6,7,0},
    {6,7,0,1},
    {7,0,1,2},
]

warp_down_count = [0] * TOTAL_WARPS
ws.column_dimensions["A"].width = 40

# Generate the pattern

current_row = 1

for pick in range(TOTAL_PICKS):

    # Gradual blend grandmother → mother
    t = pick / (TOTAL_PICKS - 1)

    value_A = chunk_to_value(chunks_A[pick % len(chunks_A)])
    value_B = chunk_to_value(chunks_B[pick % len(chunks_B)])

    blended_value = round((1 - t) * value_A + t * value_B) % 8
    lift = BASE_LIFTS[blended_value]

# Adding conductive wefts based on when 3-bit chunk = 000 AND every 10th pick

    conductive = False

    if blended_value == 0:
        conductive = True

    if pick % STRUCTURAL_INTERVAL == 0:
        conductive = True

    # Labels when to put a conductive weft and a yarn weft
    if conductive:
        weft_sequence = ["COPPER WIRE", "YARN"]
    else:
        weft_sequence = ["YARN"]

# Labeling and writing shaft lift instructions for weaver

    for weft_type in weft_sequence:

        lift_shafts = sorted([s+1 for s in lift])
        instruction = "Shaft Lift: " + ",".join(str(s) for s in lift_shafts)
        instruction += f" | {weft_type}"

        ws.cell(row=current_row, column=1).value = instruction

        for warp in range(TOTAL_WARPS):
            cell = ws.cell(row=current_row, column=warp + 2)
            shaft = threading[warp]

            if shaft in lift:
                warp_down_count[warp] = 0
                cell.fill = warp_color
            else:
                warp_down_count[warp] += 1
                cell.fill = weft_color

            if warp_down_count[warp] >= MAX_FLOAT:
                cell.fill = warp_color
                warp_down_count[warp] = 0

        ws.row_dimensions[current_row].height = 10
        current_row += 1

# Column width sizing (but this changes if you import the file from excel to say a Google Sheets app)

for col in range(2, TOTAL_WARPS + 2):
    ws.column_dimensions[get_column_letter(col)].width = 1.5

wb.save(OUTPUT_FILE)
print("Weaving draft generated.")

My Data Python File (Uses 1 data set of around ~150 characters and converts it to a weaving pattern using an 8 shaft loom, a straight draw-down threading pattern, and a simple advancing twill weave)

import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter

# Your variables!

EPI = 15
PPI = 30
WIDTH_IN = 5
LENGTH_IN = 20
SHAFTS = 8
MAX_FLOAT = 4

STRUCTURAL_INTERVAL = 10

TOTAL_WARPS = EPI * WIDTH_IN
TOTAL_PICKS = PPI * LENGTH_IN

OUTPUT_FILE = "weavingdraft_daughter.xlsx"

# Text -> Binary -> 3-Bit Chunks

def text_to_binary(filename):

    with open(filename, "r", encoding="utf-8") as f:
        text = f.read()

    binary_stream = []

    for char in text:
        byte = format(ord(char), "08b")
        binary_stream.extend([int(b) for b in byte])

    return binary_stream


def chunk_bits(bits, size=3):
    chunks = []
    for i in range(0, len(bits), size):
        chunk = bits[i:i+size]
        while len(chunk) < size:
            chunk.append(0)
        chunks.append(chunk)
    return chunks


def chunk_to_value(chunk):

    return int("".join(str(b) for b in chunk), 2)


# upload your .txt file here

chunks = chunk_bits(text_to_binary("daughter.txt"), 3)

# setting up the excel file 

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Weaving Draft"

warp_color = PatternFill(start_color="5e41ff", end_color="5e41ff", fill_type="solid")
weft_color = PatternFill(start_color="f84509", end_color="f84509", fill_type="solid")

threading = [i % SHAFTS for i in range(TOTAL_WARPS)]

BASE_LIFTS = [
    {0,1,2,3},
    {1,2,3,4},
    {2,3,4,5},
    {3,4,5,6},
    {4,5,6,7},
    {5,6,7,0},
    {6,7,0,1},
    {7,0,1,2},
]

warp_down_count = [0] * TOTAL_WARPS

ws.column_dimensions["A"].width = 35

# generate the weaving pattern

for pick in range(TOTAL_PICKS):

    row = pick + 1

    value = chunk_to_value(chunks[pick % len(chunks)]) % 8
    lift = BASE_LIFTS[value]

    conductive = False

    # data trigger
    if value == 0:
        conductive = True

    # structural reinforcement
    if pick % STRUCTURAL_INTERVAL == 0:
        conductive = True

    if conductive:
        weft_type = "COPPER WIRE"
    else:
        weft_type = "YARN"

    lift_shafts = sorted([s+1 for s in lift])

    instruction = "Shaft Lift: " + ",".join(str(s) for s in lift_shafts)
    instruction += f" | {weft_type}"

    ws.cell(row=row, column=1).value = instruction

    for warp in range(TOTAL_WARPS):

        cell = ws.cell(row=row, column=warp + 2)
        shaft = threading[warp]

        if shaft in lift:

            warp_down_count[warp] = 0
            cell.fill = warp_color

        else:

            warp_down_count[warp] += 1
            cell.fill = weft_color

        if warp_down_count[warp] >= MAX_FLOAT:

            cell.fill = warp_color
            warp_down_count[warp] = 0

    ws.row_dimensions[row].height = 10


# Column width sizing (but this changes if you import the file from excel to say a Google Sheets app)

for col in range(2, TOTAL_WARPS + 2):
    ws.column_dimensions[get_column_letter(col)].width = 1.5

# Saving and spitting out your resulting file

wb.save(OUTPUT_FILE)

print("Weaving draft generated from daughter.txt.")

Digital Theremin Code

#include <CapacitiveSensor.h> // capacitive function library to create capacitive sensors

// pin 4 sends signal to pins 2 and 3 where the latter pins listen for the signal from pin 4
CapacitiveSensor pitchAntenna = CapacitiveSensor(4,2);
CapacitiveSensor volAntenna   = CapacitiveSensor(4,3);

// variables to store smoothed raw capacitive values
float smoothPitch = 500;
float smoothVol = 0;

void setup() {
  pinMode(8, OUTPUT); // pitch sound output - sends sound through 2 step RC filter to "TIP" of audio breakout board
  pinMode(9, OUTPUT); // LED "volume"

  TCCR1B = (TCCR1B & 0b11111000) | 0x01; // pwm code to prevent LED flicker - this I don't quite understand but I read about it to smooth out the flicker of the LED through the 25W amp (?) ... yes i wish i had more for you
}

void loop() {
  // variables where raw capacitive values are stored - 30 is kind of how many samples the Arduino takes to determine where your hand is
  long rawPitch = pitchAntenna.capacitiveSensor(30);
  long rawVol = volAntenna.capacitiveSensor(30);

// if hand is near pitch textile, exceeding the raw capacitive value of 50
  if (rawPitch > 50) { // you can change 50 to a lower number if you want to activate sound from farther away
    // pitch section - smooth pitch arduino can process 90% of old position with 10% of new position
    smoothPitch = (smoothPitch * 0.95) + (rawPitch * 0.05);
    int noteFreq = map(smoothPitch, 50, 1500, 450, 1600); // map functions takes the variable value and allows sensitivity between 50 and 1500 for a frequency between 450Hz and 1600Hz
    float v = sin(millis() * 0.004) * 10; // for vibrato - change 0.004 to change vibrato
    tone(8, noteFreq + v);

    // smoothing the volume (the LED)
    smoothVol = (smoothVol * 0.85) + (rawVol * 0.15);

    // as hand approaches, LED gets brighter at pin 9 which makes volume louder - LED + photoresistor together prevents noise from interrupting pitch signal
    int brightness = map(smoothVol, 50, 1200, 0, 255);
    analogWrite(9, constrain(brightness, 0, 255));

  } else {
    noTone(8);
    analogWrite(9, 0); // no light means no sound
  }
}

How-Tos & Tutorials

You can find this info in the "Process Journal" tab! :) Check out the Analog Synth, Weaving, and Theremin tabs in particular :D :D

Fabrication files