{"id":559,"date":"2025-08-07T20:03:41","date_gmt":"2025-08-07T16:03:41","guid":{"rendered":"https:\/\/www.arparun.re\/?page_id=559"},"modified":"2025-08-17T18:42:50","modified_gmt":"2025-08-17T14:42:50","slug":"audio-pro","status":"publish","type":"page","link":"https:\/\/www.arparun.re\/index.php\/audio-pro\/","title":{"rendered":"Audio Pro Studio"},"content":{"rendered":"\n<body>\n    <div class=\"container\">\n        <div class=\"header\">\n            <!--<h1>\ud83c\udfb5 Audio Pro Studio<\/h1>-->\n            <p>Traitement audio haute qualit\u00e9 avec filtres professionnels<\/p>\n            <div class=\"quality-indicator\">\ud83c\udfa7 QUALIT\u00c9 STUDIO \u2022 48kHz\/24-bit<\/div>\n        <\/div>\n\n        <div class=\"upload-section\">\n            <h3>\ud83d\udcc1 Charger un fichier audio<\/h3>\n            <input type=\"file\" id=\"audioFile\" class=\"file-input\" accept=\"audio\/*\">\n            <label for=\"audioFile\" class=\"file-label\">\n                \ud83d\udcc2 Choisir un fichier\n            <\/label>\n            <button id=\"downloadBtn\" class=\"download-btn\">\n                \ud83d\udcbe T\u00e9l\u00e9charger l&rsquo;audio modifi\u00e9\n            <\/button>\n            <div id=\"fileName\" class=\"track-info\" style=\"margin-top: 15px;\"><\/div>\n            \n            <div class=\"audio-specs\" id=\"audioSpecs\" style=\"display: none;\">\n                <div class=\"spec-item\">\n                    <span class=\"spec-value\" id=\"sampleRate\">&#8212;<\/span>\n                    <div>Fr\u00e9quence d&rsquo;\u00e9chantillonnage<\/div>\n                <\/div>\n                <div class=\"spec-item\">\n                    <span class=\"spec-value\" id=\"bitDepth\">&#8212;<\/span>\n                    <div>Profondeur de bits<\/div>\n                <\/div>\n                <div class=\"spec-item\">\n                    <span class=\"spec-value\" id=\"channels\">&#8212;<\/span>\n                    <div>Canaux<\/div>\n                <\/div>\n                <div class=\"spec-item\">\n                    <span class=\"spec-value\" id=\"duration\">&#8212;<\/span>\n                    <div>Dur\u00e9e<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"controls\">\n            <h3>\ud83c\udf9b\ufe0f Traitement Audio Professionnel<\/h3>\n            \n            <div class=\"processing-options\">\n                <div class=\"option-group\">\n                    <h4>Qualit\u00e9 d&rsquo;Export<\/h4>\n                    <select id=\"exportQuality\">\n                        <option value=\"48000\">48kHz (Studio)<\/option>\n                        <option value=\"44100\" selected>44.1kHz (CD)<\/option>\n                        <option value=\"96000\">96kHz (Hi-Res)<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"option-group\">\n                    <h4>Format d&rsquo;Export<\/h4>\n                    <select id=\"exportFormat\">\n                        <option value=\"wav\">WAV (Sans perte)<\/option>\n                        <!--<option value=\"flac\">FLAC (Compression)<\/option>-->\n                    <\/select>\n                <\/div>\n                <div class=\"option-group\">\n                    <h4>R\u00e9duction du Bruit<\/h4>\n                    <input type=\"range\" id=\"noiseReduction\" min=\"0\" max=\"10\" value=\"0\">\n                    <div>Niveau: <span id=\"noiseValue\">0<\/span><\/div>\n                <\/div>\n                <div class=\"option-group\">\n                    <h4>Am\u00e9lioration St\u00e9r\u00e9o<\/h4>\n                    <input type=\"range\" id=\"stereoWidth\" min=\"0\" max=\"20\" value=\"10\">\n                    <div>Largeur: <span id=\"stereoValue\">10<\/span><\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"filter-buttons\">\n                <button class=\"filter-btn beats-btn\" data-filter=\"beats\">\n                    \ud83d\udd25 Beats (Bass Boost)\n                <\/button>\n                <button class=\"filter-btn tidal-btn\" data-filter=\"tidal\">\n                    \ud83d\udc8e Tidal (Hi-Fi)\n                <\/button>\n                <button class=\"filter-btn monster-btn\" data-filter=\"monster\">\n                    \u26a1 Monster (Clarity)\n                <\/button>\n                <button class=\"filter-btn neutral-btn active\" data-filter=\"neutral\">\n                    \ud83c\udfaf Neutre\n                <\/button>\n            <\/div>\n\n            <h4>\u00c9galiseur Professionnel (31 Bandes)<\/h4>\n            <div class=\"equalizer\" id=\"equalizer\">\n                <!-- G\u00e9n\u00e9r\u00e9 dynamiquement -->\n            <\/div>\n        <\/div>\n\n        <div class=\"processing-status\" id=\"processingStatus\">\n            <div>\ud83c\udfb5 Traitement en cours&#8230;<\/div>\n            <div class=\"progress-bar\">\n                <div class=\"progress-fill\" id=\"progressFill\"><\/div>\n            <\/div>\n            <div id=\"processingText\">Initialisation&#8230;<\/div>\n        <\/div>\n\n        <div class=\"player-section\">\n            <h3>\ud83c\udfa7 Lecteur Audio<\/h3>\n            <div class=\"visualizer\" id=\"visualizer\"><\/div>\n            <audio id=\"audioPlayer\" class=\"audio-player\" controls>\n                Votre navigateur ne supporte pas l&rsquo;\u00e9l\u00e9ment audio.\n            <\/audio>\n            <div id=\"trackInfo\" class=\"track-info\">\n                Chargez un fichier audio pour commencer\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <!-- FLAC encoder -->\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/libflacjs@5.3.3\/dist\/libflac.min.js\"><\/script>\n\n    <script>\n        class HighQualityAudioProcessor {\n            constructor() {\n                this.audioContext = null;\n                this.audioElement = document.getElementById('audioPlayer');\n                this.source = null;\n                this.filters = [];\n                this.analyser = null;\n                this.dataArray = null;\n                this.originalBuffer = null;\n                this.processedBuffer = null;\n                this.offlineContext = null;\n\n                \/\/ Cha\u00eene temps r\u00e9el\n                this.inputNode = null;\n                this.masterGain = null;\n\n                this.sampleRate = 48000;\n                this.channels = 2;\n                this.initializeApp();\n            }\n\n            initializeApp() {\n                this.setupEventListeners();\n                this.createVisualizer();\n                this.createEqualizer();\n            }\n\n            setupEventListeners() {\n                \/\/ Upload de fichier\n                document.getElementById('audioFile').addEventListener('change', (e) => {\n                    this.loadAudioFile(e.target.files[0]);\n                });\n\n                \/\/ Boutons de filtres\n                document.querySelectorAll('.filter-btn').forEach(btn => {\n                    btn.addEventListener('click', (e) => {\n                        this.applyPreset(e.target.dataset.filter);\n                        this.updateActiveButton(e.target);\n                        this.buildRealtimeChain();\n                        this.processAudio();\n                    });\n                });\n\n                \/\/ Sliders d'\u00e9galiseur\n                document.addEventListener('input', (e) => {\n                    if (e.target.classList.contains('eq-slider')) {\n                        this.updateSliderValue(e.target);\n                        this.buildRealtimeChain();\n                        this.processAudio();\n                    }\n                });\n\n                \/\/ Options de traitement\n                document.getElementById('noiseReduction').addEventListener('input', (e) => {\n                    document.getElementById('noiseValue').textContent = e.target.value;\n                    this.buildRealtimeChain();\n                    this.processAudio();\n                });\n\n                document.getElementById('stereoWidth').addEventListener('input', (e) => {\n                    document.getElementById('stereoValue').textContent = e.target.value;\n                    this.buildRealtimeChain();\n                    this.processAudio();\n                });\n\n                \/\/ Bouton de t\u00e9l\u00e9chargement\n                document.getElementById('downloadBtn').addEventListener('click', () => {\n                    this.downloadProcessedAudio();\n                });\n            }\n\n            async loadAudioFile(file) {\n                if (!file) return;\n\n                this.showProcessingStatus(true, 'Chargement du fichier...');\n                \n                try {\n                    const arrayBuffer = await file.arrayBuffer();\n                    \n                    \/\/ Cr\u00e9er contexte audio haute qualit\u00e9\n                    this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n                        sampleRate: this.sampleRate,\n                        latencyHint: 'playback'\n                    });\n\n                    \/\/ D\u00e9coder l'audio avec la plus haute qualit\u00e9\n                    this.originalBuffer = await this.audioContext.decodeAudioData(arrayBuffer);\n                    \n                    \/\/ Mettre \u00e0 jour les informations du fichier\n                    this.updateAudioSpecs(file, this.originalBuffer);\n                    \n                    \/\/ Configurer la lecture\n                    const url = URL.createObjectURL(file);\n                    this.audioElement.src = url;\n                    \n                    document.getElementById('fileName').textContent = `\u2705 ${file.name}`;\n                    document.getElementById('trackInfo').textContent = `Piste charg\u00e9e: ${file.name}`;\n\n                    \/\/ Configurer le traitement audio\n                    await this.setupAudioProcessing();\n                    \n                    \/\/ Traitement initial\n                    await this.processAudio();\n                    \n                    \/\/ Activer le bouton de t\u00e9l\u00e9chargement\n                    document.getElementById('downloadBtn').classList.add('enabled');\n                    \n                    this.showProcessingStatus(false);\n                } catch (error) {\n                    console.error('Erreur lors du chargement:', error);\n                    this.showProcessingStatus(false);\n                    alert('Erreur lors du chargement du fichier audio. Veuillez essayer un autre format.');\n                }\n            }\n\n            async setupAudioProcessing() {\n                \/\/ Contexte + r\u00e9sum\u00e9\n                this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n                    sampleRate: this.sampleRate,\n                    latencyHint: 'playback'\n                });\n                if (this.audioContext.state === 'suspended') await this.audioContext.resume();\n\n                \/\/ Source depuis <audio>\n                this.inputNode = this.audioContext.createMediaElementSource(this.audioElement);\n\n                \/\/ Analyseur pour la viz\n                this.analyser = this.audioContext.createAnalyser();\n                this.analyser.fftSize = 2048;\n                this.analyser.smoothingTimeConstant = 0.8;\n                this.dataArray = new Uint8Array(this.analyser.frequencyBinCount);\n\n                \/\/ Gain de sortie\n                this.masterGain = this.audioContext.createGain();\n                this.masterGain.gain.setValueAtTime(1, this.audioContext.currentTime);\n\n                \/\/ Construction de la cha\u00eene : input -> EQ -> filters -> analyser -> master -> destination\n                this.buildRealtimeChain();\n\n                \/\/ D\u00e9marrer la visualisation\n                this.startVisualization();\n            }\n\n            buildRealtimeChain() {\n                \/\/ Tout d\u00e9connecter\n                if (this.inputNode) this.inputNode.disconnect();\n\n                let node = this.inputNode;\n\n                \/\/ \u00c9galiseur temps r\u00e9el\n                node = this.buildRealtimeEQ(node);\n\n                \/\/ R\u00e9duction bruit (high-pass l\u00e9ger)\n                node = this.buildRealtimeNoiseReduction(node);\n\n                \/\/ Largeur st\u00e9r\u00e9o\n                node = this.buildRealtimeStereoEnhancement(node);\n\n                \/\/ Compresseur \/ limiteur\n                node = this.buildRealtimeLimiter(node);\n\n                \/\/ Analyseur + sortie\n                node.connect(this.analyser);\n                this.analyser.connect(this.masterGain);\n                this.masterGain.connect(this.audioContext.destination);\n            }\n\n            buildRealtimeEQ(input) {\n                const sliders = document.querySelectorAll('.eq-slider');\n                let node = input;\n\n                sliders.forEach(slider => {\n                    const freq = parseFloat(slider.dataset.freq);\n                    const gain = parseFloat(slider.value);\n                    if (Math.abs(gain) > 0.1) {\n                        const filter = this.audioContext.createBiquadFilter();\n                        if (freq <= 100) filter.type = 'lowshelf';\n                        else if (freq >= 8000) filter.type = 'highshelf';\n                        else { filter.type = 'peaking'; filter.Q.value = 0.7; }\n                        filter.frequency.setValueAtTime(freq, this.audioContext.currentTime);\n                        filter.gain.setValueAtTime(gain, this.audioContext.currentTime);\n                        node.connect(filter);\n                        node = filter;\n                    }\n                });\n                return node;\n            }\n\n            buildRealtimeNoiseReduction(input) {\n                const level = parseInt(document.getElementById('noiseReduction').value);\n                if (level === 0) return input;\n                const hp = this.audioContext.createBiquadFilter();\n                hp.type = 'highpass';\n                hp.frequency.setValueAtTime(20 + level * 5, this.audioContext.currentTime);\n                hp.Q.setValueAtTime(0.7, this.audioContext.currentTime);\n                input.connect(hp);\n                return hp;\n            }\n\n            buildRealtimeStereoEnhancement(input) {\n                const width = parseInt(document.getElementById('stereoWidth').value);\n                if (width === 10 || this.audioContext.destination.channelCount < 2) return input;\n                \/\/ simple balance st\u00e9r\u00e9o (M\/S)\n                const splitter = this.audioContext.createChannelSplitter(2);\n                const merger = this.audioContext.createChannelMerger(2);\n                const gainL = this.audioContext.createGain();\n                const gainR = this.audioContext.createGain();\n                const factor = width \/ 10;\n                gainL.gain.setValueAtTime(factor, this.audioContext.currentTime);\n                gainR.gain.setValueAtTime(factor, this.audioContext.currentTime);\n                input.connect(splitter);\n                splitter.connect(gainL, 0);\n                splitter.connect(gainR, 1);\n                gainL.connect(merger, 0, 0);\n                gainR.connect(merger, 0, 1);\n                return merger;\n            }\n\n            buildRealtimeLimiter(input) {\n                const comp = this.audioContext.createDynamicsCompressor();\n                comp.threshold.setValueAtTime(-6, this.audioContext.currentTime);\n                comp.knee.setValueAtTime(2, this.audioContext.currentTime);\n                comp.ratio.setValueAtTime(4, this.audioContext.currentTime);\n                comp.attack.setValueAtTime(0.003, this.audioContext.currentTime);\n                comp.release.setValueAtTime(0.1, this.audioContext.currentTime);\n                input.connect(comp);\n                return comp;\n            }\n\n            createEqualizer() {\n                \/\/ Fr\u00e9quences d'\u00e9galiseur professionnel (31 bandes)\n                const frequencies = [\n                    20, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630,\n                    800, 1000, 1250, 1600, 2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000\n                ];\n                \n                const equalizer = document.getElementById('equalizer');\n                equalizer.innerHTML = '';\n                \n                frequencies.forEach(freq => {\n                    const band = document.createElement('div');\n                    band.className = 'eq-band';\n                    \n                    const label = freq >= 1000 ? `${freq\/1000}k` : `${freq}`;\n                    \n                    band.innerHTML = `\n                        <div class=\"eq-label\">${label}Hz<\/div>\n                        <input type=\"range\" class=\"eq-slider\" min=\"-12\" max=\"12\" value=\"0\" step=\"0.1\" data-freq=\"${freq}\">\n                        <div class=\"eq-value\">0dB<\/div>\n                    `;\n                    \n                    equalizer.appendChild(band);\n                });\n            }\n\n            async processAudio() {\n                if (!this.originalBuffer) return;\n\n                this.showProcessingStatus(true, 'Traitement audio haute qualit\u00e9...');\n                \n                try {\n                    \/\/ Cr\u00e9er contexte offline pour le traitement\n                    const exportQuality = parseInt(document.getElementById('exportQuality').value);\n                    this.offlineContext = new OfflineAudioContext(\n                        this.originalBuffer.numberOfChannels,\n                        this.originalBuffer.length * (exportQuality \/ this.originalBuffer.sampleRate),\n                        exportQuality\n                    );\n\n                    \/\/ Cr\u00e9er source depuis le buffer original\n                    const source = this.offlineContext.createBufferSource();\n                    source.buffer = this.originalBuffer;\n\n                    \/\/ Appliquer les traitements\n                    let currentNode = source;\n                    \n                    \/\/ \u00c9galiseur haute pr\u00e9cision\n                    currentNode = await this.applyEqualizer(currentNode);\n                    \n                    \/\/ R\u00e9duction du bruit\n                    currentNode = this.applyNoiseReduction(currentNode);\n                    \n                    \/\/ Am\u00e9lioration st\u00e9r\u00e9o\n                    currentNode = this.applyStereoEnhancement(currentNode);\n                    \n                    \/\/ Compresseur doux pour \u00e9viter la saturation\n                    currentNode = this.applyLimiter(currentNode);\n\n                    \/\/ Connecter \u00e0 la destination\n                    currentNode.connect(this.offlineContext.destination);\n                    \n                    \/\/ D\u00e9marrer le rendu\n                    source.start(0);\n                    this.processedBuffer = await this.offlineContext.startRendering();\n                    \n                    this.showProcessingStatus(false);\n                    console.log('\ud83c\udfb5 Audio trait\u00e9 avec succ\u00e8s - Qualit\u00e9 studio maintenue');\n                    \n                } catch (error) {\n                    console.error('Erreur lors du traitement:', error);\n                    this.showProcessingStatus(false);\n                }\n            }\n\n            async applyEqualizer(inputNode) {\n                const sliders = document.querySelectorAll('.eq-slider');\n                let currentNode = inputNode;\n\n                sliders.forEach(slider => {\n                    const freq = parseFloat(slider.dataset.freq);\n                    const gain = parseFloat(slider.value);\n                    \n                    if (Math.abs(gain) > 0.1) { \/\/ Seulement si gain significatif\n                        const filter = this.offlineContext.createBiquadFilter();\n                        \n                        if (freq <= 100) {\n                            filter.type = 'lowshelf';\n                        } else if (freq >= 8000) {\n                            filter.type = 'highshelf';\n                        } else {\n                            filter.type = 'peaking';\n                            filter.Q.setValueAtTime(0.7, this.offlineContext.currentTime);\n                        }\n                        \n                        filter.frequency.setValueAtTime(freq, this.offlineContext.currentTime);\n                        filter.gain.setValueAtTime(gain, this.offlineContext.currentTime);\n                        \n                        currentNode.connect(filter);\n                        currentNode = filter;\n                    }\n                });\n\n                return currentNode;\n            }\n\n            applyNoiseReduction(inputNode) {\n                const noiseLevel = parseInt(document.getElementById('noiseReduction').value);\n                \n                if (noiseLevel > 0) {\n                    \/\/ Filtre passe-haut pour r\u00e9duire le bruit de fond\n                    const highpass = this.offlineContext.createBiquadFilter();\n                    highpass.type = 'highpass';\n                    highpass.frequency.setValueAtTime(20 + (noiseLevel * 5), this.offlineContext.currentTime);\n                    highpass.Q.setValueAtTime(0.7, this.offlineContext.currentTime);\n                    \n                    inputNode.connect(highpass);\n                    return highpass;\n                }\n                \n                return inputNode;\n            }\n\n            applyStereoEnhancement(inputNode) {\n                const stereoWidth = parseInt(document.getElementById('stereoWidth').value);\n                \n                if (stereoWidth !== 10 && this.originalBuffer.numberOfChannels === 2) {\n                    \/\/ Expandeur st\u00e9r\u00e9o bas\u00e9 sur M\/S\n                    const splitter = this.offlineContext.createChannelSplitter(2);\n                    const merger = this.offlineContext.createChannelMerger(2);\n                    const gainL = this.offlineContext.createGain();\n                    const gainR = this.offlineContext.createGain();\n                    \n                    const widthFactor = stereoWidth \/ 10;\n                    gainL.gain.setValueAtTime(widthFactor, this.offlineContext.currentTime);\n                    gainR.gain.setValueAtTime(widthFactor, this.offlineContext.currentTime);\n                    \n                    inputNode.connect(splitter);\n                    splitter.connect(gainL, 0);\n                    splitter.connect(gainR, 1);\n                    gainL.connect(merger, 0, 0);\n                    gainR.connect(merger, 0, 1);\n                    \n                    return merger;\n                }\n                \n                return inputNode;\n            }\n\n            applyLimiter(inputNode) {\n                \/\/ Compresseur\/limiteur doux pour \u00e9viter l'\u00e9cr\u00eatage\n                const compressor = this.offlineContext.createDynamicsCompressor();\n                compressor.threshold.setValueAtTime(-6, this.offlineContext.currentTime);\n                compressor.knee.setValueAtTime(2, this.offlineContext.currentTime);\n                compressor.ratio.setValueAtTime(4, this.offlineContext.currentTime);\n                compressor.attack.setValueAtTime(0.003, this.offlineContext.currentTime);\n                compressor.release.setValueAtTime(0.1, this.offlineContext.currentTime);\n                \n                inputNode.connect(compressor);\n                return compressor;\n            }\n\n            async downloadProcessedAudio() {\n                if (!this.processedBuffer) {\n                    alert('Aucun audio trait\u00e9 disponible.');\n                    return;\n                }\n                this.showProcessingStatus(true, 'Pr\u00e9paration du t\u00e9l\u00e9chargement...');\n\n                const format = document.getElementById('exportFormat').value;\n                try {\n                    if (format === 'wav') {\n                        this.downloadBlob(this.bufferToWAV(this.processedBuffer), 'wav');\n                    } else if (format === 'flac') {\n                        const flac = await this.bufferToFLAC(this.processedBuffer);\n                        this.downloadBlob(flac, 'flac');\n                    }\n                } finally {\n                    this.showProcessingStatus(false);\n                }\n            }\n\n            bufferToWAV(buffer) {\n                const len = buffer.length * buffer.numberOfChannels * 2 + 44;\n                const buf = new ArrayBuffer(len);\n                const view = new DataView(buf);\n                const writeStr = (o, s) => s.split('').forEach((c, i) => view.setUint8(o + i, c.charCodeAt(0)));\n                writeStr(0, 'RIFF'); view.setUint32(4, len - 8, true);\n                writeStr(8, 'WAVE'); writeStr(12, 'fmt '); view.setUint32(16, 16, true);\n                view.setUint16(20, 1, true); view.setUint16(22, buffer.numberOfChannels, true);\n                view.setUint32(24, buffer.sampleRate, true);\n                view.setUint32(28, buffer.sampleRate * buffer.numberOfChannels * 2, true);\n                view.setUint16(32, buffer.numberOfChannels * 2, true); view.setUint16(34, 16, true);\n                writeStr(36, 'data'); view.setUint32(40, len - 44, true);\n                let offset = 44;\n                for (let i = 0; i < buffer.length; i++) {\n                    for (let c = 0; c < buffer.numberOfChannels; c++) {\n                        let s = Math.max(-1, Math.min(1, buffer.getChannelData(c)[i]));\n                        view.setInt16(offset, s * 32767, true); offset += 2;\n                    }\n                }\n                return new Blob([buf], { type: 'audio\/wav' });\n            }\n\n            async bufferToFLAC(buffer) {\n                const { Flac } = window;\n                if (!Flac) throw new Error('libflac non charg\u00e9');\n                const samples = [];\n                for (let c = 0; c < buffer.numberOfChannels; c++) {\n                    const ch = buffer.getChannelData(c);\n                    samples.push(Array.from(ch, v => Math.round(Math.max(-1, Math.min(1, v)) * 32767)));\n                }\n                const data = {\n                    channels: buffer.numberOfChannels,\n                    sampleRate: buffer.sampleRate,\n                    samples: samples\n                };\n                return new Blob([Flac.encode(data)], { type: 'audio\/flac' });\n            }\n\n            downloadBlob(blob, ext) {\n                const url = URL.createObjectURL(blob);\n                const link = document.createElement('a');\n                link.href = url;\n                const name = (document.getElementById('audioFile').files[0]?.name || 'audio').replace(\/\\.[^\/.]+$\/, '');\n                link.download = `${name}_processed.${ext}`;\n                document.body.appendChild(link); link.click(); document.body.removeChild(link);\n                URL.revokeObjectURL(url);\n            }\n\n            applyPreset(presetName) {\n                const presets = {\n                    neutral: Array(31).fill(0),\n                    beats: [2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, -1, -1, -1, -1, -2, -2, -2, -2, 0, 0, 0, 1, 1, 1, 3, 3, 3, 2, 2, 2],\n                    tidal:  [2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, -1, -1, -1, 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1],\n                    monster:[4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, -1, -1, -1, 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1]\n                };\n\n                const values = presets[presetName] || presets.neutral;\n                const sliders = document.querySelectorAll('.eq-slider');\n                sliders.forEach((slider, idx) => {\n                    slider.value = values[idx] || 0;\n                    this.updateSliderValue(slider);\n                });\n            }\n\n            updateSliderValue(slider) {\n                const value = parseFloat(slider.value);\n                const display = slider.nextElementSibling;\n                display.textContent = `${value > 0 ? '+' : ''}${value}dB`;\n            }\n\n            updateActiveButton(activeBtn) {\n                document.querySelectorAll('.filter-btn').forEach(btn => btn.classList.remove('active'));\n                activeBtn.classList.add('active');\n            }\n\n            updateAudioSpecs(file, buffer) {\n                document.getElementById('sampleRate').textContent = buffer.sampleRate + ' Hz';\n                document.getElementById('bitDepth').textContent = '16-bit (source)';\n                document.getElementById('channels').textContent = buffer.numberOfChannels === 1 ? 'Mono' : 'St\u00e9r\u00e9o';\n                document.getElementById('duration').textContent = Math.round(buffer.duration * 100) \/ 100 + ' s';\n                document.getElementById('audioSpecs').style.display = 'grid';\n            }\n\n            createVisualizer() {\n                const visualizer = document.getElementById('visualizer');\n                visualizer.innerHTML = '';\n                for (let i = 0; i < 64; i++) {\n                    const bar = document.createElement('div');\n                    bar.className = 'bar';\n                    visualizer.appendChild(bar);\n                }\n            }\n\n            startVisualization() {\n                const bars = document.querySelectorAll('.bar');\n                const draw = () => {\n                    if (!this.analyser) return;\n                    this.analyser.getByteFrequencyData(this.dataArray);\n\n                    for (let i = 0; i < bars.length; i++) {\n                        const value = this.dataArray[i * 4];\n                        const height = (value \/ 255) * 100;\n                        bars[i].style.height = `${height}%`;\n                    }\n                    requestAnimationFrame(draw);\n                };\n                draw();\n            }\n\n            showProcessingStatus(show, text = '') {\n                const status = document.getElementById('processingStatus');\n                const textEl = document.getElementById('processingText');\n                const progress = document.getElementById('progressFill');\n\n                if (show) {\n                    status.classList.add('show');\n                    textEl.textContent = text || 'Traitement...';\n                    progress.style.width = '0%';\n                    let prog = 0;\n                    const interval = setInterval(() => {\n                        prog += 2;\n                        progress.style.width = `${Math.min(prog, 100)}%`;\n                        if (prog >= 100) clearInterval(interval);\n                    }, 30);\n                } else {\n                    status.classList.remove('show');\n                    progress.style.width = '100%';\n                }\n            }\n        }\n\n        \/\/ Initialiser l'application\n        window.addEventListener('DOMContentLoaded', () => {\n            new HighQualityAudioProcessor();\n        });\n    <\/script>\n\n<\/body>\n\n\n\n<p class=\"wp-block-paragraph\">Si l&rsquo;application vous \u00e0 \u00e9t\u00e9 utile, Offrer moi une bierre !! C&rsquo;est sympa et \u00e7a m&rsquo;aide \u00e0 maintenir les serveurs ! \ud83d\ude00<\/p>\n\n\n\n<div style=\"display: flex; justify-content: center; align-items: center;\">\n\n\n<script async\n  src=\"https:\/\/js.stripe.com\/v3\/buy-button.js\">\n<\/script>\n\n<stripe-buy-button\n  buy-button-id=\"buy_btn_1RXGoOAOEp7xPNKdvvgCbt2V\"\n  publishable-key=\"pk_live_51QQXMmAOEp7xPNKdUhcTaBFsUvieXz97t7VbgmEfSC8LzRxoqqoJOM4rrwpFnVsRETCnWpXBED5oqyqCCti50YC600OrlOgLNg\"\n>\n<\/stripe-buy-button>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Traitement audio haute qualit\u00e9 avec filtres professionnels \ud83c\udfa7 QUALIT\u00c9 STUDIO \u2022 48kHz\/24-bit \ud83d\udcc1 Charger un fichier audio \ud83d\udcc2 Choisir un fichier \ud83d\udcbe T\u00e9l\u00e9charger l&rsquo;audio modifi\u00e9 &#8212; Fr\u00e9quence d&rsquo;\u00e9chantillonnage &#8212; Profondeur de bits &#8212; Canaux &#8212; Dur\u00e9e \ud83c\udf9b\ufe0f Traitement Audio Professionnel Qualit\u00e9 d&rsquo;Export 48kHz (Studio)44.1kHz (CD)96kHz (Hi-Res) Format d&rsquo;Export WAV (Sans<a href=\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\" class=\"read-more\">Read More &#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-559","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Audio Pro Studio - arparun - Informatique Reunion<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Audio Pro Studio - arparun - Informatique Reunion\" \/>\n<meta property=\"og:description\" content=\"Traitement audio haute qualit\u00e9 avec filtres professionnels \ud83c\udfa7 QUALIT\u00c9 STUDIO \u2022 48kHz\/24-bit \ud83d\udcc1 Charger un fichier audio \ud83d\udcc2 Choisir un fichier \ud83d\udcbe T\u00e9l\u00e9charger l&rsquo;audio modifi\u00e9 &#8212; Fr\u00e9quence d&rsquo;\u00e9chantillonnage &#8212; Profondeur de bits &#8212; Canaux &#8212; Dur\u00e9e \ud83c\udf9b\ufe0f Traitement Audio Professionnel Qualit\u00e9 d&rsquo;Export 48kHz (Studio)44.1kHz (CD)96kHz (Hi-Res) Format d&rsquo;Export WAV (SansRead More ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\" \/>\n<meta property=\"og:site_name\" content=\"arparun - Informatique Reunion\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-17T14:42:50+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\",\"url\":\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\",\"name\":\"Audio Pro Studio - arparun - Informatique Reunion\",\"isPartOf\":{\"@id\":\"https:\/\/www.arparun.re\/#website\"},\"datePublished\":\"2025-08-07T16:03:41+00:00\",\"dateModified\":\"2025-08-17T14:42:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.arparun.re\/index.php\/audio-pro\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.arparun.re\/index.php\/audio-pro\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.arparun.re\/index.php\/audio-pro\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.arparun.re\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Audio Pro Studio\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.arparun.re\/#website\",\"url\":\"https:\/\/www.arparun.re\/\",\"name\":\"arparun - Informatique Reunion\",\"description\":\"Syst\u00e8mes, R\u00e9seaux et S\u00e9curit\u00e9\",\"publisher\":{\"@id\":\"https:\/\/www.arparun.re\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.arparun.re\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.arparun.re\/#organization\",\"name\":\"Arparun\",\"url\":\"https:\/\/www.arparun.re\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.arparun.re\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.arparun.re\/wp-content\/uploads\/2021\/02\/cropped-site.png\",\"contentUrl\":\"https:\/\/www.arparun.re\/wp-content\/uploads\/2021\/02\/cropped-site.png\",\"width\":512,\"height\":512,\"caption\":\"Arparun\"},\"image\":{\"@id\":\"https:\/\/www.arparun.re\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Audio Pro Studio - arparun - Informatique Reunion","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.arparun.re\/index.php\/audio-pro\/","og_locale":"fr_FR","og_type":"article","og_title":"Audio Pro Studio - arparun - Informatique Reunion","og_description":"Traitement audio haute qualit\u00e9 avec filtres professionnels \ud83c\udfa7 QUALIT\u00c9 STUDIO \u2022 48kHz\/24-bit \ud83d\udcc1 Charger un fichier audio \ud83d\udcc2 Choisir un fichier \ud83d\udcbe T\u00e9l\u00e9charger l&rsquo;audio modifi\u00e9 &#8212; Fr\u00e9quence d&rsquo;\u00e9chantillonnage &#8212; Profondeur de bits &#8212; Canaux &#8212; Dur\u00e9e \ud83c\udf9b\ufe0f Traitement Audio Professionnel Qualit\u00e9 d&rsquo;Export 48kHz (Studio)44.1kHz (CD)96kHz (Hi-Res) Format d&rsquo;Export WAV (SansRead More ...","og_url":"https:\/\/www.arparun.re\/index.php\/audio-pro\/","og_site_name":"arparun - Informatique Reunion","article_modified_time":"2025-08-17T14:42:50+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.arparun.re\/index.php\/audio-pro\/","url":"https:\/\/www.arparun.re\/index.php\/audio-pro\/","name":"Audio Pro Studio - arparun - Informatique Reunion","isPartOf":{"@id":"https:\/\/www.arparun.re\/#website"},"datePublished":"2025-08-07T16:03:41+00:00","dateModified":"2025-08-17T14:42:50+00:00","breadcrumb":{"@id":"https:\/\/www.arparun.re\/index.php\/audio-pro\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.arparun.re\/index.php\/audio-pro\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.arparun.re\/index.php\/audio-pro\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.arparun.re\/"},{"@type":"ListItem","position":2,"name":"Audio Pro Studio"}]},{"@type":"WebSite","@id":"https:\/\/www.arparun.re\/#website","url":"https:\/\/www.arparun.re\/","name":"arparun - Informatique Reunion","description":"Syst\u00e8mes, R\u00e9seaux et S\u00e9curit\u00e9","publisher":{"@id":"https:\/\/www.arparun.re\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.arparun.re\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.arparun.re\/#organization","name":"Arparun","url":"https:\/\/www.arparun.re\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.arparun.re\/#\/schema\/logo\/image\/","url":"https:\/\/www.arparun.re\/wp-content\/uploads\/2021\/02\/cropped-site.png","contentUrl":"https:\/\/www.arparun.re\/wp-content\/uploads\/2021\/02\/cropped-site.png","width":512,"height":512,"caption":"Arparun"},"image":{"@id":"https:\/\/www.arparun.re\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/pages\/559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/comments?post=559"}],"version-history":[{"count":3,"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/pages\/559\/revisions"}],"predecessor-version":[{"id":564,"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/pages\/559\/revisions\/564"}],"wp:attachment":[{"href":"https:\/\/www.arparun.re\/index.php\/wp-json\/wp\/v2\/media?parent=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}