BWF Analyser: browser page and macOS app

Reads and edits BWF metadata for production sound. One source tree builds a
single self-contained page and a native Tauri app with a Rust audio engine and
WAV writer. Around 370 checks across seven test suites.

First commit of the existing state, so that from here every change can be
seen and undone.
This commit is contained in:
2026-08-17 22:50:39 +08:00
commit 2d0b7fe8b5
50 changed files with 42383 additions and 0 deletions
+228
View File
@@ -0,0 +1,228 @@
{
"dropHere": "Drag & drop a folder here, or",
"dropHereActive": "Release to add these files",
"notSupported": "Folder selection is not supported in this browser. You can still pick individual files.",
"selectFolder": "Select Folder",
"selectFiles": "Select Files",
"clear": "Clear",
"statusScanning": "Scanning folder…",
"statusParsing": "Reading file %1$d of %2$d…",
"statusDone": "Done — %1$d file(s) analysed, %2$d skipped.",
"noFilesYet": "No files analysed yet.",
"noFilesFound": "No BWF/WAV files were found in that selection.",
"noResultsFilter": "No files match your search.",
"colFileName": "File",
"colFolder": "Folder",
"colScene": "Scene",
"colTake": "Take",
"colTape": "Tape/Reel",
"colCircled": "Circled",
"colTimecode": "Start TC",
"colDuration": "Duration",
"colFrameRate": "FPS",
"colSampleRate": "Sample Rate",
"colBitDepth": "Bit Depth",
"colChannels": "Channels",
"colTrackNames": "Track Names",
"trackNamePlaceholder": "Unnamed",
"trackFileCount": "%1$d file(s)",
"trackWasCount": "was %1$s · %2$d file(s)",
"trackUnnamedChannel": "Channel %1$d — no name",
"colOriginator": "Originator",
"colOriginatorRef": "Originator Ref.",
"colOriginationDate": "Origination Date",
"colOriginationTime": "Origination Time",
"colDescription": "Description",
"colNote": "Note",
"colProject": "Project",
"colFileSize": "File Size",
"colMarkers": "Markers",
"colLoudness": "Integrated LUFS",
"colCodingHistory": "Coding History",
"colDetails": "Edit",
"colPlay": "Play",
"detailsBtn": "Edit",
"play": "Play",
"pause": "Pause",
"nowPlaying": "Now playing",
"playbackError": "This file could not be played back (unsupported codec or unreadable data).",
"timecodeFromDescription": "from Description tag, no iXML present",
"channelLabel": "Ch",
"colWaveform": "Waveform",
"columnsBtn": "Settings",
"editFolder": "Edit Metadata in a Folder…",
"editing": "Editing",
"edit": "Edit",
"save": "Save",
"saving": "Saving…",
"saved": "Saved.",
"saveError": "Could not save this file — it may have been moved, deleted, or you may need to re-grant permission.",
"discardConfirm": "You have unsaved changes. Discard them?",
"fieldScene": "Scene",
"fieldTake": "Take",
"fieldTape": "Tape/Reel",
"fieldProject": "Project",
"fieldCircled": "Circled",
"fieldWildTrack": "Wild Track",
"fieldUbits": "UBits",
"fieldFrameRate": "Frame Rate",
"fieldFrameRateFlag": "Drop Frame",
"fieldTcSampleRate": "TC Sample Rate",
"fieldDigitizerRate": "Digitizer Rate",
"fieldNote": "Note",
"notEditable": "This file was opened for viewing only — use \"Edit Metadata in a Folder…\" to make it editable.",
"bulkEditBtn": "Bulk Edit…",
"bulkEditTitle": "Bulk Edit",
"bulkEditCount": "Applies to %1$d file(s) matching the current search/filter.",
"bulkEditApply": "Apply",
"bulkEditApplyN": "Apply to %1$d file(s)",
"bulkEditCancel": "Cancel",
"bulkEditConfirm": "This will overwrite %1$d file(s) on disk. Continue?",
"bulkEditConfirmBtn": "Yes, rewrite %1$d file(s)",
"bulkEditConfirmLine": "Rewrite the metadata in %1$d file(s)? The audio is not touched.",
"bulkEditProgress": "Saving %1$d of %2$d…",
"bulkEditDone": "Done — %1$d saved, %2$d failed.",
"ndf": "Non-drop (NDF)",
"df": "Drop-frame (DF)",
"noChange": "(no change)",
"modalTitle": "File metadata",
"sectionFormat": "Format",
"sectionBext": "Broadcast Extension (bext)",
"sectionIxml": "iXML",
"sectionInfo": "RIFF INFO",
"sectionCue": "Cue Points / Markers",
"sectionCart": "Cart Chunk",
"sectionOther": "Other chunks found (not decoded)",
"yes": "Yes",
"no": "No",
"unknown": "—",
"errorParsing": "Could not read this file.",
"errorNotWav": "Not a recognised WAV/BWF file.",
"errorJsPdfLoad": "The PDF library could not be loaded (check your internet connection) — try again, or use Export CSV instead.",
"exportCsv": "Export CSV",
"exportPdf": "Export PDF",
"pdfGenerating": "Building PDF…",
"pdfTitle": "BWF Metadata Report",
"pdfGeneratedOn": "Generated",
"pdfFileCount": "Files",
"close": "Close",
"playerPlaying": "Now playing",
"playerReady": "Ready to play",
"playerNothing": "Player",
"playerIdle": "Nothing loaded yet",
"audioReopened": "Audio stopped coming through — the output was reopened.",
"asRecorded": "(as recorded)",
"hints": {
"bwfa-edit-folder": "Open a folder of recordings",
"bwfa-reset": "Close the folder and start again",
"bwfa-play-btn": "Play this take",
"bwfa-details-btn": "Edit this file's metadata",
"bwfa-bulk-edit-toggle": "Change a field across every file listed",
"bwfa-export-audio": "Write copies to another folder",
"bwfa-report-open": "Make a sound report as CSV or PDF",
"bwfa-settings-open": "Columns, appearance and playback",
"bwfa-player-playpause": "Play or pause",
"bwfa-player-edit": "Edit the file that's loaded",
"bwfa-player-export": "Export just this file",
"bwfa-export-choose": "Pick where the copies go",
"bwfa-export-run": "Start writing the copies",
"bwfa-export-depth": "Convert deep files to 24-bit, or leave them as recorded",
"bwfa-export-channels": "Keep, split to mono, or combine into one poly",
"bwfa-export-normalize": "Lift levels to a target, or only stop clipping",
"bwfa-export-target": "The peak to aim for, in dBFS",
"bwfa-export-collision": "What to do about a file that's already there",
"bwfa-export-naming": "Name the copies from their metadata",
"bwfa-export-pattern": "Tokens in braces, plus any text you like",
"bwfa-bulk-edit-apply": "Write these changes to every file listed",
"bwfa-bulk-edit-cancel": "Close without changing anything",
"bwfa-result-save": "Save what happened as a text file",
"bwfa-result-done": "Close this report",
"bwfa-modal-save": "Write these changes to the file",
"bwfa-audio-reset": "Restart the app if sound stops",
"bwfa-channel-chip": "Click to mute, double-click to solo",
"bwfa-name-chip": "Click to rename this track",
"bwfa-bulk-track": "Rename this track everywhere it appears",
"bwfa-status": "What the app is doing, and what it found",
"bwfa-player-badge": "Which file the player is holding",
"bwfa-player-elapsed": "How far into the file playback has reached",
"bwfa-player-duration": "How long the file runs",
"bwfa-search": "Narrow the list by filename, scene or take",
"bwfa-settings-cog": "Choose which columns to show",
"bwfa-sort": "Click to sort by this column",
"bwfa-sort=waveform": "The shape of the audio. Click to sort",
"bwfa-sort=fileName": "The name on disk. Click to sort",
"bwfa-sort=folder": "The subfolder on the card. Click to sort",
"bwfa-sort=scene": "Scene, from the recorder's iXML. Click to sort",
"bwfa-sort=take": "Take number, from the recorder's iXML. Click to sort",
"bwfa-sort=tape": "Roll or reel, usually the shoot day. Click to sort",
"bwfa-sort=circled": "Marked as a good take. Click to sort",
"bwfa-sort=startTimecode": "Where the take starts on the day's clock. Click to sort",
"bwfa-sort=durationSeconds": "How long the take runs. Click to sort",
"bwfa-sort=sampleRate": "Samples per second. Click to sort",
"bwfa-sort=bitDepth": "Bits per sample, or 32-bit float. Click to sort",
"bwfa-sort=channels": "How many tracks are in the file. Click to sort",
"bwfa-sort=frameRate": "Frames per second the timecode counts in. Click to sort",
"bwfa-sort=originator": "The recorder that made the file. Click to sort",
"bwfa-sort=description": "The bext description field. Click to sort",
"bwfa-sort=note": "The iXML note field. Click to sort",
"bwfa-sheet-close": "Close this without doing anything",
"bwfa-modal-close": "Close. You'll be asked about unsaved changes",
"bwfa-modal-prev": "The previous file in the list",
"bwfa-modal-next": "The next file in the list",
"bwfa-modal-play": "Play this file",
"bwfa-modal-filename": "The file this is about",
"bwfa-export-cancel": "Close without exporting",
"bwfa-export-dest": "Where the copies will be written",
"bwfa-export-scope": "How many files this will act on",
"bwfa-export-summary": "What the combined file would come out as",
"bwfa-export-names": "What the copies would be called",
"bwfa-export-tracks": "Choose which tracks to export from this file",
"bwfa-export-track-chips": "Click a track to leave it out",
"bwfa-export-report": "What happened to each file",
"bwfa-edit-field=scene": "Scene, as the slate says it",
"bwfa-edit-field=take": "Take number",
"bwfa-edit-field=tape": "Roll or reel, usually the shoot day",
"bwfa-edit-field=project": "Production name, the same on every file",
"bwfa-edit-field=circled": "Mark this as a good take",
"bwfa-edit-field=wildTrack": "Mark this as a wild track, recorded without picture",
"bwfa-edit-field=ubits": "User bits, free text the recorder carries in timecode",
"bwfa-edit-field=frameRate": "Frames per second the timecode counts in",
"bwfa-edit-field=frameRateFlag": "Drop frame or not. Only 29.97 and 59.94 ever drop",
"bwfa-edit-field=tcSampleRate": "The rate the timecode's sample count is based on",
"bwfa-edit-field=digitizerRate": "The rate the converter actually ran at",
"bwfa-edit-field=note": "Free text for post: anything worth knowing about this take",
"bwfa-edit-field=description": "The bext description, 256 characters, read by most tools",
"bwfa-bulk-tracks": "Every track name across these files. Click one to rename it everywhere",
"bwfa-bulk-edit-panel": "Fill in only what you want to change",
"bwfa-report-create": "Write the report",
"bwfa-report-format": "CSV for a spreadsheet, PDF to hand over",
"bwfa-report-subject": "Which files go in the report",
"bwfa-report-field=company": "Your company, printed at the top",
"bwfa-report-field=project": "Production name",
"bwfa-report-field=director": "Director's name",
"bwfa-report-field=mixer": "Whoever recorded it",
"bwfa-report-field=phone": "Contact number on the report",
"bwfa-report-field=email": "Contact address on the report",
"bwfa-report-field=note": "Anything post should read first",
"bwfa-settings=appearance": "Light, dark, or follow the system",
"bwfa-settings=playback": "What happens when a file finishes",
"bwfa-settings=columns": "Which columns the table shows",
"bwfa-theme-mode": "Follow the system, or pick one and stay there",
"bwfa-playback-mode": "Stop, play the next file, or loop this one",
"bwfa-columns-modal": "Tick the columns you want to see",
"bwfa-spectro-open": "See the frequencies in this take",
"bwfa-spectro-canvas": "Time across, frequency up. Brighter is louder",
"bwfa-mixer-open": "Balance the tracks while you listen",
"bwfa-mixer-seek": "Drag to move through the file",
"bwfa-mixer-strips": "One fader per track. Listening only",
"bwfa-mixer-playpause": "Start or stop playback",
"bwfa-mixer-prev": "Mix the previous file",
"bwfa-mixer-next": "Mix the next file",
"bwfa-mixer-close": "Close the mixer"
},
"spectroReading": "Reading the file…",
"spectroFailed": "That file couldn't be read as a spectrogram.",
"mixerNoFile": "Play a file to mix it.",
"mixerMute": "M",
"mixerSolo": "S"
}