[alt.sources] audio-tape.ps v1.14

jwz@lucid.com (Jamie Zawinski) (03/07/91)

%!PSAdobe-1
%%Creator: Jamie Zawinski <jwz@lucid.com>
%%Title: audio-tape.ps
%%CreationDate: 6-mar-91
%%
%%  PostScript code to generate audio-cassette or DAT labels.  Version 1.14.
%%  Copyright (c) 1991 Jamie Zawinski <jwz@lucid.com>.
%%
%%  Permission granted for non-commercial use and distribution
%%  so long as this notice of copyright remains intact.
%%
%%EndComments

%%BeginDocumentation
%%
%% There are a few examples at the end of this file; print this for a
%% representative selection of what this code can do.  Search for the
%% string "example" to see how to do it.
%%
%% If you are using this code, send me mail, and I will send you updates
%% as I improve it.

%% =========================================================================
%%			       HOW TO USE THIS
%% =========================================================================
%%
%% To print a tape label, you construct a call to one of several PostScript
%% procedures defined in this file.  The calling syntax is fairly simple,
%% and you don't need to know PostScript to do it.  Just fill in the blanks.
%%
%% For a tape label with one album on each side, both albums by the same band,
%% do this:
%%
%%	 (Band Name) (Album 1 Name) (Album 1 Date)
%%		     (Album 2 Name) (Album 2 Date)
%%	  [ <...album 1 songs....> ] [ <...album 2 songs....> ]
%%	  two-albums
%%
%% For a tape label with one album on each side, both albums by different
%% bands, do this:
%%
%% 	 (Band 1 Name) (Album 1 Name) (Album 1 Date)
%%	    [ <...album 1 songs....> ]
%%	  (Band 2 Name) (Album 2 Name) (Album 2 Date)
%%	    [ <...album 2 songs....> ]
%%	  two-bands
%%
%% For a tape label with one double album consuming both sides, do this:
%%
%% 	 (Band Name) (Album Name) (Album Date)
%%	    [ <...songs, side 1....> ]
%%	    [ <...songs, side 2....> ]
%%	  double-album
%%
%% For a tape label with three or four albums/EPs by the same band, do this:
%%
%% 	 (Band Name) (Album 1.1 Name) (Album 1.2 Name) (Album 1.* Date)
%%		     (Album 2.1 Name) (Album 2.2 Name) (Album 2.* Date)
%%	    [ <...songs, side 1....> ]
%%	    [ <...songs, side 2....> ]
%%	  N-albums
%%
%% (Either of the strings (Album 1.2 Name) or (Album 1.2 Name) may be
%% an empty string; things will be positioned appropriately.)
%%
%% For a tape label with three or four albums/EPs by two different bands,
%% do this:
%%
%% 	 (Band 1 Name) (Album 1.1 Name) (Album 1.2 Name) (Album 1.* Date)
%%	    [ <...songs, side 1...> ]
%%	 (Band 2 Name) (Album 2.1 Name) (Album 2.2 Name) (Album 2.* Date)
%%	    [ <...songs, side 2...> ]
%%	  two-bands-N-albums
%%
%%
%% In the above examples, [ <songs> ] should really be of the form
%%
%%   [ (song 1) ... (song N) ]	    	that is, an array of strings; or it
%%					may also be of the form
%%
%%   [[ (song 1)  (song 1 time) ]   	that is, an array of arrays, where
%%    [ (song 2)  (song 2 time) ]	each sub-array holds exactly two
%%     ...				strings.  The first string is the name
%%    [ (song N)  (song N time) ]]	of a song, and the second string is
%%					the start-time, length, counter, or
%% whatever of the song.  The song name is printed flushleft, and the song
%% time is printed flushright.
%%
%% If an entry in the song array is of the form
%%    [ (song N)  (song N time) ...font... ]
%% where ...font... is one of /B, /I, /BI, or /Title.  This is explained a
%% little later.

%% =========================================================================
%%			      WHAT YOU WILL GET
%% =========================================================================
%%
%% The labels are printed two-per-page.  You do not need to insert "showpage"s
%% in this file; that happens automagically.
%%
%% The band-names and album-names are printed on the spine of the label.
%% For the one-band-on-both-sides cases, the band-name is printed tall enough
%% to fill the label.  For the two-band cases, the band names are printed one
%% atop the other.  Album names are scaled so that all album names fit on
%% one atop the other on the spine.
%%
%% In all cases (spine, song lists, etc) it is not possible for a string to
%% be "too long" - font-widths are scaled so that the strings fit in the
%% available space (taking into account adjascent strings of the same height;
%% strings stacked above/next to each other are scaled as a unit.  You'll
%% see what I mean.)
%%
%% Songs are printed in one or two columns on the back of the tape label, or
%% on the inside of the tape label (user-configurable).  The name of the album
%% is printed above the song lists.  When there are more than two albums on a
%% tape, the names of all three or four albums are printed on the spine, and
%% the names of albums 1.1 and 2.1 are printed above the song listings on the
%% inside.
%%
%% Labels for DATs look the same, except that they are smaller (of course...)
%%
%% It is possible to specify the font of individual lines in the song listings
%% by placing a font-keyword in the third position of an element of the 
%% song-list array.  Valid face-specifiers are /B (bold), /I (italic), /BI
%% (bold italic), and /Title.  If the font is unspecified, /B, /I, or /BI,
%% then the font used for the song name is determined by one of the variables
%% /song-font, /song-font-bold, /song-font-italic, or /song-font-bold-italic.
%% The font will always be scaled to be /song-font-height points tall.
%%
%% If, however, the font is specified as /Title, then the font used will be
%% the value of /title-font, and it will be /title-font-height tall; it will
%% also be underlined.  The intent here is that specifying the font as /Title
%% makes an entry in the song listings look just like the album titles above
%% the listings.  That way, if you have more than one album on the same side
%% of a tape, you can display a title for both of them, which was not possible
%% in versions prior to 1.5.  (Extra hack: [(song) /Title] is considered to
%% be the same as [(song) () /Title], since the time is ignored for titles.)
%%
%% It is possible to include arbitrary graphics in place of the band-name
%% on the spine, to duplicate the way a band normally renders its name, or
%% whatever.  It is also (as of v1.4) possible to include an arbitrary
%% graphic on the inside flap, or printed (lightly) under the song listings.
%% See below.
%%
%% If you want a Dolby logo printed, simply include a line containing only the
%% word "DolbyB" or "DolbyC" (no quotes) before the band name(s).  You must do
%% this before each tape to get this logo; it is reset after printing each
%% label.  "dbx", "AAD", "ADD", and "DDD" print the appropriate logo as well.
%% These logos go in the corner of the short back flap (where the signature
%% string goes) because I couldn't think of a better place.  Feel free to
%% suggest one.
%%
%% =========================================================================
%%			  HOW TO USE THIS UNDER UNIX
%% =========================================================================
%%
%% Of course, it's possible to just edit this file and print it each time you
%% want to print a label, but that's kind of a pain.  And you don't want a
%% copy of this file sitting around for every tape label you print, it's too
%% big.  This is the solution that I use:
%%
%%   When you edit a new tape label, put it in its own file.  Include in that
%%   file only what the "How to Use This" section had you type in.
%%
%%   Add the following to your .cshrc file:
%%
%%       alias tape_prolog awk '/^%.PS/,/^%%BeginDoc//^%%EndDoc/,/^%%EndPro/'
%%       alias tape_trailer awk '/^%%Trailer/,/^--eof--\$/'
%%       setenv TAPEPS ~/ps/audio-tape.ps
%%       alias catapes '(tape_prolog $TAPEPS;cat \!*; tape_trailer $TAPEPS)'
%%       alias printapes '(catapes \!*) | lpr'
%%
%%   'tape_prolog' and 'tape_trailer' are 'awk' programs that will extract
%%   the important part of this file.  TAPEPS is a variable that points at 
%%   the place your copy of the file is.  'catapes' takes one or more files 
%%   as arguments, and splices their contents in with the PostScript code at
%%   the appropriate place.  
%%
%%   With the above aliases, the command "printapes tape1 tape2 tape3" will
%%   concatentate the PostScript code defined in this file, the definitions
%%   of your labels (which presumably are the contents of the files "tape1,"
%%   "tape2," and "tape3"), and the necessary trailer together, and hand that
%%   as input to "lpr" (or whatever command it is that you use for printing).
%%
%% I also have some Common Lisp code which maintains a database of tapes, and
%% can generate this PostScript code directly.  It uses a simple textual file
%% format for storing the song listings; if you want it, send me mail.  If
%% you use TI Explorer Lisp Machines, I have a totally whizzy menu-driven 
%% interface to editing, searching, and printing these labels. Again, just ask.

