Apps for reading embedded metadata

When trying to review metadata, using Apple Music’s “Get Info” window (or similar consumer focused apps) is not ideal as this will only let you preview a subset of the metadata available in a file.

In the case of WAV files, Apple Music doesn’t support reading metadata at all.

The following apps, although archaic, allow you to view music metadata embedded in files in detail.

View all ID3 tags

View extended WAV metadata

AIFF & MP3 — ID3

ID3 is a metadata container allowing information such as the title, artist, album, track number, and other information about the file to be stored in the file itself.

Supported ID3 tags

Here are the fields we automatically add to each track when it is downloaded.

// Track title
"TIT2": title,
// Track description
"COMM": description,
// Track_number
"TRCK": track_number,
// Genre (from any genre tags present)
"TCON": genre,
// ISRC
"TSRC": isrc,
// Composer(s) - Composer name (PRO) 100% [IPI]
"TCOM": composers,
// BPM
"TBPM":	track_bpm
 
// Album title
"TALB": release_title,
// Album sleeve
"APIC": packshot
// Original release year
"TORY":	release_year
 
// Publisher - Publisher name (PRO) [IPI]
"TPUB": publisher,
// Copyright - 2015 Publisher name (PRO) [IPI]
"TCOP": `${release_year} ${publisher}`,
// Artist - we add the label name (Library Name in the CSV)
"TPE1": label_name,
 
// Auto grouping
// Contact info of your choice - to add please contact support
"GRP1": contact_info,
 
// Metadata encoder
"TENC":	"Cadenzabox",

A medium resolution JPEG of the cover artwork of the track’s parent release is added to the APIC ID3 tag for visibility in the macOS Finder / Windows File Explorer / Apple Music, etc.

Here is an example of how our supported fields look in the “Get Info” window in Apple Music:

Poor ID3 standardisation

ID3 tags are an poorly defined format, with competing usages of the different fields.

Alongside many extended discussions with a variety of Cadenzabox clients, here are some resources we have referenced when deciding how to structure our system’s use of the available fields:

For example, we currently don’t support the following fields:

// Grouping - unsupported
"TIT1": null
// Recording time - unsupported
"TDRC": null,
// File owner - unsupported
"TOWN": null,
// Album artist - unsupported
"TPE2": null,
// Original release time - unsupported
"TDOR": null,

Please contact us if you have a metadata request or suggestions on how we might better align ourselves in the sea of subtly conflicting usage standards. 🌊

WAV files — ID3 + RIFF

Broadcast Wave Format (BWF) is an extension of the Waveform Audio File Format (WAV or WAVE) to allow the addition of metadata. This metadata is stored as extension chunks in a standard digital audio WAV file.

