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.
-
[Shot of Carlsbad Beach] - “Somewhere Near San Diego, California”
-
[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.
-
[Shot of room] - Welcome to the studio! I mean it’s my room too but involuntarily it became my studio.
-
[Shots of my stuff in my room]
-
[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.
-
[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.
-
[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.
-
[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.
-
[Shots of me working on my project] - Voiceover excerpts from calls with grandmother + mother
-
[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
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
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¶
- Combining two .txt Datasets for a Weaving Pattern: weavingdraft_mothergrandmother.py
- One .txt Dataset for a Weaving Pattern: weavingdraft_daughter.py
- Mother Text File: mother.txt
- Grandmother Text File: grandmother.txt
- Daughter Text File: daughter.txt
- Circuit Enclosure Bag: enclosure_theremincircuit.dxf
- Circuit Enclosure Strips: enclosurestrips_theremincircuit.dxf
- Digital Theremin (Spirit of Analog): digitalanalogtheremin.ino
- Stick Shuttle: stickshuttle.dxf
- Lease Sticks: leasesticks.dxf
- Hand Loom: handloom.stl
- Hand Loom Comb: handloom.stl