%% =========================================================================
%%			     SIMPLE CUSTOMIZATION
%% =========================================================================
%%
%% To print labels for Digital Audio Tapes instead of normal cassette tapes,
%% insert a line consisting of
%%        DAT-sizes
%% in the file before the labels.  To switch back to cassette sizes, include
%% a line that says "cassette-sizes" instead of "DAT-sizes" (the default is
%% to produce labels for normal cassettes.)
%%
%% To change the fonts of various things, change the values of the variables
%% /song-font, /band-font, /album-font, /inner-album-font, or /date-font.
%% It is not possible to change the height or aspect ratio of the fonts, as
%% those are computed at runtime.
%%
%% If you prefer the labels to be printed in such a way that the song listings
%% will appear on the inside of the tape box instead of the outside, set the
%% variable /songs-go-inside to true.  It defaults to false.
%%
%% If you prefer the labels to be printed so that a band's graphic goes on the
%% inside of the tape box instead of the outside, set /icons-go-inside to
%% true.  It defaults to false.
%%
%% If you prefer to have the spine of the label wrong-side-up, set /flip-spine
%% to true.  It defaults to false.  If you prefer to have the song listings
%% wrong-side-up, set /flip-songs to true.  It defaults to false.
%%
%% If you want the columns to follow the long edge of the tape rather than
%% the short edge, set /columns-horizontally to true.  You can change the
%% orientation with /flip-songs.
%%
%% If you want the song-listings to be printed in one column instead of two,
%% then set /one-column to true.  The side1 songs and side2 songs will be
%% appended together and printed in one column down the middle.  This is
%% most useful in conjunction with /columns-horizontally.
%%
%% If /songs-go-inside and /icons-go-inside have the same value (both inside
%% or both outside) then the songs will be printed overlaying the icon.  The
%% icon will be printed at 20% intensity so that you can still read the songs
%% on top of dark areas.  This is customizable by changing the variable 
%% /icon-fade-factor.
%%
%% One problem I encountered with this code was that my co-worker's tapes all
%% looked just like mine...  I got around this by adding the parameter
%% /signature - set this to a string of your name or something, and it will
%% be printed on the back-spine of all of your labels.  It can be multiple
%% lines by specifying it as [ (line 1) (line 2) ... ] instead of as a string.
%% (Embedding newlines in a string will not do what you want.)

%% =========================================================================
%%			 SOPHISTICATED CUSTOMIZATION
%% =========================================================================
%%
%% Defining a new magic-name-printer is pretty simple.  Just define a
%% procedure for drawing the name, and index it in "magic-name-dict" under
%% the string which is the band's name.  There are some fairly sophisticated
%% examples of this in this file.  If you define any more, send them to me
%% and I'll include them in the next distribution (whether I like the band
%% or not :-)).
%%
%% Adding an icon-printer is similar - you use "magic-icon-dict" instead of
%% "magic-name-dict".  For magic-names, define the procedures to draw in
%% a device-scale (1 unit = 1 point) space with origin at the upper left.
%% For icons, define the procedure to be in a one-unit tall space - 1 unit
%% will correspond to the entire height of the flap on which the icon is
%% drawn.  For icons, the origin is at the XY center instead of the upper
%% left.  This is all kind of arbitrary, but it doesn't matter too much,
%% because the beauty of PostScript is that you can scale/translate within
%% your procedure to work in the space that is most convenient to you.
%%
%% When you add something to magic-name-dict or magic-icon-dict, be sure to
%% use "CIput" instead of "put" to insure case-insensitivity.
%%
%% If you associate an icon printer with the name (default-icon-printer), then
%% this will be used for bands which do not have their own icons defined.  
%%
%% When /songs-go-inside and /icons-go-inside have the same value, meaning 
%% that the songs will be printed overlaying the icon, we cause the icon to
%% be printed at quarter-intensity by changing the transfer function.  If
%% your icon is written in such a way that this is not desirable, it's
%% possible to defeat it within a given icon printer by doing something 
%% like "{} settransfer" within the scope of a "gsave".
%%
%% Note that magic-name and magic-icon printers are not used unless the label
%% being printed is a double album, or the albums on both sides are by the
%% same band.

%% =========================================================================
%%				   WISHLIST
%% =========================================================================
%%
%%  o  Maybe the magic-name printers should be invoked even if both sides of
%%     the tape are not by the same band.
%% 
%%  o  The magic-icon-printers should be used even if there are two different
%%     bands on one tape - print two of them side by side if necessary.
%%
%%  o  Maybe there should be a way to print arbitrary text on the inside flap,
%%     aside from defining a magic-icon printer.
%%
%%  o  A general font-change mechanism would be nice, for font changes in the
%%     signature as well as in the song listings.
%%
%%  o  Should have /3-bands-N-albums and /4-bands-N-albums commands.

%% =========================================================================
%%	       WHAT THE CURRENTLY DEFINED MAGIC-NAME-PRINTERS DO
%% =========================================================================
%% 
%% o  Siouxsie and the Banshees is printed in an alternating sized, alternating
%%    cased font, with the "and" over the "the" like on many early albums.
%% o  Cabaret Voltaire is printed in a font that looks like the one on the
%%    cover of "Micro-Phonies."
%% o  New Order is printed with a black "New" overlapping a hollow "Order" as
%%    on "Low Life" etc.
%% o  OMD is printed on two lines, one font thicker than the other.  The OE is
%%    printed with an OE character.
%% o  Front 242 is printed similarly.
%% o  Love and Rockets has an icon - a heart on a rocket in a circle.
%% o  Bauhaus has an icon - the Beggars' Banquet "face-in-circle" logo.
%% o  Nitzer Ebb has three icons:
%%    o  If the album name is "That Total Age", the gear/star/hammer logo is
%%       printed.
%%    o  If the album name is "Belief", a low-resolution bitmap of the angry
%%       looking eye from the cover of that album is printed.  This is a fair
%%       example of how to incorperate such bitmaps, and it doesn't take up
%%       that much space, either.
%%    o  Otherwise, the star-over-gear icon from the Warsaw Ghetto EP is used.
%% o  Nine Inch Nails has an icon - "NIN" in a box with the first N backwards.
%% o  Kate Bush has an icon.
%%
%% Please send me more!

%% Questions?  Comments?  Suggestions?  Improvements?  Send them to me,
%% jwz@lucid.com.  "Please, no applause, just throw money."
%%
%%EndDocumentation

/bdef { bind readonly def } bind readonly def

/box {
  4 2 roll
  newpath moveto
    exch dup 0 rlineto
    exch 0 exch neg rlineto
    neg 0 rlineto
  closepath
} bdef

/rightshow
 {dup stringwidth pop
  neg 0 rmoveto
  show } bdef

/centershow
 {dup stringwidth pop
  2 div neg 0 rmoveto
  show } bdef

/max {
  dup 3 -1 roll dup
  3 -1 roll gt
  { exch pop } { pop } ifelse
  } bdef

/max-stringwidth {
  stringwidth pop
  exch stringwidth pop
  max
  } bdef

%% Default font-names and sizes.  The widths (and sometimes heights) are 
%% stomped at runtime, but the names are the responsibility of the user.
%%
/song-font /Helvetica def
/song-font-bold /Helvetica-Bold def
/song-font-italic /Helvetica-Oblique def
/song-font-bold-italic /Helvetica-BoldOblique def
/song-time-font song-font def
/song-font-height 8 def

/signature-font /Helvetica def
/signature-font-height 8 def

/band-font /Helvetica def
/band-font-height 13 def

/album-font /Helvetica def
/album-font-height 13 def

/inner-album-font /Helvetica-Bold def
/inner-album-font-height 13 def

/date-font /Helvetica-Bold def
/date-font-height 8 def

% if true, songs go inside the tape label, else outside.
/songs-go-inside false def

% if true, icons go inside the tape label, else outside.
/icons-go-inside false def

% If true, the spine will be printed with a nasty orientation.
/flip-spine false def

% If true, the song-listings will be printed other-side-up.
/flip-songs false def

% If true, the song-listings will be in one column instead of two.
/one-column false def

% If true, the song-listings will be horizontal instead of vertical.
/columns-horizontally false def

% if an icon and the song listings are being printed on the same flap, the
% icon will be faded by this amount (so that the songs will be readable).
%
/icon-fade-factor 0.20 def

/cassette-sizes {
  /margins 4 def
  /back-spine-height 40 def
  /spine-height 32 def
  /list-height 185 def
  /total-height margins back-spine-height add
                margins spine-height add add
                margins list-height add  2 mul add
                margins add
                def
  /inner-width 280 def
  /total-width inner-width margins dup add add def
  % if there are DATs on the page already, force a page-break.
  DATp tick 0 ne and { showpage /tick 0 def } if
  /DATp false def
} bdef

