{"ast":null,"code":"// Manually created for GAVT project on 2024-06-03, based on commit 10df1d9 of the original project\nimport { createArrayWithSameValue } from './lib/spectroHelpers.js';\nimport { computeLPC, getPeaks, getFrequenciesFromLPC, addToRunningFormants, addToRunningLPC, isImpulse, returnAndClearFormants, coefficients } from './lib/lpc.js';\nimport { expandArraySmoothly,\n// expandArraySmoothly(array, targetResolution int)\ngetMean,\n// getMean(array)\nupdateMagnitudes,\n// updateMagnitudes(newMMagArray, currentMagArray);\nnormalizeIfNecessary } from './lib/spectroHelpers.js';\nconst SAMPLE_RATE = 44100;\nconst FRAME_SIZE = 4096; // Number of audio samples used to generate LPC Coeffs.;\nconst MAX_LPC_FREQ = 4096; // hc needs a better understanding of this\nconst LPC_DISPLAY_RES = 512; // 64\n\nconst EMPTY_WAVE_MAG = 0.3;\n\n// These fns are imported into WaveCanvas\n\n// ===================================================================\n// AUDIO SETUP FNS\n\n// initAudio Helper ------------------------------------\nconst convertToMono = (input, audioContextRef) => {\n  const splitter = audioContextRef.createChannelSplitter(2);\n  const merger = audioContextRef.createChannelMerger(2);\n  input.connect(splitter);\n  splitter.connect(merger, 0, 0);\n  splitter.connect(merger, 0, 1);\n  return merger;\n};\n\n// initAudio  ------------------------------------\nconst initAudio = (microphone, audioContextRef, analyser) => {\n  console.log('mic should be a MediaStreamAudioSourceNode');\n  console.log(microphone);\n  analyser.fftSize = FRAME_SIZE;\n  const audioInput = convertToMono(microphone, audioContextRef);\n  const HIGH_PASS = 200;\n  const LOW_PASS = MAX_LPC_FREQ + 1000;\n  const highpass = audioContextRef.createBiquadFilter();\n  const lowpass = audioContextRef.createBiquadFilter();\n  highpass.type = \"highpass\";\n  highpass.frequency.value = HIGH_PASS;\n  lowpass.type = \"lowpass\";\n  lowpass.frequency.value = LOW_PASS;\n  lowpass.Q.value = 100;\n\n  // audioInput.connect(highpass);\n  // highpass.connect(lowpass);\n  audioInput.connect(analyser);\n  return analyser;\n};\n\n// ===================================================================\n// COEFF UPDATERS / Interval Loop \n\nconst updateCoeffsOffline = audioData => {\n  // UPDATES COEFFS DATA\n  let lpcCoeffs = computeLPC(audioData);\n  let lastReceivedCoeffs = lpcCoeffs;\n  //   console.log(lastReceivedCoeffs);\n\n  return lastReceivedCoeffs;\n};\n\n// TODO: --------------------------------------------\nconst updateCoeffsWithVonage = function () {};\n\n// ===================================================================\n// MAGS & PEAKS FROM LPC \n// gets and shapes wave mag & peak data to be used in drawing sketch\n\n// Static scaling function -- scale_factor expected in range 0-200\nvar scale = function (lpc, scale_factor) {\n  for (var i = 0; i < lpc.length; i++) {\n    //console.log(sensitivityValueEle.value)\n    // value ranges from 0-200\n    var factor = scale_factor / 100.0;\n    // following lines smooth the low end of the visualization\n    // (doesn't effect any of the LPC calculations)\n    if (i <= 100) {\n      factor = factor - .0005 * (100 - i);\n    } else {\n      factor = factor - .0001 * (100 - i);\n    }\n    lpc[i] = lpc[i] * factor;\n  }\n  return lpc;\n};\nconst updateData = (drawData, lastReceivedCoeffs, calculateFormants) => {\n  const DRAW_PEAK_THRESHOLD = 0.15;\n  const HIDE_WAVE_MAG_THRESHOLD = -1; // -1 means always animate wave, otherwise min energy.\n  const HIDE_WAVE_FRAME_THRESHOLD = 60;\n  let numFramesBelowMin = 0;\n  let mags = drawData.magnitudes;\n  let peaks = drawData.peaks;\n  let newMagnitudes = getFrequenciesFromLPC(lastReceivedCoeffs, LPC_DISPLAY_RES, MAX_LPC_FREQ, SAMPLE_RATE);\n\n  // ------------------------ Post LPC\n  //newMagnitudes = expandArraySmoothly(newMagnitudes, 512);\n  // TODO perhaps move this after scaling. move 256 num to const.\n\n  newMagnitudes = scale(newMagnitudes, 20);\n  let magMean = getMean(newMagnitudes);\n  if (magMean < HIDE_WAVE_MAG_THRESHOLD) {\n    numFramesBelowMin += 1;\n    if (numFramesBelowMin > HIDE_WAVE_FRAME_THRESHOLD) {\n      newMagnitudes = createArrayWithSameValue(EMPTY_WAVE_MAG, newMagnitudes.length);\n    }\n  } else {\n    numFramesBelowMin = 0;\n  }\n  if (mags == 0) {\n    mags = newMagnitudes;\n  } else {\n    // console.log(mags)\n    // console.log(newMagnitudes)\n    mags = updateMagnitudes(newMagnitudes, mags);\n    // console.log(mags)\n    //mags = newMagnitudes;\n  }\n  // console.log('mags after data update')\n  // console.log(magsRef.current)\n\n  if (magMean >= DRAW_PEAK_THRESHOLD) {\n    peaks = getPeaks(mags);\n    // choose only top 5 peaks if more than four exist\n    let numPeaks = 5;\n    // console.log(peaks)\n    // console.log(peaks.map(id => mags[id]))\n    if (peaks.length > 4) {\n      let indexedPeaks = peaks.map(id => ({\n        value: mags[id],\n        originalIdx: id\n      }));\n      indexedPeaks.sort((a, b) => b.value - a.value);\n      let newPeaks = indexedPeaks.slice(0, numPeaks).map(item => item.originalIdx);\n      peaks = newPeaks.sort((a, b) => a - b);\n    }\n  } else {\n    peaks = [];\n  }\n  returnAndClearFormants(calculateFormants);\n  // if (calculateFormants == true && !isImpulse(lastReceivedCoeffs)){\n  //     coefficients.push(lastReceivedCoeffs);\n  // }\n  // Calculate frequencies of formants\n  let formantFreqz = peaks.map(x => x * (MAX_LPC_FREQ / LPC_DISPLAY_RES));\n  // If start button is pressed, add F2 to array\n  if (calculateFormants == true) {\n    addToRunningFormants(formantFreqz);\n    let lpcCoeffs = lastReceivedCoeffs;\n    addToRunningLPC(lpcCoeffs);\n    if (!isImpulse(lpcCoeffs)) {\n      coefficients.push(lpcCoeffs);\n    }\n  }\n  mags = normalizeIfNecessary(mags);\n  drawData = {\n    magnitudes: mags,\n    peaks: peaks\n  };\n  return drawData;\n};\n\n// ===============================================\nexport { initAudio, updateData, updateCoeffsOffline, updateCoeffsWithVonage, FRAME_SIZE, LPC_DISPLAY_RES, SAMPLE_RATE };","map":{"version":3,"names":["createArrayWithSameValue","computeLPC","getPeaks","getFrequenciesFromLPC","addToRunningFormants","addToRunningLPC","isImpulse","returnAndClearFormants","coefficients","expandArraySmoothly","getMean","updateMagnitudes","normalizeIfNecessary","SAMPLE_RATE","FRAME_SIZE","MAX_LPC_FREQ","LPC_DISPLAY_RES","EMPTY_WAVE_MAG","convertToMono","input","audioContextRef","splitter","createChannelSplitter","merger","createChannelMerger","connect","initAudio","microphone","analyser","console","log","fftSize","audioInput","HIGH_PASS","LOW_PASS","highpass","createBiquadFilter","lowpass","type","frequency","value","Q","updateCoeffsOffline","audioData","lpcCoeffs","lastReceivedCoeffs","updateCoeffsWithVonage","scale","lpc","scale_factor","i","length","factor","updateData","drawData","calculateFormants","DRAW_PEAK_THRESHOLD","HIDE_WAVE_MAG_THRESHOLD","HIDE_WAVE_FRAME_THRESHOLD","numFramesBelowMin","mags","magnitudes","peaks","newMagnitudes","magMean","numPeaks","indexedPeaks","map","id","originalIdx","sort","a","b","newPeaks","slice","item","formantFreqz","x","push"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/gavt/Wave/waveAudio.js"],"sourcesContent":["// Manually created for GAVT project on 2024-06-03, based on commit 10df1d9 of the original project\r\nimport { createArrayWithSameValue } from './lib/spectroHelpers.js'\r\n\r\nimport {computeLPC, getPeaks, getFrequenciesFromLPC, \r\n    addToRunningFormants, addToRunningLPC, isImpulse,\r\n    returnAndClearFormants, coefficients, } from './lib/lpc.js';\r\n\r\nimport {    expandArraySmoothly,  // expandArraySmoothly(array, targetResolution int)\r\n            getMean,              // getMean(array)\r\n            updateMagnitudes,     // updateMagnitudes(newMMagArray, currentMagArray);\r\n            normalizeIfNecessary\r\n} from './lib/spectroHelpers.js';\r\n\r\n\r\nconst SAMPLE_RATE = 44100;\r\nconst FRAME_SIZE = 4096; // Number of audio samples used to generate LPC Coeffs.;\r\nconst MAX_LPC_FREQ = 4096;  // hc needs a better understanding of this\r\nconst LPC_DISPLAY_RES = 512; // 64\r\n\r\nconst EMPTY_WAVE_MAG =  0.3;\r\n\r\n\r\n// These fns are imported into WaveCanvas\r\n\r\n\r\n// ===================================================================\r\n// AUDIO SETUP FNS\r\n\r\n// initAudio Helper ------------------------------------\r\nconst convertToMono = (input, audioContextRef) => {\r\n    const splitter = audioContextRef.createChannelSplitter(2);\r\n    const merger = audioContextRef.createChannelMerger(2);\r\n    input.connect(splitter);\r\n    splitter.connect(merger, 0, 0);\r\n    splitter.connect(merger, 0, 1);\r\n\r\n    return merger;\r\n};\r\n\r\n// initAudio  ------------------------------------\r\nconst initAudio = (microphone, audioContextRef, analyser) => { \r\n    \r\n    console.log('mic should be a MediaStreamAudioSourceNode')\r\n    console.log(microphone);\r\n\r\n    analyser.fftSize = FRAME_SIZE;\r\n\r\n    const audioInput = convertToMono(microphone, audioContextRef);\r\n    const HIGH_PASS = 200;\r\n    const LOW_PASS = MAX_LPC_FREQ+1000;\r\n\r\n    const highpass = audioContextRef.createBiquadFilter();\r\n    const lowpass = audioContextRef.createBiquadFilter();\r\n\r\n    highpass.type = \"highpass\";\r\n    highpass.frequency.value = HIGH_PASS;\r\n    lowpass.type = \"lowpass\";\r\n    lowpass.frequency.value = LOW_PASS;\r\n    lowpass.Q.value = 100\r\n\r\n    // audioInput.connect(highpass);\r\n    // highpass.connect(lowpass);\r\n    audioInput.connect(analyser);\r\n\r\n    return(analyser)\r\n}\r\n\r\n// ===================================================================\r\n// COEFF UPDATERS / Interval Loop \r\n\r\nconst updateCoeffsOffline = (audioData, ) => { // UPDATES COEFFS DATA\r\n    let lpcCoeffs = computeLPC(audioData);\r\n    let lastReceivedCoeffs = lpcCoeffs;\r\n    //   console.log(lastReceivedCoeffs);\r\n\r\n    return lastReceivedCoeffs\r\n}\r\n\r\n// TODO: --------------------------------------------\r\nconst updateCoeffsWithVonage = function () {}\r\n\r\n\r\n// ===================================================================\r\n// MAGS & PEAKS FROM LPC \r\n// gets and shapes wave mag & peak data to be used in drawing sketch\r\n\r\n// Static scaling function -- scale_factor expected in range 0-200\r\nvar scale = function (lpc, scale_factor) {\r\n    \r\n    for (var i = 0; i < lpc.length; i++) {\r\n        //console.log(sensitivityValueEle.value)\r\n        // value ranges from 0-200\r\n        var factor = scale_factor / 100.0;\r\n        // following lines smooth the low end of the visualization\r\n        // (doesn't effect any of the LPC calculations)\r\n        if (i <= 100){\r\n            factor = factor - .0005*(100-i)\r\n        } else {\r\n            factor = factor - .0001*(100 - i)\r\n        }\r\n        lpc[i] = lpc[i] * factor;\r\n    }\r\n    return lpc;\r\n};\r\n\r\nconst updateData = (drawData, lastReceivedCoeffs, calculateFormants) => {\r\n    const DRAW_PEAK_THRESHOLD = 0.15;\r\n    const HIDE_WAVE_MAG_THRESHOLD = -1; // -1 means always animate wave, otherwise min energy.\r\n    const HIDE_WAVE_FRAME_THRESHOLD = 60;\r\n    let numFramesBelowMin = 0;\r\n    let mags = drawData.magnitudes;\r\n    let peaks = drawData.peaks;\r\n\r\n    let newMagnitudes = getFrequenciesFromLPC(\r\n        lastReceivedCoeffs, \r\n        LPC_DISPLAY_RES,\r\n        MAX_LPC_FREQ,\r\n        SAMPLE_RATE\r\n    );\r\n\r\n    // ------------------------ Post LPC\r\n    //newMagnitudes = expandArraySmoothly(newMagnitudes, 512);\r\n    // TODO perhaps move this after scaling. move 256 num to const.\r\n    \r\n    newMagnitudes = scale(newMagnitudes, 20)\r\n    let magMean = getMean(newMagnitudes);\r\n\r\n    if (magMean < HIDE_WAVE_MAG_THRESHOLD) {\r\n        numFramesBelowMin += 1;\r\n        if (numFramesBelowMin > HIDE_WAVE_FRAME_THRESHOLD) {\r\n            newMagnitudes = createArrayWithSameValue(\r\n            EMPTY_WAVE_MAG,\r\n            newMagnitudes.length\r\n            );\r\n        }\r\n        } else {\r\n            numFramesBelowMin = 0;\r\n    }\r\n  \r\n    if (mags == 0) { \r\n        mags = newMagnitudes;\r\n    } else {\r\n        // console.log(mags)\r\n        // console.log(newMagnitudes)\r\n        mags = updateMagnitudes(newMagnitudes, mags); \r\n        // console.log(mags)\r\n        //mags = newMagnitudes;\r\n    }\r\n    // console.log('mags after data update')\r\n    // console.log(magsRef.current)\r\n  \r\n    if (magMean >= DRAW_PEAK_THRESHOLD) {\r\n        peaks = getPeaks(mags);\r\n        // choose only top 5 peaks if more than four exist\r\n        let numPeaks = 5;\r\n        // console.log(peaks)\r\n        // console.log(peaks.map(id => mags[id]))\r\n        if (peaks.length > 4){\r\n            let indexedPeaks = peaks.map(id => ({\r\n                value: mags[id],\r\n                originalIdx: id\r\n            }));\r\n\r\n            indexedPeaks.sort((a,b) => b.value - a.value);\r\n            let newPeaks = indexedPeaks.slice(0,numPeaks).map(item => item.originalIdx);\r\n\r\n            peaks = newPeaks.sort((a, b) => a - b);\r\n        }\r\n\r\n    } else {\r\n        peaks = [];\r\n    }\r\n\r\n    returnAndClearFormants(calculateFormants)\r\n    // if (calculateFormants == true && !isImpulse(lastReceivedCoeffs)){\r\n    //     coefficients.push(lastReceivedCoeffs);\r\n    // }\r\n    // Calculate frequencies of formants\r\n    let formantFreqz = peaks.map(x => x * (MAX_LPC_FREQ/LPC_DISPLAY_RES));\r\n    // If start button is pressed, add F2 to array\r\n    if (calculateFormants == true){\r\n        \r\n        addToRunningFormants(formantFreqz);\r\n\r\n        let lpcCoeffs = lastReceivedCoeffs;\r\n        addToRunningLPC(lpcCoeffs);\r\n\r\n        if (!isImpulse(lpcCoeffs)){\r\n            coefficients.push(lpcCoeffs);\r\n        }\r\n    }\r\n\r\n    mags = normalizeIfNecessary(mags);\r\n  \r\n    drawData = {\r\n      magnitudes: mags,\r\n      peaks: peaks\r\n    }\r\n    return drawData\r\n}\r\n\r\n\r\n// ===============================================\r\nexport { initAudio, updateData, updateCoeffsOffline, updateCoeffsWithVonage, FRAME_SIZE, LPC_DISPLAY_RES, SAMPLE_RATE};"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}