Reading a Khipu and Recording into the KFG File Format Specification

This page contains a lot of one minute videos. It takes a while to load…

1. Reading a Khipu

So you’ve never actually “read” a real-live khipu. This page is intended as a field guide to how to measure khipu, and what to notice and look out for. This page is a companion to the KFG Excel Specification which explains how to encode the actual khipu to a digital format.

Reading an actual Inkan khipu is a skill best acquired by writing (making) a khipu. By making a khipu you learn more about cordage, and about how knots are made. The most useful skill to acquire is how to write knots, which will teach you how to read them. Acquire a few yards of 550 Paracord and make your own knots, using the guides below. These will serve as “flash cards” for you to learn how to read knots.

2 Writing Knots

Writing knots is the first step to reading them. The most common knots are single knots, long knots, and figure-eight knots. The following table of images and notes provides a step by step guide to these three common khipu knot types, including both S, and Z twists, and long-knot axis directions (down, up).

The style of tying used in these demos is my own invention based on experience with how knot-makers make similar knots (ie. a double overhand knot is similar to a 2 long knot). It is intended to show you one “base technique” for all the knots (overhands on your finger), and to show you how similar the types of knots are to each other.

I use my index finger as a base for the construction of the knot. I use my left finger/hand for most of these knots, but using my right hand/right index finger, for some, results in an opposite knot spin/twist. With my left hand, an over and to the right results in an Z twist. With my right index finger, a looping over and to the left, results in an S twist.

There are other guides to khipu knot making, including the excellent videos on YouTube by Jon Clindaniel and the article New Horizons in Andean Art History by Andrew James Hamilton (3/2021).

2.1 Cord Parts

A little vocabulary is in order. A quick review of cord parts:

  • Standing End: The beginning of a cord - the part that attaches to the primary for example
  • Running End: The end of the cord - the part that does all the weaving of knots and ends up at the bottom of a pendant cord
  • Clockwise Loop: Just as it sounds - a loop of cord made by taking the running end up over and to the right of the standing end of the cord.
  • Counter-Clockwise Loop: Just as it sounds - a loop of cord made by taking the running end up over and to the left of the standing end of the cord.

2.2 Single Knots

Single Knots
Single Knot - Z Twist Single Knot - S Twist
KFG Encoding 1S(10.0,Z) 1S(10.0,S)
Description One Single Knot, 10.0 cm from the primary cord knot attachment, with a Z twist One Single Knot, 10.0 cm from the primary cord knot attachment, with an S twist
Layout
Front View
Back View


Videos showing the Construction of these Knots:

Single Knot Construction
Single Knot Z Twist Single Knot S Twist Single Knot S Twist Alternative

2.3 Long Knots

There are many ways to create long knots, but in essence, they are all multiples of the same alternatives in creating a single knot. As noted above, I can alter the spin based on whether I use my right hand or my left hand. You will also notice, that I can wrap cords overhand/clockwise around my finger(s) or underhand/counter-clockwise around my fingers. The former results in a Z spin, the latter an S spin. Play with variants of clockwise/counterclockwise, left/right hand, and standing end vs running end, to see how spins and axis up-downs are created.

To create a long-knot with a straigh Axis-Up Direction (AXU), swap the standing end and the running end.

Long Knots
Long Knot Z Twist - AXD Long Knot S Twist - AXD Axis Down
Long Knot Z Twist - AXU
KFG Encoding 3L(10.0,Z),AXD 4L(10.0,S),AXD 3L(10.0,Z),AXU
Description Three Long Knot, 10.0 cm from the primary cord knot attachment, with a Z twist, and Straight Axis pointing Down (AXD) Four Long Knot, 10.0 cm from the primary cord knot attachment, with an S twist, and Straight Axis pointing Down (AXD) Three Long Knot, 10.0 cm from the primary cord knot attachment, with a Z twist, and Straight Axis pointing Up (AXU)
Step 1
Clockwise loop Counter Clockwise loop to the left Clockwise loop with Standing End
Step 2
Three Clockwise turns and out the loop on top Four Counter Clockwise turns and out the loop on top Three Clockwise turns and out the loop on top with Standing End
Front View
Back View
Note Z Twist on back Note S Twist on back Note Z Twist on back and
Straight Axis Up (AXU)