/DAT-sizes {
  % Length: 3 1/6 inches     - 228.95
  % Width: 2 7/8 in          - 209.86
  % Folds:
  % 7/16 in from bottom      - 31.63
  % 15/16 in from the bottom - 67.78
  /margins 3 def
  /back-spine-height 27 def
  /spine-height 33 def
  /list-height 156 2 sub def
  /total-height margins back-spine-height add
                margins spine-height add add
                margins list-height add  2 mul add
                margins add
                def
  /inner-width 202 4 sub def
  /total-width inner-width margins dup add add def
  % if there are normal cassette tapes on the page already, force a page-break.
  DATp not tick 0 ne and { showpage /tick 0 def } if
  /DATp true def
} bdef

/tick 0 def		% How many tapes have been dumped on this page.
/DATp false def		% don't change this.
cassette-sizes

/extract-song-and-time-and-font-1 {
  dup type /stringtype eq
  { () /R }
  { dup length
    dup 0 eq
    { pop pop () () /R }
    { dup 1 eq
      { 0 get () /R }
      { 2 eq
        { dup 0 get exch 1 get /R }
        { dup 0 get exch dup 1 get exch 2 get }
	ifelse
      } ifelse
    } ifelse
  } ifelse
  % if the time is /Title or /title, set the font to
  % be the same.
  exch dup dup
  /Title eq
  exch
  /title eq
  or
    { pop pop /Title dup } if
  exch
} bdef

/extract-song-and-time-and-font {  % takes a song spec and leaves three things
                                   % on the stack - (song) (time) <font>.
  extract-song-and-time-and-font-1
  decode-song-font-name
} bdef

/song-fonts-w-scale 1 def
/song-fonts-h-scale 1 def
/song-fonts-title-w-scale 1 def

/decode-song-font-name {   % takes a name, one of /R, /B, /I, /BI, or /Title
                           % and converts that to a font scaled appropriately.
                           % Leaves the font on the stack.
    
  song-font-height exch % put the height on the stack under the name.

  /titlep false def % set the Hack flag...

  % convert the name to a font-name.
  dup /B eq
  { pop song-font-bold }
  { dup /I eq
    { pop song-font-italic }
    { dup /BI eq
      { pop song-font-bold-italic }
       { dup /Title eq
	 exch /title eq or
	 % if the code was /Title or /title, take the default height off the
	 % stack and put the title-font-height there instead.
	 { pop inner-album-font-height
	   inner-album-font 
	   /titlep true def  % hack hack...
	 }
	 { song-font }
	 ifelse
       } ifelse
    } ifelse
  } ifelse

  % set FH to the font height, leaving the font-name.
  exch /FH exch def
  % then find and scale the font, leaving it on the stack.
  findfont
  [ FH titlep {song-fonts-title-w-scale} {song-fonts-w-scale} ifelse mul
    0 0
    titlep { FH } { FH song-fonts-h-scale mul } ifelse
    0 0 ] makefont
} bdef

/compute-max-colheight {
  songs1 compute-max-colheight-1
  songs1 compute-max-colheight-1
  max
} bdef

/compute-max-colheight-1 {
  /total 0 def
  { extract-song-and-time-and-font-1
    exch pop exch pop
    /Title eq
    { /total total inner-album-font-height add 5 add def }
    { /total total song-font-height add 2 add def }
    ifelse
  } forall
  total
} bdef

% songs1 length songs2 length max
%        song-font-height song-fonts-h-scale mul 2 add mul

/print-one-column {                    % write one column of the song listings
  /songs exch def
  /h exch def /w exch def
  /y exch def /x exch def
  gsave
    /w w 10 sub def
    /x x 5 add def
    one-column double-album-p not and not
      { /y y inner-album-font-height sub def } if
    x y translate
%    -5 0 w h box clip newpath
%    -5 0 w h box stroke %debug
    /x 0 def
    /x2 x w add 5 sub def
    /y song-font-height neg def

    /maxh compute-max-colheight def
    maxh h y sub gt
    { 1 h y sub maxh div scale } if

    songs { extract-song-and-time-and-font
	    setfont
	    dup /Title eq
	    { /y y inner-album-font-height song-font-height sub sub def
	      pop x 5 sub y moveto
              show
	      0 -2 rmoveto
	      x 5 sub y 2 sub lineto stroke   % underline it
	      /y y
	        inner-album-font-height song-font-height sub
	        2 sub sub def           % frob y.
	    }
	    { exch
	      x y moveto
	      show
	      dup () ne {
		  song-time-font findfont
		  [ song-fonts-w-scale song-font-height mul 0 0
		    song-fonts-h-scale song-font-height mul 0 0 ]
		  makefont setfont
		  x2 y moveto
		  rightshow }
	      { pop }
	      ifelse
	    }
	    ifelse
            /y y song-font-height song-fonts-h-scale mul sub 1 sub def
          } forall
  grestore
 } bdef


/print-songs {                 % write a column of the song listings; 0=right.
  /left exch def
  gsave
    /x one-column { inner-width 20 sub max-songwidth sub 2 div 5 add }
                  { 10 } ifelse def
    /y  back-spine-height spine-height add
        margins 3 mul  add
        neg  def
    /w  one-column { max-songwidth 20 add } { inner-width 2 div } ifelse def
    /h  list-height
        one-column double-album-p not and not
          { inner-album-font-height sub } if
        () date1 eq () date2 eq and not { date-font-height sub } if
        margins 2 mul sub def

    songs-go-inside
    { flip-songs
      { /y y list-height margins add add def }
      { /y y list-height margins add sub def }
      ifelse }
    if

    1 left eq
      { /songs songs1 def }
      { /x x w add def 
        /songs songs2 def }
    ifelse

    x y w h songs print-one-column
  grestore
 } bdef

/draw-icon {
  gsave
    total-width 2 div
    icons-go-inside
     { total-height list-height 2 div margins add sub neg }
     { total-height list-height 1.5 mul margins dup add add sub neg }
    ifelse
    translate
    list-height dup scale
    columns-horizontally { -90 rotate } if
    flip-songs { 180 rotate } if

    icons-go-inside songs-go-inside and
    icons-go-inside not songs-go-inside not and or
      { { 1 exch sub icon-fade-factor mul 1 exch sub } settransfer
	  0 setgray } % ..to work around bug in GhostScript 2.0's settransfer.
    if
    magic-icon
  grestore
  } bdef

/set-songfont {	    % compute width-scale of fonts for song listings.
  /tfont song-time-font findfont song-font-height scalefont def
  /maxw 0 def
  /song-fonts-w-scale 1 def   % set to 1 for width computation.
  songs1 { extract-song-and-time-and-font
           setfont
           dup /Title eq
            { pop pop () 0 }
            { stringwidth pop }  %% oops, this isn't taking into account
           ifelse	         %% the /song-time-font.
           exch stringwidth pop
           add
	   maxw max
           /maxw exch def
         } forall
  songs2 { extract-song-and-time-and-font
           setfont
           dup /Title eq
            { pop pop () 0 }
            { stringwidth pop }
           ifelse
           exch stringwidth pop
           add
	   maxw max
           /maxw exch def
         } forall
  /w  one-column
      { inner-width 20 sub }
      { inner-width 2 div 5 sub } ifelse
      def 
  /max-songwidth maxw 20 add def
  max-songwidth w gt
    { /song-fonts-w-scale w max-songwidth div def
      /max-songwidth w def }
  if

  one-column double-album-p not and
  { /Imaxw inline-album-titles-max-stringwidth def
    /song-fonts-title-w-scale
      Imaxw max-songwidth gt { max-songwidth Imaxw div } { 1 } ifelse
      def
  } if
  } bdef


/inline-album-titles-max-stringwidth {
  /Imaxw 0 def
  /Imaxh 0 def
  /ofsws song-fonts-w-scale def
  /ofshs song-fonts-h-scale def
  /song-fonts-w-scale 1 def   % set to 1 for width computation.
  songs1 { extract-song-and-time-and-font
           setfont
           /Title eq
            { stringwidth pop Imaxw max /Imaxw exch def
	      /Imaxh Imaxh inner-album-font-height add 4 add def }
            { pop }
           ifelse } forall
  songs2 { extract-song-and-time-and-font
           setfont
           /Title eq
            { stringwidth pop Imaxw max /Imaxw exch def
	      /Imaxh Imaxh inner-album-font-height add 4 add def }
            { pop }
           ifelse } forall
  /song-fonts-w-scale ofsws def
  /song-fonts-h-scale ofshs def
  Imaxw
} bdef


/print-two-inner-album-titles {   % write album titles above the song listings
  gsave
    /x 10 def
    /y  back-spine-height spine-height add
        margins 3 mul  add
        neg  def
    /w  inner-width 2 div 10 sub def
    /x2 w 20 add def

    songs-go-inside
    { flip-songs
      { /y y list-height margins add add def }
      { /y y list-height margins add sub def }
      ifelse }
    if

    /font  inner-album-font findfont inner-album-font-height scalefont  def
    font setfont
    /maxw albumname1 albumname2 max-stringwidth def
    /maxw maxw inline-album-titles-max-stringwidth max def

    /song-fonts-title-w-scale
      maxw w gt { w maxw div } { 1 } ifelse
    def
    font [ song-fonts-title-w-scale 0 0 1 0 0 ] makefont setfont

    gsave
      x y w inner-album-font-height 1.5 add box clip newpath
      x  y inner-album-font-height sub 2 add  moveto
      albumname1 show
      0 -2 rmoveto
      x  y inner-album-font-height sub  lineto stroke        % underline it.
    grestore
    gsave
      x2 y w inner-album-font-height 1.5 add box clip newpath
      x2 y inner-album-font-height sub 2 add  moveto
      albumname2 show
      0 -2 rmoveto
      x  y inner-album-font-height sub  lineto stroke        % underline it.
    grestore
  grestore
 } bdef


