Projekte > Audio-CD (CDDA) > CD Text

CD Text

  • Beschreibung
  • Das CD-Text Pack Data Format
  • Der Header
  • Die Packtypen
  • Ein Beispiel
  • Demo
  • Änderungen
  • Beschreibung

    Auf einigen Audio-CDs ist CD Text enthalten. Meist verrät er kaum mehr als die Interpreten und die Namen des Albums und der Tracks. Für das Lesen des rohen CD Textes wurden zwei Alternativen (über MMC und IOCTL) dargestellt und bereits erste Informationen über den Inhalt gegeben.

    Der CD Text ist in Blöcken gruppiert. Es sind acht Blöcke möglich. Jedem Block ist ein Sprachcode zugeordnet. Die Blöcke werden in 18 Byte langen Paketen gespeichert.

    Das CD-Text Pack Data Format

    Das Paket besteht aus dem Header, den Daten und den Fehlerkorrekturdaten.

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    Header Daten (Text oder binär) CRC

    Jedes Paket enthält in den ersten vier Bytes einen Header.

    0 1 2 3
    7 6 5 4 3 2 1 0
    Packtyp Tracknummer Packnummer DBCC Blocknummer Zeichenposition

    Der Packtyp gibt die Art des Inhaltes an. Die Tracknummer bezeichnet den ersten Track auf welchen sich die Daten beziehen. Die Daten können sich auf mehrere Tracks beziehen. Die Packnummer ist der Zähler für das aktuelle Pack. Alle Packs sind unabhängig vom Packtype durchnummeriert. Jeder Block wird einzeln gezählt. DBCC ist das Flag für Doppelbytezeichen und gibt an, ob die in den Daten enthaltenen Zeichen aus einem oder zwei Byte bestehen (Ich habe bisher keinen CD-Text mit Doppelbytezeichen gehabt). Die Blocknummer bezeichnet den aktuellen Block. Die Zeichenposition gibt an, wieviele Zeichen bereits im vorigen Pack bzw. in den vorigen Packs enthalten waren. Wegen der vier Bit werden Positionen über 15 ebenfalls mit 15 angegeben.

    Die Packtypen

    Die Packtypen sind:

    Wert Beschreibung Inhalt
    $80 Liste mit dem Titel des Albums (ID2 = $00) und
    den Titeln der Tracks (ID2 = %01...$63).
    Text
    $81 Liste mit den Namen der Interpreten. Text
    $82 Name des Texter (Songwriter) Text
    $83 Name des Komponisten (Composer) Text
    $84 Name des Arrangeurs (Arranger) Text
    $85 Nachricht vom Inhalteanbieter und/oder Künstler Text
    $86 Discidentifikationinformation Binär
    $87 Genreidentifkation und Genreinformation Binär, Text
    $88 Table of Content Information (Erster und letzter Track
    sowie Startzeiten von Leadout und Tracks)
    Binär
    $89 Zweite Table of Content Information (Skipzeiten) Binär
    $8A Reserviert ---
    $8B Reserviert ---
    $8C Reserviert ---
    $8D Nur für den Inhalteanbieter reserviert. Text
    $8E Liste mit UPC/EAN Code des Albums und eventuell den ISRC Codes aller Tracks. Text
    $8F Größeninformation über die Blöcke. Binär

    Die Packtypen $80 bis $85 und $8E enthalten Text, die Packtypen $86, $87 und $8F Daten.

    Die Genreinformationen des Packtypes $87 enthalten eine der folgenden IDs sowie einen nullterminierten String.

    $0000 Ungenutzt $0001 Nicht definiert
    $0002 Adult Contemporary $0003 Alternative Rock
    $0004 Childrens' Music $0005 Classical
    $0006 Contemporary Christian $0007 Country
    $0008 Dance $0009 Easy Listening
    $000A Erotic $000B Folk
    $000C Gospel $000D Hip Hop
    $000E Jazz $000F Latin
    $0010 Musical $0011 New Age
    $0012 Opera $0013 Operetta
    $0014 Pop Music $0015 Rap
    $0016 Reggae $0017 Rock Music
    $0018 Rhythm & Blues $0019 Sound Effects
    $001A Spoken Word $001B World Music

    Der Packtyp $BF besteht aus drei Packs, welche mit den Tracknummern 0, 1 und 2 gekennzeichnet sind. Die Packs sind für alle Blöcke gleich und stellen eine Zusammenfassung dar:

    TN Byte Beispiel Bedeutung
    $00 0 $00 Zeichencode für die Packtypen von $80 bis $85
    $00: ISO-8859-1
    $01: 7bit ASCII
    $80: MS-JIS (japanese Kanji, double byte characters)
    1 $01 Die Nummer des ersen Tracks.
    2 $0B Die Nummer des letzten Tracks.
    3 $03 Copyright Flags
    0: Nicht geschützt. - 3: Geschützt.
    4 $0C Anzahl der Packs vom Packtype $80 - Albumname.
    5 $02 Anzahl der Packs vom Packtype $81 - Performer.
    6 $00 Anzahl der Packs vom Packtype $82.
    7 $00 Anzahl der Packs vom Packtype $83.
    8 $00 Anzahl der Packs vom Packtype $84.
    9 $00 Anzahl der Packs vom Packtype $85.
    10 $01 Anzahl der Packs vom Packtype $86.
    11 $00 Anzahl der Packs vom Packtype $87.
    $01 12 $00 Anzahl der Packs vom Packtype $88.
    13 $00 Anzahl der Packs vom Packtype $89.
    14 $00 Anzahl der Packs vom Packtype $8A.
    15 $00 Anzahl der Packs vom Packtype $8B.
    16 $00 Anzahl der Packs vom Packtype $8C.
    17 $00 Anzahl der Packs vom Packtype $8D.
    18 $00 Anzahl der Packs vom Packtype $8E.
    19 $03 Anzahl der Packs vom Packtype $8F - Size Packs.
    20 $11 Letzte Packnummer im Block für die Blöcke 0 bis 7.
    21 $00
    22 $00
    23 $00
    $02 24 $00
    25 $00
    26 $00
    27 $00
    28 $00 Sprachcode für die Blöcke 0 bis 7.
    $00 UNKNOWN $01 ALBANIAN $02 BRETON $03 CATALAN
    $04 CROATIAN $05 WELSH $06 CZECH $07 DANISH
    $08 GERMAN $09 ENGLISH $0A SPANISH $0B ESPERANTO
    $0F FRENCH $0C ESTONIAN $0D BASQUE $0E FAROESE
    $10 FRISIAN $11 IRISH $12 GAELIC $13 GALICIAN
    $14 ICELANDIC $15 ITALIAN $16 LAPPISH $17 LATIN
    $18 LATVIAN $19 LUXEMBOURGIAN $1A LITHUANIAN $1B HUNGARIAN
    $1C MALTESE $1D DUTCH $1E NORWEGIAN $1F OCCITAN
    $20 POLISH $21 PORTUGUESE $22 ROMANIAN $23 ROMANSH
    $24 SERBIAN $25 SLOVAK $26 SLOVENIAN $27 FINNISH
    $28 SWEDISH $29 TURKISH $2A FLEMISH $2B WALLON
    $45 ZULU $46 VIETNAMESE $47 UZBEK $48 URDU
    $49 UKRAINIAN $4A THAI $4B TELUGU $4C TATAR
    $4D TAMIL $4E TADZHIK $4F SWAHILI $50 SRANANTONGO
    $51 SOMALI $52 SINHALESE $53 SHONA $54 SERBO_CROAT
    $55 RUTHENIAN $56 RUSSIAN $57 QUECHUA $58 PUSHTU
    $59 PUNJABI $5A PERSIAN $5B PAPAMIENTO $5C ORIYA
    $5D NEPALI $5E NDEBELE $5F MARATHI $60 MOLDAVIAN
    $61 MALAYSIAN $62 MALAGASAY $63 MACEDONIAN $64 LAOTIAN
    $65 KOREAN $66 KHMER $67 KAZAKH $68 KANNADA
    $69 JAPANESE $6A INDONESIAN $6B HINDI $6C HEBREW
    $6D HAUSA $6E GURANI $6F GUJURATI $70 GREEK
    $71 GEORGIAN $72 FULANI $73 DARI $74 CHURASH
    $75 CHINESE $76 BURMESE $77 BULGARIAN $78 BENGALI
    $79 BIELORUSSIAN $7A BAMBORA $7B AZERBAIJANI $7C ASSAMESE
    $7D ARMENIAN $7E ARABIC $7F AMHARIC
    29 $00 Unbenutzt.
    30 $00
    31 $00
    32 $00
    33 $00
    34 $00
    35 $00

    Ein Beispiel

    Hier ein Beispiel von einer CD, welche ich bei Beginn des Projekts oft gehört hatte.

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    $80 $00 $00 $00 M i a .       W i l l k $DE $23
    $80 $00 $01 $0C o m m e n   i m   C l u $EA $0F
    $80 $00 $02 $0F b #0 K a p i t ä n #0 M e $8A $7A
    $80 $02 $03 $02 i n   F r e u n d #0 M a $26 $C4
    $80 $03 $04 $02 u s e n #0 D u #0 1 0 0   $8C $3C
    $80 $05 $05 $04 P r o z e n t #0 M a g i $7A $A7
    $80 $06 $06 $04 s c h #0 D e i n e t w e $87 $15
    $80 $07 $07 $08 g e n #0 V e r f o l g e $0C $B3
    $80 $08 $08 $08 r #0 G l ü c k s s t e r $BE $52
    $80 $09 $09 $0A r #0 H a l t   S t i l l $9E $D3
    $80 $0A $0A $0A #0 D i e   A u s s i c h $71 $ED
    $80 $0B $0B $0B t #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 $18 $BD
    $81 $00 $0C $00 M i a . #0 #0 #0 #0 #0 #0 #0 #0 $E5 $9C
    $81 $08 $0D $00 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 #0 $15 $40
    $86 $00 $0E $00 38 38 36 39 37 33 32 31 32 33 32 00 $C1 $69
    $8F $00 $0F $00 00 01 0B 03 0C 02 00 00 00 00 01 00 $59 $15
    $8F $01 $10 $00 00 00 00 00 00 00 00 03 11 00 00 00 $65 $5E
    $8F $02 $11 $00 00 00 00 00 00 00 00 00 00 00 00 00 $7E $DB

    Da der CD-Text vermutlich in der Regel nur aus einem Block besteht, könnte man sofort mit der Auswertung von Titeln (Packtyp $80) und Interpreten (Packtyp $81) beginnen.

    Der Packtyp $80 belegt im Beispiel die Packs $00 bis $0B. Die Tracknummer 0 steht dabei für das Album. Das vierte Byte in Pack $01 gibt an das bereits 12 Zeichen des Albumnamens in den vorigen Packs enthalten sind. In Pack $02 ist der Wert 15 ($0F). Der Albumname ist zwar bereits länger jedoch lassen sich mit vier Bit keine größeren Zahlen darstellen. Die Namen sind mit dem Zeichen #0 voneinander getrennt. In Pack $02 sind zwei Trennzeichen enthalten. Dies bedeutet, dass in dem Pack der Albumname endet, der vollständige Name des ersten Tracks und der Anfang des Namens des zweiten Tracks enthalten sind. Deshalb ist in Pack $03 die Tracknummer bereits mit $02 angegeben und das vom Name bereits zwei Zeichen gelesen wurden.

    Der Packtyp $81 belegt die Packs $0C und $0D. Hier müssen ebenso viele Tracks angegeben werden, wie bei den Titeln zuvor. Der erste Pack bezieht sich wieder auf den Track 0 und somit auf das Album. Da alle Titel vom selben Interpreten stammen, sind für die folgenden Tracks nur leere Eintragungen vorhanden. Es ist auch möglich, dass der Name wiederholt wird oder Tabulatorzeichen enthalten sind.

      Mia.   Willkommen im Club#0
      Kapitän#0
      Mein Freund#0
      Mausen#0
      Du#0
      100 Prozent#0
      Magisch#0
      Deinetwegen#0
      Verfolger#0
      Glücksstern#0
      Halt Still#0
      Die Aussicht#0
      #0
    
      Mia.#0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
      #0
    

    Demo

    Hier eine Demo, welche CD-Text auswertet:

    CD Text (podCDText.7z - 529 kb) MD5 (1 kb).
    Compiler: Delphi 7
    Stand: 26. Juli 2015

    Änderungen an der Demo

    26.07.2015Hinzu: Splash Screen.
    Änderung: Optische Details.
    Änderung: Etwas Überhang entfernt.