Videos showing the Construction of Long Knots.

Long Knot Construction
Long Knot Z Twist
Axis Down - AXD
Long Knot S Twist
Axis Down - AXD
Long Knot Z Twist
Axis Up - AXU


As mentioned above, one can make S-Twist single and long knots in your left hand using an underhand counter-clockwise loop. These two videos show how:

S Twist Alternatives
Single Knot - S Twist Alternative Long Knot - S Twist Alternative

2.4 Figure-Eight Knots

Figure-Eight Knots
Figure-Eight Knot - Z Twist Figure-Eight Knot - S Twist
KFG Encoding 1E(10.0,Z) 1E(10.0,S)
Description One Figure-Eight Knot, 10.0 cm from the primary cord knot attachment, with a Z twist One Figure-Eight Knot, 10.0 cm from the primary cord knot attachment, with an S twist
Clockwise loop Counter Clockwise loop to the left
Step 1
Over to the Right, Under & to the Left Over to the Left, Under & to the Right
Step 2
Through the loop Through the loop
Step 3
Note Z Twist Above & Below Note S Twist Above & Below
Front View
Back View


Although the above pictures are clear enough, the videos below show the parallels in construction, of a figure-eight knot and the construction of a single or long knot.

Figure-Eight Knot Construction
Figure-Eight Z Figure-Eight S

3 Recording a Khipu

3.1 Sheet 1 - Khipu Catalog Information

3.2 Sheet 2 - Primary Cord

  • Length Record from the knotted Kayte end through to the final length of the dangle end. If there is a knot at the dangle or terminating end, measure to the knot, and make a note in the Notes Sheet Primary Cord Section that X cm from the end of the knot on the Primary Cord is a Raveled cord (or however makes sense to note.). Note that a LOT of khipu are mounted backwards with the dangle end on the left. You will have to record the khipu backwards from right to left, so that the dangle end occurs in the correct location. AT THE END
  • Terminations - Record the terminations of the Primary Cord, and the spins and colors.
  • Colors - Remember that cords that consist of two sections (ie. Black[LK] from 0 to 10 cm and White[W] 10-20 cm) are recorded as LK(0-10)/W(10-20)
  • Fiber - …
  • Knots in the Primary Cord Make a note in the Notes Sheet Primary Cord Section that the primary cord is joined by a Knot at X cm (from the start).
  • Wrappings - Currently primary cord wrappings are not supported in the code. To support them in the future, if there are wrappings in the primary cord, include the information as one or more lines, with the wrapping color information encoded in the standard Ascher color format. For example if there are three primary cord wrappings strong red SR(from 10 to 12 cm), white W(from 13 to 14 cm) and deep blue PB(from 17 to 17.5 cm) we could list it as:
    Wrapping: SR(10-12)/W(13-14)/PB(17-17.5)

3.3 Sheet 3 - Group/Cluster Information

For each group:

  • Record the distance from the beginning of the primary cord to the beginning of the group. Call that D. For example D might be 43.0 cm
  • Divide the width of the group by the number of cords. That is the spacing S. For example, S might be 0.15 cm

Then a group of twelve pendants could be written as:
    D cm group of 12 pendants (13-24) spacing of Scm
    43.0 cm group of 12 pendants (107-111) space of .15 cm

A group of one pendant, p76, could be written as:
    D cm 1 (76)
    43.0cm 1 (76)

