RD5 GOLD WEB EDITOR
📄
📄 2-RB4-3CC.HTML
📄 222.JPG
📄 3CC-BASIC1.HTML
📄 Microsoft Paint.exe
📄 R2C-3.HTML
📄 R2C-4.HTML
📄 RB4-3C.HTML
📄 RB4-3CC.HTML
📄 RB4-RETRO.HTML
📄 RB4-RETRO.html
📄 RD5-3CC.html
📄 RL-4.html
📄 TARS.html
📄 TES10.mp3
📄 TES11.mp3
📄 TRISHA-OK.html
📄 TRISHA-WIN.HTML
📄 Tiny-demo.html
📄 Tinybj7-blindado.html
📄 Tinybj7-publica.html
📄 aplicaciones-rd5.html
📄 app1.html
📄 app2.html
📄 app3.html
📄 appb1.html
📄 appb2.html
📄 appb3.html
📄 appb4.html
📄 appb5.html
📄 appb6.html
📄 c-julio.JPG
📄 caratula.gif
📄 caratula02.gif
📄 caratula2.gif
📄 chokurei2.jpg
📄 columna-julio.html
📄 columna-stella.html
📄 columna-stellab.html
📄 demos.html
📄 df3.html
📄 dni.gif
📄 donaciones.gif
📄 ecualizador.html
📄 ed-podcast.JPG
📄 ed-radio.JPG
📄 editorv.html
📄 editorv1.html
📄 editorv2.html
📄 fondo5d.jpg
📄 fresi-clip.html
📄 gold.php
📄 gold62.php
📄 gold93.php
📄 googlefd161ffccea5f6ab.html
📄 gw.php
📄 index-anterior.html
📄 index.html
📄 index2.html
📄 logo.png
📄 logo.webp
📄 magazine.html
📄 manager3.php
📄 mic2.jpg
📄 mini1.html
📄 minib2a.html
📄 mn.php
📄 muestra.JPG
📄 p.html
📄 pm.html
📄 pm2.html
📄 pod-rd5.html
📄 podcast-stops.gif
📄 podcast2.mp3
📄 pp.html
📄 promo-tinybj7.html
📄 radio.html
📄 radio_gold.html
📄 rd5-fresia-4 canvashtml
📄 rd5-fresia-ok.html
📄 rd5-fresia.html
📄 rd5-plus-anterior.html
📄 rd5-plus.html
📄 rd5-plus2.html
📄 rd5-radioplayer.html
📄 rd5-tv.html
📄 rd5.html
📄 sst.html
📄 st.html
📄 starclip.html
📄 stella-2.JPG
📄 stella.JPG
📄 stt.html
📄 t-rd5.html.html
📄 t-rd6.html
📄 t-rd7.html
📄 t-tiny.html
📄 tes0.jpg
📄 tes1.jpg
📄 tes2.jpg
📄 tes4.jpg
📄 tes4.mp3
📄 tes5.jpg
📄 tes7.jpg
📄 tes8.jpg
📄 tienda.html
📄 tiendaaps.html
📄 tiendapps.html
📄 tiny-bj6.html
📄 tiny-bj7-full.html
📄 tiny-bj7.html
📄 tiny3-bj2.html
📄 tinybj7-blindado.html
📄 tinydemo.html
📄 titulo.jpg
📄 tnw2.html
📄 trisha-basic.html
📄 trisha-cafe.html
📄 trisha-mini.html
📄 tv-pantalla.php
📄 tv.html
📄 xdni.html
CÓDIGO (OSCURO GOLD)
VISTA PREVIA
💾 GUARDAR
Tema: Monokai
Tema: Dracula
Tema: Material
Tema: Blackboard
Tema: Abyss
Monospace
Courier
12px
14px
16px
18px
20px
22px
24px
26px
28px
30px
32px
↷ Rehacer
↶ Deshacer
🔍 BUSCAR
+ REPRO RADIO
SIG.
X
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Picture Music PRO Binaural Modular</title> <style> *{ box-sizing:border-box; } body{ margin:0; background:#050505; color:white; font-family:Arial; display:flex; height:100vh; overflow:hidden; } /* ===== LEFT ===== */ #left{ flex:1; display:flex; justify-content:center; align-items:center; background:#111; overflow:hidden; } #canvas{ width:100%; height:100%; object-fit:contain; background:black; } /* ===== RIGHT ===== */ #right{ width:420px; min-width:420px; background:#000; padding:20px; overflow:auto; display:flex; flex-direction:column; gap:12px; } @media(max-width:900px){ body{ flex-direction:column; overflow:auto; } #right{ width:100%; min-width:100%; } #left{ height:50vh; } } button, input[type=file]{ width:100%; } button{ padding:12px; font-size:16px; font-weight:bold; border:none; border-radius:8px; cursor:pointer; } .line{ display:flex; justify-content:space-between; align-items:center; gap:10px; } .line input{ flex:1; } .meter{ width:100%; height:14px; background:#111; border-radius:6px; overflow:hidden; } .meterFill{ height:100%; width:0%; } #eqCanvas{ width:100%; height:90px; background:#111; border-radius:8px; } </style> </head> <body> <div id="left"> <canvas id="canvas"></canvas> </div> <div id="right"> <h2>Picture Music PRO</h2> <input type="file" id="upload" accept="image/*"> <button id="playBtn">PLAY</button> <button id="stopBtn">STOP</button> <div class="line"> <span>Volumen</span> <input type="range" id="volume" min="0" max="1" step="0.01" value="0.4"> </div> <div class="line"> <span>Delay</span> <input type="range" id="delayMix" min="0" max="1" step="0.01" value="0.35"> </div> <div class="line"> <span>Feedback</span> <input type="range" id="feedback" min="0" max="0.95" step="0.01" value="0.45"> </div> <div class="line"> <span>BPM</span> <input type="range" id="bpm" min="40" max="220" value="90"> </div> <div class="line"> <span>Reverb</span> <input type="range" id="reverbMix" min="0" max="1" step="0.01" value="0.25"> </div> <div class="meter"> <div id="rMeter" class="meterFill"></div> </div> <div class="meter"> <div id="gMeter" class="meterFill"></div> </div> <div class="meter"> <div id="bMeter" class="meterFill"></div> </div> <canvas id="eqCanvas"></canvas> </div> <script> /* ========================================================= CORE ========================================================= */ const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); const eqCanvas = document.getElementById("eqCanvas"); const eqCtx = eqCanvas.getContext("2d"); eqCanvas.width = 380; eqCanvas.height = 90; const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); /* ========================================================= MASTER ========================================================= */ const masterGain = audioCtx.createGain(); masterGain.gain.value = 0.4; /* ========================================================= ANALYSER ========================================================= */ const analyser = audioCtx.createAnalyser(); analyser.fftSize = 512; /* ========================================================= DELAY ========================================================= */ const delay = audioCtx.createDelay(2.0); delay.delayTime.value = 0.35; const feedbackGain = audioCtx.createGain(); feedbackGain.gain.value = 0.45; delay.connect(feedbackGain); feedbackGain.connect(delay); /* ========================================================= REVERB ========================================================= */ const convolver = audioCtx.createConvolver(); function createImpulse(){ const length = audioCtx.sampleRate * 2; const impulse = audioCtx.createBuffer(2,length,audioCtx.sampleRate); for(let c=0;c<2;c++){ const data = impulse.getChannelData(c); for(let i=0;i<length;i++){ data[i] = (Math.random()*2-1) * Math.pow(1-i/length,2); } } return impulse; } convolver.buffer = createImpulse(); const reverbGain = audioCtx.createGain(); reverbGain.gain.value = 0.25; /* ========================================================= ROUTING ========================================================= */ masterGain.connect(delay); delay.connect(convolver); masterGain.connect(analyser); convolver.connect(reverbGain); reverbGain.connect(analyser); analyser.connect(audioCtx.destination); /* ========================================================= UI ========================================================= */ volume.oninput = e=>{ masterGain.gain.value = e.target.value; }; delayMix.oninput = e=>{ delay.delayTime.value = e.target.value; }; feedback.oninput = e=>{ feedbackGain.gain.value = e.target.value; }; reverbMix.oninput = e=>{ reverbGain.gain.value = e.target.value; }; /* ========================================================= IMAGE ENGINE ========================================================= */ let imageDataOriginal; let sequence = []; const BLOCK_SIZE = 18; upload.addEventListener("change",e=>{ const file = e.target.files[0]; if(!file) return; const reader = new FileReader(); reader.onload = ev=>{ const img = new Image(); img.onload = ()=>{ canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img,0,0); imageDataOriginal = ctx.getImageData( 0, 0, canvas.width, canvas.height ); analyzeImage(); }; img.src = ev.target.result; }; reader.readAsDataURL(file); }); /* ========================================================= SCALE ========================================================= */ const SCALE = [ 110, 123.47, 130.81, 146.83, 164.81, 174.61, 196, 220, 246.94, 261.63, 293.66, 329.63, 349.23, 392 ]; /* ========================================================= ANALYZE IMAGE ========================================================= */ function analyzeImage(){ sequence = []; const data = imageDataOriginal.data; for(let y=0;y<canvas.height;y+=BLOCK_SIZE){ for(let x=0;x<canvas.width;x+=BLOCK_SIZE){ const i = (y * canvas.width + x) * 4; const r = data[i]; const g = data[i+1]; const b = data[i+2]; const brightness = (r+g+b)/3; if(brightness < 20) continue; const noteIndex = Math.floor( (brightness / 255) * (SCALE.length-1) ); const freq = SCALE[noteIndex]; const pan = (x / canvas.width) * 2 - 1; sequence.push({ x, y, r, g, b, freq, pan }); } } } /* ========================================================= SYNTH ========================================================= */ function playVoice(note){ const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); const panner = audioCtx.createStereoPanner(); /* ===== WAVE TYPE BY COLOR ===== */ if(note.r > note.g && note.r > note.b){ osc.type = "sawtooth"; }else if(note.g > note.r && note.g > note.b){ osc.type = "triangle"; }else{ osc.type = "sine"; } osc.frequency.value = note.freq; panner.pan.value = note.pan; /* ===== SOFT ENVELOPE ===== */ gain.gain.setValueAtTime( 0, audioCtx.currentTime ); gain.gain.linearRampToValueAtTime( 0.18, audioCtx.currentTime + 0.02 ); gain.gain.exponentialRampToValueAtTime( 0.0001, audioCtx.currentTime + 0.45 ); osc.connect(gain); gain.connect(panner); panner.connect(masterGain); osc.start(); osc.stop( audioCtx.currentTime + 0.5 ); } /* ========================================================= VISUAL ========================================================= */ function drawVisual(note){ ctx.putImageData(imageDataOriginal,0,0); ctx.strokeStyle = ` rgb(${note.r},${note.g},${note.b}) `; ctx.lineWidth = 3; ctx.strokeRect( note.x, note.y, BLOCK_SIZE, BLOCK_SIZE ); updateMeters( note.r, note.g, note.b ); } /* ========================================================= METERS ========================================================= */ function updateMeters(r,g,b){ rMeter.style.width = (r/255*100)+"%"; gMeter.style.width = (g/255*100)+"%"; bMeter.style.width = (b/255*100)+"%"; rMeter.style.background = `rgb(${r},0,0)`; gMeter.style.background = `rgb(0,${g},0)`; bMeter.style.background = `rgb(0,0,${b})`; } /* ========================================================= EQ VISUALIZER ========================================================= */ function drawEQ(){ requestAnimationFrame(drawEQ); const buffer = new Uint8Array( analyser.frequencyBinCount ); analyser.getByteFrequencyData(buffer); eqCtx.fillStyle = "#000"; eqCtx.fillRect( 0, 0, eqCanvas.width, eqCanvas.height ); const barWidth = eqCanvas.width / buffer.length * 2; for(let i=0;i<buffer.length;i++){ const val = buffer[i]/255; const h = val * eqCanvas.height; eqCtx.fillStyle = "lime"; eqCtx.fillRect( i * barWidth, eqCanvas.height - h, barWidth - 1, h ); } } drawEQ(); /* ========================================================= PLAYER ========================================================= */ let playing = false; let interval; let index = 0; playBtn.onclick = ()=>{ if(playing) return; if(sequence.length===0) return; audioCtx.resume(); playing = true; const bpmValue = parseInt(bpm.value); const stepTime = (60 / bpmValue) * 1000; interval = setInterval(()=>{ const note = sequence[index % sequence.length]; playVoice(note); drawVisual(note); index++; },stepTime); }; stopBtn.onclick = ()=>{ clearInterval(interval); playing = false; }; </script> </body> </html>