/* ============================================================ SoundCloud-Style Audio Recorder + Waveform Display + Analyzer ============================================================ */ // Global variables let audioContext; let gumStream; let rec; let input; // DOM Elements const recordBtn = document.getElementById("recordButton"); const stopBtn = document.getElementById("stopButton"); const pauseBtn = document.getElementById("pauseButton"); const recordingsList = document.getElementById("recordingsList"); const uploadButton = document.getElementById("upload-button"); const uploadInput = document.getElementById("audio-file"); const responseBox = document.getElementById("response"); const metadataBox = document.getElementById("metadata-display"); // ============================== // Recording Controls // ============================== recordBtn.addEventListener("click", startRecording); stopBtn.addEventListener("click", stopRecording); pauseBtn.addEventListener("click", pauseRecording); // Start recording function startRecording() { console.log("Recording started..."); recordBtn.disabled = true; stopBtn.disabled = false; pauseBtn.disabled = false; navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) { audioContext = new (window.AudioContext || window.webkitAudioContext)(); document.getElementById("formats").innerText = "Sample rate: " + audioContext.sampleRate + " Hz"; gumStream = stream; input = audioContext.createMediaStreamSource(stream); rec = new Recorder(input, { numChannels: 1 }); rec.record(); }).catch(function (e) { console.error("Could not start recording:", e); recordBtn.disabled = false; stopBtn.disabled = true; pauseBtn.disabled = true; }); } // Pause recording function pauseRecording() { if (rec.recording) { rec.stop(); pauseBtn.innerText = "Resume"; } else { rec.record(); pauseBtn.innerText = "Pause"; } } // Stop recording function stopRecording() { console.log("Recording stopped."); stopBtn.disabled = true; recordBtn.disabled = false; pauseBtn.disabled = true; pauseBtn.innerText = "Pause"; rec.stop(); gumStream.getAudioTracks()[0].stop(); rec.exportWAV(createWaveformItem); } // ============================== // File Upload // ============================== uploadButton.addEventListener("click", () => { if (!uploadInput.files.length) { alert("Select at least one file."); return; } Array.from(uploadInput.files).forEach((file) => handleUploadedFile(file)); }); function handleUploadedFile(file) { const url = URL.createObjectURL(file); createWaveformItem(file, url); } // ============================== // Create SoundCloud-like Waveform // ============================== function createWaveformItem(blob, forcedUrl = null) { const url = forcedUrl || URL.createObjectURL(blob); const li = document.createElement("li"); li.className = "wave-item"; const container = document.createElement("div"); container.className = "wave-canvas"; const meta = document.createElement("div"); meta.className = "wave-meta"; meta.innerHTML = `