{"id":33289499,"url":"https://github.com/lcweden/loudness-worklet","last_synced_at":"2026-02-09T19:18:10.270Z","repository":{"id":316309676,"uuid":"1048750146","full_name":"lcweden/loudness-worklet","owner":"lcweden","description":"Measures audio loudness in the browser with the Web Audio API. A lightweight, ITU-R BS.1770-5 compliant meter, validated with official ITU-R (BS.2217) and EBU (TECH 3341, 3342) test suites. Provides momentary, short-term, integrated loudness (LUFS), LRA, and true-peak analysis.","archived":false,"fork":false,"pushed_at":"2025-11-14T13:02:30.000Z","size":5138,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-14T15:08:40.815Z","etag":null,"topics":["audio-worklet","github-pages","itu-r-bs1770","javascript","loudness-measurement","loudness-meter","pwa","solidjs","typescript","web-audio-api"],"latest_commit_sha":null,"homepage":"https://lcweden.github.io/loudness-worklet/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lcweden.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-02T01:04:22.000Z","updated_at":"2025-11-14T13:02:34.000Z","dependencies_parsed_at":"2025-09-23T22:30:15.242Z","dependency_job_id":null,"html_url":"https://github.com/lcweden/loudness-worklet","commit_stats":null,"previous_names":["lcweden/loudness-audio-worklet-processor","lcweden/loudness-worklet"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/lcweden/loudness-worklet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lcweden%2Floudness-worklet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lcweden%2Floudness-worklet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lcweden%2Floudness-worklet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lcweden%2Floudness-worklet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lcweden","download_url":"https://codeload.github.com/lcweden/loudness-worklet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lcweden%2Floudness-worklet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284964283,"owners_count":27091965,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-17T02:00:06.431Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-worklet","github-pages","itu-r-bs1770","javascript","loudness-measurement","loudness-meter","pwa","solidjs","typescript","web-audio-api"],"created_at":"2025-11-17T22:00:45.613Z","updated_at":"2026-02-09T19:18:10.254Z","avatar_url":"https://github.com/lcweden.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Loudness Worklet\n\n[![npm version](https://img.shields.io/npm/v/loudness-worklet.svg)](https://www.npmjs.com/package/loudness-worklet)\n[![license](https://img.shields.io/github/license/lcweden/loudness-worklet.svg)](LICENSE)\n[![demo](https://img.shields.io/badge/demo-Online-purple.svg)](https://lcweden.github.io/loudness-worklet/)\n\nA loudness meter for the `Web Audio API`, based on the [ITU-R BS.1770-5](https://www.itu.int/rec/R-REC-BS.1770) standard and implemented as an AudioWorkletProcessor.\n\n[![screenshot](https://github.com/lcweden/loudness-worklet/blob/main/packages/web/public/screenshots/meter.png)](https://lcweden.github.io/loudness-worklet/)\n\n## Features\n\n- **Standard Compliant**: Strictly follows **ITU-R BS.1770-5** for accurate loudness measurement.\n- **Comprehensive Metrics**: Calculates Momentary, Short-term, and Integrated Loudness, plus Loudness Range (LRA) and True-Peak levels.\n- **Versatile Input**: Seamlessly supports both live audio streams (\"Microphone/WebRTC\") and offline file analysis.\n- **Zero Dependencies**: Lightweight, pure AudioWorklet implementation requiring no external libraries.\n\n## Use Cases\n\n- **Volume Normalization**: Dynamically analyze and harmonize volume levels across multi-source playlists directly in the browser, eliminating the need for server-side processing.\n- **Pre-upload Validation**: Verify if audio files meet platform-specific loudness standards (e.g., -14 LUFS) locally before uploading.\n- **Live Metering**: Build responsive, standard-compliant loudness meters for web-based recorders, conferencing tools, or broadcasting interfaces.\n- **Web Audio Editors**: Integrate professional-grade loudness analysis into browser-based Digital Audio Workstations (DAWs).\n\n## Installation\n\n### CDN\n\nImport directly in your code:\n\n```javascript\nconst moduleUrl = \"https://lcweden.github.io/loudness-worklet/loudness.worklet.js\";\nawait audioContext.audioWorklet.addModule(moduleUrl);\nconst worklet = new AudioWorkletNode(audioContext, \"loudness-processor\");\n```\n\n### Download\n\n1. Download the pre-built file: [loudness.worklet.js](https://lcweden.github.io/loudness-worklet/loudness.worklet.js).\n2. Place `loudness.worklet.js` in your project directory (e.g., `/public/`).\n\n```javascript\nawait audioContext.audioWorklet.addModule(\"loudness.worklet.js\");\nconst worklet = new AudioWorkletNode(audioContext, \"loudness-processor\");\n```\n\n### NPM\n\nInstall via [npm](https://www.npmjs.com/package/loudness-worklet):\n\n```bash\nnpm install loudness-worklet\n```\n\nUse helper functions to create and load the worklet:\n\n```javascript\nimport { createLoudnessWorklet } from \"loudness-worklet\";\n\nconst worklet = await createLoudnessWorklet(audioContext);\n```\n\nor\n\n```javascript\nimport { LoudnessWorkletNode } from \"loudness-worklet\";\n\nawait LoudnessWorkletNode.loadModule(audioContext);\nconst worklet = new LoudnessWorkletNode(audioContext);\n```\n\n## Quick Start\n\n### Example\n\nThis example shows the easiest way to get started with the Loudness Audio Worklet Processor.\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003cbody\u003e\n    \u003cbutton\u003eShare Screen\u003c/button\u003e\n    \u003cpre\u003e\u003c/pre\u003e\n    \u003cscript\u003e\n      const moduleUrl = \"https://lcweden.github.io/loudness-worklet/loudness.worklet.js\";\n      const button = document.querySelector(\"button\");\n      const pre = document.querySelector(\"pre\");\n\n      button.onclick = async () =\u003e {\n        // Get the screen stream with audio, for example a YouTube tab\n        const mediaStream = await navigator.mediaDevices.getDisplayMedia({ audio: true });\n        const context = new AudioContext();\n\n        // Load the loudness worklet processor\n        await context.audioWorklet.addModule(moduleUrl);\n\n        // Create the audio node from the stream\n        const source = new MediaStreamAudioSourceNode(context, { mediaStream });\n        // Create the loudness worklet node\n        const worklet = new AudioWorkletNode(context, \"loudness-processor\", {\n          processorOptions: {\n            interval: 0.02, // every 0.02s a message will be sent\n            capacity: 600 // 1 minute of history can be stored\n          }\n        });\n\n        worklet.port.onmessage = (event) =\u003e {\n          pre.textContent = JSON.stringify(event.data, null, 2);\n        };\n\n        // Connect the nodes\n        source.connect(worklet);\n      };\n    \u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n### File-based measurement\n\nYou can measure the loudness of audio files using `OfflineAudioContext`.\n\n```javascript\nimport { LoudnessWorkletNode } from \"loudness-worklet\";\n\nconst input = document.querySelector(\"input\");\n\ninput.addEventListener(\"change\", async (event) =\u003e {\n  const file = event.target.files[0];\n  const arrayBuffer = await file.arrayBuffer();\n  const audioBuffer = await new AudioContext().decodeAudioData(arrayBuffer);\n  const { numberOfChannels, length, sampleRate } = audioBuffer;\n  const context = new OfflineAudioContext(numberOfChannels, length, sampleRate);\n\n  await LoudnessWorkletNode.loadModule(context);\n\n  const source = new AudioBufferSourceNode(context, { buffer: audioBuffer });\n  const worklet = new LoudnessWorkletNode(context);\n\n  worklet.port.onmessage = (event) =\u003e console.log(\"Loudness Data:\", event.data);\n\n  source.connect(worklet).connect(context.destination);\n  source.start();\n\n  await context.startRendering();\n});\n```\n\n### Live-based measurement\n\nSupports all kinds of audio input.\n\n```javascript\nimport { createLoudnessWorklet } from \"loudness-worklet\";\n\nconst mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\nconst context = new AudioContext({ sampleRate: 48000 });\nconst source = context.createMediaStreamSource(mediaStream);\nconst worklet = await createLoudnessWorklet(context, {\n  processorOptions: { interval: 1, capacity: 600 }\n});\n\nworklet.port.onmessage = (event) =\u003e console.log(\"Loudness Data:\", event.data);\nsource.connect(worklet);\n\n// worklet.connect(context.destination);\n// Optionally connect to destination for monitoring (echo)\n```\n\n## Concepts\n\n### Contexts\n\nProvide the execution environment for audio processing.\n\n#### AudioContext\n\n`AudioContext` is used for real-time audio processing, such as live audio input from a microphone or media stream.\n\n#### OfflineAudioContext\n\n`OfflineAudioContext` is used for processing audio data offline, allowing for rendering and analysis without requiring real-time playback.\n\n### Nodes\n\nNodes are the building blocks of an audio graph, representing audio sources, processing modules, and destinations. The following nodes are commonly used as a source input:\n\n#### AudioBufferSourceNode\n\n`AudioBufferSourceNode` is used to play audio data stored in an `AudioBuffer`, typically for pre-recorded audio files.\n\n```javascript\nconst audioContext = new AudioContext();\nconst arrayBuffer = await file.arrayBuffer();\nconst audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\nconst bufferSource = new AudioBufferSourceNode(audioContext, { buffer: audioBuffer });\n```\n\n#### MediaStreamAudioSourceNode\n\n`MediaStreamAudioSourceNode` is used to play audio from a `MediaStream`, such as a live microphone input or a video element.\n\n```javascript\nconst audioContext = new AudioContext();\nconst mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\nconst mediaStreamSource = new MediaStreamAudioSourceNode(audioContext, { mediaStream });\n```\n\n#### MediaElementAudioSourceNode\n\n`MediaElementAudioSourceNode` is used to play audio from an HTML `\u003caudio\u003e` or `\u003cvideo\u003e` element.\n\n```javascript\nconst audioContext = new AudioContext();\nconst mediaElement = document.querySelector(\"audio\");\nconst elementSource = new MediaElementAudioSourceNode(audioContext, { mediaElement });\n```\n\n## API\n\n### Options\n\nThe `AudioWorkletNode` constructor accepts the following options:\n\n#### Params\n\n| Option                    | Type       | Required | Default | Description                                                                                          |\n| ------------------------- | ---------- | -------- | ------- | ---------------------------------------------------------------------------------------------------- |\n| processorOptions.interval | `number`   | `No`     | `0.02`  | Message interval in seconds.                                                                         |\n| processorOptions.capacity | `number`   | `No`     | `0`     | Maximum seconds of history to keep. If set to `0`, the processor will not limit the history size.   |\n\n#### Example\n\nMost of the time, you only need to set `processorOptions`.\n\n```javascript\nconst { numberOfChannels, length, sampleRate } = audioBuffer;\nconst worklet = new AudioWorkletNode(context, \"loudness-processor\", {\n  processorOptions: {\n    capacity: length / sampleRate,\n    interval: 0.02\n  }\n});\n```\n\n### Message Format\n\nMeasurement results are sent back to the main thread via `port.onmessage` as a `LoudnessSnapshot` object:\n\n```typescript\ntype LoudnessMeasurements = {\n  momentaryLoudness: number;\n  shortTermLoudness: number;\n  integratedLoudness: number;\n  maximumMomentaryLoudness: number;\n  maximumShortTermLoudness: number;\n  maximumTruePeakLevel: number;\n  loudnessRange: number;\n};\n\ntype LoudnessSnapshot = {\n  currentFrame: number;\n  currentTime: number;\n  currentMeasurements: LoudnessMeasurements[];\n};\n```\n\n### Units\n\n| Metric                     | Unit          |\n| -------------------------- | ------------- |\n| `momentaryLoudness`        | `LUFS`/`LKFS` |\n| `shortTermLoudness`        | `LUFS`/`LKFS` |\n| `integratedLoudness`       | `LUFS`/`LKFS` |\n| `maximumMomentaryLoudness` | `LUFS`/`LKFS` |\n| `maximumShortTermLoudness` | `LUFS`/`LKFS` |\n| `maximumTruePeakLevel`     | `dBTP`        |\n| `loudnessRange`            | `LU`          |\n\n### Supported Channels\n\nSupported channel counts: `1`, `2`, `6`, `8`, `10`, `12`, `24`\n\n\u003e [!NOTE]\n\u003e Channel counts not listed above are weighted at `1.0`.\n\n### Coefficients\n\nThe following coefficients are used for the K-weighting filter:\n\n|     | highshelf         | highpass          |\n| --- | ----------------- | ----------------- |\n| a1  | -1.69065929318241 | -1.99004745483398 |\n| a2  | 0.73248077421585  | 0.99007225036621  |\n| b0  | 1.53512485958697  | 1.0               |\n| b1  | -2.69169618940638 | -2.0              |\n| b2  | 1.19839281085285  | 1.0               |\n\nThe following FIR filter coefficients are used for true-peak measurement:\n\n| Phase 0          | Phase 1          | Phase 2          | Phase 3          |\n| ---------------- | ---------------- | ---------------- | ---------------- |\n| 0.0017089843750  | -0.0291748046875 | -0.0189208984375 | -0.0083007812500 |\n| 0.0109863281250  | 0.0292968750000  | 0.0330810546875  | 0.0148925781250  |\n| -0.0196533203125 | -0.0517578125000 | -0.0582275390625 | -0.0266113281250 |\n| 0.0332031250000  | 0.0891113281250  | 0.1015625000000  | 0.0476074218750  |\n| -0.0594482421875 | -0.1665039062500 | -0.2003173828125 | -0.1022949218750 |\n| 0.1373291015625  | 0.4650878906250  | 0.7797851562500  | 0.9721679687500  |\n| 0.9721679687500  | 0.7797851562500  | 0.4650878906250  | 0.1373291015625  |\n| -0.1022949218750 | -0.2003173828125 | -0.1665039062500 | -0.0594482421875 |\n| 0.0476074218750  | 0.1015625000000  | 0.0891113281250  | 0.0332031250000  |\n| -0.0266113281250 | -0.0582275390625 | -0.0517578125000 | -0.0196533203125 |\n| 0.0148925781250  | 0.0330810546875  | 0.0292968750000  | 0.0109863281250  |\n| -0.0083007812500 | -0.0189208984375 | -0.0291748046875 | 0.0017089843750  |\n\n## Validation\n\n### ITU-R BS.2217\n\nCode correctness is verified against the official **[ITU-R BS.2217](https://www.itu.int/pub/R-REP-BS.2217)** compliance test suite, ensuring strict adherence to the **[ITU-R BS.1770](https://www.itu.int/rec/R-REC-BS.1770)** specification.\n\n| file                                 | measurement | channels |                    |\n| ------------------------------------ | ----------- | -------- | ------------------ |\n| 1770Comp_2_RelGateTest               | -10.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_AbsGateTest               | -69.5 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_25Hz_2ch           | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_100Hz_2ch          | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_500Hz_2ch          | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_1000Hz_2ch         | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_2000Hz_2ch         | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_24LKFS_10000Hz_2ch        | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_25Hz_2ch           | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_100Hz_2ch          | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_500Hz_2ch          | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_1000Hz_2ch         | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_2000Hz_2ch         | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_23LKFS_10000Hz_2ch        | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770Comp_2_18LKFS_FrequencySweep     | -18.0 LKFS  | 1        | :white_check_mark: |\n| 1770Comp_2_24LKFS_SummingTest        | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_SummingTest        | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckLeft   | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckRight  | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckCentre | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckLFE    | -inf LKFS   | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckLs     | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_24LKFS_ChannelCheckRs     | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_ChannelCheckLeft   | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_ChannelCheckRight  | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LFKS_ChannelCheckCentre | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_ChannelCheckLFE    | -inf LKFS   | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_ChannelCheckLs     | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770Comp_2_23LKFS_ChannelCheckRs     | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf 6ch VinCntr-24LKFS       | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf 6ch VinL+R-24LKFS        | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf 6ch VinL-R-C-24LKFS      | -24.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf Stereo VinL+R-24LKFS     | -24.0 LKFS  | 2        | :white_check_mark: |\n| 1770-2 Conf Mono Voice+Music-24LKFS  | -24.0 LKFS  | 1        | :white_check_mark: |\n| 1770-2 Conf 6ch VinCntr-23LKFS       | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf 6ch VinL+R-23LKFS        | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf 6ch VinL-R-C-23LKFS      | -23.0 LKFS  | 6        | :white_check_mark: |\n| 1770-2 Conf Stereo VinL+R-23LKFS     | -23.0 LKFS  | 2        | :white_check_mark: |\n| 1770-2 Conf Mono Voice+Music-23LKFS  | -23.0 LKFS  | 1        | :white_check_mark: |\n| 1770Conf-8channels_24LKFS            | -24.0 LKFS  | 8        | :white_check_mark: |\n| 1770Conf-8channels_23LKFS            | -23.0 LKFS  | 8        | :white_check_mark: |\n| 1770Conf-10channels_24LKFS           | -24.0 LKFS  | 10       | :white_check_mark: |\n| 1770Conf-10channels_23LKFS           | -23.0 LKFS  | 10       | :white_check_mark: |\n| 1770Conf-12channels_24LKFS           | -24.0 LKFS  | 12       | :white_check_mark: |\n| 1770Conf-12channels_23LKFS           | -23.0 LKFS  | 12       | :white_check_mark: |\n| 1770Conf-24channels_24LKFS           | -24.0 LKFS  | 24       | :white_check_mark: |\n| 1770Conf-24channels_23LKFS           | -23.0 LKFS  | 24       | :white_check_mark: |\n\n\u003e [!TIP]\n\u003e If `decodeAudioData` fails, it's often due to the browser's specific support for the audio file's format (codec), container, or channel layout, rather than a general API incompatibility.\n\u003e Try a different browser or convert the audio file to a more widely supported format.\n\u003e For example, Chrome has limited support for certain codecs in audio files, while Safari offers broader support. (1770Conf-24channels_24LKFS)\n\n### EBU TECH 3341 Minimum requirements test signals\n\nValidated against **[EBU TECH 3341](https://tech.ebu.ch/publications/tech3341)** minimum requirements for loudness metering, including gating behavior, time scales, and true-peak accuracy.\n\n| file                                 | expected response and accepted tolerances                   |                    |\n| ------------------------------------ | ----------------------------------------------------------- | ------------------ |\n| seq-3341-1-16bit                     | M, S, I = -23.0 ±0.1 LUFS                                   | :white_check_mark: |\n| seq-3341-2-16bit                     | M, S, I = -33.0 ±0.1 LUFS                                   | :white_check_mark: |\n| seq-3341-3-16bit-v02                 | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-4-16bit-v02                 | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-5-16bit-v02                 | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-6-6channels-WAVEEX-16bit    | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-7_seq-3342-5-24bit          | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-2011-8_seq-3342-6-24bit-v02 | I = -23.0 ±0.1 LUFS                                         | :white_check_mark: |\n| seq-3341-9-24bit                     | S = -23.0 ±0.1 LUFS, constant after 3 s                     | :white_check_mark: |\n| seq-3341-10-\\*-24bit                 | Max S = -23.0 ±0.1 LUFS, for each segment                   | :white_check_mark: |\n| seq-3341-11-24bit                    | Max S = -38.0, -37.0, …, -19.0 ±0.1 LUFS, successive values | :white_check_mark: |\n| seq-3341-12-24bit                    | M = -23.0 ±0.1 LUFS, constant after 1 s                     | :white_check_mark: |\n| seq-3341-13-\\*-24bit                 | Max M = -23.0 ±0.1 LUFS, for each segment                   | :white_check_mark: |\n| seq-3341-14-24bit                    | Max M = -38.0, …, -19.0 ±0.1 LUFS, successive values        | :white_check_mark: |\n| seq-3341-15-24bit                    | Max true-peak = -6.0 +0.2/-0.4 dBTP                         | :white_check_mark: |\n| seq-3341-16-24bit                    | Max true-peak = -6.0 +0.2/-0.4 dBTP                         | :white_check_mark: |\n| seq-3341-17-24bit                    | Max true-peak = -6.0 +0.2/-0.4 dBTP                         | :white_check_mark: |\n| seq-3341-18-24bit                    | Max true-peak = -6.0 +0.2/-0.4 dBTP                         | :white_check_mark: |\n| seq-3341-19-24bit                    | Max true-peak = +3.0 +0.2/-0.4 dBTP                         | :white_check_mark: |\n| seq-3341-20-24bit                    | Max true-peak = 0.0 +0.2/-0.4 dBTP                          | :white_check_mark: |\n| seq-3341-21-24bit                    | Max true-peak = 0.0 +0.2/-0.4 dBTP                          | :white_check_mark: |\n| seq-3341-22-24bit                    | Max true-peak = 0.0 +0.2/-0.4 dBTP                          | :white_check_mark: |\n| seq-3341-23-24bit                    | Max true-peak = 0.0 +0.2/-0.4 dBTP                          | :white_check_mark: |\n\n### EBU TECH 3342 Minimum requirements test signals\n\n[EBU TECH 3342](https://tech.ebu.ch/publications/tech3342) focuses on the measurement of loudness range.\n\n| file                                 | expected response and accepted tolerances |                    |\n| ------------------------------------ | ----------------------------------------- | ------------------ |\n| seq-3342-1-16bit                     | LRA = 10 ±1 LU                            | :white_check_mark: |\n| seq-3342-2-16bit                     | LRA = 5 ±1 LU                             | :white_check_mark: |\n| seq-3342-3-16bit                     | LRA = 20 ±1 LU                            | :white_check_mark: |\n| seq-3342-4-16bit                     | LRA = 15 ±1 LU                            | :white_check_mark: |\n| seq-3341-7_seq-3342-5-24bit          | LRA = 5 ±1 LU                             | :white_check_mark: |\n| seq-3341-2011-8_seq-3342-6-24bit-v02 | LRA = 15 ±1 LU                            | :white_check_mark: |\n\n## Acknowledgments\n\nThis project is a learning experiment aimed at exploring audio signal processing and ITU-R BS.1770 loudness measurement standards. I am not an expert in audio engineering or signal processing, and this project was developed as a way to better understand the concepts of audio loudness and implementation techniques. Thanks to the ITU-R BS.1770 standards for providing the theoretical basis for loudness measurement.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n\n## References\n\n- [ITU-R BS.1770](https://www.itu.int/rec/R-REC-BS.1770)\n- [ITU-R BS.2217](https://www.itu.int/pub/R-REP-BS.2217)\n- [EBU Tech 3341](https://tech.ebu.ch/publications/tech3341)\n- [EBU Tech 3342](https://tech.ebu.ch/publications/tech3342)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flcweden%2Floudness-worklet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flcweden%2Floudness-worklet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flcweden%2Floudness-worklet/lists"}