diff --git a/checkpoint.py b/checkpoint.py
index 1c6e878..2b6b068 100644
--- a/checkpoint.py
+++ b/checkpoint.py
@@ -219,3 +219,280 @@ def restore(
if params_only:
state = state.params
return state
+import React from "react";
+import { Canvas } from "@react-three/fiber";
+import { OrbitControls, Stars } from "@react-three/drei";
+import { useState, useEffect } from "react";
+import * as THREE from "three";
+
+const LumoraCity = () => {
+ const [frequencyData, setFrequencyData] = useState([]);
+
+ useEffect(() => {
+ const analyser = new (window.AudioContext || window.webkitAudioContext)();
+ navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
+ const source = analyser.createMediaStreamSource(stream);
+ const analyserNode = analyser.createAnalyser();
+ source.connect(analyserNode);
+ analyserNode.fftSize = 256;
+ const bufferLength = analyserNode.frequencyBinCount;
+ const dataArray = new Uint8Array(bufferLength);
+
+ const updateFrequency = () => {
+ analyserNode.getByteFrequencyData(dataArray);
+ setFrequencyData([...dataArray]);
+ requestAnimationFrame(updateFrequency);
+ };
+
+ updateFrequency();
+ });
+ }, []);
+
+ return (
+
+ );
+};
+
+export default LumoraCity;
+import React from "react";
+import { Canvas } from "@react-three/fiber";
+import { OrbitControls, Stars } from "@react-three/drei";
+import { useState, useEffect } from "react";
+import * as THREE from "three";
+import { VRButton } from "@react-three/xr";
+import { XR } from "@react-three/xr";
+
+const LumoraCity = () => {
+ const [frequencyData, setFrequencyData] = useState([]);
+
+ useEffect(() => {
+ const analyser = new (window.AudioContext || window.webkitAudioContext)();
+ navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
+ const source = analyser.createMediaStreamSource(stream);
+ const analyserNode = analyser.createAnalyser();
+ source.connect(analyserNode);
+ analyserNode.fftSize = 256;
+ const bufferLength = analyserNode.frequencyBinCount;
+ const dataArray = new Uint8Array(bufferLength);
+
+ const updateFrequency = () => {
+ analyserNode.getByteFrequencyData(dataArray);
+ setFrequencyData([...dataArray]);
+ requestAnimationFrame(updateFrequency);
+ };
+
+ updateFrequency();
+ });
+ }, []);
+
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default LumoraCity;
+import React, { useState, useEffect } from "react";
+import { Canvas } from "@react-three/fiber";
+import { OrbitControls, Stars, Html } from "@react-three/drei";
+import * as THREE from "three";
+import { VRButton } from "@react-three/xr";
+import { XR } from "@react-three/xr";
+
+const AIHelper = ({ position, text }) => {
+ return (
+
+
+
+
+
+ {text}
+
+
+
+ );
+};
+
+const LumoraCity = () => {
+ const [frequencyData, setFrequencyData] = useState([]);
+ const [aiMessage, setAiMessage] = useState("Bienvenue à Lumora. Parle, et la ville écoutera.");
+
+ useEffect(() => {
+ const analyser = new (window.AudioContext || window.webkitAudioContext)();
+ navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
+ const source = analyser.createMediaStreamSource(stream);
+ const analyserNode = analyser.createAnalyser();
+ source.connect(analyserNode);
+ analyserNode.fftSize = 256;
+ const bufferLength = analyserNode.frequencyBinCount;
+ const dataArray = new Uint8Array(bufferLength);
+
+ const updateFrequency = () => {
+ analyserNode.getByteFrequencyData(dataArray);
+ setFrequencyData([...dataArray]);
+
+ const avgFreq = dataArray.reduce((sum, val) => sum + val, 0) / dataArray.length;
+ if (avgFreq > 100) {
+ setAiMessage("Les vibrations sont fortes. Lumora répond.");
+ } else {
+ setAiMessage("Le silence est aussi une réponse. Écoute.");
+ }
+
+ requestAnimationFrame(updateFrequency);
+ };
+
+ updateFrequency();
+ });
+ }, []);
+
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default LumoraCity;
+import React, { useState, useEffect } from "react";
+import { Canvas } from "@react-three/fiber";
+import { OrbitControls, Stars, Html } from "@react-three/drei";
+import * as THREE from "three";
+import { VRButton } from "@react-three/xr";
+import { XR } from "@react-three/xr";
+
+const AIHelper = ({ position, text }) => {
+ return (
+
+
+
+
+
+ {text}
+
+
+
+ );
+};
+
+const Pathway = ({ points }) => {
+ return (
+
+ {points.map((point, index) => (
+
+
+
+
+ ))}
+
+ );
+};
+
+const LumoraCity = () => {
+ const [frequencyData, setFrequencyData] = useState([]);
+ const [aiMessage, setAiMessage] = useState("Bienvenue à Lumora. Parle, et la ville écoutera.");
+ const pathwayPoints = [
+ [0, 0, -5], [1, 0, -4], [2, 0, -3], [3, 0, -2], [4, 0, -1],
+ [5, 0, 0], [4, 0, 1], [3, 0, 2], [2, 0, 3], [1, 0, 4], [0, 0, 5]
+ ];
+
+ useEffect(() => {
+ const analyser = new (window.AudioContext || window.webkitAudioContext)();
+ navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {
+ const source = analyser.createMediaStreamSource(stream);
+ const analyserNode = analyser.createAnalyser();
+ source.connect(analyserNode);
+ analyserNode.fftSize = 256;
+ const bufferLength = analyserNode.frequencyBinCount;
+ const dataArray = new Uint8Array(bufferLength);
+
+ const updateFrequency = () => {
+ analyserNode.getByteFrequencyData(dataArray);
+ setFrequencyData([...dataArray]);
+
+ const avgFreq = dataArray.reduce((sum, val) => sum + val, 0) / dataArray.length;
+ if (avgFreq > 100) {
+ setAiMessage("Les vibrations sont fortes. Lumora répond.");
+ } else {
+ setAiMessage("Le silence est aussi une réponse. Écoute.");
+ }
+
+ requestAnimationFrame(updateFrequency);
+ };
+
+ updateFrequency();
+ });
+ }, []);
+
+ return (
+ <>
+
+
+ >
+ );
+};
+
+export default LumoraCity;