/print-one-inner-album-title {  % write album title centered above songs.
  gsave
    /x 10 def
    /y  back-spine-height spine-height add
        margins 3 mul  add
        neg  def
    /w  inner-width x sub def
    /w2 inner-width 2 div x sub def

    songs-go-inside
    { flip-songs
      { /y y list-height margins add add def }
      { /y y list-height margins add sub def }
      ifelse }
    if

    /font inner-album-font findfont inner-album-font-height scalefont def
    font setfont
    /maxw albumname1 stringwidth pop def
    /innerw inline-album-titles-max-stringwidth def
    /maxw maxw innerw max def

    /w3 innerw 0 eq { w } { w2 } ifelse def
    /song-fonts-title-w-scale
      maxw w3 gt
      { w3 maxw div } { 1 } ifelse
    def
    font [ song-fonts-title-w-scale 0 0 1 0 0 ] makefont setfont

    gsave
      x y w inner-album-font-height 1.5 add box clip newpath
      x w 2 div add  y inner-album-font-height sub 2 add  moveto
      albumname1 centershow
      newpath 
      x  y inner-album-font-height sub  moveto
%      w 10 sub 0 rlineto stroke
      w 0 rlineto stroke
    grestore
  grestore
 } bdef


/print-inner-album-titles {
  double-album-p
  { print-one-inner-album-title }
  { print-two-inner-album-titles }
  ifelse
} bdef


/print-one-date {       % write a date centered below the song listings
  gsave
    /x 10 def
    /y  back-spine-height spine-height add
        list-height  add
        margins 2 mul  add
        inner-album-font-height sub
        neg  def
    /w  inner-width x sub def

    songs-go-inside
    { flip-songs
      { /y y list-height margins add add def }
      { /y y list-height margins add sub def }
      ifelse }
    if

    date-font findfont date-font-height scalefont setfont
    x y w inner-album-font-height 1.5 add box clip newpath
    x w 2 div add  y inner-album-font-height sub 2 add  moveto
    /datew date1 stringwidth pop def
    datew w gt { currentfont [ w datew div 0 0 1 0 0 ] makefont setfont } if
    date1 centershow
  grestore
 } bdef


/print-two-dates {              % write the dates below the song listings
  gsave
    /x 25 def
    /y  back-spine-height spine-height add
        list-height add
        margins 2 mul  add
        inner-album-font-height sub
        neg  def
    /w  inner-width 2 div def
    /x2 w x add def

    songs-go-inside
    { flip-songs
      { /y y list-height margins add add def }
      { /y y list-height margins add sub def }
      ifelse }
    if

    date-font findfont date-font-height scalefont setfont
    /datew date1 date2 max-stringwidth def
    gsave
      x y w inner-album-font-height box clip newpath
      x  y inner-album-font-height sub 2 add  moveto
      datew w x sub gt
        { currentfont [ w x sub datew div 0 0 1 0 0 ] makefont setfont } if
      date1 show
    grestore
    gsave
      x2 y w inner-album-font-height box clip newpath
      x2  y inner-album-font-height sub 2 add  moveto
      datew w x sub gt
        { currentfont [ w x sub datew div 0 0 1 0 0 ] makefont setfont } if
      date2 show
    grestore
  grestore
 } bdef

/print-dates {
  one-column double-album-p not and
  { () date1 eq
    { /date1 date2 def
      /date2 () def }
    { () date2 eq not
      {
	/l1 date1 length def
	/l2 date2 length def
	/s l1 l2 add 2 add string def
	0 1 l1 1 sub { s exch dup date1 exch get put } for
	s l1 (,) 0 get put
	s l1 1 add ( ) 0 get put
	0 1 l2 1 sub { s exch dup date2 exch get exch l1 2 add add exch put }
	  for
	/date1 s def
	/date2 () def
      } if
    } ifelse
  } if
  double-album-p one-column or
  { print-one-date }
  { print-two-dates }
  ifelse
} bdef


/compute-spine-font-xscale {
  % compute horizontal size of largest band name string...
  magic-name-p
   { magic-name-width }
   { band-font findfont band-font-height scalefont setfont
     bandname1 bandname2 max-stringwidth }
  ifelse
  % compute horizontal size of largest album name string...
  album-font findfont album-font-height scalefont setfont
  albumname1 albumname2 max-stringwidth
  albumname3 albumname4 max-stringwidth max
  add	     		  % add them and divide inner-width by them to get
  spine-height mul	  % the ratio to scale the fonts by.  If this is
  inner-width		  % less than 1, don't do any scaling.
  10 sub     % subtract 10 from inner-width to account for the 5 point margin
             % between the text and the right and left edges.
  % if the two fonts are the same height, insert an additional 10 point gap.
%  band-font-height album-font-height eq { 10 sub } if
  % no, always insert it.
  10 sub

  exch div
  dup 1 ge { pop 1 } if
} bdef


/box-name-printers-p false def   % For debugging.  You don't want this.


/draw-spine {                       % draw the spine of the tape
  gsave
    margins  margins margins add  back-spine-height add neg  translate

    flip-spine not { 180 rotate inner-width neg spine-height translate } if
    
    0 0  inner-width  spine-height  box stroke     % the box around the spine
    0 0  inner-width  spine-height  box clip newpath
    margins spine-height neg translate
    /xscale compute-spine-font-xscale def
    gsave
      0 0 moveto
      spine-height xscale mul spine-height scale
      magic-name-p
      { box-name-printers-p  % debugging magic-name-printer sizing.
	{ 0 setgray 0 0 magic-name-width -1 box fill
	  { 1 exch sub } settransfer 0.01 setlinewidth 0 setgray
	  0 1 9 { 0 moveto 0 1 rlineto stroke } for }
	if
%	bandname2 () eq not
%	{
%	  0 0.6 translate
%	  0.45 0.45 scale
%	  gsave magic-name grestore
%	  0 -1 translate
%	  magic-name2
%	}
%	{
	  0 0.2222 translate
	  0.9 0.9 scale
	  magic-name
%	} ifelse
      }
      { band-font findfont band-font-height scalefont setfont
	0 1 band-font-height sub moveto
	same-band-p { 0 -0.1 rmoveto } if
	bandname1 show
	0 1 band-font-height dup add sub moveto
	bandname2 show
      }
      ifelse
    grestore
    inner-width margins sub margins sub 0 translate
    gsave
      spine-height xscale mul spine-height scale
      /afh album-font-height def
      album-font findfont afh scalefont setfont
      1 afh sub
      dup 0 exch moveto
      double-album-p { 0 -0.1 rmoveto } if
      % albumname1 and albumname2 are the first album on each side.
      % albumname3 and albumname4 are the second album on each side.
      albumname1 () eq not {                  albumname1 rightshow afh sub }if
      albumname3 () eq not {dup 0 exch moveto albumname3 rightshow afh sub }if
      albumname2 () eq not {dup 0 exch moveto albumname2 rightshow afh sub }if
      albumname4 () eq not {dup 0 exch moveto albumname4 rightshow }if
      pop
    grestore
  grestore
} bdef

/coerce-to-array-of-strings {  % if given a string, puts it in an array.
  dup
  type /stringtype eq
  { 1 array astore }
  if
  } bdef


/draw-back-spine {                 % draw the short flap on the back.
  /x margins def
  /y margins neg def
  /w inner-width def
  /h back-spine-height def
  gsave
  x y w h box stroke
    x y w h box clip newpath
    x w add  y h add neg  translate
    180 rotate
    signature-font findfont signature-font-height scalefont setfont
    /s signature coerce-to-array-of-strings def
    /sx margins def
    /sy h margins 3 mul sub neg
        s length 1 sub signature-font-height mul add
       def
    s { sx sy moveto
	show
	/sy sy signature-font-height sub def
      } forall
  grestore
 } bdef


/reset {		% resets all the tape-specific parameters.
  /bandname1 () def
  /bandname2 () def
  /albumname1 () def
  /albumname2 () def
  /albumname3 () def
  /albumname4 () def
  /date1 () def
  /date2 () def
  /magic-name-p false def
  /magic-icon-p false def
  /double-album-p false def
  /same-band-p false def
  /dolby false def
  } bdef

reset	    		% do it now to give them their initial values.
/signature () def	% probably redefined later.


