import matplotlib.pyplot as plt
# ASCII Letters (A–Z)
ascii_letters = [(chr(i), f"ASCII {i}", f"U+{i:04X}") for i in range(65, 91)]
# NATO Phonetic Alphabet with IPA
nato_alphabet = [
("A", "Alpha", "/ˈælfɑ/"),
("B", "Bravo", "/ˈbrɑːvoʊ/"),
("C", "Charlie", "/ˈtʃɑːrli/"),
("D", "Delta", "/ˈdɛltɑ/"),
("E", "Echo", "/ˈɛkoʊ/"),
("F", "Foxtrot", "/ˈfɑkstrɑt/"),
("G", "Golf", "/ɡɑlf/"),
("H", "Hotel", "/hoʊˈtɛl/"),
("I", "India", "/ˈɪndiə/"),
("J", "Juliett", "/ˈdʒuːliˌɛt/"),
("K", "Kilo", "/ˈkiːloʊ/"),
("L", "Lima", "/ˈliːmə/"),
("M", "Mike", "/maɪk/"),
("N", "November", "/noʊˈvɛmbɚ/"),
("O", "Oscar", "/ˈɑskɑr/"),
("P", "Papa", "/pəˈpɑ/"),
("Q", "Quebec", "/kɪˈbɛk/ or /kəˈbɛk/"),
("R", "Romeo", "/ˈroʊmiˌoʊ/"),
("S", "Sierra", "/siˈɛrɑ/"),
("T", "Tango", "/ˈtæŋɡoʊ/"),
("U", "Uniform", "/ˈjunɪˌfɔrm/"),
("V", "Victor", "/ˈvɪktɚ/"),
("W", "Whiskey", "/ˈwɪski/"),
("X", "X-ray", "/ˈɛksˌreɪ/"),
("Y", "Yankee", "/ˈjæŋki/"),
("Z", "Zulu", "/ˈzuːlu/")
]
# English letter names with IPA
english_names = [
("A", "Name: A", "[eɪ]"),
("B", "Name: B", "[biː]"),
("C", "Name: C", "[siː]"),
("D", "Name: D", "[diː]"),
("E", "Name: E", "[iː]"),
("F", "Name: F", "[ɛf]"),
("G", "Name: G", "[dʒiː]"),
("H", "Name: H", "[eɪtʃ]"),
("I", "Name: I", "[aɪ]"),
("J", "Name: J", "[dʒeɪ]"),
("K", "Name: K", "[keɪ]"),
("L", "Name: L", "[ɛl]"),
("M", "Name: M", "[ɛm]"),
("N", "Name: N", "[ɛn]"),
("O", "Name: O", "[oʊ]"),
("P", "Name: P", "[piː]"),
("Q", "Name: Q", "[kjuː]"),
("R", "Name: R", "[ɑːr]"),
("S", "Name: S", "[ɛs]"),
("T", "Name: T", "[tiː]"),
("U", "Name: U", "[juː]"),
("V", "Name: V", "[viː]"),
("W", "Name: W", "[ˈdʌbəl.juː]"),
("X", "Name: X", "[ɛks]"),
("Y", "Name: Y", "[waɪ]"),
("Z", "Name: Z", "[ziː] or [zɛd]")
]
# Grid layout (3 columns: ASCII, NATO, English Name IPA)
cols = 3
rows = len(ascii_letters)
fig, ax = plt.subplots(figsize=(20, 24))
for idx, (ascii_entry, nato_entry, eng_entry) in enumerate(zip(ascii_letters, nato_alphabet, english_names)):
# ASCII column
letter, code, unicode_point = ascii_entry
ax.add_patch(plt.Rectangle((0, -idx), 3, -1, facecolor="#E6E6FA", edgecolor="black"))
ax.text(1.5, -idx - 0.35, letter, ha="center", va="center", fontsize=16, fontweight="bold")
ax.text(1.5, -idx - 0.65, code, ha="center", va="center", fontsize=8)
ax.text(1.5, -idx - 0.85, unicode_point, ha="center", va="center", fontsize=7)
# NATO column
letter, word, ipa = nato_entry
ax.add_patch(plt.Rectangle((3, -idx), 5, -1, facecolor="#B0E0E6", edgecolor="black"))
ax.text(5.5, -idx - 0.3, f"{letter} – {word}", ha="center", va="center", fontsize=12, fontweight="bold")
ax.text(5.5, -idx - 0.7, ipa, ha="center", va="center", fontsize=9)
# English Name IPA column
_, name, ipa_eng = eng_entry
ax.add_patch(plt.Rectangle((8, -idx), 5, -1, facecolor="#98FB98", edgecolor="black"))
ax.text(10.5, -idx - 0.35, name, ha="center", va="center", fontsize=12, fontweight="bold")
ax.text(10.5, -idx - 0.7, ipa_eng, ha="center", va="center", fontsize=9)
ax.set_xlim(0, 13)
ax.set_ylim(-rows, 1)
ax.axis("off")
plt.title("ASCII Letters (A–Z), NATO Phonetic Alphabet, and English Letter Names (IPA)", fontsize=18, fontweight="bold")
plt.show()

Here’s the triple-column Codex chart:
- Left (lavender): ASCII A–Z, with decimal and Unicode code points.
- Center (blue): NATO phonetic words with IPA (clarity in transmission).
- Right (green): English letter names with their IPA pronunciation (how each letter itself is spoken).
This unifies written code → operational code → spoken code all in one table.
Would you like me to now add a fourth column for the IPA base phoneme value that each letter most often represents (e.g., A → [æ], B → [b], C → [k]/[s]) so we see the Codex cycle: letter → ASCII → NATO → English name → phoneme sound?
NATO Phonetic Alphabet – SolveForce Communications