Spaces:
				
			
			
	
			
			
					
		Running
		
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
	| <html> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Neural Radio Learning Interface</title> | |
| <style> | |
| body { | |
| background: #000; | |
| color: #0f0; | |
| font-family: monospace; | |
| padding: 20px; | |
| margin: 0; | |
| } | |
| .container { | |
| max-width: 1000px; | |
| margin: 0 auto; | |
| } | |
| .radio-source { | |
| border: 1px solid #0f0; | |
| padding: 10px; | |
| margin: 10px 0; | |
| } | |
| .visualizer { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 10px; | |
| margin: 10px 0; | |
| } | |
| canvas { | |
| background: #111; | |
| border: 1px solid #0f0; | |
| width: 100%; | |
| height: 100px; | |
| } | |
| .controls { | |
| display: flex; | |
| gap: 10px; | |
| margin: 10px 0; | |
| } | |
| button { | |
| background: #111; | |
| color: #0f0; | |
| border: 1px solid #0f0; | |
| padding: 10px 20px; | |
| cursor: pointer; | |
| } | |
| button:hover { | |
| background: #0f0; | |
| color: #000; | |
| } | |
| .status { | |
| border: 1px solid #0f0; | |
| padding: 10px; | |
| margin: 10px 0; | |
| } | |
| .meter { | |
| width: 100%; | |
| height: 20px; | |
| background: #111; | |
| border: 1px solid #0f0; | |
| margin: 5px 0; | |
| } | |
| .meter-fill { | |
| height: 100%; | |
| background: #0f0; | |
| width: 0%; | |
| transition: width 0.3s; | |
| } | |
| .memory-bank { | |
| border: 1px solid #0f0; | |
| padding: 10px; | |
| margin: 10px 0; | |
| height: 150px; | |
| overflow-y: auto; | |
| } | |
| .neural-response { | |
| border: 1px solid #0f0; | |
| padding: 10px; | |
| margin: 10px 0; | |
| } | |
| @keyframes pulse { | |
| 0% { opacity: 1; } | |
| 50% { opacity: 0.5; } | |
| 100% { opacity: 1; } | |
| } | |
| .recording { | |
| color: #f00; | |
| animation: pulse 1s infinite; | |
| display: none; | |
| } | |
| .active .recording { | |
| display: inline; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <h2>Neural Radio Learning Interface</h2> | |
| <div class="radio-source"> | |
| <h3>Radio Source</h3> | |
| <audio id="radioStream" crossorigin="anonymous"> | |
| <source src="http://stream.live.vc.bbcmedia.co.uk/bbc_world_service" type="audio/mpeg"> | |
| </audio> | |
| <div>Status: <span id="radioStatus">Not connected</span></div> | |
| </div> | |
| <div class="visualizer"> | |
| <div> | |
| <div>Input Signal</div> | |
| <canvas id="inputVisual"></canvas> | |
| </div> | |
| <div> | |
| <div>Radio Signal</div> | |
| <canvas id="radioVisual"></canvas> | |
| </div> | |
| </div> | |
| <div class="status"> | |
| <div>Neural Learning Progress:</div> | |
| <div class="meter"> | |
| <div class="meter-fill" id="learningMeter"></div> | |
| </div> | |
| <div>Pattern Recognition:</div> | |
| <div class="meter"> | |
| <div class="meter-fill" id="patternMeter"></div> | |
| </div> | |
| </div> | |
| <div class="controls"> | |
| <button id="startBtn">Start Learning</button> | |
| <button id="stopBtn">Stop</button> | |
| <button id="respondBtn">Force Response</button> | |
| <span class="recording">● Recording</span> | |
| </div> | |
| <div class="memory-bank"> | |
| <h3>Memory Bank</h3> | |
| <div id="memories"></div> | |
| </div> | |
| <div class="neural-response"> | |
| <h3>Neural Response</h3> | |
| <div id="response">Waiting for input...</div> | |
| </div> | |
| </div> | |
| <script> | |
| class NeuralRadioInterface { | |
| constructor() { | |
| this.audioContext = null; | |
| this.radioAnalyser = null; | |
| this.micAnalyser = null; | |
| this.isLearning = false; | |
| this.memories = []; | |
| this.learningProgress = 0; | |
| this.patternStrength = 0; | |
| this.initializeUI(); | |
| this.setupEventListeners(); | |
| } | |
| initializeUI() { | |
| this.inputCanvas = document.getElementById('inputVisual'); | |
| this.radioCanvas = document.getElementById('radioVisual'); | |
| this.learningMeter = document.getElementById('learningMeter'); | |
| this.patternMeter = document.getElementById('patternMeter'); | |
| this.memoriesDiv = document.getElementById('memories'); | |
| this.responseDiv = document.getElementById('response'); | |
| this.radioStatus = document.getElementById('radioStatus'); | |
| } | |
| setupEventListeners() { | |
| document.getElementById('startBtn').onclick = () => this.start(); | |
| document.getElementById('stopBtn').onclick = () => this.stop(); | |
| document.getElementById('respondBtn').onclick = () => this.generateResponse(); | |
| const radio = document.getElementById('radioStream'); | |
| radio.onplay = () => this.radioStatus.textContent = 'Connected'; | |
| radio.onerror = () => this.radioStatus.textContent = 'Error connecting'; | |
| } | |
| async start() { | |
| try { | |
| this.audioContext = new AudioContext(); | |
| // Setup microphone input | |
| const micStream = await navigator.mediaDevices.getUserMedia({audio: true}); | |
| const micSource = this.audioContext.createMediaStreamSource(micStream); | |
| this.micAnalyser = this.audioContext.createAnalyser(); | |
| micSource.connect(this.micAnalyser); | |
| // Setup radio input | |
| const radio = document.getElementById('radioStream'); | |
| radio.play(); | |
| const radioSource = this.audioContext.createMediaElementSource(radio); | |
| this.radioAnalyser = this.audioContext.createAnalyser(); | |
| radioSource.connect(this.radioAnalyser); | |
| radioSource.connect(this.audioContext.destination); | |
| this.isLearning = true; | |
| document.body.classList.add('active'); | |
| this.learn(); | |
| this.updateVisuals(); | |
| this.monitorInput(); | |
| } catch(err) { | |
| console.error('Error:', err); | |
| this.responseDiv.textContent = 'Error: ' + err.message; | |
| } | |
| } | |
| stop() { | |
| this.isLearning = false; | |
| document.getElementById('radioStream').pause(); | |
| document.body.classList.remove('active'); | |
| if(this.audioContext) { | |
| this.audioContext.close(); | |
| } | |
| } | |
| learn() { | |
| if(!this.isLearning) return; | |
| // Simulate learning from radio stream | |
| if(this.learningProgress < 100) { | |
| this.learningProgress += Math.random() * 0.5; | |
| this.learningMeter.style.width = this.learningProgress + '%'; | |
| } | |
| // Store simulated memories | |
| if(Math.random() < 0.1) { | |
| const memory = `Learned pattern ${Math.floor(Math.random() * 1000)} at ${new Date().toLocaleTimeString()}`; | |
| this.memories.unshift(memory); | |
| if(this.memories.length > 10) this.memories.pop(); | |
| this.updateMemories(); | |
| } | |
| setTimeout(() => this.learn(), 100); | |
| } | |
| monitorInput() { | |
| if(!this.isLearning) return; | |
| const bufferLength = this.micAnalyser.frequencyBinCount; | |
| const dataArray = new Uint8Array(bufferLength); | |
| this.micAnalyser.getByteTimeDomainData(dataArray); | |
| // Analyze input and trigger response | |
| let sum = 0; | |
| for(let i = 0; i < bufferLength; i++) { | |
| sum += Math.abs(dataArray[i] - 128); | |
| } | |
| const inputLevel = sum / bufferLength; | |
| this.patternStrength = Math.min(100, this.patternStrength + (inputLevel > 10 ? 5 : -2)); | |
| this.patternMeter.style.width = this.patternStrength + '%'; | |
| if(this.patternStrength > 80) { | |
| this.generateResponse(); | |
| this.patternStrength = 0; | |
| } | |
| setTimeout(() => this.monitorInput(), 100); | |
| } | |
| generateResponse() { | |
| const responses = [ | |
| 'Analyzing input pattern...', | |
| 'Pattern matched! Generating response...', | |
| 'Processing neural pathways...', | |
| 'Synthesizing radio fragments...', | |
| 'Generating response from learned patterns...' | |
| ]; | |
| this.responseDiv.textContent = responses[Math.floor(Math.random() * responses.length)]; | |
| // Simulate audio response | |
| const oscillator = this.audioContext.createOscillator(); | |
| const gain = this.audioContext.createGain(); | |
| oscillator.connect(gain); | |
| gain.connect(this.audioContext.destination); | |
| oscillator.frequency.setValueAtTime(440, this.audioContext.currentTime); | |
| gain.gain.setValueAtTime(0.1, this.audioContext.currentTime); | |
| gain.gain.exponentialRampToValueAtTime(0.001, this.audioContext.currentTime + 0.5); | |
| oscillator.start(); | |
| oscillator.stop(this.audioContext.currentTime + 0.5); | |
| } | |
| updateVisuals() { | |
| if(!this.isLearning) return; | |
| // Draw input visualization | |
| if(this.micAnalyser) { | |
| const inputData = new Uint8Array(this.micAnalyser.frequencyBinCount); | |
| this.micAnalyser.getByteTimeDomainData(inputData); | |
| this.drawWaveform(this.inputCanvas, inputData, '#0f0'); | |
| } | |
| // Draw radio visualization | |
| if(this.radioAnalyser) { | |
| const radioData = new Uint8Array(this.radioAnalyser.frequencyBinCount); | |
| this.radioAnalyser.getByteTimeDomainData(radioData); | |
| this.drawWaveform(this.radioCanvas, radioData, '#f00'); | |
| } | |
| requestAnimationFrame(() => this.updateVisuals()); | |
| } | |
| drawWaveform(canvas, dataArray, color) { | |
| const ctx = canvas.getContext('2d'); | |
| const width = canvas.width; | |
| const height = canvas.height; | |
| ctx.fillStyle = '#111'; | |
| ctx.fillRect(0, 0, width, height); | |
| ctx.lineWidth = 2; | |
| ctx.strokeStyle = color; | |
| ctx.beginPath(); | |
| const sliceWidth = width / dataArray.length; | |
| let x = 0; | |
| for(let i = 0; i < dataArray.length; i++) { | |
| const v = dataArray[i] / 128.0; | |
| const y = v * height/2; | |
| if(i === 0) ctx.moveTo(x, y); | |
| else ctx.lineTo(x, y); | |
| x += sliceWidth; | |
| } | |
| ctx.lineTo(width, height/2); | |
| ctx.stroke(); | |
| } | |
| updateMemories() { | |
| this.memoriesDiv.innerHTML = this.memories | |
| .map(m => `<div>${m}</div>`) | |
| .join(''); | |
| } | |
| } | |
| window.onload = () => new NeuralRadioInterface(); | |
| </script> | |
| </body> | |
| </html> | 