/draw-tape-label {     % draw one.  Assumes all variables have been filled in.
		       % Takes X and Y on the stack.
  /tty exch def
  /ttx exch def
  gsave
    90 rotate
    ttx tty translate

    0 0 total-width total-height box stroke

    margins total-height neg
            list-height 2 mul add
            margins 2 mul add
    inner-width list-height box stroke    % draw a box around the back.
    magic-icon-p { draw-icon } if

    margins total-height neg
            list-height add
            margins add
    inner-width list-height box stroke    % draw a box around the listings.

    draw-back-spine
    draw-spine
    0 0 total-width total-height box      % draw the outermost box.

    % You are not expected to understand this.
    %
    flip-songs
    { 180 rotate total-width neg
      list-height
       spine-height back-spine-height add margins 3 mul add 2 mul
      add
      translate } if

    /frobbed-columns false def
    columns-horizontally
    { /frobbed-columns true def
      -90 rotate 0 inner-width translate
      back-spine-height spine-height add 3 margins mul add
      dup margins sub exch translate
      flip-songs
        {
	  columns-horizontally not
	  { 0 total-width neg margins add translate }
	  if
	  songs-go-inside
	  { list-height margins add neg total-width neg margins add translate }
	  if
	}
        { songs-go-inside
	  { list-height margins add total-width translate }
	  if }
      ifelse
      one-column { margins 0 translate } if    % hack
      /iw inner-width def
      /inner-width list-height def
      /list-height iw def
      /total-width inner-width margins dup add add def
    } if

    one-column
    { double-album-p not { [ albumname1 /Title ] } if
      songs1 aload pop
      double-album-p not { () [ albumname2 /Title ] } if
      songs2 aload pop
      songs1 length songs2 length add
      double-album-p not { 3 add } if
      array astore
      /songs1 exch def
      /songs2 [] def
      double-album-p { print-inner-album-titles } if
      set-songfont
      1 print-songs
    }
    { print-inner-album-titles
      set-songfont
      0 print-songs
      1 print-songs }
    ifelse

    print-dates
    frobbed-columns { DATp {DAT-sizes} {cassette-sizes} ifelse } if
  grestore
  gsave
    90 rotate ttx tty translate
    -90 rotate margins 2 add dup translate
    dolby false eq not { draw-dolby } if
  grestore
  reset
 } bdef


%% Dolby symbols.  This code is derived from code written by Michael L. Brown.
%%
/draw-dolby-internal {
  gsave
    dup () eq
    { pop }
    {
      % text
      /Helvetica-Bold findfont 36 scalefont setfont
      92 12 moveto
      dup stringwidth pop /dolbytextw exch def
      show % from stack
      4 setlinewidth
      82 2 moveto
      0 46 rlineto
      dolbytextw 20 add 0 rlineto
      0 -46 rlineto
      closepath stroke
      % Trademark
% aaah, who needs this.
%      /Helvetica-Bold findfont 28 scalefont setfont
%      dolbytextw 110 add 29.5 moveto
%      (TM) show
    }
    ifelse
    % left D box
    0 0 moveto 0 50 rlineto 32 0 rlineto 0 -50 rlineto closepath fill
    % right D box
    38 0 moveto 0 50 rlineto 32 0 rlineto 0 -50 rlineto closepath fill
    1.0 setgray
    4 setlinewidth
    % left D
    10 8 moveto 0 34 rlineto stroke
    gsave
      newpath
      1.0 1.2142857 scale
      12 20.588236 14 270 90 arc fill
    grestore
    % right D
    60 8 moveto 0 34 rlineto stroke
    gsave
      newpath
      1.0 1.2142857 scale
      58 20.588236 14 90 270 arc fill
    grestore
    0.0 setgray
  grestore
} bdef

/draw-dolby {  % stack: x y
    	       % draw a dolby symbol at x,y, with a boxed string next to it.
	       % if string=(), don't draw box.  DD symbol is 1 point square.
  gsave
    0.0143 9 mul dup scale
    dolby type /stringtype eq
    { dolby draw-dolby-internal }
    { /Helvetica-Bold findfont 36 scalefont setfont
      gsave
	5 setlinewidth
	/d dolby 3 string cvs def
	0 0 d stringwidth pop 12 add -36 box stroke
	7 7 translate 0 0 moveto d show
      grestore
    }
    ifelse
  grestore
} bdef

/Dolby  { /dolby () def } def
/DolbyB { /dolby (DOLBY  B) def } def
/DolbyC { /dolby (DOLBY  C) def } def
/AAD    { /dolby /AAD def } def
/DAD    { /dolby /DAD def } def
/ADD    { /dolby /ADD def } def
/DDD    { /dolby /DDD def } def
/dbx    { /dolby /dbx def } def

%%% Case-insensitive dictionary lookup.  Yowza.

/nsdc-buf 255 string def
/nstring-downcase { % target-string source-string
    	 	    % convert a string to lowercase; copies source-string
		    % into target-string, doing the conversion.  The two 
		    % strings may be the same, and the source-string may
    		    % be a 'name'.
  dup type /nametype eq { nsdc-buf cvs } if
  0 exch
  { dup dup 65 ge
    exch 90 le and
     { 32 add } if
    exch dup
    4 1 roll exch
    2 index 5 1 roll
    put 1 add
  } forall
  pop
} bdef

/CIget { % like get, but uses a lowercase version of the string.
    dup length string exch nstring-downcase get
} bdef

/CIput { % like put, but uses a lowercase version of the string.
    exch dup length string exch nstring-downcase exch put
} bdef

/CIknown { % like known, but uses a lowercase version of the string.
    dup length string exch nstring-downcase known
} bdef


% Dictionaries for storing magic band-name-and-icon-rendering functions.
%
/magic-name-dict 200 dict def
/magic-icon-dict 200 dict def

% Invoke the magic band-name-rendering function for the current band.
%
/magic-icon
{ magic-icon-dict bandname1 CIknown
  { magic-icon-dict bandname1 CIget exec }
  { magic-icon-dict /default-icon-printer known
    { magic-icon-dict /default-icon-printer get exec }
    if }
  ifelse
} bdef

/magic-name  { magic-name-dict bandname1 CIget 0 get exec } bdef
/magic-name2 { magic-name-dict bandname2 CIget 0 get exec } bdef

/magic-name-width { magic-name-dict bandname1 CIget 1 get } bdef


% Decide whether this band has a magic rendering function.
%
/check-magic {
  /magic-name-p magic-name-dict bandname1 CIknown def
  /magic-icon-p magic-icon-dict bandname1 CIknown 
		magic-icon-dict /default-icon-printer known or
  def
} bdef


% Define a new magic-name printer.
/define-magic-name-printer {   % arguments: bandname procedure width
   2 array astore
   magic-name-dict  % stack: band [proc w] dict
   3 1 roll         % stack: dict band [proc w]
   CIput
} bdef


/dump-internal {
  DATp { tick 2 eq {550} { tick 1 eq {300} {50} ifelse } ifelse }
       { tick 1 eq {360} {50} ifelse } ifelse
  -100 draw-tape-label
  tick DATp { 2 } { 1 } ifelse eq
  { showpage } if
  /tick tick 1 add DATp { 3 } { 2 } ifelse mod def
  reset
} bdef

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    		The user-level functions.		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/two-albums {	% arguments:  bandname album1 date1 album2 date2 songs1 songs2
  /songs2 exch def
  /songs1 exch def
  /date2 exch def
  /albumname2 exch def
  /date1 exch def
  /albumname1 exch def
  /bandname1 exch def
  /same-band-p true def
  /band-font-height  0.6 def
  /album-font-height 0.4 def
  check-magic
  dump-internal
} bdef


/two-bands { %args: bandname1 album1 date1 songs1 bandname2 album2 date2 songs2
  /songs2 exch def
  /date2 exch def
  /albumname2 exch def
  /bandname2 exch def
  /songs1 exch def
  /date1 exch def
  /albumname1 exch def
  /bandname1 exch def
  /band-font-height  0.4 def
  /album-font-height 0.4 def
  /magic-name-p false def
  /magic-icon-p false def
%  check-magic
  dump-internal
} bdef


/double-album {	% arguments:  bandname album date songs1 songs2
  /songs2 exch def
  /songs1 exch def
  /date1 exch def
  /albumname1 exch def
  /bandname1 exch def
  /band-font-height  0.6 def
  /album-font-height 0.6 def
  /double-album-p true def
  /same-band-p true def
  check-magic
  dump-internal
} bdef


/N-albums { %args:  bandname album1.1 album1.2 date1 album2.1 album2.2 date2 songs1 songs2
  /songs2 exch def
  /songs1 exch def
  /date2 exch def
  /albumname4 exch def
  /albumname2 exch def
  /date1 exch def
  /albumname3 exch def
  /albumname1 exch def
  /bandname1 exch def

  /band-font-height 0.6 def
  () albumname3 eq () albumname4 eq and
  { /album-font-height 0.4 def }
  { () albumname3 eq () albumname4 eq or
    { /album-font-height 0.3125 def }
    { /album-font-height 0.21875 def }
    ifelse }
  /same-band-p band-font-height 0.6 eq def
  ifelse

  check-magic
  dump-internal
} bdef