WAV is an application of the Resource Interchange File Format (RIFFbitstream format method for storing data in chunks, similar to the Audio Interchange File Format (AIFF) format.

ID3 tags

Cadenzabox embeds ID3 tags when exporting WAV files. These can be read using a professional ID3 metadata tool.

Please note that Apple Music doesn’t support reading ID3 tags from WAV files, even when they are present. Thankfully macOS does at least create an icon in the Finder using the album packshot (the APIC ID3 field).

RIFF chunks

We clear all metadata and add the following when exporting WAV files from Cadenzabox.

Resource Interchange File Format headers comprise the following fields:

// Track number
"TRCK": track_number,
// Track title (bracketed version title followed if present)
"INAM": title,
// Genre(s) - comma delimited tags from Genre/Genres tag-categories
"IGNR": genre,
// Track artist
"IART": org_name,
// Composers - Composer name (PRO) 100% [IPI]
"IMUS": composers,
// Comments
"ICMT": description,
 
// Album title
"IPRD": release_title,
// Release date
"ICRD": release_date,
// Copyright - Publisher name (PRO) [IPI]
"ICOP": copyright,
 
// Software - metadata encoder
"ISFT": "Cadenzabox",
 
// Description - track description, falls back to the organisation name
"bext": description || org_name,
// XMP file - detailed below
"_PMX": xmp_file,
// aXML file - detailed below
"axml": axml_file,
// iXML file - currently unsupported
"iXML": null,

XMP chunk

Extensible Metadata Platform (XMP) headers comprise the following fields:

// Track title
"dc:title": title,
// Track description
"dc:description": description,
// Composers - Composer name (PRO) 100% [IPI]
"xmpDM:composer": composers,
// Genre(s) - comma delimited tags from Genre/Genres tag-categories
"xmpDM:genre": genre,
 
// Album name
"xmpDM:album": release_title,
// Publisher - Publisher name (PRO) [IPI]
"dc:publisher": publisher,
// Organisation name
"xmpDM:artist": org_name,
 
// Metadata encoding
"xmp:MetadataDate": iso_datetime_now,
"xmp:ModifyDate": iso_datetime_now,
"xmp:CreatorTool": "Cadenzabox",

The following XMP formatted XML text file is added to the WAV’s _PMX BEXT header:

<?xpacket?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <rdf:Description rdf:about=""
                xmlns:xmp="http://ns.adobe.com/xap/1.0/"
                xmlns:dc="http://purl.org/dc/elements/1.1/"
                xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/">
            <xmp:CreatorTool>Cadenzabox</xmp:CreatorTool>
            <xmp:MetadataDate>{{iso_datetime_now}}</xmp:MetadataDate>
            <xmp:ModifyDate>{{iso_datetime_now}}</xmp:ModifyDate>
            <xmp:rating>0.000000</xmp:rating>
            <dc:description>
                <rdf:Alt>
                <rdf:li xml:lang="x-default">{{description}}</rdf:li>
                <rdf:li xml:lang="en-US">{{description}}</rdf:li>
                </rdf:Alt>
            </dc:description>
            <dc:publisher>
                <rdf:Bag>
                <rdf:li>{{publisher}}</rdf:li>
                </rdf:Bag>
            </dc:publisher>
            <dc:title>
                <rdf:Alt>
                <rdf:li xml:lang="x-default">{{title}}</rdf:li>
                <rdf:li xml:lang="en-US">{{title}}</rdf:li>
                </rdf:Alt>
            </dc:title>
            <xmpDM:comment/>
            <xmpDM:album>{{release_title}}</xmpDM:album>
            <xmpDM:artist>{{org_name}}</xmpDM:artist>
            <xmpDM:composer>{{composers}}</xmpDM:composer>
            <xmpDM:genre>{{genres}}</xmpDM:genre>
            <xmpDM:instrument></xmpDM:instrument>
            <xmpDM:key/>
        </rdf:Description>
    </rdf:RDF>
</x:xmpmeta>

aXML chunk

The aXML chunk solely contains the International Standard Recording Code (ISRC):

// International Standard Recording Code
"isrc": isrc

The following aXML (XML) text file is added to the WAV’s axml BEXT header:

<ebuCoreMain
		xmlns:dc=" http://purl.org/dc/elements/1.1/"
		xmlns="urn:ebu:metadata-schema:ebucore">
	<coreMetadata>
		<identifier
				typeLabel="GUID"
				typeDefinition="Globally Unique Identifier"
				formatLabel="ISRC"
				formatDefinition="International Standard Recording Code"
				formatLink="http://www.ebu.ch/metadata/cs/ebu_IdentifierTypeCodeCS.xml#3.7">
			<dc:identifier>ISRC:{{isrc}}</dc:identifier>
		</identifier>
		<!-- More optional EBUCore: titles, descriptions, contributors -->
	</coreMetadata>
</ebuCoreMain>

Unsupported RIFF chunks

iXML chunk

The iXML chunk is currently unsupported but could contain the following fields. Please speak to us if this WAV metadata is a requirement for you.

// Track title
"SmfSongName": title,
// Track description
"BWF_DESCRIPTION": description,
// Track code - UNS1019_89
"SHORTID": track_code
 
// Album name
"MediaLibrary": release_title,
// Publisher - Publisher name (PRO) [IPI]
"MediaCompany": publisher,
// URL of organisation
"URL": org_domain
 
// Metadata encoder
"BWF_CODING_HISTORY": "Cadenzabox",
"EMBEDDER": "Cadenzabox",
 
// Undefined currently
"MediaCategoryPost": "???",
"MusicalCharacter": "???",
"MusicalCategory": "???",
"LIBRARY": "???", // library_name / org_name
"CATEGORY": "???",
"KEYWORDS": "???",

The above fields would be attached to the WAV file via the following iXML text file

<BWFXML>
  <IXML_VERSION>1.61</IXML_VERSION>
  <BEXT>
    <BWF_DESCRIPTION>{{description}}</BWF_DESCRIPTION>
    <BWF_CODING_HISTORY>Cadenzabox</BWF_CODING_HISTORY>
  </BEXT>
  <SPEED/>
  <STEINBERG>
    <ATTR_LIST>
      <ATTR>
        <NAME>MediaLibrary</NAME>
        <TYPE>string</TYPE>
        <VALUE>{{release_title}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MediaCategoryPost</NAME>
        <TYPE>string</TYPE>
        <VALUE>UNS1019_89_Work Hard_Short.wav{{???}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MusicalCharacter</NAME>
        <TYPE>string</TYPE>
        <VALUE>Determined,Swagger{{???}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>SmfSongName</NAME>
        <TYPE>string</TYPE>
        <VALUE>{{title}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MediaComment</NAME>
        <TYPE>string</TYPE>
        <VALUE>{{description}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MediaAlbum</NAME>
        <TYPE>string</TYPE>
        <VALUE>{{release_title}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MusicalCategory</NAME>
        <TYPE>string</TYPE>
        <VALUE>UNS1019_89_Work Hard_Short.wav{{???}}</VALUE>
      </ATTR>
      <ATTR>
        <NAME>MediaCompany</NAME>
        <TYPE>string</TYPE>
        <VALUE>{{publisher}}</VALUE>
      </ATTR>
    </ATTR_LIST>
  </STEINBERG>
  <USER>
    <CDTITLE>{{release_title}}</CDTITLE>
    <LIBRARY>Unscripted{{???library_name/org_name???}}</LIBRARY>
    <DESCRIPTION>{{description}}</DESCRIPTION>
    <SHORTID>{{track_code}}</SHORTID>
    <EMBEDDER>Cadenzabox</EMBEDDER>
    <URL>{{org_domain}}</URL>
    <RATING>0</RATING>
    <TRACKTITLE>{{title}}</TRACKTITLE>
    <CATEGORY>ABC1001_03_Track Name_Short.wav{{???}}</CATEGORY>
    <KEYWORDS>Determined,Swagger{{???}}</KEYWORDS>
  </USER>
</BWFXML>