3.4 Sheet 4 - Cord Information

  • Length - Measure the cord from the bottom of the primary cord to the knotted end of the cord if there is a knotted end, or the end of the cord if it terminates without a knot. Note in the cord notes if it’s end is Raveled.
  • Attachment - If the cord comes from the bottom of the primary cord, it is verso, from the top, it’s recto. If it points up as it’s tied, compared to it’s peers, it’s a top cord.
    A personal note from Manuel Medrano:

The relationship between loop cords and top cords has never been formalized, as far as I’m aware. To the extent that top cords have been defined, they are typically identified by their spatial arrangement in relation to the pendant cords: a cord tied in such a way that it projects in a direction opposite to the pendants would constitute a top cord.

By that definition, a “loop cord” that extends downward, in line with the pendants (and whose attached pendants sit parallel to the pendants that aren’t on the loop), would not constitute a top cord. If it is tied so that the loop sits on the other side of the primary cord from the pendants (and its attached pendants sit parallel but opposite to the pendants on the rest of the quipu), that is unclear. In that scenario I could see recording the loop cord in the notes and then the cords attached to it as all being top cords.

Remember to reverse attachment orientations if the khipu has been mounted backwards with the dangle end leading on the left. In that case verso and recto will be switched, since you are looking at the back of the primary cord.

  • Termination - If the cord ends in a knot, label it’s termination as K (knotted), and if it is unraveling after the knot, note it as Raveled in the cord note.

  • Color Since color matching is so subjective, I encourage you to work through the medium of digital pictures and RGB pixel values to decide what are the appropriate matching colors.

      1. White Balance Correction - There is a lot of information on the net on how to adjust your photos for a correct neutral white balance. Fixing your digital images white balance is the first step to matching brezine color or other color schemes.
      1. Matching colors. Matching color is arguably the most subjective part of reading a khipu. Colors have faded, colors are “fuzzy”, etc. To match colors to the Brezine/Ascher color chart:
      • Use the most common Ascher Cord Colors in the KFG as a guide first. The 10 most common Brezine/Ascher Cord Colors (from a base of 64 colors) are

        • W (25%) - White
        • AB (13%) - Light Brown
        • MB (10%) - Moderate Brown
        • YB (05%) - Light Yellowish Brown
        • B (4%) - Moderate Yellowish Brown
        • W:MB (2%) - Mottled White/Moderate Brown
        • W:AB (2%) - Mottle White/Light Brown
        • KB (2%) - Dark Brown
        • LB (2%) - Deep Yellowish Brown
        • PK (2%) - Pink (aka the Unknown Color)
      • Taking a digital picture (with proper white balance - see above) and comparing the rgb values of the cord to the RGB values of the Brezine color chart in Photoshop or similar will reveal closest match without human bias (although white balance might be an issue). I have frequently reaffirmed that comparing actual digital RGB values is far superior to human intuition.

      • Use the khipu field guide function below for matching an RGB value to the closest Brezine or Pantone color. See Code Below:

  • Knots - If a long knot, note the axis of the knot in the note spec. If it’s an Axis/Straight cord Down part of long knot, encode it as AXD, if an Axis/Straight Cord Up part of the long knot, encode as AXU

Code
import pandas as pd
import utils_loom as uloom

def RGB_color_to_Brezine_color(red, green, blue, metric="euclidean"):
    """ Given red, green, blue triple in range 0.0-1.0 for each of red, green, and blue, 
    using the appropriate distance metric (either "euclidean" or "cosine"),
    return tuple of (closest color, color_record) in the Brezine color set.

    Uses a CSV file of the Brezine color set, which is a set of 64 colors containing their Ascher Color Code, their expanded name, and an RGB triple from 0-1.0
    """
    # Create a cached attribute to store the color_df
    try:
        RGB_color_to_Brezine_color.color_df
    except AttributeError:
        RGB_color_to_Brezine_color.color_df = pd.read_csv(f"{uloom.data_directory()}/CSV/ascher_color.csv")
    
    min_distance = 0
    rgb_vect = uloom.to_unit_vector([red, green, blue])
    
    for i, row in RGB_color_to_Brezine_color.color_df.iterrows():
        brez_r, brez_g, brez_b = row[["red", "green", "blue"]]
        brez_vect = uloom.to_unit_vector([brez_r, brez_g, brez_b])
        if metric == "euclidean":
            distance = uloom.distance_between(rgb_vect, brez_vect)
        elif metric == "cosine":
             distance = uloom.degrees_between(brez_vect, rgb_vect, do_normalize=False)
        else:
            raise ValueError(f"Unknown metric: {metric}")
        if i == 0 or distance < min_distance:
            min_distance = distance
            closest_color = row["color_name"]
            closest_row = row

    return (closest_color, closest_row)