/two-bands-N-albums { % arguments:  band1 album1.1 album1.2 date1 songs1 band2 album2.1 album2.2 date2 songs2
  /songs2 exch def
  /date2 exch def
  /albumname4 exch def
  /albumname2 exch def
  /bandname2 exch def
  /songs1 exch def
  /date1 exch def
  /albumname3 exch def
  /albumname1 exch def
  /bandname1 exch def

  /band-font-height 0.4 def
  () albumname3 eq () albumname4 eq and
  { /album-font-height 0.4 def }
  { () albumname3 eq () albumname4 eq or
    { /album-font-height 0.3125 def }
    { /album-font-height 0.21875 def }
    ifelse }
  ifelse
  /magic-name-p false def
  /magic-icon-p false def
  dump-internal
} bdef

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    		The Magic-Name Printers.		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    These routines will be automatically invoked to	%%%%%%%%
%%%%%%%    draw certain band-names, so that you can have	%%%%%%%%
%%%%%%%    really hi-tech tape-labels.  Add more!		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%% Draw "Front 242" as a long, thin "front" over a long, tall "242".
%%%
(Front 242)
  {
    gsave
      0 -0.1 translate
      0.95 1 scale
      /Helvetica-Bold findfont [ 1.35 0 0 0.4 0 0 ] makefont  setfont
      0 0.58 moveto
      (FRONT) show
      /Helvetica-Bold findfont [ 2.85 0 0 0.7 0 0 ] makefont  setfont
      0 0 moveto (242) show
    grestore
  } bind
  4
define-magic-name-printer

%%% Draw "Orchestral Manoeuveres in the Dark" on two lines; use the
%%% "oe" character.
%%%
(Orchestral Manoeuveres in the Dark)
  {
    gsave
      0 -0.1 translate
      0.7 1 scale
      /Helvetica-Bold findfont [0.45 0 0 0.65 0 0] makefont setfont
      0.1 0.35 moveto
      (ORCHESTRAL MAN\352UVRES) show
      /Helvetica findfont [1 0 0 0.3 0 0] makefont setfont
      0.1 0.05 moveto
      (IN THE DARK) show
    grestore
  } bind
  4.2
define-magic-name-printer


%%% Draw "OMD" in the same way as "Orchestral Manoeuveres in the Dark".
%%%
magic-name-dict (OMD) cvn
  magic-name-dict (Orchestral Manoeuveres in the Dark) cvn CIget
CIput


%%% Draw "New Order" as a dark "New" over an outlined "Order", staggered.
%%%

(New Order)
  {
    gsave
      0 -0.1 translate
      0.02 setlinewidth
      1.5 setmiterlimit
      /Helvetica-Bold findfont setfont
      0 0.1 moveto
      (Order) true charpath stroke
      1.57 0.1 moveto
      (new) show
    grestore
  } bind
  3.2
define-magic-name-printer


%%% Draw "Siouxsie and the Banshees" with varying-height letters,
%%% like on the early albums.
%%%

(Siouxsie and the Banshees)
  {
    gsave
      0 -0.1 translate
      0.7 0.4 scale
      0.1 0.25 translate
      /big-font   /Helvetica findfont [ 0.5 0 0 2.2 0 0 ] makefont  def
      /med-font   /Helvetica findfont [ 0.5 0 0 1.1 0 0 ] makefont  def
      /small-font /Helvetica findfont [ 0.5 0 0 1.5 0 0 ] makefont  def
      0 -0.1 5.9 -1.8 box clip newpath
      0 0 moveto
      big-font setfont (SI) show
      0 0.8 rmoveto
      small-font setfont (o) show
      0 -0.8 rmoveto
      big-font setfont (UXSIE) show
      med-font setfont
      currentpoint /y exch def /x exch def
      .07 0.85 rmoveto
      (and) show x y moveto (THE) show
      big-font setfont (BANSHE) show
      0 0.8 rmoveto
      small-font setfont (e) show
      0 -0.8 rmoveto
      big-font setfont (S) show
    grestore
  } bind
  4
define-magic-name-printer


%%% Draw "Cabaret Voltaire" in their font.  I should probably have
%%% implemented this as a font, instead of as a set of procedures,
%%% but life's too short.
%%%

(Cabaret Voltaire)
  {
    gsave
      0 -0.1 translate
      0.5 0.5 scale
      1.8 setmiterlimit 0.1 setlinewidth
      0.2 0.3 moveto cabaret-c 0.5 0 rmoveto cabaret-a
      0.7 0 rmoveto cabaret-b  0.6 0 rmoveto cabaret-a
      0.7 0 rmoveto cabaret-R  0.6 0 rmoveto cabaret-e
      0.4 0 rmoveto cabaret-T  1.0 0 rmoveto cabaret-v
      0.6 0 rmoveto cabaret-o  0.7 0 rmoveto cabaret-L
      0.6 0 rmoveto cabaret-t  0.4 0 rmoveto cabaret-A
      0.45 0 rmoveto cabaret-I 0.45 0 rmoveto cabaret-r
      0.5 0 rmoveto cabaret-e
    grestore
  } bind
  4.1
define-magic-name-printer

%% Internal procedures to the "Cabaret Voltaire" printer.
%%
/cabaret-c { gsave currentpoint translate newpath 0.5 0.25 moveto 0.25 0 lineto
  0 0.5 lineto 0.25 1 lineto 0.5 0.75 lineto stroke grestore } bdef

/cabaret-a { gsave currentpoint translate newpath 0.25 0.75 moveto 0.5 1 lineto
   0.5 0 lineto 0 0.5 lineto 0.5 0.5 lineto stroke grestore } bdef

/cabaret-b { gsave currentpoint translate newpath 0 1 moveto 0 0 lineto 
  0.5 0.5 lineto 0 0.5 lineto stroke grestore } bdef

/cabaret-R { gsave currentpoint translate newpath 0 0 moveto 0 1 lineto 0.5 0.5
  lineto 0 0.5 lineto 0.25 0.5 moveto 0.5 0 lineto stroke grestore } bdef

/cabaret-e { gsave currentpoint translate newpath 0.375 0.25 moveto 
  0.25 0 lineto 0 0.5 lineto 0.25 1 lineto 0.5 0.5 lineto 0 0.5 lineto stroke
  grestore } bdef

/cabaret-T { gsave currentpoint translate newpath 0 1 moveto 0.5 1 lineto 
  0.25 1 moveto 0.25 0 lineto stroke grestore } bdef

/cabaret-v { gsave currentpoint translate newpath
  0 1 moveto 0.25 0 lineto 0.5 1 lineto stroke grestore } bdef

/cabaret-o { gsave currentpoint translate newpath 0.25 1 moveto 0.5 0.5 lineto
  0.25 0 lineto 0 0.5 lineto closepath stroke grestore } bdef

/cabaret-L { gsave currentpoint translate newpath 0 1 moveto
    0 0.10 lineto 0.5 0.10 lineto stroke grestore } bdef

/cabaret-t { gsave currentpoint translate newpath 0 1 moveto
  0 0 lineto 0.275 0.25 lineto stroke 0 0.75 moveto 0.25 0.75 lineto stroke
  grestore } bdef

/cabaret-A { gsave currentpoint translate newpath 0 0 moveto 0.25 1 lineto
  0.5 0 lineto stroke 0.125 0.5 moveto 0.375 0.5 lineto stroke grestore } bdef

/cabaret-I { gsave currentpoint translate newpath 0.25 0 moveto 0.25 1 lineto
  stroke grestore } bdef

/cabaret-r { gsave currentpoint translate newpath 0 0 moveto 0 1 lineto stroke
  0 0.75 moveto 0.25 1 lineto 0.5 0.75 lineto stroke grestore } bdef


(Nine Inch Nails)
  { gsave
      0 0 moveto
      /Helvetica findfont [ 1 0 0 1 0 0] makefont
      /Helvetica findfont [-1 0 0 1 0 0] makefont
      dup setfont
      gsave
        90 rotate 0.3 -0.2 translate 0.7 0.7 scale NiNbox
      grestore
      /nw (n)stringwidth pop neg def
      0.6 0 moveto
      nw 0 rmoveto (n)show
      nw 0 rmoveto exch dup setfont (i)show
      nw 0 rmoveto exch dup setfont (n)show
      nw 0 rmoveto exch dup setfont (e i)show
      nw 0 rmoveto exch dup setfont (n)show
      nw 0 rmoveto exch dup setfont (ch )show
      nw 0 rmoveto exch dup setfont (n)show
      nw 0 rmoveto exch dup setfont (ails)show
      pop pop
    grestore } bind
  6.3
