|
|
""" |
|
|
LUXBIN - Photonic Binary Language Demo |
|
|
A language where colors are letters and shades are grammar |
|
|
""" |
|
|
|
|
|
import gradio as gr |
|
|
import numpy as np |
|
|
from PIL import Image, ImageDraw, ImageFont |
|
|
import time |
|
|
|
|
|
|
|
|
ALPHABET = { |
|
|
'A': 0.0, 'B': 5.625, 'C': 11.25, 'D': 16.875, 'E': 22.5, |
|
|
'F': 28.125, 'G': 33.75, 'H': 39.375, 'I': 45.0, 'J': 50.625, |
|
|
'K': 56.25, 'L': 61.875, 'M': 67.5, 'N': 73.125, 'O': 78.75, |
|
|
'P': 84.375, 'Q': 90.0, 'R': 95.625, 'S': 101.25, 'T': 106.875, |
|
|
'U': 112.5, 'V': 118.125, 'W': 123.75, 'X': 129.375, 'Y': 135.0, |
|
|
'Z': 140.625 |
|
|
} |
|
|
|
|
|
|
|
|
REVERSE_ALPHABET = {v: k for k, v in ALPHABET.items()} |
|
|
|
|
|
|
|
|
PARTS_OF_SPEECH = { |
|
|
'Noun': 100, |
|
|
'Verb': 75, |
|
|
'Adjective': 50, |
|
|
'Modifier': 30, |
|
|
'Control': 0 |
|
|
} |
|
|
|
|
|
TENSES = { |
|
|
'Present': 70, |
|
|
'Past': 40, |
|
|
'Future': 85, |
|
|
'Conditional': 90 |
|
|
} |
|
|
|
|
|
|
|
|
def hsl_to_rgb(h, s, l): |
|
|
"""Convert HSL to RGB (0-255)""" |
|
|
s = s / 100.0 |
|
|
l = l / 100.0 |
|
|
|
|
|
c = (1 - abs(2 * l - 1)) * s |
|
|
x = c * (1 - abs((h / 60) % 2 - 1)) |
|
|
m = l - c / 2 |
|
|
|
|
|
if h < 60: |
|
|
r, g, b = c, x, 0 |
|
|
elif h < 120: |
|
|
r, g, b = x, c, 0 |
|
|
elif h < 180: |
|
|
r, g, b = 0, c, x |
|
|
elif h < 240: |
|
|
r, g, b = 0, x, c |
|
|
elif h < 300: |
|
|
r, g, b = x, 0, c |
|
|
else: |
|
|
r, g, b = c, 0, x |
|
|
|
|
|
return int((r + m) * 255), int((g + m) * 255), int((b + m) * 255) |
|
|
|
|
|
|
|
|
def encode_text_to_luxbin(text, part_of_speech='Noun', tense='Present'): |
|
|
"""Encode text to LUXBIN color sequence""" |
|
|
text = text.upper() |
|
|
saturation = PARTS_OF_SPEECH.get(part_of_speech, 100) |
|
|
lightness = TENSES.get(tense, 70) |
|
|
|
|
|
colors = [] |
|
|
for char in text: |
|
|
if char == ' ': |
|
|
colors.append((0, 0, 0)) |
|
|
elif char in ALPHABET: |
|
|
hue = ALPHABET[char] |
|
|
rgb = hsl_to_rgb(hue, saturation, lightness) |
|
|
colors.append(rgb) |
|
|
else: |
|
|
colors.append((128, 128, 128)) |
|
|
|
|
|
return colors |
|
|
|
|
|
|
|
|
def create_color_strip(colors, width=800, height=100): |
|
|
"""Create image showing color sequence""" |
|
|
if not colors: |
|
|
return Image.new('RGB', (width, height), 'black') |
|
|
|
|
|
img = Image.new('RGB', (width, height)) |
|
|
draw = ImageDraw.Draw(img) |
|
|
|
|
|
block_width = width // len(colors) |
|
|
|
|
|
for i, color in enumerate(colors): |
|
|
x1 = i * block_width |
|
|
x2 = x1 + block_width |
|
|
draw.rectangle([x1, 0, x2, height], fill=color) |
|
|
|
|
|
return img |
|
|
|
|
|
|
|
|
def create_hue_wheel(size=400): |
|
|
"""Create visual hue wheel showing alphabet""" |
|
|
img = Image.new('RGB', (size, size), 'white') |
|
|
draw = ImageDraw.Draw(img) |
|
|
|
|
|
center = size // 2 |
|
|
radius = size // 2 - 20 |
|
|
|
|
|
|
|
|
for i in range(360): |
|
|
angle = i * np.pi / 180 |
|
|
hue = i |
|
|
rgb = hsl_to_rgb(hue, 100, 70) |
|
|
|
|
|
x1 = center + int((radius - 30) * np.cos(angle)) |
|
|
y1 = center + int((radius - 30) * np.sin(angle)) |
|
|
x2 = center + int(radius * np.cos(angle)) |
|
|
y2 = center + int(radius * np.sin(angle)) |
|
|
|
|
|
draw.line([x1, y1, x2, y2], fill=rgb, width=2) |
|
|
|
|
|
|
|
|
try: |
|
|
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 16) |
|
|
except: |
|
|
font = ImageFont.load_default() |
|
|
|
|
|
for letter, hue in ALPHABET.items(): |
|
|
angle = (hue - 90) * np.pi / 180 |
|
|
label_radius = radius + 30 |
|
|
x = center + int(label_radius * np.cos(angle)) |
|
|
y = center + int(label_radius * np.sin(angle)) |
|
|
|
|
|
|
|
|
bbox = draw.textbbox((x, y), letter, font=font) |
|
|
draw.text((x - (bbox[2] - bbox[0]) / 2, y - (bbox[3] - bbox[1]) / 2), |
|
|
letter, fill='black', font=font) |
|
|
|
|
|
return img |
|
|
|
|
|
|
|
|
def encode_demo(text, pos, tense): |
|
|
"""Main encoding function""" |
|
|
colors = encode_text_to_luxbin(text, pos, tense) |
|
|
strip = create_color_strip(colors) |
|
|
|
|
|
|
|
|
desc = f"**LUXBIN Encoding**\n\n" |
|
|
desc += f"Text: `{text}`\n\n" |
|
|
desc += f"Grammar: {pos} (Saturation: {PARTS_OF_SPEECH[pos]}%), " |
|
|
desc += f"{tense} (Lightness: {TENSES[tense]}%)\n\n" |
|
|
desc += f"**Color Sequence:** {len(colors)} symbols\n\n" |
|
|
|
|
|
|
|
|
for i, char in enumerate(text.upper()): |
|
|
if char == ' ': |
|
|
desc += "` ` → Black (word boundary)\n\n" |
|
|
elif char in ALPHABET: |
|
|
desc += f"`{char}` → Hue {ALPHABET[char]:.1f}° (RGB: {colors[i]})\n\n" |
|
|
|
|
|
return strip, desc |
|
|
|
|
|
|
|
|
def create_grammar_guide(): |
|
|
"""Create visual guide for grammar rules""" |
|
|
img = Image.new('RGB', (600, 400), 'white') |
|
|
draw = ImageDraw.Draw(img) |
|
|
|
|
|
try: |
|
|
font_title = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 20) |
|
|
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14) |
|
|
except: |
|
|
font_title = font = ImageFont.load_default() |
|
|
|
|
|
y = 20 |
|
|
|
|
|
|
|
|
draw.text((20, y), "LUXBIN Grammar Rules", fill='black', font=font_title) |
|
|
y += 40 |
|
|
|
|
|
|
|
|
draw.text((20, y), "Saturation → Part of Speech", fill='black', font=font) |
|
|
y += 30 |
|
|
|
|
|
for pos, sat in PARTS_OF_SPEECH.items(): |
|
|
rgb = hsl_to_rgb(180, sat, 70) |
|
|
draw.rectangle([20, y, 70, y + 20], fill=rgb, outline='black') |
|
|
draw.text((80, y + 3), f"{pos}: {sat}%", fill='black', font=font) |
|
|
y += 30 |
|
|
|
|
|
y += 20 |
|
|
|
|
|
|
|
|
draw.text((20, y), "Lightness → Tense/Mode", fill='black', font=font) |
|
|
y += 30 |
|
|
|
|
|
for tense, light in TENSES.items(): |
|
|
rgb = hsl_to_rgb(180, 100, light) |
|
|
draw.rectangle([20, y, 70, y + 20], fill=rgb, outline='black') |
|
|
draw.text((80, y + 3), f"{tense}: {light}%", fill='black', font=font) |
|
|
y += 30 |
|
|
|
|
|
return img |
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks(title="LUXBIN - Photonic Binary Language", theme=gr.themes.Soft()) as demo: |
|
|
gr.Markdown(""" |
|
|
# ⚛️ LUXBIN - Photonic Binary Language |
|
|
|
|
|
**A language where colors are letters and shades are grammar** |
|
|
|
|
|
- **Hue (0°-360°)** = Letter identity (A-Z) |
|
|
- **Saturation** = Part of speech (Noun, Verb, etc.) |
|
|
- **Lightness** = Tense/mode (Present, Past, etc.) |
|
|
- **Timing** = Word and sentence boundaries |
|
|
|
|
|
--- |
|
|
""") |
|
|
|
|
|
with gr.Tabs(): |
|
|
|
|
|
with gr.Tab("📤 Encode Text to LUXBIN"): |
|
|
gr.Markdown("### Convert text into photonic color sequences") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
text_input = gr.Textbox( |
|
|
label="Enter Text", |
|
|
placeholder="HELLO WORLD", |
|
|
value="HELLO" |
|
|
) |
|
|
|
|
|
pos_input = gr.Dropdown( |
|
|
choices=list(PARTS_OF_SPEECH.keys()), |
|
|
value="Noun", |
|
|
label="Part of Speech (Saturation)" |
|
|
) |
|
|
|
|
|
tense_input = gr.Dropdown( |
|
|
choices=list(TENSES.keys()), |
|
|
value="Present", |
|
|
label="Tense/Mode (Lightness)" |
|
|
) |
|
|
|
|
|
encode_btn = gr.Button("🎨 Encode to LUXBIN", variant="primary") |
|
|
|
|
|
with gr.Column(): |
|
|
color_output = gr.Image(label="LUXBIN Color Sequence") |
|
|
desc_output = gr.Markdown() |
|
|
|
|
|
encode_btn.click( |
|
|
fn=encode_demo, |
|
|
inputs=[text_input, pos_input, tense_input], |
|
|
outputs=[color_output, desc_output] |
|
|
) |
|
|
|
|
|
gr.Markdown(""" |
|
|
**How to read:** |
|
|
- Each color block = one letter |
|
|
- Black = space (word boundary) |
|
|
- Hue = which letter (A-Z) |
|
|
- Saturation = grammatical role |
|
|
- Lightness = tense |
|
|
""") |
|
|
|
|
|
|
|
|
with gr.Tab("🎨 Alphabet & Hue Wheel"): |
|
|
gr.Markdown("### Visual reference for the LUXBIN alphabet") |
|
|
|
|
|
wheel_img = create_hue_wheel() |
|
|
gr.Image(value=wheel_img, label="LUXBIN Hue Wheel (26 Letters)") |
|
|
|
|
|
gr.Markdown(""" |
|
|
**How it works:** |
|
|
- 360° hue spectrum divided into 64 symbols |
|
|
- A-Z occupy first 26 positions |
|
|
- Step size: 5.625° per symbol |
|
|
- A = 0° (red), Z = 140.625° (greenish-blue) |
|
|
""") |
|
|
|
|
|
|
|
|
gr.Markdown("### Complete Alphabet") |
|
|
|
|
|
alphabet_html = "<table style='width:100%'><tr>" |
|
|
for i, (letter, hue) in enumerate(ALPHABET.items()): |
|
|
if i % 6 == 0 and i > 0: |
|
|
alphabet_html += "</tr><tr>" |
|
|
rgb = hsl_to_rgb(hue, 100, 70) |
|
|
alphabet_html += f"<td style='background-color:rgb{rgb}; padding:10px; text-align:center; border:1px solid black;'><b>{letter}</b><br>{hue:.1f}°</td>" |
|
|
alphabet_html += "</tr></table>" |
|
|
|
|
|
gr.HTML(alphabet_html) |
|
|
|
|
|
|
|
|
with gr.Tab("📚 Grammar Rules"): |
|
|
gr.Markdown("### LUXBIN grammar encoded in light properties") |
|
|
|
|
|
grammar_img = create_grammar_guide() |
|
|
gr.Image(value=grammar_img, label="Grammar Visual Guide") |
|
|
|
|
|
gr.Markdown(""" |
|
|
### Encoding Rules |
|
|
|
|
|
**Binary Layer:** |
|
|
- Each symbol = 6 bits (0-63) |
|
|
- Binary indexes photonic states |
|
|
- Not direct letter encoding |
|
|
|
|
|
**Photonic Layer:** |
|
|
- Hue = semantic identity (which letter/symbol) |
|
|
- Saturation = grammatical role |
|
|
- Lightness = temporal/modal information |
|
|
|
|
|
**Temporal Layer:** |
|
|
- 100ms = letter duration |
|
|
- 200ms dark = word boundary |
|
|
- 500ms dark = sentence end |
|
|
|
|
|
**Modifiers:** |
|
|
- +10% darker = plural |
|
|
- -10% lighter = negation |
|
|
- Rapid flicker = emphasis |
|
|
- Smooth fade = completion |
|
|
""") |
|
|
|
|
|
|
|
|
with gr.Tab("ℹ️ About LUXBIN"): |
|
|
gr.Markdown(""" |
|
|
# About LUXBIN |
|
|
|
|
|
**LUXBIN** is a photonic binary language where semantic information is encoded directly in the physical properties of light. |
|
|
|
|
|
## Key Concepts |
|
|
|
|
|
1. **Physics as Syntax**: Light parameters carry meaning |
|
|
2. **Parallel Channels**: Multiple layers of information in one photon |
|
|
3. **Non-Linear Encoding**: Not a cipher, but a genuine language |
|
|
|
|
|
## Applications |
|
|
|
|
|
- **Assistive Technology**: Non-verbal communication |
|
|
- **Secure Communication**: Line-of-sight only, hard to intercept |
|
|
- **Extreme Environments**: Underwater, space, RF-denied zones |
|
|
- **Human-Machine Interfaces**: Direct photonic signaling |
|
|
|
|
|
## Technical Details |
|
|
|
|
|
- **Alphabet Size**: 26 letters + 38 extended symbols |
|
|
- **Color Space**: HSL (Hue, Saturation, Lightness) |
|
|
- **Binary Base**: 6-bit indexing (64 total symbols) |
|
|
- **Grammar Layers**: Saturation, Lightness, Temporal |
|
|
|
|
|
## Implementation |
|
|
|
|
|
- **Hardware**: ESP32 + WS2812 RGB LEDs |
|
|
- **Software**: Python encoder/decoder |
|
|
- **Perception**: Trainable by humans in ~30 minutes |
|
|
|
|
|
## Status |
|
|
|
|
|
LUXBIN is a complete language specification ready for: |
|
|
- Hardware prototyping |
|
|
- Human perception testing |
|
|
- Standardization |
|
|
- Publication |
|
|
|
|
|
--- |
|
|
|
|
|
**Created by:** Nicholechristie |
|
|
**Version:** 1.0 |
|
|
**License:** Open Specification |
|
|
""") |
|
|
|
|
|
|
|
|
gr.Markdown("---") |
|
|
gr.Markdown("### 🚀 Try These Examples") |
|
|
|
|
|
gr.Examples( |
|
|
examples=[ |
|
|
["HELLO WORLD", "Noun", "Present"], |
|
|
["TEST", "Verb", "Past"], |
|
|
["AI LANGUAGE", "Noun", "Future"], |
|
|
["QUANTUM", "Adjective", "Present"], |
|
|
], |
|
|
inputs=[text_input, pos_input, tense_input], |
|
|
outputs=[color_output, desc_output], |
|
|
fn=encode_demo, |
|
|
cache_examples=True |
|
|
) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|