+++ /dev/null
-\header{
-filename fugue1.ly
-title Fuga a 4
-description Das Wohltemperierte Clavier I, Fuga I (c-major)
-opus BWV 846
-composer Johann Sebastian Bach (1685-1750)
-enteredby Shay Rojansky
-copyright Public Domain
-}
-
-%{
-
-%}
-\version "0.1.1";
-
-
-global =
- \melodic {
- \meter 4/4; % should be \meter C
- }
-
-tenor =
- \melodic {
- \clef "violin";
- \octave c';
-
- \stem \down;
- r8 [c8 d e] [f. g32 f] [e8 a] |
- [d g] ~ [g16 a g f] [e f e d] [c d c 'b] |
- ['a8 fis] g4 ~ [g8 fis16 e] [f8 d] |
- [g f! e d] c r r g ~ |
-%% 5
- [g f16 e] f4 ~ [f16 f e8] d4 |
- [c8 f] r16 [g f e] [f8 d] g4 ~ |
- g4 r4 r2 |
- r1 |
- r8 [g8 a b] [c'. d'32 c'] [b8 e']
-%% 10
- [a d'] ~ [d'16 e' d' c'] b8 r8 r d |
- [e fis] [g. a32 g] [fis8 b e a] ~ |
- [a16 b a gis] [fis8 f!] [e d] ~ [d16 e fis gis] |
- [a gis a b] [gis fis gis a] b8 r8 r4 |
- r8 [c8 d e] \stem 1; [f. g32 f] [e8 a] |
-%% 15
- [d g] ~ [g16 a g f] e8 \stem -1; [e fis g] ~ |
- [g8 fis] [gis8 a] ~ [a g! a b] |
- \stem 0;
- [c'. d'32 c'] [b8 e'] [a d'] ~ [d'16 e' d' c'] |
- [b8 g' cis' d'] [e' cis' d' e' ] |
- \stem -1; a8 r8 r e [fis g] \stem 0; [a. b32 a] |
-%% 20
- [g8 c' fis b] ~ [b16 c' b a] \stem -1; [g fis e d] \stem 0; |
- e4 \stem -1; d ~ [d16 a g f!] [e g f! a] |
- g4 ~ [g16 a bes8] c'4 [d'8 g] |
- \stem 0; g4. f8 ~ [f e] d4 |
- \stem -1; e8 a4 g8 ~ [g8 f g a] |
-%% 25
- [bes8. c'32 b] [a8 d'] [g c'] ~ [c'16 d' c' bes] |
- [a bes a g] [f g f e] d4 ~ [d8. g16] |
- a4 r16 [f'16 d'8] e'2 |
- }
-
-
-soprane =
- \melodic {
- \octave c';
- \stem \up;
- r1 |
- r2 r8 [g8 a b] |
- [c'. d'32 c'] [b8 e'] [a d'] ~ [d'16 e' d' c'] |
- [b g a b] [c' b c' d'] [e' d' e' fis'] [g'8 b] |
-%% 5
- [c' a] [d'16 c' b a] [g8. g16] [f e f g] |
- [a g a b] c'2 b4 |
- \octave c'';
- r8 [c8 d e] [f. g32 f] [e8 a] |
- [d g] ~ [g16 a g f] [e8 a] ~ [a16 b a g] |
- f2 [e8. fis16] g4 ~
-%% 10
- g4 fis [g16 f! e d] [c d c 'b] |
- ['a16 c 'b 'a] 'g8 r8 r16 [c16 'b 'a] ['gis8 e] |
- [d c16 'b16] ['a 'gis 'a 'b] [c 'fis 'a 'gis] ['b8 'a16 'b]
- [c8 f e d] ~ [d c16 'b] ['b8. 'a16] |
- 'a4 r4 r2 |
-%% 15
- r2 r8 ['g8 'a 'b] |
- [c8. d32 c] ['b8 c] [d e] [f!. g32 f!] |
- [e8 a d g] ~ [g16 a g f] [e8 a] |
- [d8 bes] [a g16 f] [g f g e] [f g g f32 g] |
- [a16 cis d g] [e8. d16] d8 r8 r4 |
-%% 20
- r2 r4 r8 'g |
- ['a 'b] [c. d32 c] ['b8 e 'a d] ~ |
- [e16 e d c] ['b c d e] [f g a g] [f e d c] |
- 'b4 [c8 d] 'g c4 'b8 |
- c4 ['b8 'bes8] 'a d4 c8 |
-%% 25
- [d8 e] f4 ~ [f16 a g f] [e f e d] |
- c2 r16 ['g32 'a 'b!16 c] [d e f8] ~ |
- [f32 c d e f16 g] [a8. b16] <g2 c'2> |
- }
-
-alt =
- \melodic {
- \clef "bass";
- \octave c;
-
- \stem 1;
- r1 |
- r |
- r |
- r8 [g8 a b] [c'. d'32 c'] [b8 e'] |
-%% 5
- [a d'] ~ [d'16 e' d' c'] [b8 c' ~ c' bes8] |
- [a d' g c'] r16 [a16 b c'] d'4 |
- g4 r8 g8 [a b] [c'. d'32 c'] |
- [b8 e' a d'] ~ [d'16 e' d' c'!] [b!8 e'] ~ |
- e'4 d'4 [c'16 b c' a] [e' d' c' b] |
-%% 10
- [c'16 a b c'] [d' c' b a] g4 r4 |
- r1 |
- r8 [e8 fis gis] [a. b32 a] [gis8 c'] |
- [fis b] ~ [b16 c' b a] gis8 a4 gis8 |
- a4 r8 g8 [a b] c'. [d'32 c'] |
-%% 15
- [b8 e' a d'] ~ [d' g] d'4 |
- [c'8 a] e'4 d'8 r8 r4 |
- r8 [a8 b cis'] [d'. e'32 d'] [c'!8 f'] |
- [b8 e'] ~ [e'16 f' e' d'] cis'8 r8 r4 |
- r8 [a8 b cis'] [d'. e'32 d'] [c'!8 fis'] |
-%% 20
- [b e'] ~ [e'16 fis' e' d'] c'2 ~ |
- [c'16 d' c' b] [a g a fis] [g8 b c' d'] |
- [e'. f'32 e'] [d'8 g'] [c' f'] ~ [f'16 g' f' e'] |
- d'4 [e'8 d'] ~ [d' g] g4 ~
- [g8 c d e] [f. g32 f] [e8 a] |
-%% 25
- [d g] ~ [g16 a g f] [e d e f] [g a bes g] |
- [a e f g] [a b c' a] b2 |
- c'1 |
- }
-
-bass =
- \melodic {
- \clef "bass";
- \octave c;
-
- \stem -1;
- r1 |
- r |
- r |
- r |
-%% 5
- r2 r8 [c8 d e] |
- [f. g32 f] [e8 a] [d g] ~ [g16 a g f] |
- [e f e d] [c d c 'b] ['a8 d a fis] |
- [g16 a bes g] [cis8 d] a4 e4 |
- [a16 b c' d'] [c' b a g] c'8 r8 r4 |
-%% 10
- r2 r8 ['g8 'a 'b] |
- [c. d32 c] ['b8 e] ['a d] ~ [d16 e d c] |
- 'b8 e4 d8 c f!4 e8 ~ |
- e d4 e8 [f! e16 d] e4 |
- 'a4 r4 r2 |
-%% 15
- r8 ['g8 'a 'b] [c. d32 c] ['b8 e] |
- ['a8 d] ~ [d16 e d c] ['b8 'bes 'a g'] |
- ['a8 fis g e] d4 [e8 f!] |
- [g8. a32 g] [f8 bes] [e a] ~ [a16 bes a g] |
- [f e f d] [g8 a] d2 ~ |
-%% 20
- [d16 e d c] ['b 'a 'g 'fis] ['e8 e fis g] ~ |
- [g a16 g16] [fis8 d] g2 ~ |
- g2 a4 [b8 c'] |
- [f16 a g f] [e d c 'b] [c d e f] [g8 'g] |
- c1 ~ |
-%% 25
- c1 ~ |
- c1 ~ |
- c1 |
- }
-
-
-\score {
- \melodic < \id "Piano" "";
- \multi 1;
- < \multi 2;
- \global
- \soprane
- \tenor
- >
- < \multi 2;
- \global
- \alt
- \bass
- >
- >
-
- \paper{
- gourlay_maxmeasures =5.;
-% castingalgorithme = \Wordwrap
- }
- \midi {
- \tempo 4 = 84;
- }
-}
-
-% EOF
+++ /dev/null
-\header{
-filename prelude1.ly
-title Preludium
-description Das Wohltemperierte Clavier I, Prelude I (c-major)
-opus BWV 846
-source
-composer Johann Sebastian Bach (1685-1750)
-enteredby Shay Rojansky
-copyright Public Domain"
-}
-
-\version "0.1.1";
-
- % should add \need{dutch.ini} for
- % correct parsing of note names
-
-global =
- \melodic {
- \meter 4/4; % should be \meter C
- }
-
-
-% should do programmable input.
-
-soprane =
- \melodic {
- \clef "violin";
- \octave c';
-
- <\multi 2;
- % Real soprane
- {\stem 1;
- r8 [g16 c'] [e' g c' e'] r8 [g16 c'] [e' g c' e'] |
- r8 [a16 d'] [f' a d' f'] r8 [a16 d'] [f' a d' f'] |
- r8 [g16 d'] [f' g d' f'] r8 [g16 d'] [f' g d' f'] |
- r8 [g16 c'] [e' g c' e'] r8 [g16 c'] [e' g c' e'] |
- r8 [a16 e'] [a' a e' a'] r8 [a16 e'] [a' a e' a'] |
- r8 [fis16 a] [d' fis a d'] r8 [fis16 a] [d' fis a d'] |
- r8 [g16 d'] [g' g d' g'] r8 [g16 d'] [g' g d' g'] |
- r8 [e16 g] [c' e g c'] r8 [e16 g] [c' e g c'] |
- r8 [e16 g] [c' e g c'] r8 [e16 g] [c' e g c'] |}
- % Tenor
- {\stem -1;
- r16 e8. ~ e4 r16 e8. ~ e4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 e8. ~ e4 r16 e8. ~ e4 |
- r16 e8. ~ e4 r16 e8. ~ e4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 c8. ~ c4 r16 c8. ~ c4 |
- r16 c8. ~ c4 r16 c8. ~ c4 |}>
-%% 10
- r8 [d16 fis] [c' d fis c'] r8 [d16 fis] [c' d fis c'] |
- r8 [d16 g] [b d g b] r8 [d16 g] [b d g b] |
- r8 [e16 g] [cis' e g cis'] r8 [e16 g] [cis' e g cis'] |
- r8 [d16 a] [d' d a d'] r8 [d16 a] [d' d a d'] |
- r8 [d16 f] [b d f b] r8 [d16 f] [b d f b] |
- r8 [c16 g] [c' c g c'] r8 [c16 g] [c' c g c'] |
- r8 ['a16 c] [f 'a c f] r8 ['a16 c] [f 'a c f] |
- r8 ['a16 c] [f 'a c f] r8 ['a16 c] [f 'a c f] |
- r8 ['g16 'b] [f 'g 'b f] r8 ['g16 'b] [f 'g 'b f] |
- r8 ['g16 c] [e 'g c e] r8 ['g16 c] [e 'g c e] |
-%% 20
- r8 ['bes16 c] [e 'bes c e] r8 ['bes16 c] [e 'bes c e] |
- r8 ['a16 c] [e 'a c e] r8 ['a16 c] [e 'a c e] |
- r8 ['a16 c] [ees 'a c ees] r8 ['a16 c] [ees 'a c ees] |
- r8 ['b16 c] [d 'b c d] r8 ['b16 c] [d 'b c d] |
- r8 ['g16 'b] [d 'g 'b d] r8 ['g16 'b] [d 'g 'b d] |
- r8 ['g16 c] [e 'g c e] r8 ['g16 c] [e 'g c e] |
- r8 ['g16 c] [f 'g c f] r8 ['g16 c] [f 'g c f] |
- r8 ['g16 'b] [f 'g 'b f] r8 ['g16 'b] [f 'g 'b f] |
- r8 ['a16 c] [fis 'a c fis] r8 ['a16 c] [fis 'a c fis] |
- r8 ['g16 c] [g 'g c g] r8 ['g16 c] [g 'g c g] |
-%% 30
- r8 ['g16 c] [f 'g c f] r8 ['g16 c] [f 'g c f] |
- r8 ['g16 'b] [f 'g 'b f] r8 ['g16 'b] [f 'g 'b f] |
- r8 ['g16 'bes] [e 'g 'bes e] r8 ['g16 'bes] [e 'g 'bes e] |
-
- r8 ['f16 'a] [c f c 'a] [c 'a 'f 'a] ['f 'd 'f 'd] |
- r8 [g16 b] [d' f' d' b] [d' b g b] [d f e d] |
- <e1 g c'> ||
- }
-
-bass =
- \melodic {
- \clef "bass";
- \octave c;
-
- \stem -1;
- c'2 c' |
- c' c' |
- b b |
- c' c' |
- c' c' |
- c' c' |
- b b |
- b b |
- a a |
-%% 10
- <\multi 2;
- % Alt
- {\stem 1;
- r16 a8. ~ a4 r16 a8. ~ a4 |
- r16 b8. ~ b4 r16 b8. ~ b4 |
- r16 bes8. ~ bes4 r16 bes8. ~ bes4 |
- r16 a8. ~ a4 r16 a8. ~ a4 |
- r16 aes8. ~ aes4 r16 aes8. ~ aes4 |
- r16 g8. ~ g4 r16 g8. ~ g4 |
- r16 f8. ~ f4 r16 f8. ~ f4 |
- r16 f8. ~ f4 r16 f8. ~ f4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 e8. ~ e4 r16 e8. ~ e4 |
-%% 20
- r16 g8. ~ g4 r16 g8. ~ g4 |
- r16 f8. ~ f4 r16 f8. ~ f4 |
- r16 c8. ~ c4 r16 c8. ~ c4 |
- r16 f8. ~ f4 r16 f8. ~ f4 |
- r16 f8. ~ f4 r16 f8. ~ f4 |
- r16 e8. ~ e4 r16 e8. ~ e4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 ees8. ~ ees4 r16 ees8. ~ ees4 |
- r16 e!8. ~ e4 r16 e8. ~ e4 |
-%% 30
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 d8. ~ d4 r16 d8. ~ d4 |
- r16 c8. ~ c4 r16 c8. ~ c4 |
-
- r16 c8. ~ c4 ~ c2 |
- r16 'b8. ~ 'b4 ~ 'b2 |
- c1 ||}
-
- % Bass
- {\stem -1;
- d2 d |
- g g |
- g g |
- f f |
- f f |
- e e |
- e e |
- d d |
- 'g 'g |
- c c |
-%% 20
- c c |
- 'f 'f |
- 'fis 'fis |
- 'aes 'aes |
- 'g 'g |
- 'g 'g |
- 'g 'g |
- 'g 'g |
- 'g 'g |
- 'g 'g |
-%% 30
- 'g 'g |
- 'g 'g |
- 'c 'c |
-
- 'c 'c |
- 'c 'c |
- 'c1 }>
- }
-
-
-\score {
- \melodic < \id "Piano" "";
- \multi 1;
- < \multi 2;
- \global
- \soprane
- >
- < \multi 2;
- \global
- \bass
- >
- >
-
- \paper{
- gourlay_maxmeasures =5.;
-
- }
- \midi {
- \tempo 4 = 84;
- }
-}
-
-% EOF
+++ /dev/null
-\header{
-filename wohltemperirt.ly
-title Fuga a 3
-description Das Wohltemperierte Clavier I, Fuga II (c-minor)
-opus BWV 847-Fuga
-source Henle's Urtext
-composer Johann Sebastian Bach (1685-1750)
-enteredby HWN and Werner Lemberg
-copyright Public Domain
-}
-%{
- Tested Features: stem direction, multivoice, forced accidentals.
-%}
-
-\version "0.1.1";
-
- % should add \need{dutch.ini} for
- % correct parsing of note names
-
-global =
- \melodic {
- \meter 4/4; % should be \meter C
- \keyCminor
- }
-
-dux =
- \melodic {
- \clef "violin";
- \octave c';
-
- \stem \down;
- r8 [c'16 b] [c'8 g] [as c'16 b] [c'8 d'] |
- [g c'16 b] [c'8 d'] [f16 g] as4 [g16 f] |
- [es c' b a] [g f! es d] [c8 es' d' c'] |
- [bes a bes c'] [fis g a fis] |
-%% 5
- g4 r16 [c d es] [f g as8~] [as16 d es f] |
- [g a bes8~] [bes16 es f g] [as g f es] [d8 c'16 b!] |
- % forced accident!
- c'4 r4 r8 [f' es' d'] |
- r8 [as g f] [g f16 es] [f8 d] |
- g4 r8 b [c' c'16 b] [c'8 g] |
-%% 10
- as4 r8 a [bes bes16 a] [bes8 f] |
- g4 r8 g [as as g f] |
- \octave c; r8 [as bes c'] r8 [as16 g] [as8 f8] |
- [bes8 c' bes as] [bes g f es] |
- [f des' c' bes] [c' as g f] |
-%% 15
- g8 \octave c'; [g16 fis] [g8 c] [es g16 fis!] [g8 a] |
- [d g16 fis] [g8 a!] [c16 d] es4 [d16 c] |
- % forced accident!
- 'bes8 r8 r16 [d e fis] [g a bes8~] [bes16 e f g] |
- [a bes c'8~] [c'16 fis16 g a] [bes8 es!16 d] [es8 'g] |
- ['as f16 es] [f8 'a8] ['bes g16 f] [g8 'b] |
-%% 20
- [c16 f es d] [c Bes! As G] [F8 as g f] |
- [es d es f] [B c d B] |
- c4 r8 e8 [f f16 e] [f8 c] |
- d4 r8 d8 [es8 es16 d] [es8 Bes] |
- c2 ~ [c8 d16 es][ f es f d] |
-%% 25
- B8 r8 r B c r r es |
- d r r f~ f r r f |
- [es as g f] [es d es f] |
- [B c d B] [B c] r c |
- [f16 d es c]~ [c8 B] c4 r8 e |
-%% 30
- f4 r8 f [f es16 d] [es8 <f as]> |
- <B d> r <B d> r <G2 c> |
- }
-
-
-comes =
- \melodic {
- \octave c'';
- \stem \up;
- r1 |
- r1 |
- r8 [g16 fis] [g8 c] [es g16 fis] [g8 a] |
- [d8 g16 fis] [g8 a] [c16 d] es4 [d16 c] |
-%% 5
- ['bes8 es16 d] [es8 'g8] ['as f16 es] [f8 'a]
- ['bes8 g16 f] [g8 'b] [c8 d16 es] f4~ |
- [f8 es16 d] [c16 'bes! 'as 'g] ['f8 as g f]
- [es d es f] ['b c d 'b] |
- [c g16 fis] [g8 d] es4 r8 e8 |
-%% 10
- [f f16 e] [f8 c8] d4 r8 d |
- [es8 es16 d] [es8 'bes] [c es16 d] [es8 f] |
- ['bes es16 d] [es8 f] ['as16 'bes] c4 ['bes16 'as] |
- [G16 Es F G] [As Bes c d] [es d c d] [es f g a] |
- [bes F G As] [Bes c d e] [f es d es] [ f g a b] |
-%% 15
- [c'8 b16 a] [g f! es d] [c8 es d c] |
- [Bes A Bes c] [Fis! G A Fis] |
- % forced accident
- [G8 d16 c] d8 r8 r8 [e16 d] e8 r8 |
- r [fis16 e] fis8 r r [G16 F] G8 r8 |
- r8 [A16 G] A8 r r [B16 A] B8 r |
-%% 20
- r8 [c16 'b] [c8 'g] [As c16 'b] [c8 d] |
- [G c16 B] [c8 d] [F16 G] As4 [G16 F] |
- [Es8 c16 B] [c8 G] As4 r8 A |
- [Bes8 Bes16 A] [Bes8 F8] 'g4 r8 G~ |
- [G As16 Bes] [c B c As] F2~ |
-%% 25
- [F8 d16 c] [d8 F] [Es es16 d] [es8 G] |
- [F f16 es] [f8 As] [G16 f es d] [c B A G] |
- [c8 f es d] r [As G F] |
- [G F16 Es] [F8 D] [As G] r A |
- [B c] [F16 Es D C] C8 [c16 B] [c8 G] |
-%% 30
- [As c16 B] [c8 <d 'b! 'as!]> [G8 c16 B] [c8 d] |
- [F16 G] As4 [G16 F] E2 |
- }
-
-bassdux =
- \melodic {
- \clef "bass";
- \octave c';
- r1 |
- r |
- r |
- r |
-%% 5
- r |
- r1 |
- r8 [c16 B] [c8 G] [As c16 B] [c8 d] |
- [G c16 B] [c8 d] [F16 G] As4 [G16 F] |
- \octave c; [es c' b a] [g f es d] [c d es d] [c Bes! As! G] |
- % -> \classic_accidentals
-%% 10
- [F bes as g] [f es d c] [Bes c d c] [Bes As G F] |
- [Es as g f] [es des c Bes] [As8 c' bes as] |
- [g8 f g as] [d es f d] |
- [es as g f] [g es d c] |
- [d bes as g] [as f es d!] |
-%% 15
- es8 r8 r4 r8 [c Bes A] |
- r [es d c] [d c16 Bes] [c8 d] |
- [G8 bes16 a] [bes8 d] [es c'16 bes] [c'8 e] |
- [f d'16 c'] [d'8 fis] g4 r16 [G A B] |
- [c16 d es8~] [es16 A Bes c] [d es f8~] [f16 'b c d] |
-%% 20
- es8 r r e [f F Es! D] | % -> \classic_accidentals
- r [As G F] [G F16 Es] [F8 G] |
- [c16 d es d] [c Bes As G] [F bes as g] [f es d c] |
- [Bes c d c] [Bes As G F] [Es as g f] [es d c Bes] |
- [As Bes c Bes] [As G F Es] [D g f es] [d c B A] |
-%% 25
- G4 r4 r16 [G A B] [c d es f] |
- [g f as g] [f es d c] [B8 c16 B] [c8 G] |
- [As c16 B] [c8 d] [G c16 B] [c8 d] |
- [F16 G] As4 [G16 F] Es4 r8 es |
- [d c g G]
-%% 30
- < \multi 2;
- { \stem \up; c2~ | c1~ | c1 }
- { \stem \down; C2~ | C1~ | C1 }
- >
- }
-
-
-\score {
- \melodic < \id "Piano" "";
- \multi 1;
- < \multi 2;
- \global
- \dux
- \comes
- >
- < \multi 2;
- \global
- \bassdux
- >
- >
-
- \paper{
- gourlay_maxmeasures =5.;
-
- }
- \midi {
- \tempo 4 = 84;
- }
-}
-
-% EOF
+++ /dev/null
-/*
- audio-score.cc -- implement Audio_score
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#include <time.h>
-#include "debug.hh"
-#include "string.hh"
-#include "string-convert.hh"
-#include "main.hh"
-#include "midi-def.hh"
-#include "midi-item.hh"
-#include "midi-stream.hh"
-#include "audio-column.hh"
-#include "audio-staff.hh"
-#include "audio-score.hh"
-#include "score.hh"
-
-Audio_score::Audio_score ()
-{
- midi_l_ =0;
-}
-
-void
-Audio_score::add (Audio_column* p)
-{
- p->audio_score_l_ = this;
- audio_column_p_list_.bottom().add (p);
-}
-
-void
-Audio_score::output (Midi_stream& midi_stream_r)
-{
- int tracks_i = audio_staff_l_list_.size() + 1;
- // ugh
- int clocks_per_4_i = 384;
- midi_stream_r << Midi_header (1, tracks_i, clocks_per_4_i);
- output_header_track (midi_stream_r);
- int n = 1;
- for (PCursor<Audio_staff*> i (audio_staff_l_list_); i.ok(); i++)
- i->output (midi_stream_r, n++);
-}
-
-void
-Audio_score::output_header_track (Midi_stream& midi_stream_r)
-{
- Midi_track midi_track;
-
- time_t t = time (0);
-
- // perhaps multiple text events?
- String str = String ("Creator: ") + get_version_str() + "\n";
-
- Midi_text creator (Midi_text::TEXT, str);
- midi_track.add (Moment (0), &creator);
-
- str = "Automatically generated at ";
- str += ctime (&t);
- str = str.left_str (str.length_i() - 1);
- str += "\n";
- Midi_text generate (Midi_text::TEXT, str);
- midi_track.add (Moment (0), &generate);
-
- str = "from musical definition: ";
-
- str += origin_str_;
- Midi_text from (Midi_text::TEXT, str);
- midi_track.add (Moment (0), &from);
-
- Midi_text track_name (Midi_text::TRACK_NAME, "Track "
- + String_convert::i2dec_str (0, 0, '0'));
- midi_track.add (Moment (0), &track_name);
-
- Midi_tempo tempo (midi_l_->get_tempo_i (Moment (1, 4)));
- midi_track.add (Moment (0), &tempo);
-
- midi_stream_r << midi_track;
-}
-
-void
-Audio_score::add_staff (Audio_staff* l)
-{
- audio_staff_l_list_.bottom().add (l);
-}
-
-void
-Audio_score::add (Audio_element *p)
-{
- audio_elem_p_list_.bottom().add (p);
-}
-
-void
-Audio_score::print() const
-{
-#ifndef NPRINT
- DOUT << "Audio_score { ";
- DOUT << "\ncolumns: ";
- for (PCursor<Audio_column*> i (audio_column_p_list_); i.ok(); i++)
- i->print();
- DOUT << "}\n";
-#endif
-}
-
-void
-Audio_score::process()
-{
- String out=midi_l_->outfile_str_;
- if (out == "")
- out = default_out_str_ + ".midi";
-
- Midi_stream midi_stream (out);
- *mlog << "MIDI output to " << out<< " ..." << endl;
-
- output (midi_stream);
- *mlog << endl;
-}
+++ /dev/null
-/*
- global-gravs.cc -- implement Engraver,Performer ctors
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "proto.hh"
-#include "plist.hh"
-#include "input-translator.hh"
-#include "debug.hh"
-#include "engraver.hh"
-
-struct Engraver_table_entry {
- String name_str_;
- Grav_ctor ctor_l_;
- Engraver_table_entry (String s, Grav_ctor f)
- {
- name_str_ =s;
- ctor_l_ = f;
- }
- Engraver_table_entry()
- {
- ctor_l_ =0;
- }
-};
-
-static Array<Engraver_table_entry> *grav_table=0;
-
-void
-add_engraver (String s, Grav_ctor f)
-{
- if (!grav_table)
- grav_table = new Array<Engraver_table_entry>;
-
- grav_table->push (Engraver_table_entry (s, f));
-}
-
-
-Engraver*
-get_engraver_p (String s)
-{
- for (int i=0; i < grav_table->size(); i++)
- {
- if ((*grav_table)[i].name_str_ == s)
- return (*(*grav_table)[i].ctor_l_)();
- }
- error ("Unknown engraver `" + s +"\'");
- return 0;
-}
-
-#if 0
-
-struct Performer_table_entry
-{
- String name_str_;
- Perf_ctor ctor_l_;
- Performer_table_entry (String s, Perf_ctor f)
- {
- name_str_ =s;
- ctor_l_ = f;
- }
- Performer_table_entry()
- {
- ctor_l_ =0;
- }
-}
-
-static Array<Performer_table_entry> *perf_table=0;
-
-void
-add_performer (String s, Perf_ctor f)
-{
- if (!perf_table)
- perf_table = new Array<Performer_table_entry>;
-
- perf_table->push (Performer_table_entry (s, f));
-}
-
-
-Performer*
-get_performer_p (String s)
-{
- for (int i=0; i < perf_table->size(); i++)
- {
- if ((*perf_table)[i].name_str_ == s)
- return (*(*perf_table)[i].ctor_l_)();
- }
- error ("Unknown performer `" + s +"\'");
- return 0;
-}
-#endif
+++ /dev/null
-/*
- global-performers.cc -- implement
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#include "proto.hh"
-#include "plist.hh"
-#include "input-translator.hh"
-#include "debug.hh"
-#include "performer.hh"
-
-struct Performer_table_entry {
- String name_str_;
- Perf_ctor ctor_l_;
- Performer_table_entry (String s, Perf_ctor f)
- {
- name_str_ =s;
- ctor_l_ = f;
- }
- Performer_table_entry()
- {
- ctor_l_ =0;
- }
-};
-
-static Array<Performer_table_entry> *perf_table=0;
-
-void
-add_Performer (String s, Perf_ctor f)
-{
- if (!perf_table)
- perf_table = new Array<Performer_table_entry>;
-
- perf_table->push (Performer_table_entry (s, f));
-}
-
-
-Performer*
-get_performer_p (String s)
-{
- for (int i=0; i < perf_table->size(); i++)
- {
- if ((*perf_table)[i].name_str_ == s)
- return (*(*perf_table)[i].ctor_l_)();
- }
- error ("Unknown performer `" + s +"\'");
- return 0;
-}
+++ /dev/null
-/*
- head-column.cc -- implement Head_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "debug.hh"
-#include "head-column.hh"
-#include "note-head.hh"
-#include "stem.hh"
-#include "script.hh"
-
-Head_column::Head_column()
-{
- stem_l_ = 0;
- dir_ =CENTER;
-}
-
-void
-Head_column::do_substitute_dependency (Score_elem*o,
- Score_elem*n)
-{
- Script_column::do_substitute_dependency (o,n);
- if (o->name() == Note_head::static_name ())
- {
- head_l_arr_.substitute ((Note_head*)o->item(),
- (n)? (Note_head*)n->item() : 0);
- }
- if (stem_l_ == o)
- {
- stem_l_ = n ? (Stem*)n->item():0;
- }
-}
-
-
-void
-Head_column::set (Stem*stem_l)
-{
- stem_l_ = stem_l;
- Score_elem::add_dependency (stem_l);
- for (int i=0; i < script_l_arr_.size(); i++)
- script_l_arr_[i]->set_stem (stem_l);
-}
-
-void
-Head_column::add (Script *script_l)
-{
- Script_column::add (script_l) ;
- if (stem_l_)
- script_l->set_stem (stem_l_);
-}
-void
-Head_column::add (Note_head *n_l)
-{
- add_support (n_l);
- head_l_arr_.push (n_l);
-}
-
-
-
-IMPLEMENT_IS_TYPE_B1(Head_column,Script_column);
-
-void
-Head_column::do_print() const
-{
-#ifndef NPRINT
- DOUT << "heads: " << head_l_arr_.size();
-#endif
-}
-
-void
-Head_column::do_pre_processing()
-{
- if (!dir_)
- {
- if (stem_l_)
- dir_ = stem_l_->dir_;
- }
- Script_column::do_pre_processing();
-}
+++ /dev/null
-/*
- audio-score.hh -- declare Audio_score
-
- (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
- */
-
-#ifndef AUDIO_SCORE_HH
-#define AUDIO_SCORE_HH
-
-#include "lily-proto.hh"
-#include "plist.hh"
-#include "music-output.hh"
-
-/** all stuff which goes onto midi. notes, signs, symbols in a score
- #Audio_score# contains the items, the columns.
-
- */
-
-class Audio_score : public Music_output {
-public:
- Audio_score ();
- ~Audio_score () {}
-
- void add (Audio_column*);
- void add_staff (Audio_staff* l);
- void add (Audio_element*p);
-
-
- void output (Midi_stream& midi_stream_r);
- void output_header_track (Midi_stream& midi_stream_r);
-
- void print() const;
- void process();
-
- Pointer_list<Audio_column*> audio_column_p_list_;
- Link_list<Audio_staff*> audio_staff_l_list_;
- Pointer_list<Audio_element*> audio_elem_p_list_;
- Midi_def * midi_l_;
-};
-
-#endif // AUDIO_SCORE_HH
+++ /dev/null
-
-/*
- global-performers.hh -- declare global performer stuff
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#ifndef GLOBAL_PERFORMER_HH
-#define GLOBAL_PERFORMER_HH
-
-/**
- A macro to automate administration of performers
- */
-#define ADD_THIS_PERFORMER( c) \
-struct c ## init { \
- static Performer* globalctor() \
- { \
- return new c;\
- } \
- c ## init() \
- { \
- add_Performer (c::static_name(), globalctor); \
- } \
-} _ ## c ## init;
-
-// typedef Performer*(*Perf_ctor)(void); c++ ?
-typedef Performer*(*Perf_ctor)();
-void add_Performer (String s, Perf_ctor f);
-
-#endif // GLOBAL_PERFORMER_HH
+++ /dev/null
-/*
- head-column.hh -- declare Head_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef HEAD_COLUMN_HH
-#define HEAD_COLUMN_HH
-
-#include "script-column.hh"
-
-/**
- Scripts and rests/noteheads
- */
-class Head_column : public Script_column
-{
-public:
- Link_array<Note_head> head_l_arr_;
- /** The relative position of the "voice" containing this
- chord. Normally this would be the same as the stem direction,
- but rests do not have stems.
-
- Hmm. outdated.. Rests *do* have stems.
- */
-
- Direction dir_;
- Stem* stem_l_;
-
- void add (Note_head*);
- virtual void add (Script*s);
- void set (Stem*);
- Head_column();
- DECLARE_MY_RUNTIME_TYPEINFO;
-protected:
-
-
- virtual void do_pre_processing();
- virtual void do_print() const;
- virtual void do_substitute_dependency (Score_elem*,Score_elem*);
-};
-#endif // HEAD_COLUMN_HH
+++ /dev/null
-/*
- note-column-grav.hh -- declare Note_column_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef NOTE_COLUMN_GRAV_HH
-#define NOTE_COLUMN_GRAV_HH
-
-#include "engraver.hh"
-
-class Note_column_engraver :public Engraver {
- Rest_column * rest_col_l();
- Note_column * note_col_l();
-
- Array< Script * > script_l_arr_;
- Stem * stem_l_;
- Note_column *ncol_p_;
- Rest_column *restcol_p_;
- bool h_shift_b_;
- Direction dir_;
-
-
- bool acceptable_elem_b (Score_elem const*) const;
-protected:
- virtual void set_feature (Feature);
- virtual void acknowledge_element (Score_elem_info);
- virtual void do_pre_move_processing();
- virtual void do_post_move_processing();
-public:
- Note_column_engraver();
- DECLARE_MY_RUNTIME_TYPEINFO;
-};
-#endif // NOTE_COLUMN_GRAV_HH
+++ /dev/null
-/*
- rest-column.hh -- declare Rest_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef REST_COLUMN_HH
-#define REST_COLUMN_HH
-
-#include "script-column.hh"
-#include "head-column.hh"
-
-/** struct to treat a set of rests as union (one voice should only
- produce one rest. */
-class Rest_column : public Head_column {
-public:
- DECLARE_MY_RUNTIME_TYPEINFO;
- void translate_heads (int dy);
-};
-
-#endif // REST_COLUMN_HH
+++ /dev/null
-/*
- text-grav.hh -- part of GNU LilyPond
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef TEXTGRAV_HH
-#define TEXTGRAV_HH
-#include "engraver.hh"
-
-class Text_engraver : public Engraver{
- Text_item * text_p_;
- Text_req * text_req_l_;
- Direction dir_;
- /* *************** */
-protected:
- virtual void set_feature (Feature);
- virtual bool do_try_request (Request*);
- virtual void do_process_requests();
- virtual void do_pre_move_processing();
- virtual void do_post_move_processing();
- virtual void acknowledge_element (Score_elem_info);
-public:
- Text_engraver();
- DECLARE_MY_RUNTIME_TYPEINFO;
-};
-
-#endif // TEXTGRAV_HH
+++ /dev/null
-/*
- voice-group-gravs.hh -- declare Voice_group_engravers
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef VOICEGROUPGRAVS_HH
-#define VOICEGROUPGRAVS_HH
-
-#include "engraver-group.hh"
-
-/**
- A group of voices which share certain characteristics (such as beams.).
- */
-class Voice_group_engravers : public Engraver_group_engraver {
- Moment termination_mom_;
- Direction dir_;
-
-protected:
- virtual void do_print() const;
- virtual Scalar get_feature (String);
- virtual bool do_try_request (Request*);
-public:
-
-
- DECLARE_MY_RUNTIME_TYPEINFO;
- static bool static_acceptable_request_b (Request*);
- Voice_group_engravers();
-};
-#endif // VOICEGROUPGRAVS_HH
+++ /dev/null
-/*
- input-translator.cc -- implement Input_translator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "debug.hh"
-#include "engraver.hh"
-#include "input-translator.hh"
-#include "parray.hh"
-#include "input-translator.hh"
-#include "engraver-group.hh"
-#include "performer-group-performer.hh"
-
-bool
-Input_translator::is_name_b (String n)
-{
- for (int i=0; i < alias_str_arr_.size(); i++)
- if (alias_str_arr_[i] == n)
- return true;
- return false;
-}
-
-void
-Input_translator::print() const
-{
-#ifndef NPRINT
- if (! check_debug)
- return ;
- DOUT << base_str_ <<" " << type_str_<<" {\n";
- DOUT << "Consists of ";
- for (int i=0; i< consists_str_arr_.size(); i++)
- DOUT << consists_str_arr_[i] << ',';
- if (contains_itrans_p_list_.size())
- DOUT << "\nContains " ;
- for (PCursor<Input_translator*> i (contains_itrans_p_list_.top()); i.ok (); i++)
- i->print();
- DOUT << "}\n";
-#endif
-}
-
-
-
-Input_translator *
-Input_translator::recursive_find (String nm)
-{
- if (is_name_b (nm))
- return this;
-
- Input_translator * r =0;
- // what bout for() ?
- PCursor<Input_translator*> i (contains_itrans_p_list_.top());
- for (; !r &&i.ok(); i++)
- {
- if (i->recursive_find (nm))
- r = i.ptr();
- }
-
- return r;
-}
-
-Input_translator *
-Input_translator::find_itrans_l (String nm)
-{
- for (PCursor<Input_translator*> i (contains_itrans_p_list_.top()); i.ok (); i++)
- if (i->is_name_b (nm))
- return i;
-
- return 0;
-}
-
-
-Engraver_group_engraver *
-Input_translator::get_group_engraver_p()
-{
- assert (base_str_ == "Engraver");
- Engraver_group_engraver * grav_p = (Engraver_group_engraver*)
- get_engraver_p (type_str_);
-
- for (int i=0; i < consists_str_arr_.size(); i++)
- {
- grav_p->add (get_engraver_p (consists_str_arr_[i]));
- }
- grav_p->itrans_l_ = this;
- grav_p->id_str_ = default_id_str_;
- return grav_p;
-}
-
-Performer_group_performer*
-Input_translator::get_group_performer_p()
-{
- assert (base_str_ == "Performer");
- Performer_group_performer * perf_p = (Performer_group_performer*)
- get_performer_p (type_str_);
-
- for (int i=0; i < consists_str_arr_.size(); i++)
- {
- perf_p->add (get_performer_p (consists_str_arr_[i]));
- }
- perf_p->itrans_l_ = this;
- perf_p->id_str_ = default_id_str_;
- return perf_p;
-}
-
-bool
-Input_translator::accept_req_b()
-{
- return ! contains_itrans_p_list_.size();
-}
-
-void
-Input_translator::add (Input_translator *ip)
-{
- contains_itrans_p_list_.bottom().add (ip);
-}
-
-Input_translator*
-Input_translator::get_default_itrans_l()
-{
- if (contains_itrans_p_list_.size())
- return contains_itrans_p_list_.top();
- else
- return 0;
-}
-
-
-Input_translator_list::Input_translator_list (Input_translator_list const &s)
-{
- for (PCursor<Input_translator*> pc (s); pc.ok(); pc++)
- {
- Input_translator *q = pc;
- Input_translator *p=new Input_translator (*q) ;
- bottom().add (p);
- }
-}
+++ /dev/null
-/*
- note-column-reg.cc -- implement Note_column_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "note-column-grav.hh"
-#include "note-head.hh"
-#include "stem.hh"
-#include "note-column.hh"
-#include "script.hh"
-#include "rest-column.hh"
-
-bool
-Note_column_engraver::acceptable_elem_b (Score_elem const*elem_C) const
-{
- char const*nC = elem_C->name();
- return (nC == Script::static_name() || nC == Note_head::static_name ()
- || nC == Stem::static_name());
-}
-Note_column*
-Note_column_engraver::note_col_l()
-{
- if (!ncol_p_)
- {
- ncol_p_ = new Note_column;
- announce_element (Score_elem_info (ncol_p_, 0));
- }
- return ncol_p_;
-}
-
-Rest_column *
-Note_column_engraver::rest_col_l()
-{
- if (!restcol_p_)
- {
- restcol_p_ = new Rest_column;
- announce_element (Score_elem_info (restcol_p_,0));
- }
- return restcol_p_;
-}
-
-void
-Note_column_engraver::acknowledge_element (Score_elem_info i)
-{
- if (!acceptable_elem_b (i.elem_l_))
- return;
-
-
- char const*nC = i.elem_l_->name();
-
- if (nC == Script::static_name() && i.req_l_ && i.req_l_->musical ())
- {
- script_l_arr_.push ((Script*)i.elem_l_->item());
- }
- else if (nC == Note_head::static_name())
- {
- Note_head * h_l = (Note_head*)i.elem_l_->item();
- if (h_l->rest_b_)
- rest_col_l()->add (h_l);
- else
- note_col_l()->add (h_l);
-
- }
- else if (nC == Stem::static_name())
- {
- stem_l_ = (Stem*)i.elem_l_->item();
- }
-
- if (ncol_p_ || restcol_p_)
- {
- if (stem_l_)
- {
- if (restcol_p_&& !restcol_p_->stem_l_)
- restcol_p_->set (stem_l_);
- if (ncol_p_ && !ncol_p_->stem_l_)
- ncol_p_->set (stem_l_);
- }
-
-
- for (int i=0; i < script_l_arr_.size(); i++)
- {
- if (restcol_p_)
- restcol_p_->add (script_l_arr_[i]);
- if (ncol_p_)
- ncol_p_->add (script_l_arr_[i]);
- }
-
- script_l_arr_.clear();
- }
-
-}
-
-void
-Note_column_engraver::do_pre_move_processing()
-{
- if (ncol_p_)
- {
- if (! ncol_p_->h_shift_b_)
- ncol_p_->h_shift_b_ = h_shift_b_;
- if (! ncol_p_->dir_)
- ncol_p_->dir_ = dir_;
-
- typeset_element (ncol_p_);
- ncol_p_ =0;
- }
- if (restcol_p_)
- {
- if (! restcol_p_->dir_)
- restcol_p_->dir_ = dir_;
-
- typeset_element (restcol_p_);
- restcol_p_ =0;
- }
-}
-
-void
-Note_column_engraver::do_post_move_processing()
-{
- script_l_arr_.clear();
- stem_l_ =0;
-}
-
-void
-Note_column_engraver::set_feature (Feature i)
-{
- if (i.type_ == "vdir")
- dir_ = (Direction) int(i.value_);
- if (i.type_ == "hshift")
- h_shift_b_ = (bool)(int)i.value_;
-}
-
-Note_column_engraver::Note_column_engraver()
-{
- dir_ =CENTER;
- h_shift_b_ = false;
-
- ncol_p_=0;
- restcol_p_ =0;
- do_post_move_processing();
-}
-
-
-IMPLEMENT_IS_TYPE_B1(Note_column_engraver,Engraver);
-ADD_THIS_ENGRAVER(Note_column_engraver);
+++ /dev/null
-/*
- rest-column.cc -- implement Rest_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "debug.hh"
-#include "rest-column.hh"
-#include "note-head.hh"
-#include "rest-column.hh"
-#include "stem.hh"
-
-
-IMPLEMENT_IS_TYPE_B1(Rest_column,Head_column);
-
-
-/**
- translate the rest symbols
- */
-void
-Rest_column::translate_heads (int dy_i)
-{
- for (int i=0; i < head_l_arr_.size(); i++)
- head_l_arr_[i]->position_i_ += dy_i;
-}
-
+++ /dev/null
-/*
- voicegroup.cc -- implement Voice_group_engravers
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-#include "proto.hh"
-#include "plist.hh"
-#include "musical-request.hh"
-#include "voice-group-gravs.hh"
-#include "engraver.hh"
-#include "command-request.hh"
-#include "debug.hh"
-
-
-Voice_group_engravers::Voice_group_engravers()
-{
- dir_ =CENTER;
-}
-
-bool
-Voice_group_engravers::do_try_request (Request*r_l)
-{
- Command_req* c_l = r_l->command();
- if (c_l&& c_l->groupfeature())
- {
- Feature f;
- f.type_ = c_l->groupfeature()->type_str_;
- f.value_ = c_l->groupfeature()->value_str_;
- set_feature (f);
- return true;
- }
- return Engraver_group_engraver::do_try_request (r_l);
-}
-
-
-
-IMPLEMENT_IS_TYPE_B1(Voice_group_engravers,Engraver_group_engraver);
-
-void
-Voice_group_engravers::do_print() const
-{
-#ifndef NPRINT
- Engraver_group_engraver::do_print();
-#endif
-}
-
-
-
-Scalar
-Voice_group_engravers::get_feature (String f)
-{
- if (f == "vdir")
- return dir_;
- Engraver_group_engraver::get_feature (f);
-}
-
-ADD_THIS_ENGRAVER(Voice_group_engravers);
+++ /dev/null
-%
-% A tex file to help determine dims.
-%
-
-\font\musicfont=musix16
-\font\slurfont=xslu16
-\font\specfont=musixspx
-\def\thefont{\musicfont}
-%\def\thefont{\specfont}
-
-\def\mb#1{{\thefont\char#1}}
-
-\newdimen\wid
-\newdimen\inc
-\newdimen\here
-\def\hruler#1{%
- \wid=#1pt
- \inc=\wid
- \divide\inc by #1
- \divide\wid by 2
- \here=-\wid
- \loop\ifdim\here<\wid\advance\here by\inc
- \hbox to0pt{\kern\here\vrule width0.05pt height 1pt depth 1pt\hss}%
- \repeat%
-}
-
-\def\vruler#1{%
- \wid=#1pt
- \inc=\wid
- \divide\inc by #1
- \divide\wid by 2
- \here=-\wid
- \loop\ifdim\here<\wid\advance\here by\inc
- \hbox to0pt{\vbox to0pt{\vss\hrule width2pt height 0.05pt\kern\here}\hss}%
- \repeat%
-}
-\def\twhrul{\hbox to 0pt{\hbox{\hruler{20}%
- \vrule width0.1pt height 2pt depth 2pt}}}
-\def\twvrul{\vbox to0pt{\vss\hbox to0pt{\hss\vruler{12}}\vss}%
- \kern-1pt\vrule width4pt height 0.1pt}%
-
-
-\def\doitem#1{
- #1%
- \vbox to12pt{\vfill\hbox to0pt{\qquad\kern-1pt\twvrul\hss}}%
- \hbox to50pt{\qquad\twhrul\mb{#1}\hss}%
- \setbox0=\hbox{\mb{#1}} width \the\wd0\ depth \the\dp0 \ height \the\ht0}
-
-\newcount\n
-\def\charn{\n=-1
- \loop\ifnum\n<255\advance\n by1
- \doitem{\number\n}\endgraf\repeat}
-
-
- \charn
-
-\bye