define-magic-name-printer


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    		The Magic-Icon Printers.		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    These routines will be automatically invoked to	%%%%%%%%
%%%%%%%    draw icons for tapes of certain band, again for	%%%%%%%%
%%%%%%%    added whizziness.  Add more!		 		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

magic-icon-dict (Love and Rockets) cvn { L&R } CIput

/L&R {    % Love and Rockets logo.
  gsave
   0.005 setlinewidth
   gsave
     newpath 0.5 0 moveto 0 0 0.5 0 360 arc clip newpath
     -0.5 -0.5 1 -1 box fill
     1 setgray
     -0.1875 -0.5 0.375 -1 box fill
   grestore
   newpath 0.5 0 moveto 0 0 0.5 0 360 arc stroke
   L&R-rocket
   L&R-heart
  grestore
  } bdef

/L&R-rocket {
  -0.0625 0.3125 0.125 0.625 box fill   % shaft
  -0.0625 0.3125 moveto 0.125 0 rlineto % head
   0 0.5 lineto closepath fill
  -0.0625 -0.2 moveto -0.03 -0.03 rlineto % lfin
   0 -0.25 rlineto 0 -0.3125 lineto fill
   0.0625 -0.2 moveto 0.03 -0.03 rlineto  % rfin
   0 -0.25 rlineto 0 -0.3125 lineto fill
  } bdef

/L&R-heart-path {
  newpath
  0 0.125 moveto
  -0.0625 0.125 0.0625 0 180 arc
  0 -0.125 lineto
  0.125 0.125 lineto
   0.0625 0.125 0.0625 0 180 arc
  closepath
  } bdef

/L&R-heart {
  0.5 setgray L&R-heart-path fill
  0 setgray L&R-heart-path stroke
  } bdef


magic-icon-dict (Bauhaus) cvn { BEGA } CIput

/BEGA {  % Beggars Banquet logo.
  gsave
   0.005 setlinewidth
   newpath 0.5 0 moveto 0 0 0.5 0 360 arc stroke
   newpath 0.5 0 moveto 0 0 0.5 0 360 arc clip newpath
   0     0.3333 moveto 0.25 0 rlineto 0 -0.25 rlineto stroke  % eye
   0.083 0.3333 0.1666 0.1666 box fill
   0.3125 0.5 0.02 0.5 box fill                         % nose v
   0.2125 0 moveto 0.3125 0 lineto stroke               % nose h
   0.2725 0 0.04 0.3 box fill                           % mouth v
   0.2125 -0.125 0.1 0.03 box fill                      % mouth h
   0.125 -0.3 0.155 0.25 box fill                       % chin v
   0.0625 -0.3 moveto 0.28 -0.3 lineto stroke           % chin h
  grestore
  } bdef

magic-icon-dict (Nitzer Ebb) cvn { NE-dispatch } CIput

/NE-dispatch {  % draw one of three nitzer ebb logos, depending on albumname.
  albumname1 (That Total Age) eq
  { NE3 }
  { albumname1 (Belief) eq
    { NE-belief }
    { NE-star-and-gear }
    ifelse
  }
  ifelse
} bdef

/NE3 {  % Nitzer Ebb "That Total Age" logo.
  gsave
    -0.175 0.5 0.35 1 box fill
    0.5 setgray
    /s 0.3 def
    gsave 0 -0.3333 translate s s scale
     NE-hammer grestore
    gsave s s scale
     starpath fill grestore
    gsave 0 0.3333 translate s s scale
     NE-gear grestore
  grestore
  } bdef

/NE-gear {
  gsave
    0.1 setlinewidth
    0 0 0.375 0 360 arc stroke
    0 1 8
     { -0.075 0.5 0.15 0.1 box fill
       45 rotate
     } for
  grestore
  } bdef

/NE-hammer {
  gsave
    0.05 0 translate
    45 rotate
    -0.1 0.4 0.2 0.85 box fill
    -0.3 0.4 0.45 0.2 box fill
     0.15 0.4 moveto
     0.35 0.2 lineto
     0.15 0.2 lineto
     closepath fill
  grestore
  } bdef

/starpath {
  newpath 0 0.5 moveto
  0 1 4 { 144 rotate 0 0.5 lineto } for
  closepath
  } bdef


/NE-star-and-gear {  % Nitzer Ebb "Warsaw Ghetto" logo.
  gsave
   0.8 0.8 scale
   NE-split-gear
  grestore
  NE-split-star
  } bdef

/NE-split-star {
  gsave
    0.02 setlinewidth
    0 setgray starpath stroke
    starpath clip newpath
    0 setgray 0 0.5 0.5 1 box fill
    1 setgray -0.5 0.5 0.5 1 box fill
  grestore
  } bdef

/NE-gear-path {
    0 0.5 moveto
    0 1 11
      { -0.075 0.5 lineto
        -0.075 0.45 lineto
        30 rotate
         0.075 0.45 lineto % ## make this a curveto!!
         0.075 0.45 lineto
         0.075 0.5 lineto
      } for
    closepath
  } bdef


/NE-split-gear {
  gsave
    % I tried doing this with eopath, but it doesn't work in Amiga Post 1.1.
    0.005 setlinewidth
    0 setgray
    NE-gear-path stroke
    NE-gear-path clip newpath
    -0.5 0.5 0.5 1 box fill
    1 setgray 0.4 0 moveto 0 0 0.4 0 360 arc fill
    0 setgray 0.4 0 moveto 0 0 0.4 0 360 arc stroke
  grestore
  } bdef

%% What follows is a bitmap of the "grainy eye" image from "Belief".
%% Digitized on an Amiga, converted to PS with Jef Poskanzer's PBM toolkit.
%% I would have stored the bitmap run-length encoded, but that would have
%% taken some work, as the only rle-decoders I have expect to draw the image
%% as they decode, and not store it away for future use as we do here.
%%
/NE-belief {
  gsave
  0.8 0.8 scale
  -0.5 -0.5 translate
  82 71 1
  [ 82 0 0 -71 0 71 ]
  %% 28 lines of bitmap data... pinhead representation (tm).
  {<000000000000000000003f000000000000000000003f000000000000000000003f00000000
   0000000000003f000000000000000000003f03ffffffffffeffff0003f03ffffffdf3fffffb
   0003f03fffff800002ff661003f03ffffe00000060ffb003f03ffff8000000001fc003f007f
   fc00000000067c003f007fe000000000001d803f001f00000000000008203f0000000000000
   00006003f000000000000000004003f0000000000001e0000003f0000000000003f8000003f
   0000000000007d0000003f000000000000390000003f000000000000000000003f000000000
   000000000003f000000000000000000003f000000000000000000003f000000002000000000
   003f0000000ff000000000003f0000001fe006000000003f0000003f8046000000003f02000
   07fc1c6000000003f0200007fb780000000403f0300007fc70800000f803f0300003ff03040
   0008883f030001ffffff800018003f0380004ffffe0001f8003f03800007fffc0003fc003f0
   380001780000053f4003f03800001c8000197f7003f03800001f80001fffe003f03800046c0
   0037ffbf003f03800007f801ffffff803f0380000ffffffffff0003f03800003fffffffffe0
   03f03800002fffffffffe003f03c00000fffffffff8003f03c00000fffffffff8003f03c000
   01fffffffff0003f03c000007ffffffff0003f03c000001ffffffff0003f03c000007ffffff
   fe0003f03c00000ffffffffe0003f03e000007fffffffe0003f03e000003fffffff40003f03
   e000001fffffff80003f03e000001ffffffd80003f03f0000003fffffe00003f03f0000001f
   ffffc00003f03f0000001fffffc00003f03f0000000fffffc00003f03f00000017ffff80000
   3f03f0000001fffffc00003f03f0000000fffff800003f03e0000000fffff800003f03e0000
   0003ffff000003f03e000000017fff000003f0300000000179fe000003f02000000001f0ae0
   00003f000000000001000000003f0000000000007f0000003f000000000000000000003f000
   000000000000000003f000000000000000000003f000000000000000000003f000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000>}
  image
  grestore
  } bdef

magic-icon-dict (Nine Inch Nails) cvn { NiNbox } CIput

/NiNbox {
   gsave
    0.7 0.7 scale
    /Helvetica-Bold findfont [ 1 0 0 1 0 0] makefont
    /Helvetica-Bold findfont [-1 0 0 1 0 0] makefont
    dup setfont
    (NIN)stringwidth pop 2 div -0.3 translate
    0 0 moveto
    /Nw (N)stringwidth pop neg def
    Nw 0 rmoveto (N)show Nw 0 rmoveto
    exch dup setfont (IN)show exch
    0.1 setlinewidth
    -0.1 -0.15 Nw (IN)stringwidth pop add 0.2 add -1.05 box stroke
    pop pop
    grestore
} bdef

