GarageBand

From MultimediaWiki
Jump to navigation Jump to search

Garageband is Apple's consumer multitrack editor.

Garageband files are actually directories with a ".band" extenstion.

Structure of the ".band" directory

Old versions of GarageBand

The ".band" directory contained:

  • projectData
  • Media/ - a directory containing source aiffs.

Previous version (GarageBand v6? april 2014?)

The ".band" directory contained:

  • projectData
  • Contents/
    • Contents/PkgInfo
  • Media/
    • Media/Images/
    • Media/Recording/
  • Output/
    • Output/arrange_screenshot.tiff
    • Output/metadata.plist
    • Output/Output.aif
  • Thumbs/

Version 10.0.3 (oct. 2014)

The ".band" directory contains:

  • projectData
  • Alternatives/
    • Alternatives/000/
      • Alternatives/000/Autosave/
        • Alternatives/000/Autosave/.dummy
        • Alternatives/000/DisplayState.plist
        • Alternatives/000/MetaData.plist
      • Alternatives/000/Previews/
        • Alternatives/000/Previews/Output.aif
      • Alternatives/000/ProjectData
      • Alternatives/000/Undo Data.nosync/
      • Alternatives/000/WindowImage.jpg
  • Contents/
    • Contents/PkgInfo
  • Media/
    • Media/Audio Files/
    • Media/Freeze Files.nosync/
  • Output/
    • Output/Output.aif
  • Resources/
    • Resources/ProjectInformation.plist

Structure of the "projectData" file

The "projectData" file is an xml file describing the project along with a large chunk of base64 encoded data within the tags.

Once base64 decoded, this data tag still contains some binary data with human readable strings which can be found from the Terminal with a command like:

cat "foo.band/projectData"	\
    | sed -n '/<data>/,/<\/data>/{//!p;}'	\
    | base64 -D	\
    | strings	\
    | less

These strings can be filtered out. For example, the following command gets (almost) only the names of the instruments used in the project:

cat "foo.band/projectData"	\
    | sed -n '/<data>/,/<\/data>/{//!p;}'	\
    | base64 -D	\
    | strings	\
    | awk ' /^ Inst 1$/{flag=1} /^ Inst 12$/{flag=0} flag { print }'

Samples

Samples can be found here: [1]