home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3034 < prev    next >
Text File  |  1991-03-08  |  67KB  |  2,165 lines

  1. Newsgroups: comp.lang.postscript,alt.sources
  2. From: Jamie Zawinski <jwz@lucid.com>
  3. Subject: audio-tape.ps v1.14 (long)
  4. Message-ID: <JWZ.91Mar6185655@sunvalleymall.lucid.com>
  5. Date: 6 Mar 91 18:56:55
  6.  
  7. %!PSAdobe-1
  8. %%Creator: Jamie Zawinski <jwz@lucid.com>
  9. %%Title: audio-tape.ps
  10. %%CreationDate: 6-mar-91
  11. %%
  12. %%  PostScript code to generate audio-cassette or DAT labels.  Version 1.14.
  13. %%  Copyright (c) 1991 Jamie Zawinski <jwz@lucid.com>.
  14. %%
  15. %%  Permission granted for non-commercial use and distribution
  16. %%  so long as this notice of copyright remains intact.
  17. %%
  18. %%EndComments
  19.  
  20. %%BeginDocumentation
  21. %%
  22. %% There are a few examples at the end of this file; print this for a
  23. %% representative selection of what this code can do.  Search for the
  24. %% string "example" to see how to do it.
  25. %%
  26. %% If you are using this code, send me mail, and I will send you updates
  27. %% as I improve it.
  28.  
  29. %% =========================================================================
  30. %%                   HOW TO USE THIS
  31. %% =========================================================================
  32. %%
  33. %% To print a tape label, you construct a call to one of several PostScript
  34. %% procedures defined in this file.  The calling syntax is fairly simple,
  35. %% and you don't need to know PostScript to do it.  Just fill in the blanks.
  36. %%
  37. %% For a tape label with one album on each side, both albums by the same band,
  38. %% do this:
  39. %%
  40. %%     (Band Name) (Album 1 Name) (Album 1 Date)
  41. %%             (Album 2 Name) (Album 2 Date)
  42. %%      [ <...album 1 songs....> ] [ <...album 2 songs....> ]
  43. %%      two-albums
  44. %%
  45. %% For a tape label with one album on each side, both albums by different
  46. %% bands, do this:
  47. %%
  48. %%      (Band 1 Name) (Album 1 Name) (Album 1 Date)
  49. %%        [ <...album 1 songs....> ]
  50. %%      (Band 2 Name) (Album 2 Name) (Album 2 Date)
  51. %%        [ <...album 2 songs....> ]
  52. %%      two-bands
  53. %%
  54. %% For a tape label with one double album consuming both sides, do this:
  55. %%
  56. %%      (Band Name) (Album Name) (Album Date)
  57. %%        [ <...songs, side 1....> ]
  58. %%        [ <...songs, side 2....> ]
  59. %%      double-album
  60. %%
  61. %% For a tape label with three or four albums/EPs by the same band, do this:
  62. %%
  63. %%      (Band Name) (Album 1.1 Name) (Album 1.2 Name) (Album 1.* Date)
  64. %%             (Album 2.1 Name) (Album 2.2 Name) (Album 2.* Date)
  65. %%        [ <...songs, side 1....> ]
  66. %%        [ <...songs, side 2....> ]
  67. %%      N-albums
  68. %%
  69. %% (Either of the strings (Album 1.2 Name) or (Album 1.2 Name) may be
  70. %% an empty string; things will be positioned appropriately.)
  71. %%
  72. %% For a tape label with three or four albums/EPs by two different bands,
  73. %% do this:
  74. %%
  75. %%      (Band 1 Name) (Album 1.1 Name) (Album 1.2 Name) (Album 1.* Date)
  76. %%        [ <...songs, side 1...> ]
  77. %%     (Band 2 Name) (Album 2.1 Name) (Album 2.2 Name) (Album 2.* Date)
  78. %%        [ <...songs, side 2...> ]
  79. %%      two-bands-N-albums
  80. %%
  81. %%
  82. %% In the above examples, [ <songs> ] should really be of the form
  83. %%
  84. %%   [ (song 1) ... (song N) ]            that is, an array of strings; or it
  85. %%                    may also be of the form
  86. %%
  87. %%   [[ (song 1)  (song 1 time) ]       that is, an array of arrays, where
  88. %%    [ (song 2)  (song 2 time) ]    each sub-array holds exactly two
  89. %%     ...                strings.  The first string is the name
  90. %%    [ (song N)  (song N time) ]]    of a song, and the second string is
  91. %%                    the start-time, length, counter, or
  92. %% whatever of the song.  The song name is printed flushleft, and the song
  93. %% time is printed flushright.
  94. %%
  95. %% If an entry in the song array is of the form
  96. %%    [ (song N)  (song N time) ...font... ]
  97. %% where ...font... is one of /B, /I, /BI, or /Title.  This is explained a
  98. %% little later.
  99.  
  100. %% =========================================================================
  101. %%                  WHAT YOU WILL GET
  102. %% =========================================================================
  103. %%
  104. %% The labels are printed two-per-page.  You do not need to insert "showpage"s
  105. %% in this file; that happens automagically.
  106. %%
  107. %% The band-names and album-names are printed on the spine of the label.
  108. %% For the one-band-on-both-sides cases, the band-name is printed tall enough
  109. %% to fill the label.  For the two-band cases, the band names are printed one
  110. %% atop the other.  Album names are scaled so that all album names fit on
  111. %% one atop the other on the spine.
  112. %%
  113. %% In all cases (spine, song lists, etc) it is not possible for a string to
  114. %% be "too long" - font-widths are scaled so that the strings fit in the
  115. %% available space (taking into account adjascent strings of the same height;
  116. %% strings stacked above/next to each other are scaled as a unit.  You'll
  117. %% see what I mean.)
  118. %%
  119. %% Songs are printed in one or two columns on the back of the tape label, or
  120. %% on the inside of the tape label (user-configurable).  The name of the album
  121. %% is printed above the song lists.  When there are more than two albums on a
  122. %% tape, the names of all three or four albums are printed on the spine, and
  123. %% the names of albums 1.1 and 2.1 are printed above the song listings on the
  124. %% inside.
  125. %%
  126. %% Labels for DATs look the same, except that they are smaller (of course...)
  127. %%
  128. %% It is possible to specify the font of individual lines in the song listings
  129. %% by placing a font-keyword in the third position of an element of the 
  130. %% song-list array.  Valid face-specifiers are /B (bold), /I (italic), /BI
  131. %% (bold italic), and /Title.  If the font is unspecified, /B, /I, or /BI,
  132. %% then the font used for the song name is determined by one of the variables
  133. %% /song-font, /song-font-bold, /song-font-italic, or /song-font-bold-italic.
  134. %% The font will always be scaled to be /song-font-height points tall.
  135. %%
  136. %% If, however, the font is specified as /Title, then the font used will be
  137. %% the value of /title-font, and it will be /title-font-height tall; it will
  138. %% also be underlined.  The intent here is that specifying the font as /Title
  139. %% makes an entry in the song listings look just like the album titles above
  140. %% the listings.  That way, if you have more than one album on the same side
  141. %% of a tape, you can display a title for both of them, which was not possible
  142. %% in versions prior to 1.5.  (Extra hack: [(song) /Title] is considered to
  143. %% be the same as [(song) () /Title], since the time is ignored for titles.)
  144. %%
  145. %% It is possible to include arbitrary graphics in place of the band-name
  146. %% on the spine, to duplicate the way a band normally renders its name, or
  147. %% whatever.  It is also (as of v1.4) possible to include an arbitrary
  148. %% graphic on the inside flap, or printed (lightly) under the song listings.
  149. %% See below.
  150. %%
  151. %% If you want a Dolby logo printed, simply include a line containing only the
  152. %% word "DolbyB" or "DolbyC" (no quotes) before the band name(s).  You must do
  153. %% this before each tape to get this logo; it is reset after printing each
  154. %% label.  "dbx", "AAD", "ADD", and "DDD" print the appropriate logo as well.
  155. %% These logos go in the corner of the short back flap (where the signature
  156. %% string goes) because I couldn't think of a better place.  Feel free to
  157. %% suggest one.
  158. %%
  159. %% =========================================================================
  160. %%              HOW TO USE THIS UNDER UNIX
  161. %% =========================================================================
  162. %%
  163. %% Of course, it's possible to just edit this file and print it each time you
  164. %% want to print a label, but that's kind of a pain.  And you don't want a
  165. %% copy of this file sitting around for every tape label you print, it's too
  166. %% big.  This is the solution that I use:
  167. %%
  168. %%   When you edit a new tape label, put it in its own file.  Include in that
  169. %%   file only what the "How to Use This" section had you type in.
  170. %%
  171. %%   Add the following to your .cshrc file:
  172. %%
  173. %%       alias tape_prolog awk '/^%.PS/,/^%%BeginDoc//^%%EndDoc/,/^%%EndPro/'
  174. %%       alias tape_trailer awk '/^%%Trailer/,/^--eof--\$/'
  175. %%       setenv TAPEPS ~/ps/audio-tape.ps
  176. %%       alias catapes '(tape_prolog $TAPEPS;cat \!*; tape_trailer $TAPEPS)'
  177. %%       alias printapes '(catapes \!*) | lpr'
  178. %%
  179. %%   'tape_prolog' and 'tape_trailer' are 'awk' programs that will extract
  180. %%   the important part of this file.  TAPEPS is a variable that points at 
  181. %%   the place your copy of the file is.  'catapes' takes one or more files 
  182. %%   as arguments, and splices their contents in with the PostScript code at
  183. %%   the appropriate place.  
  184. %%
  185. %%   With the above aliases, the command "printapes tape1 tape2 tape3" will
  186. %%   concatentate the PostScript code defined in this file, the definitions
  187. %%   of your labels (which presumably are the contents of the files "tape1,"
  188. %%   "tape2," and "tape3"), and the necessary trailer together, and hand that
  189. %%   as input to "lpr" (or whatever command it is that you use for printing).
  190. %%
  191. %% I also have some Common Lisp code which maintains a database of tapes, and
  192. %% can generate this PostScript code directly.  It uses a simple textual file
  193. %% format for storing the song listings; if you want it, send me mail.  If
  194. %% you use TI Explorer Lisp Machines, I have a totally whizzy menu-driven 
  195. %% interface to editing, searching, and printing these labels. Again, just ask.
  196.  
  197. %% =========================================================================
  198. %%                 SIMPLE CUSTOMIZATION
  199. %% =========================================================================
  200. %%
  201. %% To print labels for Digital Audio Tapes instead of normal cassette tapes,
  202. %% insert a line consisting of
  203. %%        DAT-sizes
  204. %% in the file before the labels.  To switch back to cassette sizes, include
  205. %% a line that says "cassette-sizes" instead of "DAT-sizes" (the default is
  206. %% to produce labels for normal cassettes.)
  207. %%
  208. %% To change the fonts of various things, change the values of the variables
  209. %% /song-font, /band-font, /album-font, /inner-album-font, or /date-font.
  210. %% It is not possible to change the height or aspect ratio of the fonts, as
  211. %% those are computed at runtime.
  212. %%
  213. %% If you prefer the labels to be printed in such a way that the song listings
  214. %% will appear on the inside of the tape box instead of the outside, set the
  215. %% variable /songs-go-inside to true.  It defaults to false.
  216. %%
  217. %% If you prefer the labels to be printed so that a band's graphic goes on the
  218. %% inside of the tape box instead of the outside, set /icons-go-inside to
  219. %% true.  It defaults to false.
  220. %%
  221. %% If you prefer to have the spine of the label wrong-side-up, set /flip-spine
  222. %% to true.  It defaults to false.  If you prefer to have the song listings
  223. %% wrong-side-up, set /flip-songs to true.  It defaults to false.
  224. %%
  225. %% If you want the columns to follow the long edge of the tape rather than
  226. %% the short edge, set /columns-horizontally to true.  You can change the
  227. %% orientation with /flip-songs.
  228. %%
  229. %% If you want the song-listings to be printed in one column instead of two,
  230. %% then set /one-column to true.  The side1 songs and side2 songs will be
  231. %% appended together and printed in one column down the middle.  This is
  232. %% most useful in conjunction with /columns-horizontally.
  233. %%
  234. %% If /songs-go-inside and /icons-go-inside have the same value (both inside
  235. %% or both outside) then the songs will be printed overlaying the icon.  The
  236. %% icon will be printed at 20% intensity so that you can still read the songs
  237. %% on top of dark areas.  This is customizable by changing the variable 
  238. %% /icon-fade-factor.
  239. %%
  240. %% One problem I encountered with this code was that my co-worker's tapes all
  241. %% looked just like mine...  I got around this by adding the parameter
  242. %% /signature - set this to a string of your name or something, and it will
  243. %% be printed on the back-spine of all of your labels.  It can be multiple
  244. %% lines by specifying it as [ (line 1) (line 2) ... ] instead of as a string.
  245. %% (Embedding newlines in a string will not do what you want.)
  246.  
  247. %% =========================================================================
  248. %%             SOPHISTICATED CUSTOMIZATION
  249. %% =========================================================================
  250. %%
  251. %% Defining a new magic-name-printer is pretty simple.  Just define a
  252. %% procedure for drawing the name, and index it in "magic-name-dict" under
  253. %% the string which is the band's name.  There are some fairly sophisticated
  254. %% examples of this in this file.  If you define any more, send them to me
  255. %% and I'll include them in the next distribution (whether I like the band
  256. %% or not :-)).
  257. %%
  258. %% Adding an icon-printer is similar - you use "magic-icon-dict" instead of
  259. %% "magic-name-dict".  For magic-names, define the procedures to draw in
  260. %% a device-scale (1 unit = 1 point) space with origin at the upper left.
  261. %% For icons, define the procedure to be in a one-unit tall space - 1 unit
  262. %% will correspond to the entire height of the flap on which the icon is
  263. %% drawn.  For icons, the origin is at the XY center instead of the upper
  264. %% left.  This is all kind of arbitrary, but it doesn't matter too much,
  265. %% because the beauty of PostScript is that you can scale/translate within
  266. %% your procedure to work in the space that is most convenient to you.
  267. %%
  268. %% When you add something to magic-name-dict or magic-icon-dict, be sure to
  269. %% use "CIput" instead of "put" to insure case-insensitivity.
  270. %%
  271. %% If you associate an icon printer with the name (default-icon-printer), then
  272. %% this will be used for bands which do not have their own icons defined.  
  273. %%
  274. %% When /songs-go-inside and /icons-go-inside have the same value, meaning 
  275. %% that the songs will be printed overlaying the icon, we cause the icon to
  276. %% be printed at quarter-intensity by changing the transfer function.  If
  277. %% your icon is written in such a way that this is not desirable, it's
  278. %% possible to defeat it within a given icon printer by doing something 
  279. %% like "{} settransfer" within the scope of a "gsave".
  280. %%
  281. %% Note that magic-name and magic-icon printers are not used unless the label
  282. %% being printed is a double album, or the albums on both sides are by the
  283. %% same band.
  284.  
  285. %% =========================================================================
  286. %%                   WISHLIST
  287. %% =========================================================================
  288. %%
  289. %%  o  Maybe the magic-name printers should be invoked even if both sides of
  290. %%     the tape are not by the same band.
  291. %% 
  292. %%  o  The magic-icon-printers should be used even if there are two different
  293. %%     bands on one tape - print two of them side by side if necessary.
  294. %%
  295. %%  o  Maybe there should be a way to print arbitrary text on the inside flap,
  296. %%     aside from defining a magic-icon printer.
  297. %%
  298. %%  o  A general font-change mechanism would be nice, for font changes in the
  299. %%     signature as well as in the song listings.
  300. %%
  301. %%  o  Should have /3-bands-N-albums and /4-bands-N-albums commands.
  302.  
  303. %% =========================================================================
  304. %%           WHAT THE CURRENTLY DEFINED MAGIC-NAME-PRINTERS DO
  305. %% =========================================================================
  306. %% 
  307. %% o  Siouxsie and the Banshees is printed in an alternating sized, alternating
  308. %%    cased font, with the "and" over the "the" like on many early albums.
  309. %% o  Cabaret Voltaire is printed in a font that looks like the one on the
  310. %%    cover of "Micro-Phonies."
  311. %% o  New Order is printed with a black "New" overlapping a hollow "Order" as
  312. %%    on "Low Life" etc.
  313. %% o  OMD is printed on two lines, one font thicker than the other.  The OE is
  314. %%    printed with an OE character.
  315. %% o  Front 242 is printed similarly.
  316. %% o  Love and Rockets has an icon - a heart on a rocket in a circle.
  317. %% o  Bauhaus has an icon - the Beggars' Banquet "face-in-circle" logo.
  318. %% o  Nitzer Ebb has three icons:
  319. %%    o  If the album name is "That Total Age", the gear/star/hammer logo is
  320. %%       printed.
  321. %%    o  If the album name is "Belief", a low-resolution bitmap of the angry
  322. %%       looking eye from the cover of that album is printed.  This is a fair
  323. %%       example of how to incorperate such bitmaps, and it doesn't take up
  324. %%       that much space, either.
  325. %%    o  Otherwise, the star-over-gear icon from the Warsaw Ghetto EP is used.
  326. %% o  Nine Inch Nails has an icon - "NIN" in a box with the first N backwards.
  327. %% o  Kate Bush has an icon.
  328. %%
  329. %% Please send me more!
  330.  
  331. %% Questions?  Comments?  Suggestions?  Improvements?  Send them to me,
  332. %% jwz@lucid.com.  "Please, no applause, just throw money."
  333. %%
  334. %%EndDocumentation
  335.  
  336. /bdef { bind readonly def } bind readonly def
  337.  
  338. /box {
  339.   4 2 roll
  340.   newpath moveto
  341.     exch dup 0 rlineto
  342.     exch 0 exch neg rlineto
  343.     neg 0 rlineto
  344.   closepath
  345. } bdef
  346.  
  347. /rightshow
  348.  {dup stringwidth pop
  349.   neg 0 rmoveto
  350.   show } bdef
  351.  
  352. /centershow
  353.  {dup stringwidth pop
  354.   2 div neg 0 rmoveto
  355.   show } bdef
  356.  
  357. /max {
  358.   dup 3 -1 roll dup
  359.   3 -1 roll gt
  360.   { exch pop } { pop } ifelse
  361.   } bdef
  362.  
  363. /max-stringwidth {
  364.   stringwidth pop
  365.   exch stringwidth pop
  366.   max
  367.   } bdef
  368.  
  369. %% Default font-names and sizes.  The widths (and sometimes heights) are 
  370. %% stomped at runtime, but the names are the responsibility of the user.
  371. %%
  372. /song-font /Helvetica def
  373. /song-font-bold /Helvetica-Bold def
  374. /song-font-italic /Helvetica-Oblique def
  375. /song-font-bold-italic /Helvetica-BoldOblique def
  376. /song-time-font song-font def
  377. /song-font-height 8 def
  378.  
  379. /signature-font /Helvetica def
  380. /signature-font-height 8 def
  381.  
  382. /band-font /Helvetica def
  383. /band-font-height 13 def
  384.  
  385. /album-font /Helvetica def
  386. /album-font-height 13 def
  387.  
  388. /inner-album-font /Helvetica-Bold def
  389. /inner-album-font-height 13 def
  390.  
  391. /date-font /Helvetica-Bold def
  392. /date-font-height 8 def
  393.  
  394. % if true, songs go inside the tape label, else outside.
  395. /songs-go-inside false def
  396.  
  397. % if true, icons go inside the tape label, else outside.
  398. /icons-go-inside false def
  399.  
  400. % If true, the spine will be printed with a nasty orientation.
  401. /flip-spine false def
  402.  
  403. % If true, the song-listings will be printed other-side-up.
  404. /flip-songs false def
  405.  
  406. % If true, the song-listings will be in one column instead of two.
  407. /one-column false def
  408.  
  409. % If true, the song-listings will be horizontal instead of vertical.
  410. /columns-horizontally false def
  411.  
  412. % if an icon and the song listings are being printed on the same flap, the
  413. % icon will be faded by this amount (so that the songs will be readable).
  414. %
  415. /icon-fade-factor 0.20 def
  416.  
  417. /cassette-sizes {
  418.   /margins 4 def
  419.   /back-spine-height 40 def
  420.   /spine-height 32 def
  421.   /list-height 185 def
  422.   /total-height margins back-spine-height add
  423.                 margins spine-height add add
  424.                 margins list-height add  2 mul add
  425.                 margins add
  426.                 def
  427.   /inner-width 280 def
  428.   /total-width inner-width margins dup add add def
  429.   % if there are DATs on the page already, force a page-break.
  430.   DATp tick 0 ne and { showpage /tick 0 def } if
  431.   /DATp false def
  432. } bdef
  433.  
  434. /DAT-sizes {
  435.   % Length: 3 1/6 inches     - 228.95
  436.   % Width: 2 7/8 in          - 209.86
  437.   % Folds:
  438.   % 7/16 in from bottom      - 31.63
  439.   % 15/16 in from the bottom - 67.78
  440.   /margins 3 def
  441.   /back-spine-height 27 def
  442.   /spine-height 33 def
  443.   /list-height 156 2 sub def
  444.   /total-height margins back-spine-height add
  445.                 margins spine-height add add
  446.                 margins list-height add  2 mul add
  447.                 margins add
  448.                 def
  449.   /inner-width 202 4 sub def
  450.   /total-width inner-width margins dup add add def
  451.   % if there are normal cassette tapes on the page already, force a page-break.
  452.   DATp not tick 0 ne and { showpage /tick 0 def } if
  453.   /DATp true def
  454. } bdef
  455.  
  456. /tick 0 def        % How many tapes have been dumped on this page.
  457. /DATp false def        % don't change this.
  458. cassette-sizes
  459.  
  460. /extract-song-and-time-and-font-1 {
  461.   dup type /stringtype eq
  462.   { () /R }
  463.   { dup length
  464.     dup 0 eq
  465.     { pop pop () () /R }
  466.     { dup 1 eq
  467.       { 0 get () /R }
  468.       { 2 eq
  469.         { dup 0 get exch 1 get /R }
  470.         { dup 0 get exch dup 1 get exch 2 get }
  471.     ifelse
  472.       } ifelse
  473.     } ifelse
  474.   } ifelse
  475.   % if the time is /Title or /title, set the font to
  476.   % be the same.
  477.   exch dup dup
  478.   /Title eq
  479.   exch
  480.   /title eq
  481.   or
  482.     { pop pop /Title dup } if
  483.   exch
  484. } bdef
  485.  
  486. /extract-song-and-time-and-font {  % takes a song spec and leaves three things
  487.                                    % on the stack - (song) (time) <font>.
  488.   extract-song-and-time-and-font-1
  489.   decode-song-font-name
  490. } bdef
  491.  
  492. /song-fonts-w-scale 1 def
  493. /song-fonts-h-scale 1 def
  494. /song-fonts-title-w-scale 1 def
  495.  
  496. /decode-song-font-name {   % takes a name, one of /R, /B, /I, /BI, or /Title
  497.                            % and converts that to a font scaled appropriately.
  498.                            % Leaves the font on the stack.
  499.     
  500.   song-font-height exch % put the height on the stack under the name.
  501.  
  502.   /titlep false def % set the Hack flag...
  503.  
  504.   % convert the name to a font-name.
  505.   dup /B eq
  506.   { pop song-font-bold }
  507.   { dup /I eq
  508.     { pop song-font-italic }
  509.     { dup /BI eq
  510.       { pop song-font-bold-italic }
  511.        { dup /Title eq
  512.      exch /title eq or
  513.      % if the code was /Title or /title, take the default height off the
  514.      % stack and put the title-font-height there instead.
  515.      { pop inner-album-font-height
  516.        inner-album-font 
  517.        /titlep true def  % hack hack...
  518.      }
  519.      { song-font }
  520.      ifelse
  521.        } ifelse
  522.     } ifelse
  523.   } ifelse
  524.  
  525.   % set FH to the font height, leaving the font-name.
  526.   exch /FH exch def
  527.   % then find and scale the font, leaving it on the stack.
  528.   findfont
  529.   [ FH titlep {song-fonts-title-w-scale} {song-fonts-w-scale} ifelse mul
  530.     0 0
  531.     titlep { FH } { FH song-fonts-h-scale mul } ifelse
  532.     0 0 ] makefont
  533. } bdef
  534.  
  535. /compute-max-colheight {
  536.   songs1 compute-max-colheight-1
  537.   songs1 compute-max-colheight-1
  538.   max
  539. } bdef
  540.  
  541. /compute-max-colheight-1 {
  542.   /total 0 def
  543.   { extract-song-and-time-and-font-1
  544.     exch pop exch pop
  545.     /Title eq
  546.     { /total total inner-album-font-height add 5 add def }
  547.     { /total total song-font-height add 2 add def }
  548.     ifelse
  549.   } forall
  550.   total
  551. } bdef
  552.  
  553. % songs1 length songs2 length max
  554. %        song-font-height song-fonts-h-scale mul 2 add mul
  555.  
  556. /print-one-column {                    % write one column of the song listings
  557.   /songs exch def
  558.   /h exch def /w exch def
  559.   /y exch def /x exch def
  560.   gsave
  561.     /w w 10 sub def
  562.     /x x 5 add def
  563.     one-column double-album-p not and not
  564.       { /y y inner-album-font-height sub def } if
  565.     x y translate
  566. %    -5 0 w h box clip newpath
  567. %    -5 0 w h box stroke %debug
  568.     /x 0 def
  569.     /x2 x w add 5 sub def
  570.     /y song-font-height neg def
  571.  
  572.     /maxh compute-max-colheight def
  573.     maxh h y sub gt
  574.     { 1 h y sub maxh div scale } if
  575.  
  576.     songs { extract-song-and-time-and-font
  577.         setfont
  578.         dup /Title eq
  579.         { /y y inner-album-font-height song-font-height sub sub def
  580.           pop x 5 sub y moveto
  581.               show
  582.           0 -2 rmoveto
  583.           x 5 sub y 2 sub lineto stroke   % underline it
  584.           /y y
  585.             inner-album-font-height song-font-height sub
  586.             2 sub sub def           % frob y.
  587.         }
  588.         { exch
  589.           x y moveto
  590.           show
  591.           dup () ne {
  592.           song-time-font findfont
  593.           [ song-fonts-w-scale song-font-height mul 0 0
  594.             song-fonts-h-scale song-font-height mul 0 0 ]
  595.           makefont setfont
  596.           x2 y moveto
  597.           rightshow }
  598.           { pop }
  599.           ifelse
  600.         }
  601.         ifelse
  602.             /y y song-font-height song-fonts-h-scale mul sub 1 sub def
  603.           } forall
  604.   grestore
  605.  } bdef
  606.  
  607.  
  608. /print-songs {                 % write a column of the song listings; 0=right.
  609.   /left exch def
  610.   gsave
  611.     /x one-column { inner-width 20 sub max-songwidth sub 2 div 5 add }
  612.                   { 10 } ifelse def
  613.     /y  back-spine-height spine-height add
  614.         margins 3 mul  add
  615.         neg  def
  616.     /w  one-column { max-songwidth 20 add } { inner-width 2 div } ifelse def
  617.     /h  list-height
  618.         one-column double-album-p not and not
  619.           { inner-album-font-height sub } if
  620.         () date1 eq () date2 eq and not { date-font-height sub } if
  621.         margins 2 mul sub def
  622.  
  623.     songs-go-inside
  624.     { flip-songs
  625.       { /y y list-height margins add add def }
  626.       { /y y list-height margins add sub def }
  627.       ifelse }
  628.     if
  629.  
  630.     1 left eq
  631.       { /songs songs1 def }
  632.       { /x x w add def 
  633.         /songs songs2 def }
  634.     ifelse
  635.  
  636.     x y w h songs print-one-column
  637.   grestore
  638.  } bdef
  639.  
  640. /draw-icon {
  641.   gsave
  642.     total-width 2 div
  643.     icons-go-inside
  644.      { total-height list-height 2 div margins add sub neg }
  645.      { total-height list-height 1.5 mul margins dup add add sub neg }
  646.     ifelse
  647.     translate
  648.     list-height dup scale
  649.     columns-horizontally { -90 rotate } if
  650.     flip-songs { 180 rotate } if
  651.  
  652.     icons-go-inside songs-go-inside and
  653.     icons-go-inside not songs-go-inside not and or
  654.       { { 1 exch sub icon-fade-factor mul 1 exch sub } settransfer
  655.       0 setgray } % ..to work around bug in GhostScript 2.0's settransfer.
  656.     if
  657.     magic-icon
  658.   grestore
  659.   } bdef
  660.  
  661. /set-songfont {        % compute width-scale of fonts for song listings.
  662.   /tfont song-time-font findfont song-font-height scalefont def
  663.   /maxw 0 def
  664.   /song-fonts-w-scale 1 def   % set to 1 for width computation.
  665.   songs1 { extract-song-and-time-and-font
  666.            setfont
  667.            dup /Title eq
  668.             { pop pop () 0 }
  669.             { stringwidth pop }  %% oops, this isn't taking into account
  670.            ifelse             %% the /song-time-font.
  671.            exch stringwidth pop
  672.            add
  673.        maxw max
  674.            /maxw exch def
  675.          } forall
  676.   songs2 { extract-song-and-time-and-font
  677.            setfont
  678.            dup /Title eq
  679.             { pop pop () 0 }
  680.             { stringwidth pop }
  681.            ifelse
  682.            exch stringwidth pop
  683.            add
  684.        maxw max
  685.            /maxw exch def
  686.          } forall
  687.   /w  one-column
  688.       { inner-width 20 sub }
  689.       { inner-width 2 div 5 sub } ifelse
  690.       def 
  691.   /max-songwidth maxw 20 add def
  692.   max-songwidth w gt
  693.     { /song-fonts-w-scale w max-songwidth div def
  694.       /max-songwidth w def }
  695.   if
  696.  
  697.   one-column double-album-p not and
  698.   { /Imaxw inline-album-titles-max-stringwidth def
  699.     /song-fonts-title-w-scale
  700.       Imaxw max-songwidth gt { max-songwidth Imaxw div } { 1 } ifelse
  701.       def
  702.   } if
  703.   } bdef
  704.  
  705.  
  706. /inline-album-titles-max-stringwidth {
  707.   /Imaxw 0 def
  708.   /Imaxh 0 def
  709.   /ofsws song-fonts-w-scale def
  710.   /ofshs song-fonts-h-scale def
  711.   /song-fonts-w-scale 1 def   % set to 1 for width computation.
  712.   songs1 { extract-song-and-time-and-font
  713.            setfont
  714.            /Title eq
  715.             { stringwidth pop Imaxw max /Imaxw exch def
  716.           /Imaxh Imaxh inner-album-font-height add 4 add def }
  717.             { pop }
  718.            ifelse } forall
  719.   songs2 { extract-song-and-time-and-font
  720.            setfont
  721.            /Title eq
  722.             { stringwidth pop Imaxw max /Imaxw exch def
  723.           /Imaxh Imaxh inner-album-font-height add 4 add def }
  724.             { pop }
  725.            ifelse } forall
  726.   /song-fonts-w-scale ofsws def
  727.   /song-fonts-h-scale ofshs def
  728.   Imaxw
  729. } bdef
  730.  
  731.  
  732. /print-two-inner-album-titles {   % write album titles above the song listings
  733.   gsave
  734.     /x 10 def
  735.     /y  back-spine-height spine-height add
  736.         margins 3 mul  add
  737.         neg  def
  738.     /w  inner-width 2 div 10 sub def
  739.     /x2 w 20 add def
  740.  
  741.     songs-go-inside
  742.     { flip-songs
  743.       { /y y list-height margins add add def }
  744.       { /y y list-height margins add sub def }
  745.       ifelse }
  746.     if
  747.  
  748.     /font  inner-album-font findfont inner-album-font-height scalefont  def
  749.     font setfont
  750.     /maxw albumname1 albumname2 max-stringwidth def
  751.     /maxw maxw inline-album-titles-max-stringwidth max def
  752.  
  753.     /song-fonts-title-w-scale
  754.       maxw w gt { w maxw div } { 1 } ifelse
  755.     def
  756.     font [ song-fonts-title-w-scale 0 0 1 0 0 ] makefont setfont
  757.  
  758.     gsave
  759.       x y w inner-album-font-height 1.5 add box clip newpath
  760.       x  y inner-album-font-height sub 2 add  moveto
  761.       albumname1 show
  762.       0 -2 rmoveto
  763.       x  y inner-album-font-height sub  lineto stroke        % underline it.
  764.     grestore
  765.     gsave
  766.       x2 y w inner-album-font-height 1.5 add box clip newpath
  767.       x2 y inner-album-font-height sub 2 add  moveto
  768.       albumname2 show
  769.       0 -2 rmoveto
  770.       x  y inner-album-font-height sub  lineto stroke        % underline it.
  771.     grestore
  772.   grestore
  773.  } bdef
  774.  
  775.  
  776. /print-one-inner-album-title {  % write album title centered above songs.
  777.   gsave
  778.     /x 10 def
  779.     /y  back-spine-height spine-height add
  780.         margins 3 mul  add
  781.         neg  def
  782.     /w  inner-width x sub def
  783.     /w2 inner-width 2 div x sub def
  784.  
  785.     songs-go-inside
  786.     { flip-songs
  787.       { /y y list-height margins add add def }
  788.       { /y y list-height margins add sub def }
  789.       ifelse }
  790.     if
  791.  
  792.     /font inner-album-font findfont inner-album-font-height scalefont def
  793.     font setfont
  794.     /maxw albumname1 stringwidth pop def
  795.     /innerw inline-album-titles-max-stringwidth def
  796.     /maxw maxw innerw max def
  797.  
  798.     /w3 innerw 0 eq { w } { w2 } ifelse def
  799.     /song-fonts-title-w-scale
  800.       maxw w3 gt
  801.       { w3 maxw div } { 1 } ifelse
  802.     def
  803.     font [ song-fonts-title-w-scale 0 0 1 0 0 ] makefont setfont
  804.  
  805.     gsave
  806.       x y w inner-album-font-height 1.5 add box clip newpath
  807.       x w 2 div add  y inner-album-font-height sub 2 add  moveto
  808.       albumname1 centershow
  809.       newpath 
  810.       x  y inner-album-font-height sub  moveto
  811. %      w 10 sub 0 rlineto stroke
  812.       w 0 rlineto stroke
  813.     grestore
  814.   grestore
  815.  } bdef
  816.  
  817.  
  818. /print-inner-album-titles {
  819.   double-album-p
  820.   { print-one-inner-album-title }
  821.   { print-two-inner-album-titles }
  822.   ifelse
  823. } bdef
  824.  
  825.  
  826. /print-one-date {       % write a date centered below the song listings
  827.   gsave
  828.     /x 10 def
  829.     /y  back-spine-height spine-height add
  830.         list-height  add
  831.         margins 2 mul  add
  832.         inner-album-font-height sub
  833.         neg  def
  834.     /w  inner-width x sub def
  835.  
  836.     songs-go-inside
  837.     { flip-songs
  838.       { /y y list-height margins add add def }
  839.       { /y y list-height margins add sub def }
  840.       ifelse }
  841.     if
  842.  
  843.     date-font findfont date-font-height scalefont setfont
  844.     x y w inner-album-font-height 1.5 add box clip newpath
  845.     x w 2 div add  y inner-album-font-height sub 2 add  moveto
  846.     /datew date1 stringwidth pop def
  847.     datew w gt { currentfont [ w datew div 0 0 1 0 0 ] makefont setfont } if
  848.     date1 centershow
  849.   grestore
  850.  } bdef
  851.  
  852.  
  853. /print-two-dates {              % write the dates below the song listings
  854.   gsave
  855.     /x 25 def
  856.     /y  back-spine-height spine-height add
  857.         list-height add
  858.         margins 2 mul  add
  859.         inner-album-font-height sub
  860.         neg  def
  861.     /w  inner-width 2 div def
  862.     /x2 w x add def
  863.  
  864.     songs-go-inside
  865.     { flip-songs
  866.       { /y y list-height margins add add def }
  867.       { /y y list-height margins add sub def }
  868.       ifelse }
  869.     if
  870.  
  871.     date-font findfont date-font-height scalefont setfont
  872.     /datew date1 date2 max-stringwidth def
  873.     gsave
  874.       x y w inner-album-font-height box clip newpath
  875.       x  y inner-album-font-height sub 2 add  moveto
  876.       datew w x sub gt
  877.         { currentfont [ w x sub datew div 0 0 1 0 0 ] makefont setfont } if
  878.       date1 show
  879.     grestore
  880.     gsave
  881.       x2 y w inner-album-font-height box clip newpath
  882.       x2  y inner-album-font-height sub 2 add  moveto
  883.       datew w x sub gt
  884.         { currentfont [ w x sub datew div 0 0 1 0 0 ] makefont setfont } if
  885.       date2 show
  886.     grestore
  887.   grestore
  888.  } bdef
  889.  
  890. /print-dates {
  891.   one-column double-album-p not and
  892.   { () date1 eq
  893.     { /date1 date2 def
  894.       /date2 () def }
  895.     { () date2 eq not
  896.       {
  897.     /l1 date1 length def
  898.     /l2 date2 length def
  899.     /s l1 l2 add 2 add string def
  900.     0 1 l1 1 sub { s exch dup date1 exch get put } for
  901.     s l1 (,) 0 get put
  902.     s l1 1 add ( ) 0 get put
  903.     0 1 l2 1 sub { s exch dup date2 exch get exch l1 2 add add exch put }
  904.       for
  905.     /date1 s def
  906.     /date2 () def
  907.       } if
  908.     } ifelse
  909.   } if
  910.   double-album-p one-column or
  911.   { print-one-date }
  912.   { print-two-dates }
  913.   ifelse
  914. } bdef
  915.  
  916.  
  917. /compute-spine-font-xscale {
  918.   % compute horizontal size of largest band name string...
  919.   magic-name-p
  920.    { magic-name-width }
  921.    { band-font findfont band-font-height scalefont setfont
  922.      bandname1 bandname2 max-stringwidth }
  923.   ifelse
  924.   % compute horizontal size of largest album name string...
  925.   album-font findfont album-font-height scalefont setfont
  926.   albumname1 albumname2 max-stringwidth
  927.   albumname3 albumname4 max-stringwidth max
  928.   add                   % add them and divide inner-width by them to get
  929.   spine-height mul      % the ratio to scale the fonts by.  If this is
  930.   inner-width          % less than 1, don't do any scaling.
  931.   10 sub     % subtract 10 from inner-width to account for the 5 point margin
  932.              % between the text and the right and left edges.
  933.   % if the two fonts are the same height, insert an additional 10 point gap.
  934. %  band-font-height album-font-height eq { 10 sub } if
  935.   % no, always insert it.
  936.   10 sub
  937.  
  938.   exch div
  939.   dup 1 ge { pop 1 } if
  940. } bdef
  941.  
  942.  
  943. /box-name-printers-p false def   % For debugging.  You don't want this.
  944.  
  945.  
  946. /draw-spine {                       % draw the spine of the tape
  947.   gsave
  948.     margins  margins margins add  back-spine-height add neg  translate
  949.  
  950.     flip-spine not { 180 rotate inner-width neg spine-height translate } if
  951.     
  952.     0 0  inner-width  spine-height  box stroke     % the box around the spine
  953.     0 0  inner-width  spine-height  box clip newpath
  954.     margins spine-height neg translate
  955.     /xscale compute-spine-font-xscale def
  956.     gsave
  957.       0 0 moveto
  958.       spine-height xscale mul spine-height scale
  959.       magic-name-p
  960.       { box-name-printers-p  % debugging magic-name-printer sizing.
  961.     { 0 setgray 0 0 magic-name-width -1 box fill
  962.       { 1 exch sub } settransfer 0.01 setlinewidth 0 setgray
  963.       0 1 9 { 0 moveto 0 1 rlineto stroke } for }
  964.     if
  965. %    bandname2 () eq not
  966. %    {
  967. %      0 0.6 translate
  968. %      0.45 0.45 scale
  969. %      gsave magic-name grestore
  970. %      0 -1 translate
  971. %      magic-name2
  972. %    }
  973. %    {
  974.       0 0.2222 translate
  975.       0.9 0.9 scale
  976.       magic-name
  977. %    } ifelse
  978.       }
  979.       { band-font findfont band-font-height scalefont setfont
  980.     0 1 band-font-height sub moveto
  981.     same-band-p { 0 -0.1 rmoveto } if
  982.     bandname1 show
  983.     0 1 band-font-height dup add sub moveto
  984.     bandname2 show
  985.       }
  986.       ifelse
  987.     grestore
  988.     inner-width margins sub margins sub 0 translate
  989.     gsave
  990.       spine-height xscale mul spine-height scale
  991.       /afh album-font-height def
  992.       album-font findfont afh scalefont setfont
  993.       1 afh sub
  994.       dup 0 exch moveto
  995.       double-album-p { 0 -0.1 rmoveto } if
  996.       % albumname1 and albumname2 are the first album on each side.
  997.       % albumname3 and albumname4 are the second album on each side.
  998.       albumname1 () eq not {                  albumname1 rightshow afh sub }if
  999.       albumname3 () eq not {dup 0 exch moveto albumname3 rightshow afh sub }if
  1000.       albumname2 () eq not {dup 0 exch moveto albumname2 rightshow afh sub }if
  1001.       albumname4 () eq not {dup 0 exch moveto albumname4 rightshow }if
  1002.       pop
  1003.     grestore
  1004.   grestore
  1005. } bdef
  1006.  
  1007. /coerce-to-array-of-strings {  % if given a string, puts it in an array.
  1008.   dup
  1009.   type /stringtype eq
  1010.   { 1 array astore }
  1011.   if
  1012.   } bdef
  1013.  
  1014.  
  1015. /draw-back-spine {                 % draw the short flap on the back.
  1016.   /x margins def
  1017.   /y margins neg def
  1018.   /w inner-width def
  1019.   /h back-spine-height def
  1020.   gsave
  1021.   x y w h box stroke
  1022.     x y w h box clip newpath
  1023.     x w add  y h add neg  translate
  1024.     180 rotate
  1025.     signature-font findfont signature-font-height scalefont setfont
  1026.     /s signature coerce-to-array-of-strings def
  1027.     /sx margins def
  1028.     /sy h margins 3 mul sub neg
  1029.         s length 1 sub signature-font-height mul add
  1030.        def
  1031.     s { sx sy moveto
  1032.     show
  1033.     /sy sy signature-font-height sub def
  1034.       } forall
  1035.   grestore
  1036.  } bdef
  1037.  
  1038.  
  1039. /reset {        % resets all the tape-specific parameters.
  1040.   /bandname1 () def
  1041.   /bandname2 () def
  1042.   /albumname1 () def
  1043.   /albumname2 () def
  1044.   /albumname3 () def
  1045.   /albumname4 () def
  1046.   /date1 () def
  1047.   /date2 () def
  1048.   /magic-name-p false def
  1049.   /magic-icon-p false def
  1050.   /double-album-p false def
  1051.   /same-band-p false def
  1052.   /dolby false def
  1053.   } bdef
  1054.  
  1055. reset                % do it now to give them their initial values.
  1056. /signature () def    % probably redefined later.
  1057.  
  1058.  
  1059. /draw-tape-label {     % draw one.  Assumes all variables have been filled in.
  1060.                % Takes X and Y on the stack.
  1061.   /tty exch def
  1062.   /ttx exch def
  1063.   gsave
  1064.     90 rotate
  1065.     ttx tty translate
  1066.  
  1067.     0 0 total-width total-height box stroke
  1068.  
  1069.     margins total-height neg
  1070.             list-height 2 mul add
  1071.             margins 2 mul add
  1072.     inner-width list-height box stroke    % draw a box around the back.
  1073.     magic-icon-p { draw-icon } if
  1074.  
  1075.     margins total-height neg
  1076.             list-height add
  1077.             margins add
  1078.     inner-width list-height box stroke    % draw a box around the listings.
  1079.  
  1080.     draw-back-spine
  1081.     draw-spine
  1082.     0 0 total-width total-height box      % draw the outermost box.
  1083.  
  1084.     % You are not expected to understand this.
  1085.     %
  1086.     flip-songs
  1087.     { 180 rotate total-width neg
  1088.       list-height
  1089.        spine-height back-spine-height add margins 3 mul add 2 mul
  1090.       add
  1091.       translate } if
  1092.  
  1093.     /frobbed-columns false def
  1094.     columns-horizontally
  1095.     { /frobbed-columns true def
  1096.       -90 rotate 0 inner-width translate
  1097.       back-spine-height spine-height add 3 margins mul add
  1098.       dup margins sub exch translate
  1099.       flip-songs
  1100.         {
  1101.       columns-horizontally not
  1102.       { 0 total-width neg margins add translate }
  1103.       if
  1104.       songs-go-inside
  1105.       { list-height margins add neg total-width neg margins add translate }
  1106.       if
  1107.     }
  1108.         { songs-go-inside
  1109.       { list-height margins add total-width translate }
  1110.       if }
  1111.       ifelse
  1112.       one-column { margins 0 translate } if    % hack
  1113.       /iw inner-width def
  1114.       /inner-width list-height def
  1115.       /list-height iw def
  1116.       /total-width inner-width margins dup add add def
  1117.     } if
  1118.  
  1119.     one-column
  1120.     { double-album-p not { [ albumname1 /Title ] } if
  1121.       songs1 aload pop
  1122.       double-album-p not { () [ albumname2 /Title ] } if
  1123.       songs2 aload pop
  1124.       songs1 length songs2 length add
  1125.       double-album-p not { 3 add } if
  1126.       array astore
  1127.       /songs1 exch def
  1128.       /songs2 [] def
  1129.       double-album-p { print-inner-album-titles } if
  1130.       set-songfont
  1131.       1 print-songs
  1132.     }
  1133.     { print-inner-album-titles
  1134.       set-songfont
  1135.       0 print-songs
  1136.       1 print-songs }
  1137.     ifelse
  1138.  
  1139.     print-dates
  1140.     frobbed-columns { DATp {DAT-sizes} {cassette-sizes} ifelse } if
  1141.   grestore
  1142.   gsave
  1143.     90 rotate ttx tty translate
  1144.     -90 rotate margins 2 add dup translate
  1145.     dolby false eq not { draw-dolby } if
  1146.   grestore
  1147.   reset
  1148.  } bdef
  1149.  
  1150.  
  1151. %% Dolby symbols.  This code is derived from code written by Michael L. Brown.
  1152. %%
  1153. /draw-dolby-internal {
  1154.   gsave
  1155.     dup () eq
  1156.     { pop }
  1157.     {
  1158.       % text
  1159.       /Helvetica-Bold findfont 36 scalefont setfont
  1160.       92 12 moveto
  1161.       dup stringwidth pop /dolbytextw exch def
  1162.       show % from stack
  1163.       4 setlinewidth
  1164.       82 2 moveto
  1165.       0 46 rlineto
  1166.       dolbytextw 20 add 0 rlineto
  1167.       0 -46 rlineto
  1168.       closepath stroke
  1169.       % Trademark
  1170. % aaah, who needs this.
  1171. %      /Helvetica-Bold findfont 28 scalefont setfont
  1172. %      dolbytextw 110 add 29.5 moveto
  1173. %      (TM) show
  1174.     }
  1175.     ifelse
  1176.     % left D box
  1177.     0 0 moveto 0 50 rlineto 32 0 rlineto 0 -50 rlineto closepath fill
  1178.     % right D box
  1179.     38 0 moveto 0 50 rlineto 32 0 rlineto 0 -50 rlineto closepath fill
  1180.     1.0 setgray
  1181.     4 setlinewidth
  1182.     % left D
  1183.     10 8 moveto 0 34 rlineto stroke
  1184.     gsave
  1185.       newpath
  1186.       1.0 1.2142857 scale
  1187.       12 20.588236 14 270 90 arc fill
  1188.     grestore
  1189.     % right D
  1190.     60 8 moveto 0 34 rlineto stroke
  1191.     gsave
  1192.       newpath
  1193.       1.0 1.2142857 scale
  1194.       58 20.588236 14 90 270 arc fill
  1195.     grestore
  1196.     0.0 setgray
  1197.   grestore
  1198. } bdef
  1199.  
  1200. /draw-dolby {  % stack: x y
  1201.                % draw a dolby symbol at x,y, with a boxed string next to it.
  1202.            % if string=(), don't draw box.  DD symbol is 1 point square.
  1203.   gsave
  1204.     0.0143 9 mul dup scale
  1205.     dolby type /stringtype eq
  1206.     { dolby draw-dolby-internal }
  1207.     { /Helvetica-Bold findfont 36 scalefont setfont
  1208.       gsave
  1209.     5 setlinewidth
  1210.     /d dolby 3 string cvs def
  1211.     0 0 d stringwidth pop 12 add -36 box stroke
  1212.     7 7 translate 0 0 moveto d show
  1213.       grestore
  1214.     }
  1215.     ifelse
  1216.   grestore
  1217. } bdef
  1218.  
  1219. /Dolby  { /dolby () def } def
  1220. /DolbyB { /dolby (DOLBY  B) def } def
  1221. /DolbyC { /dolby (DOLBY  C) def } def
  1222. /AAD    { /dolby /AAD def } def
  1223. /DAD    { /dolby /DAD def } def
  1224. /ADD    { /dolby /ADD def } def
  1225. /DDD    { /dolby /DDD def } def
  1226. /dbx    { /dolby /dbx def } def
  1227.  
  1228. %%% Case-insensitive dictionary lookup.  Yowza.
  1229.  
  1230. /nsdc-buf 255 string def
  1231. /nstring-downcase { % target-string source-string
  1232.                  % convert a string to lowercase; copies source-string
  1233.             % into target-string, doing the conversion.  The two 
  1234.             % strings may be the same, and the source-string may
  1235.                 % be a 'name'.
  1236.   dup type /nametype eq { nsdc-buf cvs } if
  1237.   0 exch
  1238.   { dup dup 65 ge
  1239.     exch 90 le and
  1240.      { 32 add } if
  1241.     exch dup
  1242.     4 1 roll exch
  1243.     2 index 5 1 roll
  1244.     put 1 add
  1245.   } forall
  1246.   pop
  1247. } bdef
  1248.  
  1249. /CIget { % like get, but uses a lowercase version of the string.
  1250.     dup length string exch nstring-downcase get
  1251. } bdef
  1252.  
  1253. /CIput { % like put, but uses a lowercase version of the string.
  1254.     exch dup length string exch nstring-downcase exch put
  1255. } bdef
  1256.  
  1257. /CIknown { % like known, but uses a lowercase version of the string.
  1258.     dup length string exch nstring-downcase known
  1259. } bdef
  1260.  
  1261.  
  1262. % Dictionaries for storing magic band-name-and-icon-rendering functions.
  1263. %
  1264. /magic-name-dict 200 dict def
  1265. /magic-icon-dict 200 dict def
  1266.  
  1267. % Invoke the magic band-name-rendering function for the current band.
  1268. %
  1269. /magic-icon
  1270. { magic-icon-dict bandname1 CIknown
  1271.   { magic-icon-dict bandname1 CIget exec }
  1272.   { magic-icon-dict /default-icon-printer known
  1273.     { magic-icon-dict /default-icon-printer get exec }
  1274.     if }
  1275.   ifelse
  1276. } bdef
  1277.  
  1278. /magic-name  { magic-name-dict bandname1 CIget 0 get exec } bdef
  1279. /magic-name2 { magic-name-dict bandname2 CIget 0 get exec } bdef
  1280.  
  1281. /magic-name-width { magic-name-dict bandname1 CIget 1 get } bdef
  1282.  
  1283.  
  1284. % Decide whether this band has a magic rendering function.
  1285. %
  1286. /check-magic {
  1287.   /magic-name-p magic-name-dict bandname1 CIknown def
  1288.   /magic-icon-p magic-icon-dict bandname1 CIknown 
  1289.         magic-icon-dict /default-icon-printer known or
  1290.   def
  1291. } bdef
  1292.  
  1293.  
  1294. % Define a new magic-name printer.
  1295. /define-magic-name-printer {   % arguments: bandname procedure width
  1296.    2 array astore
  1297.    magic-name-dict  % stack: band [proc w] dict
  1298.    3 1 roll         % stack: dict band [proc w]
  1299.    CIput
  1300. } bdef
  1301.  
  1302.  
  1303. /dump-internal {
  1304.   DATp { tick 2 eq {550} { tick 1 eq {300} {50} ifelse } ifelse }
  1305.        { tick 1 eq {360} {50} ifelse } ifelse
  1306.   -100 draw-tape-label
  1307.   tick DATp { 2 } { 1 } ifelse eq
  1308.   { showpage } if
  1309.   /tick tick 1 add DATp { 3 } { 2 } ifelse mod def
  1310.   reset
  1311. } bdef
  1312.  
  1313. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1314. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1315. %%%%%%%                                %%%%%%%%
  1316. %%%%%%%            The user-level functions.        %%%%%%%%
  1317. %%%%%%%                                %%%%%%%%
  1318. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1319.  
  1320. /two-albums {    % arguments:  bandname album1 date1 album2 date2 songs1 songs2
  1321.   /songs2 exch def
  1322.   /songs1 exch def
  1323.   /date2 exch def
  1324.   /albumname2 exch def
  1325.   /date1 exch def
  1326.   /albumname1 exch def
  1327.   /bandname1 exch def
  1328.   /same-band-p true def
  1329.   /band-font-height  0.6 def
  1330.   /album-font-height 0.4 def
  1331.   check-magic
  1332.   dump-internal
  1333. } bdef
  1334.  
  1335.  
  1336. /two-bands { %args: bandname1 album1 date1 songs1 bandname2 album2 date2 songs2
  1337.   /songs2 exch def
  1338.   /date2 exch def
  1339.   /albumname2 exch def
  1340.   /bandname2 exch def
  1341.   /songs1 exch def
  1342.   /date1 exch def
  1343.   /albumname1 exch def
  1344.   /bandname1 exch def
  1345.   /band-font-height  0.4 def
  1346.   /album-font-height 0.4 def
  1347.   /magic-name-p false def
  1348.   /magic-icon-p false def
  1349. %  check-magic
  1350.   dump-internal
  1351. } bdef
  1352.  
  1353.  
  1354. /double-album {    % arguments:  bandname album date songs1 songs2
  1355.   /songs2 exch def
  1356.   /songs1 exch def
  1357.   /date1 exch def
  1358.   /albumname1 exch def
  1359.   /bandname1 exch def
  1360.   /band-font-height  0.6 def
  1361.   /album-font-height 0.6 def
  1362.   /double-album-p true def
  1363.   /same-band-p true def
  1364.   check-magic
  1365.   dump-internal
  1366. } bdef
  1367.  
  1368.  
  1369. /N-albums { %args:  bandname album1.1 album1.2 date1 album2.1 album2.2 date2 songs1 songs2
  1370.   /songs2 exch def
  1371.   /songs1 exch def
  1372.   /date2 exch def
  1373.   /albumname4 exch def
  1374.   /albumname2 exch def
  1375.   /date1 exch def
  1376.   /albumname3 exch def
  1377.   /albumname1 exch def
  1378.   /bandname1 exch def
  1379.  
  1380.   /band-font-height 0.6 def
  1381.   () albumname3 eq () albumname4 eq and
  1382.   { /album-font-height 0.4 def }
  1383.   { () albumname3 eq () albumname4 eq or
  1384.     { /album-font-height 0.3125 def }
  1385.     { /album-font-height 0.21875 def }
  1386.     ifelse }
  1387.   /same-band-p band-font-height 0.6 eq def
  1388.   ifelse
  1389.  
  1390.   check-magic
  1391.   dump-internal
  1392. } bdef
  1393.  
  1394.  
  1395. /two-bands-N-albums { % arguments:  band1 album1.1 album1.2 date1 songs1 band2 album2.1 album2.2 date2 songs2
  1396.   /songs2 exch def
  1397.   /date2 exch def
  1398.   /albumname4 exch def
  1399.   /albumname2 exch def
  1400.   /bandname2 exch def
  1401.   /songs1 exch def
  1402.   /date1 exch def
  1403.   /albumname3 exch def
  1404.   /albumname1 exch def
  1405.   /bandname1 exch def
  1406.  
  1407.   /band-font-height 0.4 def
  1408.   () albumname3 eq () albumname4 eq and
  1409.   { /album-font-height 0.4 def }
  1410.   { () albumname3 eq () albumname4 eq or
  1411.     { /album-font-height 0.3125 def }
  1412.     { /album-font-height 0.21875 def }
  1413.     ifelse }
  1414.   ifelse
  1415.   /magic-name-p false def
  1416.   /magic-icon-p false def
  1417.   dump-internal
  1418. } bdef
  1419.  
  1420. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1421. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1422. %%%%%%%                                %%%%%%%%
  1423. %%%%%%%            The Magic-Name Printers.        %%%%%%%%
  1424. %%%%%%%                                %%%%%%%%
  1425. %%%%%%%    These routines will be automatically invoked to    %%%%%%%%
  1426. %%%%%%%    draw certain band-names, so that you can have    %%%%%%%%
  1427. %%%%%%%    really hi-tech tape-labels.  Add more!        %%%%%%%%
  1428. %%%%%%%                                %%%%%%%%
  1429. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1430.  
  1431.  
  1432. %%% Draw "Front 242" as a long, thin "front" over a long, tall "242".
  1433. %%%
  1434. (Front 242)
  1435.   {
  1436.     gsave
  1437.       0 -0.1 translate
  1438.       0.95 1 scale
  1439.       /Helvetica-Bold findfont [ 1.35 0 0 0.4 0 0 ] makefont  setfont
  1440.       0 0.58 moveto
  1441.       (FRONT) show
  1442.       /Helvetica-Bold findfont [ 2.85 0 0 0.7 0 0 ] makefont  setfont
  1443.       0 0 moveto (242) show
  1444.     grestore
  1445.   } bind
  1446.   4
  1447. define-magic-name-printer
  1448.  
  1449. %%% Draw "Orchestral Manoeuveres in the Dark" on two lines; use the
  1450. %%% "oe" character.
  1451. %%%
  1452. (Orchestral Manoeuveres in the Dark)
  1453.   {
  1454.     gsave
  1455.       0 -0.1 translate
  1456.       0.7 1 scale
  1457.       /Helvetica-Bold findfont [0.45 0 0 0.65 0 0] makefont setfont
  1458.       0.1 0.35 moveto
  1459.       (ORCHESTRAL MAN\352UVRES) show
  1460.       /Helvetica findfont [1 0 0 0.3 0 0] makefont setfont
  1461.       0.1 0.05 moveto
  1462.       (IN THE DARK) show
  1463.     grestore
  1464.   } bind
  1465.   4.2
  1466. define-magic-name-printer
  1467.  
  1468.  
  1469. %%% Draw "OMD" in the same way as "Orchestral Manoeuveres in the Dark".
  1470. %%%
  1471. magic-name-dict (OMD) cvn
  1472.   magic-name-dict (Orchestral Manoeuveres in the Dark) cvn CIget
  1473. CIput
  1474.  
  1475.  
  1476. %%% Draw "New Order" as a dark "New" over an outlined "Order", staggered.
  1477. %%%
  1478.  
  1479. (New Order)
  1480.   {
  1481.     gsave
  1482.       0 -0.1 translate
  1483.       0.02 setlinewidth
  1484.       1.5 setmiterlimit
  1485.       /Helvetica-Bold findfont setfont
  1486.       0 0.1 moveto
  1487.       (Order) true charpath stroke
  1488.       1.57 0.1 moveto
  1489.       (new) show
  1490.     grestore
  1491.   } bind
  1492.   3.2
  1493. define-magic-name-printer
  1494.  
  1495.  
  1496. %%% Draw "Siouxsie and the Banshees" with varying-height letters,
  1497. %%% like on the early albums.
  1498. %%%
  1499.  
  1500. (Siouxsie and the Banshees)
  1501.   {
  1502.     gsave
  1503.       0 -0.1 translate
  1504.       0.7 0.4 scale
  1505.       0.1 0.25 translate
  1506.       /big-font   /Helvetica findfont [ 0.5 0 0 2.2 0 0 ] makefont  def
  1507.       /med-font   /Helvetica findfont [ 0.5 0 0 1.1 0 0 ] makefont  def
  1508.       /small-font /Helvetica findfont [ 0.5 0 0 1.5 0 0 ] makefont  def
  1509.       0 -0.1 5.9 -1.8 box clip newpath
  1510.       0 0 moveto
  1511.       big-font setfont (SI) show
  1512.       0 0.8 rmoveto
  1513.       small-font setfont (o) show
  1514.       0 -0.8 rmoveto
  1515.       big-font setfont (UXSIE) show
  1516.       med-font setfont
  1517.       currentpoint /y exch def /x exch def
  1518.       .07 0.85 rmoveto
  1519.       (and) show x y moveto (THE) show
  1520.       big-font setfont (BANSHE) show
  1521.       0 0.8 rmoveto
  1522.       small-font setfont (e) show
  1523.       0 -0.8 rmoveto
  1524.       big-font setfont (S) show
  1525.     grestore
  1526.   } bind
  1527.   4
  1528. define-magic-name-printer
  1529.  
  1530.  
  1531. %%% Draw "Cabaret Voltaire" in their font.  I should probably have
  1532. %%% implemented this as a font, instead of as a set of procedures,
  1533. %%% but life's too short.
  1534. %%%
  1535.  
  1536. (Cabaret Voltaire)
  1537.   {
  1538.     gsave
  1539.       0 -0.1 translate
  1540.       0.5 0.5 scale
  1541.       1.8 setmiterlimit 0.1 setlinewidth
  1542.       0.2 0.3 moveto cabaret-c 0.5 0 rmoveto cabaret-a
  1543.       0.7 0 rmoveto cabaret-b  0.6 0 rmoveto cabaret-a
  1544.       0.7 0 rmoveto cabaret-R  0.6 0 rmoveto cabaret-e
  1545.       0.4 0 rmoveto cabaret-T  1.0 0 rmoveto cabaret-v
  1546.       0.6 0 rmoveto cabaret-o  0.7 0 rmoveto cabaret-L
  1547.       0.6 0 rmoveto cabaret-t  0.4 0 rmoveto cabaret-A
  1548.       0.45 0 rmoveto cabaret-I 0.45 0 rmoveto cabaret-r
  1549.       0.5 0 rmoveto cabaret-e
  1550.     grestore
  1551.   } bind
  1552.   4.1
  1553. define-magic-name-printer
  1554.  
  1555. %% Internal procedures to the "Cabaret Voltaire" printer.
  1556. %%
  1557. /cabaret-c { gsave currentpoint translate newpath 0.5 0.25 moveto 0.25 0 lineto
  1558.   0 0.5 lineto 0.25 1 lineto 0.5 0.75 lineto stroke grestore } bdef
  1559.  
  1560. /cabaret-a { gsave currentpoint translate newpath 0.25 0.75 moveto 0.5 1 lineto
  1561.    0.5 0 lineto 0 0.5 lineto 0.5 0.5 lineto stroke grestore } bdef
  1562.  
  1563. /cabaret-b { gsave currentpoint translate newpath 0 1 moveto 0 0 lineto 
  1564.   0.5 0.5 lineto 0 0.5 lineto stroke grestore } bdef
  1565.  
  1566. /cabaret-R { gsave currentpoint translate newpath 0 0 moveto 0 1 lineto 0.5 0.5
  1567.   lineto 0 0.5 lineto 0.25 0.5 moveto 0.5 0 lineto stroke grestore } bdef
  1568.  
  1569. /cabaret-e { gsave currentpoint translate newpath 0.375 0.25 moveto 
  1570.   0.25 0 lineto 0 0.5 lineto 0.25 1 lineto 0.5 0.5 lineto 0 0.5 lineto stroke
  1571.   grestore } bdef
  1572.  
  1573. /cabaret-T { gsave currentpoint translate newpath 0 1 moveto 0.5 1 lineto 
  1574.   0.25 1 moveto 0.25 0 lineto stroke grestore } bdef
  1575.  
  1576. /cabaret-v { gsave currentpoint translate newpath
  1577.   0 1 moveto 0.25 0 lineto 0.5 1 lineto stroke grestore } bdef
  1578.  
  1579. /cabaret-o { gsave currentpoint translate newpath 0.25 1 moveto 0.5 0.5 lineto
  1580.   0.25 0 lineto 0 0.5 lineto closepath stroke grestore } bdef
  1581.  
  1582. /cabaret-L { gsave currentpoint translate newpath 0 1 moveto
  1583.     0 0.10 lineto 0.5 0.10 lineto stroke grestore } bdef
  1584.  
  1585. /cabaret-t { gsave currentpoint translate newpath 0 1 moveto
  1586.   0 0 lineto 0.275 0.25 lineto stroke 0 0.75 moveto 0.25 0.75 lineto stroke
  1587.   grestore } bdef
  1588.  
  1589. /cabaret-A { gsave currentpoint translate newpath 0 0 moveto 0.25 1 lineto
  1590.   0.5 0 lineto stroke 0.125 0.5 moveto 0.375 0.5 lineto stroke grestore } bdef
  1591.  
  1592. /cabaret-I { gsave currentpoint translate newpath 0.25 0 moveto 0.25 1 lineto
  1593.   stroke grestore } bdef
  1594.  
  1595. /cabaret-r { gsave currentpoint translate newpath 0 0 moveto 0 1 lineto stroke
  1596.   0 0.75 moveto 0.25 1 lineto 0.5 0.75 lineto stroke grestore } bdef
  1597.  
  1598.  
  1599. (Nine Inch Nails)
  1600.   { gsave
  1601.       0 0 moveto
  1602.       /Helvetica findfont [ 1 0 0 1 0 0] makefont
  1603.       /Helvetica findfont [-1 0 0 1 0 0] makefont
  1604.       dup setfont
  1605.       gsave
  1606.         90 rotate 0.3 -0.2 translate 0.7 0.7 scale NiNbox
  1607.       grestore
  1608.       /nw (n)stringwidth pop neg def
  1609.       0.6 0 moveto
  1610.       nw 0 rmoveto (n)show
  1611.       nw 0 rmoveto exch dup setfont (i)show
  1612.       nw 0 rmoveto exch dup setfont (n)show
  1613.       nw 0 rmoveto exch dup setfont (e i)show
  1614.       nw 0 rmoveto exch dup setfont (n)show
  1615.       nw 0 rmoveto exch dup setfont (ch )show
  1616.       nw 0 rmoveto exch dup setfont (n)show
  1617.       nw 0 rmoveto exch dup setfont (ails)show
  1618.       pop pop
  1619.     grestore } bind
  1620.   6.3
  1621. define-magic-name-printer
  1622.  
  1623.  
  1624. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1625. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1626. %%%%%%%                                %%%%%%%%
  1627. %%%%%%%            The Magic-Icon Printers.        %%%%%%%%
  1628. %%%%%%%                                %%%%%%%%
  1629. %%%%%%%    These routines will be automatically invoked to    %%%%%%%%
  1630. %%%%%%%    draw icons for tapes of certain band, again for    %%%%%%%%
  1631. %%%%%%%    added whizziness.  Add more!                 %%%%%%%%
  1632. %%%%%%%                                %%%%%%%%
  1633. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1634.  
  1635. magic-icon-dict (Love and Rockets) cvn { L&R } CIput
  1636.  
  1637. /L&R {    % Love and Rockets logo.
  1638.   gsave
  1639.    0.005 setlinewidth
  1640.    gsave
  1641.      newpath 0.5 0 moveto 0 0 0.5 0 360 arc clip newpath
  1642.      -0.5 -0.5 1 -1 box fill
  1643.      1 setgray
  1644.      -0.1875 -0.5 0.375 -1 box fill
  1645.    grestore
  1646.    newpath 0.5 0 moveto 0 0 0.5 0 360 arc stroke
  1647.    L&R-rocket
  1648.    L&R-heart
  1649.   grestore
  1650.   } bdef
  1651.  
  1652. /L&R-rocket {
  1653.   -0.0625 0.3125 0.125 0.625 box fill   % shaft
  1654.   -0.0625 0.3125 moveto 0.125 0 rlineto % head
  1655.    0 0.5 lineto closepath fill
  1656.   -0.0625 -0.2 moveto -0.03 -0.03 rlineto % lfin
  1657.    0 -0.25 rlineto 0 -0.3125 lineto fill
  1658.    0.0625 -0.2 moveto 0.03 -0.03 rlineto  % rfin
  1659.    0 -0.25 rlineto 0 -0.3125 lineto fill
  1660.   } bdef
  1661.  
  1662. /L&R-heart-path {
  1663.   newpath
  1664.   0 0.125 moveto
  1665.   -0.0625 0.125 0.0625 0 180 arc
  1666.   0 -0.125 lineto
  1667.   0.125 0.125 lineto
  1668.    0.0625 0.125 0.0625 0 180 arc
  1669.   closepath
  1670.   } bdef
  1671.  
  1672. /L&R-heart {
  1673.   0.5 setgray L&R-heart-path fill
  1674.   0 setgray L&R-heart-path stroke
  1675.   } bdef
  1676.  
  1677.  
  1678. magic-icon-dict (Bauhaus) cvn { BEGA } CIput
  1679.  
  1680. /BEGA {  % Beggars Banquet logo.
  1681.   gsave
  1682.    0.005 setlinewidth
  1683.    newpath 0.5 0 moveto 0 0 0.5 0 360 arc stroke
  1684.    newpath 0.5 0 moveto 0 0 0.5 0 360 arc clip newpath
  1685.    0     0.3333 moveto 0.25 0 rlineto 0 -0.25 rlineto stroke  % eye
  1686.    0.083 0.3333 0.1666 0.1666 box fill
  1687.    0.3125 0.5 0.02 0.5 box fill                         % nose v
  1688.    0.2125 0 moveto 0.3125 0 lineto stroke               % nose h
  1689.    0.2725 0 0.04 0.3 box fill                           % mouth v
  1690.    0.2125 -0.125 0.1 0.03 box fill                      % mouth h
  1691.    0.125 -0.3 0.155 0.25 box fill                       % chin v
  1692.    0.0625 -0.3 moveto 0.28 -0.3 lineto stroke           % chin h
  1693.   grestore
  1694.   } bdef
  1695.  
  1696. magic-icon-dict (Nitzer Ebb) cvn { NE-dispatch } CIput
  1697.  
  1698. /NE-dispatch {  % draw one of three nitzer ebb logos, depending on albumname.
  1699.   albumname1 (That Total Age) eq
  1700.   { NE3 }
  1701.   { albumname1 (Belief) eq
  1702.     { NE-belief }
  1703.     { NE-star-and-gear }
  1704.     ifelse
  1705.   }
  1706.   ifelse
  1707. } bdef
  1708.  
  1709. /NE3 {  % Nitzer Ebb "That Total Age" logo.
  1710.   gsave
  1711.     -0.175 0.5 0.35 1 box fill
  1712.     0.5 setgray
  1713.     /s 0.3 def
  1714.     gsave 0 -0.3333 translate s s scale
  1715.      NE-hammer grestore
  1716.     gsave s s scale
  1717.      starpath fill grestore
  1718.     gsave 0 0.3333 translate s s scale
  1719.      NE-gear grestore
  1720.   grestore
  1721.   } bdef
  1722.  
  1723. /NE-gear {
  1724.   gsave
  1725.     0.1 setlinewidth
  1726.     0 0 0.375 0 360 arc stroke
  1727.     0 1 8
  1728.      { -0.075 0.5 0.15 0.1 box fill
  1729.        45 rotate
  1730.      } for
  1731.   grestore
  1732.   } bdef
  1733.  
  1734. /NE-hammer {
  1735.   gsave
  1736.     0.05 0 translate
  1737.     45 rotate
  1738.     -0.1 0.4 0.2 0.85 box fill
  1739.     -0.3 0.4 0.45 0.2 box fill
  1740.      0.15 0.4 moveto
  1741.      0.35 0.2 lineto
  1742.      0.15 0.2 lineto
  1743.      closepath fill
  1744.   grestore
  1745.   } bdef
  1746.  
  1747. /starpath {
  1748.   newpath 0 0.5 moveto
  1749.   0 1 4 { 144 rotate 0 0.5 lineto } for
  1750.   closepath
  1751.   } bdef
  1752.  
  1753.  
  1754. /NE-star-and-gear {  % Nitzer Ebb "Warsaw Ghetto" logo.
  1755.   gsave
  1756.    0.8 0.8 scale
  1757.    NE-split-gear
  1758.   grestore
  1759.   NE-split-star
  1760.   } bdef
  1761.  
  1762. /NE-split-star {
  1763.   gsave
  1764.     0.02 setlinewidth
  1765.     0 setgray starpath stroke
  1766.     starpath clip newpath
  1767.     0 setgray 0 0.5 0.5 1 box fill
  1768.     1 setgray -0.5 0.5 0.5 1 box fill
  1769.   grestore
  1770.   } bdef
  1771.  
  1772. /NE-gear-path {
  1773.     0 0.5 moveto
  1774.     0 1 11
  1775.       { -0.075 0.5 lineto
  1776.         -0.075 0.45 lineto
  1777.         30 rotate
  1778.          0.075 0.45 lineto % ## make this a curveto!!
  1779.          0.075 0.45 lineto
  1780.          0.075 0.5 lineto
  1781.       } for
  1782.     closepath
  1783.   } bdef
  1784.  
  1785.  
  1786. /NE-split-gear {
  1787.   gsave
  1788.     % I tried doing this with eopath, but it doesn't work in Amiga Post 1.1.
  1789.     0.005 setlinewidth
  1790.     0 setgray
  1791.     NE-gear-path stroke
  1792.     NE-gear-path clip newpath
  1793.     -0.5 0.5 0.5 1 box fill
  1794.     1 setgray 0.4 0 moveto 0 0 0.4 0 360 arc fill
  1795.     0 setgray 0.4 0 moveto 0 0 0.4 0 360 arc stroke
  1796.   grestore
  1797.   } bdef
  1798.  
  1799. %% What follows is a bitmap of the "grainy eye" image from "Belief".
  1800. %% Digitized on an Amiga, converted to PS with Jef Poskanzer's PBM toolkit.
  1801. %% I would have stored the bitmap run-length encoded, but that would have
  1802. %% taken some work, as the only rle-decoders I have expect to draw the image
  1803. %% as they decode, and not store it away for future use as we do here.
  1804. %%
  1805. /NE-belief {
  1806.   gsave
  1807.   0.8 0.8 scale
  1808.   -0.5 -0.5 translate
  1809.   82 71 1
  1810.   [ 82 0 0 -71 0 71 ]
  1811.   %% 28 lines of bitmap data... pinhead representation (tm).
  1812.   {<000000000000000000003f000000000000000000003f000000000000000000003f00000000
  1813.    0000000000003f000000000000000000003f03ffffffffffeffff0003f03ffffffdf3fffffb
  1814.    0003f03fffff800002ff661003f03ffffe00000060ffb003f03ffff8000000001fc003f007f
  1815.    fc00000000067c003f007fe000000000001d803f001f00000000000008203f0000000000000
  1816.    00006003f000000000000000004003f0000000000001e0000003f0000000000003f8000003f
  1817.    0000000000007d0000003f000000000000390000003f000000000000000000003f000000000
  1818.    000000000003f000000000000000000003f000000000000000000003f000000002000000000
  1819.    003f0000000ff000000000003f0000001fe006000000003f0000003f8046000000003f02000
  1820.    07fc1c6000000003f0200007fb780000000403f0300007fc70800000f803f0300003ff03040
  1821.    0008883f030001ffffff800018003f0380004ffffe0001f8003f03800007fffc0003fc003f0
  1822.    380001780000053f4003f03800001c8000197f7003f03800001f80001fffe003f03800046c0
  1823.    0037ffbf003f03800007f801ffffff803f0380000ffffffffff0003f03800003fffffffffe0
  1824.    03f03800002fffffffffe003f03c00000fffffffff8003f03c00000fffffffff8003f03c000
  1825.    01fffffffff0003f03c000007ffffffff0003f03c000001ffffffff0003f03c000007ffffff
  1826.    fe0003f03c00000ffffffffe0003f03e000007fffffffe0003f03e000003fffffff40003f03
  1827.    e000001fffffff80003f03e000001ffffffd80003f03f0000003fffffe00003f03f0000001f
  1828.    ffffc00003f03f0000001fffffc00003f03f0000000fffffc00003f03f00000017ffff80000
  1829.    3f03f0000001fffffc00003f03f0000000fffff800003f03e0000000fffff800003f03e0000
  1830.    0003ffff000003f03e000000017fff000003f0300000000179fe000003f02000000001f0ae0
  1831.    00003f000000000001000000003f0000000000007f0000003f000000000000000000003f000
  1832.    000000000000000003f000000000000000000003f000000000000000000003f000000000000
  1833.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1834.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1835.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1836.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1837.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1838.    000000000000000000000000000000000000000000000000000000000000000000000000000
  1839.    000000000000000000000000>}
  1840.   image
  1841.   grestore
  1842.   } bdef
  1843.  
  1844. magic-icon-dict (Nine Inch Nails) cvn { NiNbox } CIput
  1845.  
  1846. /NiNbox {
  1847.    gsave
  1848.     0.7 0.7 scale
  1849.     /Helvetica-Bold findfont [ 1 0 0 1 0 0] makefont
  1850.     /Helvetica-Bold findfont [-1 0 0 1 0 0] makefont
  1851.     dup setfont
  1852.     (NIN)stringwidth pop 2 div -0.3 translate
  1853.     0 0 moveto
  1854.     /Nw (N)stringwidth pop neg def
  1855.     Nw 0 rmoveto (N)show Nw 0 rmoveto
  1856.     exch dup setfont (IN)show exch
  1857.     0.1 setlinewidth
  1858.     -0.1 -0.15 Nw (IN)stringwidth pop add 0.2 add -1.05 box stroke
  1859.     pop pop
  1860.     grestore
  1861. } bdef
  1862.  
  1863. %% Kate Bush logo by Christer Lindh <clindh@abalon.se>.  
  1864. %% This draws the old-style KB logo. If it goes on the outside 
  1865. %% but songs go inside, it is rotates 90 degrees.
  1866. %%
  1867. /KB {   gsave
  1868.     .87 .87 scale
  1869. %    songs-go-inside icons-go-inside not and
  1870. %        { -0.5 0.54 translate -90 rotate }
  1871. %        { -0.5 -0.5 translate }
  1872. %        ifelse
  1873.     0.5 0.5 0.5 0 360 arc fill stroke
  1874.     1 setgray
  1875.     0.3 setlinewidth
  1876.     0.14 0.68 moveto
  1877.     0.14 0 lineto stroke
  1878.  
  1879.     0.08 setlinewidth
  1880.     0 0.80 moveto
  1881.     1 0.80 lineto
  1882.     0.45 0.80 moveto
  1883.     0.45 0 lineto stroke
  1884.  
  1885.     0.06 setlinewidth
  1886.     0.45 0.45 moveto
  1887.     1 0.875 lineto
  1888.     0.60 0.55 moveto
  1889.     0.9 0.1 lineto stroke
  1890.    grestore
  1891. } bdef
  1892. magic-icon-dict (Kate Bush) cvn { KB } CIput
  1893.  
  1894.  
  1895. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1896. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1897. %%EndProlog
  1898.  
  1899.  
  1900. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1901. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1902. %%%%%%%                                %%%%%%%%
  1903. %%%%%%%            Begin Example-Land.            %%%%%%%%
  1904. %%%%%%%        Modify what lies after this point.        %%%%%%%%
  1905. %%%%%%%                                %%%%%%%%
  1906. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1907.  
  1908.  
  1909. %% Set this string to what you want printed on the back flap, or an array
  1910. %% of strings (one string per line).
  1911. %%
  1912. /signature (From the Jamie Zawinski Collection of Fine Tapes) def
  1913.  
  1914. /band-font /Helvetica def        % The font for band-names.
  1915. /album-font /Helvetica def        % The font for album-names.
  1916.  
  1917. % Uncomment the next line to produce labels for Digital Audio Tapes.
  1918. %DAT-sizes
  1919.  
  1920. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1921. %%%%%%  An example of the normal case: two albums by one band,    %%%%%%%%
  1922. %%%%%%  with one album on each side of the tape.        %%%%%%%%
  1923. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1924.  
  1925. (Gang of 4)        (Entertainment)        (1979)
  1926.             (Solid Gold)        (1981)
  1927. [(Ether)
  1928.  (Natural's not in it)
  1929.  (Not Great Men)
  1930.  (Damaged Goods)
  1931.  (Return the Gift)
  1932.  (Guns before Butter)
  1933.  ()
  1934.  (I Found that Essence Rare)
  1935.  (Glass)
  1936.  (Contract)
  1937.  (At Home He's a Tourist)
  1938.  (5:45)
  1939.  (Anthrax)
  1940.  ()
  1941.  (To Hell With Poverty)
  1942.  (Capital it Fails Us Now)
  1943.  ]
  1944. [(Paralysed)
  1945.  (What we All Want)
  1946.  (Why Theory)
  1947.  (If I could keep it for myself)
  1948.  (Outside the trains don't run on time)
  1949.  ()
  1950.  (Cheeseburger)
  1951.  (The Republic)
  1952.  (In the Ditch)
  1953.  (A Hole in the Wallet)
  1954.  (He'd send in the Army)
  1955.  ]
  1956. two-albums
  1957.  
  1958.  
  1959. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1960. %%%%%%  An example of a double album, which consumes both sides    %%%%%%%%
  1961. %%%%%%  of the tape.  Also an example of the automatic "magic    %%%%%%%%
  1962. %%%%%%  printer" feature, since the band name is known.        %%%%%%%%
  1963. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1964.  
  1965. (Front 242)        (Backcatalogue)        (1982-1985)
  1966.  
  1967. [[(U-Men (LP mix))        (3:12)]
  1968.  [(Geography II)        (1:08)]
  1969.  [(Kampfbereit)            (3:18)]
  1970.  [(Operating Tracks)        (3:48)]
  1971.  [(Geography I)            (2:16)]
  1972.  [(Take One)            (4:45)]
  1973.  [(Controversy Between)        (4:54)]
  1974.  [(Sample D)            (3:15)]
  1975.  ]
  1976. [[(Nomenklatura I)        (4:24)]
  1977.  [(Nomenklatura II)        (2:10)]
  1978.  [(Lovely Day)            (5:26)]
  1979.  [(Special Forces)        (5:30)]
  1980.  [(Commando Remix)        (9:03)]
  1981.  [(No Shuffle (single mix))    (3:45)]
  1982.  [(Don't Crash)            (4:51)]
  1983.  [(Funkahdafi)            (3:15)]
  1984.  [(Take One (live))        (5:00)]
  1985.  ]
  1986. double-album
  1987.  
  1988. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1989. %%%%%%  An example of a double album, which consumes both sides    %%%%%%%%
  1990. %%%%%%  of the tape.  The band name and album name are printed  %%%%%%%%
  1991. %%%%%%  in different fonts.  Also, there is a "Dolby B" logo.   %%%%%%%%
  1992. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1993.  
  1994. DolbyB
  1995. album-font band-font            % push the current values on the stack.
  1996. /band-font /Courier-Bold def        % redefine the album and band fonts.
  1997. /album-font /Times-Italic def
  1998.  
  1999. (bauhaus)               (1979-1983) ()
  2000. [(Kick in the Eye)
  2001.  (Hollow Hills)
  2002.  (In Fear of Fear)
  2003.  (Ziggy Stardust)
  2004.  (Silent Hedges)
  2005.  (Crack the Whip)
  2006.  (Third Uncle)
  2007.  (Spirit)
  2008.  (All We Ever Wanted was Everything)
  2009.  (She's in Parties)
  2010.  (Sanity Assassin)
  2011.  (untitled)
  2012.  ]
  2013. [(Double Dare)
  2014.  (In the Flat Field)
  2015.  (Dark Entries)
  2016.  (Stigmata Martyr)
  2017.  (Bela Lugosi's Dead)
  2018.  (Telegram Sam)
  2019.  (St. Vitus Dance)
  2020.  (Spy in the Cab)
  2021.  (Terror Couple Kills Colonel)
  2022.  (The Passion of Lovers)
  2023.  (Mask)
  2024.  ]
  2025. double-album                              % print the album...
  2026.  
  2027. /band-font exch def            % restore the fonts to the values that
  2028. /album-font exch def            % we pushed on the stack a while ago.
  2029.  
  2030. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2031. %%%%%%  An example of three albums by one band that happen to    %%%%%%%%
  2032. %%%%%%  fit on one tape - one album on the front and two on    %%%%%%%%
  2033. %%%%%%  the back.                        %%%%%%%%
  2034. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2035.  
  2036. (Shriekback)
  2037.   (Jamscience)    ()                    (1984)
  2038.   (Tench)    (Knowledge, Power, Truth and Sex)    (1982, 1984)
  2039.  
  2040. [(Under the Lights)
  2041.  (Building Up a New Home)
  2042.  (Hand on my Heart)
  2043.  (International)
  2044.  (Putting on the Pressure)
  2045.  (Party Line)
  2046.  (My Careful Hands)
  2047.  (Midnight Maps)
  2048.  ()
  2049.  (Working on the Ground)
  2050.  (Lined Up (instrumental))
  2051.  (Hapax Legomena)
  2052.  ]
  2053. [(Sexthinkone)
  2054.  (A Kind of Fascination)
  2055.  (All the Greek Boys)
  2056.  (Moth Loop)
  2057.  (Here Comes my Hand: Clap)
  2058.  ()
  2059.  [(Knowledge, Power, Truth and Sex) /Title]
  2060.  (Mercy Dash)
  2061.  (Achtung)
  2062.  (Hubris)
  2063.  (Suck)
  2064.  (Nerve)
  2065.  (Mistah Linn He Dead)
  2066.  ]
  2067. N-albums
  2068.  
  2069. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2070. %%%%%%  An example of two albums, each by different bands, with    %%%%%%%%
  2071. %%%%%%  one album on each side of the tape.            %%%%%%%%
  2072. %%%%%%  Also, the song listings are in one sideways column.     %%%%%%%%
  2073. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2074.  
  2075. /one-column true def
  2076. /columns-horizontally true def
  2077.  
  2078. (Revolting Cocks)    (Big Sexy Land)        (1986)
  2079.  
  2080. [[(38)                      (4:10)]
  2081.  [(We Shall Cleanse the World)          (5:34)]
  2082.  [(Attack Ships on Fire)          (4:55)]
  2083.  [(Big Sexy Land)              (3:57)]
  2084.  [(Union Carbide (West Virginia version)) (3:20)]
  2085.  [(TV Mind)                  (5:39)]
  2086.  [(No Devotion)                      ()]
  2087.  [(Union Carbide (Bhopal version))       (3:39)]
  2088.  [(You Often Forget (Malignant))       (8:28)]
  2089.  ]
  2090.  
  2091. (Sisters of Mercy)    (Floodland)        (1988)
  2092.  
  2093. [[(Dominion/Mother Russia)          (7:01)]
  2094.  [(Flood I)                  (6:22)]
  2095.  [(Lucretia My Reflection)          (4:57)]
  2096.  [(1959)                  (4:09)]
  2097.  [(This Corrosion)                    (10:55)]
  2098.  [(Flood II)                  (6:47)]
  2099.  [(Driven Like the Snow)          (6:27)]
  2100.  [(Neverland (a Fragment))          (2:46)]
  2101.  ]
  2102. two-bands
  2103.  
  2104. % reset this for the next tape
  2105. /one-column false def
  2106. /columns-horizontally false def
  2107.  
  2108. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2109. %%%%%%  An example of several EPs and singles by one band on    %%%%%%%%
  2110. %%%%%%  both sides of a tape.  Also, the band-name is printed    %%%%%%%%
  2111. %%%%%%  in a different font for this one.            %%%%%%%%
  2112. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2113.  
  2114. band-font            % push band-font on the stack..
  2115. /band-font /Times-Roman def    % change it...
  2116.  
  2117. (THE ART OF NOISE)
  2118.     (Who's Afraid of the Art of Noise?)    (Beatbox. Paranoimia.)  ()
  2119.     (The Art of Noise have Closed Up.)    (Legs. Peter Gunn.)    ()
  2120.  
  2121. [[(A Time for Fear (Who's Afraid?))    (1984)]
  2122.  [(Beatbox (Diversion One))        ()]
  2123.  [(Snapshot)                ()]
  2124.  [(Close to the Edit)            ()]
  2125.  [(Who's Afraid (of the Art of Noise?))    ()]
  2126.  [(Momento)                ()]
  2127.  [(How to Kill)                ()]
  2128.  [(Realization)                ()]
  2129.  [()                    ()]
  2130.  [(Beatbox (Battle))            (1983)]
  2131.  [(The Army Now)            ()]
  2132.  [(Donna)                ()]
  2133.  [(Bright Noise)            ()]
  2134.  [(Moments in Love)            ()]
  2135.  [()                    ()]
  2136.  [(Legs)                (1985)]
  2137.  ]
  2138. [[(Closely Closely (Enough's Enough!))    (1984)]
  2139.  [(Close Up (Hop))            ()]
  2140.  [(A Time to Hear (Who's Listening?))    ()]
  2141.  [()                    ()]
  2142.  [(Hoops and Mallets)            (1985)]
  2143.  [(Legs (Inside Legmix))        ()]
  2144.  [()                    ()]
  2145.  [(Paranoimia (Headroom Mix))        (1986)]
  2146.  [(Why Me?)                ()]
  2147.  [(A Nation Rejects)            ()]
  2148.  [()                    ()]
  2149.  [(Peter Gunn Theme)            (1986)]
  2150.  [(Something Always Happens)        ()]
  2151.  [()                    ()]
  2152.  [(Beatbox (Battle))            (1983)]
  2153.  ]
  2154. N-albums            % print the label...
  2155.  
  2156. /band-font exch def        % set band font back to what it was before.
  2157.  
  2158.  
  2159. %%Trailer
  2160. %%  This form should always be here at the end, to make sure that the
  2161. %%  final page is dumped even if there are an odd number of labels
  2162. %%  being printed.
  2163. %%
  2164. tick 0 ne { showpage } if
  2165.