%% Kate Bush logo by Christer Lindh <clindh@abalon.se>.  
%% This draws the old-style KB logo. If it goes on the outside 
%% but songs go inside, it is rotates 90 degrees.
%%
/KB {   gsave
	.87 .87 scale
%	songs-go-inside icons-go-inside not and
%		{ -0.5 0.54 translate -90 rotate }
%		{ -0.5 -0.5 translate }
%		ifelse
	0.5 0.5 0.5 0 360 arc fill stroke
    1 setgray
	0.3 setlinewidth
	0.14 0.68 moveto
    0.14 0 lineto stroke

    0.08 setlinewidth
    0 0.80 moveto
    1 0.80 lineto
    0.45 0.80 moveto
    0.45 0 lineto stroke

    0.06 setlinewidth
    0.45 0.45 moveto
    1 0.875 lineto
    0.60 0.55 moveto
    0.9 0.1 lineto stroke
   grestore
} bdef
magic-icon-dict (Kate Bush) cvn { KB } CIput


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%EndProlog


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%    		Begin Example-Land.			%%%%%%%%
%%%%%%%		Modify what lies after this point.		%%%%%%%%
%%%%%%%								%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%% Set this string to what you want printed on the back flap, or an array
%% of strings (one string per line).
%%
/signature (From the Jamie Zawinski Collection of Fine Tapes) def

/band-font /Helvetica def		% The font for band-names.
/album-font /Helvetica def		% The font for album-names.

% Uncomment the next line to produce labels for Digital Audio Tapes.
%DAT-sizes

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of the normal case: two albums by one band,	%%%%%%%%
%%%%%%  with one album on each side of the tape.		%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(Gang of 4)		(Entertainment)		(1979)
			(Solid Gold)		(1981)
[(Ether)
 (Natural's not in it)
 (Not Great Men)
 (Damaged Goods)
 (Return the Gift)
 (Guns before Butter)
 ()
 (I Found that Essence Rare)
 (Glass)
 (Contract)
 (At Home He's a Tourist)
 (5:45)
 (Anthrax)
 ()
 (To Hell With Poverty)
 (Capital it Fails Us Now)
 ]
[(Paralysed)
 (What we All Want)
 (Why Theory)
 (If I could keep it for myself)
 (Outside the trains don't run on time)
 ()
 (Cheeseburger)
 (The Republic)
 (In the Ditch)
 (A Hole in the Wallet)
 (He'd send in the Army)
 ]
two-albums


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of a double album, which consumes both sides	%%%%%%%%
%%%%%%  of the tape.  Also an example of the automatic "magic	%%%%%%%%
%%%%%%  printer" feature, since the band name is known.		%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(Front 242)		(Backcatalogue)		(1982-1985)

[[(U-Men (LP mix))		(3:12)]
 [(Geography II)		(1:08)]
 [(Kampfbereit)			(3:18)]
 [(Operating Tracks)		(3:48)]
 [(Geography I)			(2:16)]
 [(Take One)			(4:45)]
 [(Controversy Between)		(4:54)]
 [(Sample D)			(3:15)]
 ]
[[(Nomenklatura I)		(4:24)]
 [(Nomenklatura II)		(2:10)]
 [(Lovely Day)			(5:26)]
 [(Special Forces)		(5:30)]
 [(Commando Remix)		(9:03)]
 [(No Shuffle (single mix))	(3:45)]
 [(Don't Crash)			(4:51)]
 [(Funkahdafi)			(3:15)]
 [(Take One (live))		(5:00)]
 ]
double-album

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of a double album, which consumes both sides	%%%%%%%%
%%%%%%  of the tape.  The band name and album name are printed  %%%%%%%%
%%%%%%  in different fonts.  Also, there is a "Dolby B" logo.   %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

DolbyB
album-font band-font		    % push the current values on the stack.
/band-font /Courier-Bold def	    % redefine the album and band fonts.
/album-font /Times-Italic def

(bauhaus)   	    	(1979-1983) ()
[(Kick in the Eye)
 (Hollow Hills)
 (In Fear of Fear)
 (Ziggy Stardust)
 (Silent Hedges)
 (Crack the Whip)
 (Third Uncle)
 (Spirit)
 (All We Ever Wanted was Everything)
 (She's in Parties)
 (Sanity Assassin)
 (untitled)
 ]
[(Double Dare)
 (In the Flat Field)
 (Dark Entries)
 (Stigmata Martyr)
 (Bela Lugosi's Dead)
 (Telegram Sam)
 (St. Vitus Dance)
 (Spy in the Cab)
 (Terror Couple Kills Colonel)
 (The Passion of Lovers)
 (Mask)
 ]
double-album	      	    	    	% print the album...

/band-font exch def			% restore the fonts to the values that
/album-font exch def			% we pushed on the stack a while ago.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of three albums by one band that happen to	%%%%%%%%
%%%%%%  fit on one tape - one album on the front and two on	%%%%%%%%
%%%%%%  the back.						%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(Shriekback)
  (Jamscience)	()					(1984)
  (Tench)	(Knowledge, Power, Truth and Sex)	(1982, 1984)

[(Under the Lights)
 (Building Up a New Home)
 (Hand on my Heart)
 (International)
 (Putting on the Pressure)
 (Party Line)
 (My Careful Hands)
 (Midnight Maps)
 ()
 (Working on the Ground)
 (Lined Up (instrumental))
 (Hapax Legomena)
 ]
[(Sexthinkone)
 (A Kind of Fascination)
 (All the Greek Boys)
 (Moth Loop)
 (Here Comes my Hand: Clap)
 ()
 [(Knowledge, Power, Truth and Sex) /Title]
 (Mercy Dash)
 (Achtung)
 (Hubris)
 (Suck)
 (Nerve)
 (Mistah Linn He Dead)
 ]
N-albums

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of two albums, each by different bands, with	%%%%%%%%
%%%%%%  one album on each side of the tape.			%%%%%%%%
%%%%%%  Also, the song listings are in one sideways column.     %%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/one-column true def
/columns-horizontally true def

(Revolting Cocks)	(Big Sexy Land)		(1986)

[[(38)					  (4:10)]
 [(We Shall Cleanse the World)		  (5:34)]
 [(Attack Ships on Fire)		  (4:55)]
 [(Big Sexy Land)			  (3:57)]
 [(Union Carbide (West Virginia version)) (3:20)]
 [(TV Mind)				  (5:39)]
 [(No Devotion)				      ()]
 [(Union Carbide (Bhopal version)) 	  (3:39)]
 [(You Often Forget (Malignant)) 	  (8:28)]
 ]

(Sisters of Mercy)	(Floodland)		(1988)

[[(Dominion/Mother Russia)		  (7:01)]
 [(Flood I)				  (6:22)]
 [(Lucretia My Reflection)		  (4:57)]
 [(1959)				  (4:09)]
 [(This Corrosion)	       		 (10:55)]
 [(Flood II)				  (6:47)]
 [(Driven Like the Snow)		  (6:27)]
 [(Neverland (a Fragment))		  (2:46)]
 ]
two-bands

% reset this for the next tape
/one-column false def
/columns-horizontally false def

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%  An example of several EPs and singles by one band on	%%%%%%%%
%%%%%%  both sides of a tape.  Also, the band-name is printed	%%%%%%%%
%%%%%%  in a different font for this one.			%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

band-font			% push band-font on the stack..
/band-font /Times-Roman def	% change it...

(THE ART OF NOISE)
	(Who's Afraid of the Art of Noise?)	(Beatbox. Paranoimia.)  ()
	(The Art of Noise have Closed Up.)	(Legs. Peter Gunn.)	()

[[(A Time for Fear (Who's Afraid?))	(1984)]
 [(Beatbox (Diversion One))		()]
 [(Snapshot)				()]
 [(Close to the Edit)			()]
 [(Who's Afraid (of the Art of Noise?))	()]
 [(Momento)				()]
 [(How to Kill)				()]
 [(Realization)				()]
 [()					()]
 [(Beatbox (Battle))			(1983)]
 [(The Army Now)			()]
 [(Donna)				()]
 [(Bright Noise)			()]
 [(Moments in Love)			()]
 [()					()]
 [(Legs)				(1985)]
 ]
[[(Closely Closely (Enough's Enough!))	(1984)]
 [(Close Up (Hop))			()]
 [(A Time to Hear (Who's Listening?))	()]
 [()					()]
 [(Hoops and Mallets)			(1985)]
 [(Legs (Inside Legmix))		()]
 [()					()]
 [(Paranoimia (Headroom Mix))		(1986)]
 [(Why Me?)				()]
 [(A Nation Rejects)			()]
 [()					()]
 [(Peter Gunn Theme)			(1986)]
 [(Something Always Happens)		()]
 [()					()]
 [(Beatbox (Battle))			(1983)]
 ]
N-albums			% print the label...

/band-font exch def		% set band font back to what it was before.


%%Trailer
%%  This form should always be here at the end, to make sure that the
%%  final page is dumped even if there are an odd number of labels
%%  being printed.
%%
tick 0 ne { showpage } if