audio-tape.ps v1.14 (long)
Jamie Zawinski
jwz at lucid.com
Thu Mar 7 09:56:55 AEST 1991
%!PSAdobe-1
%%Creator: Jamie Zawinski <jwz at 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 at 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 at 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 at 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
More information about the Alt.sources
mailing list