# Example usage
# print(RGB_color_to_Brezine_color(0.5, 0.5, 0.5, metric="euclidean")) #Bluish Grey (LA)
# print(RGB_color_to_Brezine_color(0.75, 0.15, 0.15, metric="euclidean")) #Strong Red (SR)   
# print(RGB_color_to_Brezine_color(0.15, 0.15, 0.75, metric="euclidean")) #Deep Blue (PB)    
# print(RGB_color_to_Brezine_color(0.01, 0.01, 0.01, metric="cosine")) #Black (LK)
Code
def RGB_color_to_Pantone_color(red, green, blue, metric="euclidean"):
    """ Given red, green, blue triple in range 0.0-1.0 for each of red, green, and blue, 
    using the appropriate distance metric (either "euclidean" or "cosine"),
    return tuple of (closest color, color_record) in the Pantone color set.

    Uses a CSV file of the Pantone color set, which is a set of 3458 colors containing their Pantone Color Code an RGB triple from 0-1.0, and their hex value
    """
    # Create a cached attribute to store the color_df
    try:
        RGB_color_to_Pantone_color.color_df
    except AttributeError:
        RGB_color_to_Pantone_color.color_df = pd.read_csv(f"{uloom.data_directory()}/CSV/pantone_color.csv")
    
    min_distance = 0
    rgb_vect = uloom.to_unit_vector([red, green, blue])
    
    for i, row in RGB_color_to_Pantone_color.color_df.iterrows():
        pantone_r, pantone_g, pantone_b = row[["red", "green", "blue"]]
        pantone_vect = uloom.to_unit_vector([pantone_r, pantone_g, pantone_b])
        if metric == "euclidean":
            distance = uloom.distance_between(rgb_vect, pantone_vect)
        elif metric == "cosine":
             distance = uloom.degrees_between(pantone_vect, rgb_vect, do_normalize=False)
        else:
            raise ValueError(f"Unknown metric: {metric}")
        if i == 0 or distance < min_distance:
            min_distance = distance
            closest_color = row["color_name"].replace(" ", "_")
            closest_row = row

    return (closest_color, closest_row)

# Example usage
# print(RGB_color_to_Pantone_color(0.5, 0.5, 0.5, metric="euclidean")) #420_U
# print(RGB_color_to_Pantone_color(0.75, 0.15, 0.15, metric="euclidean")) #711_C   
# print(RGB_color_to_Pantone_color(0.15, 0.15, 0.75, metric="euclidean")) #2736_C    
# print(RGB_color_to_Pantone_color(0.01, 0.01, 0.01, metric="cosine")) #420_U

3.5 Sheet 5 - Notes

  • Catalog - …
  • Primary Cord - If there are Primary Cord notes, start the Primary Cord Section of the Notes Sheet with a Section Title line:
    # Primary Cord Notes
  • Group/Cluster - If there are Group notes, start the Group Section of the Notes Sheet with a Section Title line:
    # Group Notes
  • Cord - If there are Cord notes that require additional discussion from the one line per cord notes in the cord sheet, add a Section Title line:
    # Cord Notes
  • Author’s Notes - If there are Author’s notes, observations, or disclaimers, start the Author’s Notes Section of the Notes Sheet with a Section Title line:
    # Author's Notes