From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Sun, 20 Aug 2000 14:56:11 +0000 (+0200)
Subject: patch::: 1.3.79.jcn4
X-Git-Tag: release/1.3.80~2
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e2321f60fb73e9843d07ed9072cdef872ce28f2a;p=lilypond.git

patch::: 1.3.79.jcn4

1.3.79.jcn4
===========

* Coriolan fixes.

* Slur attachment fix for chords where case slurdir != stemdir.
---

diff --git a/CHANGES b/CHANGES
index 0e3fcdf388..1234b55c6e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,10 @@
+1.3.79.jcn4
+===========
+
+* Coriolan fixes.
+
+* Slur attachment fix for chords where case slurdir != stemdir.
+
 1.3.79.jcn3
 ===========
 
diff --git a/NEWS b/NEWS
index 9297c95a40..90f069c6f7 100644
--- a/NEWS
+++ b/NEWS
@@ -5,9 +5,10 @@
 * Improved design and implementation: Complete rewrite of the
 internals: LilyPond is smaller, cleaner, more flexible, etc.
 
- - More pervasive GUILE integration resulting in 
+ - More pervasive GUILE integration resulting in:
 
- - Improved speed, with comparable memory footprint
+ - Improved speed (undone for now, by .73 + .74), 
+   with comparable memory footprint
 
  - Improved robustness: Lily almost never crashes.
 
@@ -17,6 +18,11 @@ internals: LilyPond is smaller, cleaner, more flexible, etc.
 
 * Typography: More elegant slurs, aligned dynamics, text crescendos,
 
+* Nice lyrics placement: Automagical phrasing and melisma alignment.
+
+* Part combining for orchestral scores and hymns: Automagical combining
+  and separating of two voices, with Solo/`a2 indications as appropriate.
+
 * Chordnames are now configurable in every respect
 
 * Included extensive glossary
diff --git a/VERSION b/VERSION
index 648c53e1ae..b864025dbd 100644
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PATCH_LEVEL=79
-MY_PATCH_LEVEL=jcn3
+MY_PATCH_LEVEL=jcn4
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
diff --git a/input/bugs/hang.ly b/input/bugs/hang.ly
new file mode 100644
index 0000000000..efcd426500
--- /dev/null
+++ b/input/bugs/hang.ly
@@ -0,0 +1,18 @@
+\score{
+	<
+	\context Staff = flauti <
+		\context Voice=one \partcombine Voice
+			\context Thread=one \notes\relative c''
+				{
+					%c1
+					c2 c2
+				}
+			\context Thread=two \notes\relative c''
+				{
+				}
+		>
+	>
+	\paper{
+		
+	}
+}
diff --git a/input/bugs/monstrous.ly b/input/bugs/monstrous.ly
index e25ea236e5..e69de29bb2 100644
--- a/input/bugs/monstrous.ly
+++ b/input/bugs/monstrous.ly
@@ -1,22 +0,0 @@
-
-%% Chord gurus, is this ok now??
-
-monstrous= \chords{
-    \property Score.chordInversion = "1"
-
-    % /c is/was missing:
-    bes:6/+c
-
-    % Cdim7
-    c:dim7
-}
-
-\score{
-    <
-	\context ChordNames \monstrous
-	\context Staff \monstrous
-    >
-    \paper{
-	linelength=-1.0\mm;
-    }
-}
diff --git a/input/bugs/slur.ly b/input/bugs/slur.ly
index c2a8552d1d..e69de29bb2 100644
--- a/input/bugs/slur.ly
+++ b/input/bugs/slur.ly
@@ -1,5 +0,0 @@
-
- \score {
-       \notes \relative c' {
-       c2(  c  \break c c  c  c  \break c 
-}}
diff --git a/input/test/monstrous.ly b/input/test/monstrous.ly
new file mode 100644
index 0000000000..d9c8dbf47e
--- /dev/null
+++ b/input/test/monstrous.ly
@@ -0,0 +1,22 @@
+
+%% Chord gurus, is this ok now??
+
+monstrous= \chords{
+    \property Score.chordInversion = ##t 
+
+    % /c is/was missing:
+    bes:6/+c
+
+    % Cdim7
+    c:dim7
+}
+
+\score{
+    <
+	\context ChordNames \monstrous
+	\context Staff \monstrous
+    >
+    \paper{
+	linelength=-1.0\mm;
+    }
+}
diff --git a/input/test/part-combine-score.ly b/input/test/part-combine-score.ly
new file mode 100644
index 0000000000..c674bd4416
--- /dev/null
+++ b/input/test/part-combine-score.ly
@@ -0,0 +1,206 @@
+\score{
+	<
+	\context VoiceCombineStaff = flauti <
+		\time 4/4;
+
+		\context VoiceCombineThread=one \skip 1*9;
+		\context VoiceCombineThread=two \skip 1*9;
+
+		\context VoiceCombineVoice=one \partcombine VoiceCombineVoice
+			\context VoiceCombineThread=one \notes\relative c''
+				{
+					c4 d e f
+					b,4 d c d
+					r2 e4 f
+					\break
+					c4 d e f
+					c4 r e f
+					c4 r e f
+					\break
+					c4 r a r
+					a a r a
+					a2 \property VoiceCombineThread.soloADue = ##f a
+				}
+			\context VoiceCombineThread=two \notes\relative c''
+				{
+					g4 b d f
+					r2 c4 d
+					a c c d
+					a4. b8 c4 d
+					c r e r
+					r2 s2
+					a,4 r a r
+					a r r a
+					a2 \property VoiceCombineThread.soloADue = ##f a
+				}
+		>
+	\context PianoStaff <
+		\context StaffCombineStaff=one \skip 1*9;
+		\context StaffCombineStaff=two \skip 1*9;
+		\context StaffCombineStaff=one \partcombine StaffCombineStaff
+			\context StaffCombineThread=one \notes\relative c''
+				{
+					c4 d e f
+					c d e f
+					c d e f
+					c d e f
+					c d e f
+					c d e f
+					c4 d e f
+					a8 a a a
+					b b b b
+					d1
+				}
+			\context StaffCombineThread=two \notes\relative c''
+				{
+					c4 d e f
+					c d e f
+					c d e f
+					c2 e2
+					c4 d e f
+					c2 e2
+					c,4 d e f
+					a8 a a a
+					b b b b
+					b1
+				}
+		>
+	>
+	\paper{
+		%
+		% The Voice combine hierarchy
+		%
+		\translator{
+			\ThreadContext
+			\name "VoiceCombineThread";
+			\consists "Rest_engraver";
+		}
+		\translator{
+			\VoiceContext
+			\name "VoiceCombineVoice";
+			\remove "Rest_engraver";
+			\accepts "VoiceCombineThread";
+		}
+		\translator{
+			\HaraKiriStaffContext
+			\consists "Mark_engraver";
+			\name "VoiceCombineStaff";
+			\accepts "VoiceCombineVoice";
+		}
+
+		%
+		% The Staff combine hierarchy
+		%
+		\translator{
+			\ThreadContext
+			\name "StaffCombineThread";
+%%
+%%			\remove "A2_devnull_engraver";
+%%			\remove "Note_heads_engraver";
+		}
+		\translator{
+			\VoiceContext
+			\name "StaffCombineVoice";
+			\accepts "StaffCombineThread";
+
+			\remove "Rest_engraver";
+			\remove "Dot_column_engraver";
+			\remove "Stem_engraver";
+			\remove "Beam_engraver";
+			\remove "Auto_beam_engraver";
+			%\include "auto-beam-settings.ly";
+
+			\remove "Chord_tremolo_engraver";
+			\remove "Melisma_engraver";
+			\remove "Text_engraver";
+			\remove "A2_engraver";
+
+			\remove "Piano_pedal_engraver";
+			\remove "Script_engraver";
+			\remove "Script_column_engraver";
+			\remove "Rhythmic_column_engraver";
+			\remove "Slur_engraver";
+			\remove "Tie_engraver";
+
+%%			\consists "A2_devnull_engraver";
+%%			\consists "Note_heads_engraver";
+		}
+		\translator {
+			\HaraKiriStaffContext
+			\name "StaffCombineStaff";
+			\accepts "StaffCombineVoice";
+
+			\consists "Rest_engraver";
+			\consists "Dot_column_engraver";
+			\consists "Stem_engraver";
+			\consists "Beam_engraver";
+			\consists "Auto_beam_engraver";
+			\include "auto-beam-settings.ly";
+
+			\consists "Chord_tremolo_engraver";
+			\consists "Melisma_engraver";
+			\consists "Text_engraver";
+			\consists "A2_engraver";
+
+			soloADue = ##f
+			%soloADue = ##t
+
+			\consists "Piano_pedal_engraver";
+			\consists "Script_engraver";
+			\consists "Script_column_engraver";
+			\consists "Rhythmic_column_engraver";
+			\consists "Slur_engraver";
+			\consists "Tie_engraver";
+		}
+		\translator {
+			\StaffGroupContext
+			\accepts "VoiceCombineStaff";
+			\accepts "StaffCombineStaff";
+		}
+		\translator {
+			\ScoreContext
+			\accepts "VoiceCombineStaff";
+			\accepts "StaffCombineStaff";
+		}
+%		linewidth = 40.\mm;
+	}
+
+	\midi{ 
+		\tempo 4 = 150; 
+
+		\translator {
+			\ThreadContext
+			\name "VoiceCombineThread";
+		}
+		\translator {
+			\VoiceContext
+			\name "VoiceCombineVoice";
+			\accepts "VoiceCombineThread";
+		}
+		\translator {
+			\StaffContext
+			\name "VoiceCombineStaff";
+			\accepts "VoiceCombineVoice";
+		}
+
+		\translator {
+			\ThreadContext
+			\name "StaffCombineThread";
+		}
+		\translator {
+			\VoiceContext
+			\name "StaffCombineVoice";
+			\accepts "StaffCombineThread";
+		}
+		\translator {
+			\StaffContext
+			\name "StaffCombineStaff";
+			\accepts "StaffCombineVoice";
+		}
+		\translator {
+			\ScoreContext
+			\accepts "VoiceCombineStaff";
+			\accepts "StaffCombineStaff";
+		}
+	}
+}
diff --git a/lily/a2-devnull-engraver.cc b/lily/a2-devnull-engraver.cc
index e57502a083..4d957c01cc 100644
--- a/lily/a2-devnull-engraver.cc
+++ b/lily/a2-devnull-engraver.cc
@@ -18,9 +18,47 @@ public:
   
 protected:
   virtual void acknowledge_element (Score_element_info);
+  virtual bool do_try_music (Music *);
 };
 
 ADD_THIS_TRANSLATOR (A2_devnull_engraver);
+/*
+  Maybe this is too crude.
+  It would probably be better to have a devnull engraver in StaffContext,
+  that acknowledges stuff and suicides it.
+ */
+bool
+A2_devnull_engraver::do_try_music (Music *m)
+{
+  if (daddy_trans_l_->id_str_ == "two"
+      && (to_boolean (get_property ("unison"))
+	  || to_boolean (get_property ("unisilence"))))
+    {
+      /*
+	We mustn't junk Rest requests
+       */
+      if (Span_req *s = dynamic_cast <Span_req *> (m))
+	{
+	  if (s->span_type_str_ == "slur"
+	      || s->span_type_str_ == "beam"
+	      || s->span_type_str_ == "crescendo"
+	      || s->span_type_str_ == "decrescendo")
+	    {
+	      return true;
+	    }
+	  return false;
+	}
+      else if (Tie_req *t = dynamic_cast<Tie_req*> (m))
+	{
+	  return true;
+	}
+      else if (Text_script_req *d = dynamic_cast <Text_script_req*> (m))
+	{
+	  return true;
+	}
+    }
+  return false;
+}
 
 void
 A2_devnull_engraver::acknowledge_element (Score_element_info i)
diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc
index 4bd5a30495..7bc2a0b54b 100644
--- a/lily/my-lily-lexer.cc
+++ b/lily/my-lily-lexer.cc
@@ -40,6 +40,7 @@ static Keyword_ent the_key_tab[]={
   {"consists", CONSISTS},
   {"consistsend", CONSISTSEND},
   {"context", CONTEXT},
+  {"denies", DENIES},
   {"duration", DURATION},
   {"font", FONT},
   {"grace", GRACE},
diff --git a/lily/parser.yy b/lily/parser.yy
index 215dd69394..03ecf130d1 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -142,6 +142,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %token SEQUENTIAL
 %token SIMULTANEOUS
 %token CONSISTSEND
+%token DENIES
 %token DURATION
 %token EXTENDER
 %token FONT
@@ -459,6 +460,9 @@ translator_spec_body:
 	| translator_spec_body ACCEPTS STRING semicolon {
 		dynamic_cast<Translator_group*> ($$)-> set_acceptor (ly_scm2string ($3), true);
 	}
+	| translator_spec_body DENIES STRING semicolon {
+		dynamic_cast<Translator_group*> ($$)-> set_acceptor (ly_scm2string ($3), false);
+	}
 	| translator_spec_body REMOVE STRING semicolon {
 		dynamic_cast<Translator_group*> ($$)-> set_element (ly_scm2string ($3), false);
 	}
diff --git a/lily/slur.cc b/lily/slur.cc
index a2228c73ce..6a3d31eaed 100644
--- a/lily/slur.cc
+++ b/lily/slur.cc
@@ -218,7 +218,8 @@ Slur::get_attachment (Score_element*me,Direction dir,
 
 	  if (str == "head")
 	    {
-	      o = Offset (0, Stem::chord_start_f (stem));
+	      o = Offset (0, Stem::head_positions (stem)
+			  [Directional_element_interface (me).get ()] * hs);
 	      /*
 		Default position is centered in X, on outer side of head Y
 	       */
diff --git a/lily/spanner.cc b/lily/spanner.cc
index 04387ef9f7..3328d26636 100644
--- a/lily/spanner.cc
+++ b/lily/spanner.cc
@@ -104,12 +104,38 @@ Spanner::do_break_processing ()
 	  span_p->set_bound(LEFT,bounds[LEFT]);
 	  span_p->set_bound(RIGHT,bounds[RIGHT]);
 
-
+#if 0
 	  assert (bounds[LEFT]->line_l () ==
 		  bounds[RIGHT]->line_l ());
 
 	  bounds[LEFT]->line_l ()->typeset_element (span_p);
 	  broken_into_l_arr_.push (span_p);
+#else
+
+	  if (bounds[LEFT]->line_l () != bounds[RIGHT]->line_l ())
+	    {
+	      programming_error ("bounds[LEFT]->line_l () != bounds[RIGHT]->line_l ()");
+#if 0
+	      /*
+		lily crashes upon displaying this ...
+		
+	       */
+	      
+	      gh_display (ly_str02scm ("\nspanner:mutable_property_alist_\n"));
+	      gh_display (mutable_property_alist_);
+	      gh_display (ly_str02scm ("\nspanner:immutable_property_alist_\n"));
+	      gh_display (immutable_property_alist_);
+	      gh_newline ();
+#endif
+	      span_p->suicide ();
+	    }
+	  else
+	    {
+	      bounds[LEFT]->line_l ()->typeset_element (span_p);
+	      broken_into_l_arr_.push (span_p);
+	    }
+#endif
+	  
 	}
     }
   broken_into_l_arr_.sort (Spanner::compare);
diff --git a/ly/engraver.ly b/ly/engraver.ly
index 6c7ab190c5..1a9bb26eab 100644
--- a/ly/engraver.ly
+++ b/ly/engraver.ly
@@ -147,7 +147,6 @@ VoiceContext = \translator {
 	\consists "Text_engraver";
 	\consists "A2_engraver";
 
-
 	startSustain = #"Ped."
 	stopSustain = #"*"
 	stopStartSustain = #"*Ped."
diff --git a/ly/performer.ly b/ly/performer.ly
index 90eddae484..4529859e7c 100644
--- a/ly/performer.ly
+++ b/ly/performer.ly
@@ -35,13 +35,13 @@ VoiceContext = \translator {
 };
 \translator { \VoiceContext }
 
-GraceContext = \translator {
+ThreadContext = \translator {
 	\type "Performer_group_performer";
 	\name Thread;
 	\consists "Note_performer";
 	\consists "Tie_performer";
 };
-\translator { \GraceContext }
+\translator { \ThreadContext }
 
 \translator {
 	\type "Grace_performer_group";
diff --git a/mutopia/Coriolan/bassi-part.ly b/mutopia/Coriolan/bassi-part.ly
index 58cdb55370..7f011a363a 100644
--- a/mutopia/Coriolan/bassi-part.ly
+++ b/mutopia/Coriolan/bassi-part.ly
@@ -13,46 +13,26 @@ copyright =	 "public domain";
 \include "violoncello.ly"
 \include "contrabasso.ly"
 
-bassiGroup = \context GrandStaff = bassi_group <
-	\context Staff=one { 
+bassiGroup = \context PianoStaff = bassi_group <
+	\context StaffCombineStaff=one {
 		\clef "bass"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=two { 
+	\context StaffCombineStaff=two {
 		\clef "bass"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=one \partcombine Staff
-		\context Thread=one \violoncello
-		\context Thread=two \contrabasso
->
 
-%\include "coriolan-part-paper.ly"
-\include "coriolan-part-combine-paper.ly"
+	\context StaffCombineStaff=one \partcombine StaffCombineStaff
+		\context StaffCombineThread=one \violoncello
+		\context StaffCombineThread=two \contrabasso
+>
 
 \score{
 	\bassiGroup
-	\paper{
-		\translator { \HaraKiriStaffContext }
-		\translator {
-			\StaffContext
-			\consists "Slur_engraver";
-			\consists "Rest_engraver";
-			\consists "Tie_engraver";
-		}
-		\translator{
-			\VoiceContext
-			\remove "Rest_engraver";
-			\remove "Slur_engraver";
-			\remove "Tie_engraver";
-		}
-	}
+	\include "coriolan-part-combine-paper.ly"
 	\include "coriolan-midi.ly"
 }
 
diff --git a/mutopia/Coriolan/coriolan-midi.ly b/mutopia/Coriolan/coriolan-midi.ly
index ba81ffaf75..544e817be3 100644
--- a/mutopia/Coriolan/coriolan-midi.ly
+++ b/mutopia/Coriolan/coriolan-midi.ly
@@ -1,18 +1,38 @@
 \midi{ 
 	\tempo 4 = 150; 
+
+	\translator {
+		\ThreadContext
+		\name "VoiceCombineThread";
+	}
 	\translator {
 		\VoiceContext
-		\name "VoiceOne";
+		\name "VoiceCombineVoice";
+		\accepts "VoiceCombineThread";
+	}
+	\translator {
+		\StaffContext
+		\name "VoiceCombineStaff";
+		\accepts "VoiceCombineVoice";
+	}
+
+	\translator {
+		\ThreadContext
+		\name "StaffCombineThread";
 	}
 	\translator {
 		\VoiceContext
-		\name "VoiceTwo";
-		%\remove "Span_dynamic_engraver";
-		%\remove "Dynamic_engraver";
+		\name "StaffCombineVoice";
+		\accepts "StaffCombineThread";
 	}
 	\translator {
 		\StaffContext
-		\accepts "VoiceOne";
-		\accepts "VoiceTwo";
+		\name "StaffCombineStaff";
+		\accepts "StaffCombineVoice";
+	}
+	\translator {
+		\ScoreContext
+		\accepts "VoiceCombineStaff";
+		\accepts "StaffCombineStaff";
 	}
 }
diff --git a/mutopia/Coriolan/coriolan-paper.ly b/mutopia/Coriolan/coriolan-paper.ly
index ea63eb4cd2..6dde56b9bd 100644
--- a/mutopia/Coriolan/coriolan-paper.ly
+++ b/mutopia/Coriolan/coriolan-paper.ly
@@ -3,59 +3,115 @@
 	textheight = 295.0\mm;
 	linewidth = 180.0\mm;
 
-	% slurs are never beautiful (no steep slurs)
-	slur_beautiful = 0.0;
-
-	\translator {
+	\translator{ \HaraKiriStaffContext }
+	%
+	% The Voice combine hierarchy
+	%
+	\translator{
+		\ThreadContext
+		\name "VoiceCombineThread";
+		\consists "Rest_engraver";
+	}
+	\translator{
 		\VoiceContext
-		dynamicPadding = #2  % urg, in \pt
-		dynamicMinimumSpace = #6  % urg, in \pt
-		\remove Rest_engraver;
-		\remove Slur_engraver;
-		\remove Tie_engraver;
+		\name "VoiceCombineVoice";
+		soloText = #"I."
+		soloIIText = #"II."
+		\remove "Rest_engraver";
+		\accepts "VoiceCombineThread";
+		\consists "A2_devnull_engraver";
 	}
-	\translator {
-		\StaffContext
-%		\consists Slur_engraver;
-		\consists Tie_engraver;
+	\translator{
+		\HaraKiriStaffContext
+%%		\consists "Mark_engraver";
+		\name "VoiceCombineStaff";
+		\accepts "VoiceCombineVoice";
 	}
-	\translator {
+
+	%
+	% The Staff combine hierarchy
+	%
+	\translator{
+		\ThreadContext
+		\name "StaffCombineThread";
+		\remove "A2_devnull_engraver";
+%%			\remove "Note_heads_engraver";
+	}
+	\translator{
 		\VoiceContext
-		\name "VoiceOne";
+		\name "StaffCombineVoice";
+		\accepts "StaffCombineThread";
+
+		\remove "Rest_engraver";
+		\remove "Dot_column_engraver";
+		\remove "Stem_engraver";
+		\remove "Beam_engraver";
+		\remove "Auto_beam_engraver";
+		%\include "auto-beam-settings.ly";
+
+		\remove "Chord_tremolo_engraver";
+		\remove "Melisma_engraver";
+		\remove "Text_engraver";
+		\remove "A2_engraver";
 
-		dynamicPadding = #2  % urg, in \pt
-		dynamicMinimumSpace = #6  % urg, in \pt
+		\remove "Piano_pedal_engraver";
+		\remove "Script_engraver";
+		\remove "Script_column_engraver";
+		\remove "Rhythmic_column_engraver";
+		\remove "Slur_engraver";
+		\remove "Tie_engraver";
 
-		%%\consists "Line_number_engraver";
-		verticalDirection = #1
-		stemVerticalDirection = #1
-		%dynamicDirection = #-1
-		dynamicDirection = #1
+		\consists "A2_devnull_engraver";
 	}
 	\translator {
-		\VoiceContext
-		\name "VoiceTwo";
-		%%\consists "Line_number_engraver";
-		verticalDirection = #-1
-		stemVerticalDirection = #-1
-		\remove "Dynamic_engraver";
-		%% Aargh: absulute dynamics:
-		\remove "Text_engraver";
+		\HaraKiriStaffContext
+		\name "StaffCombineStaff";
+		\accepts "StaffCombineVoice";
+
+		\consists "Rest_engraver";
+		\consists "Dot_column_engraver";
+		\consists "Stem_engraver";
+		\consists "Beam_engraver";
+		\consists "Auto_beam_engraver";
+		\include "auto-beam-settings.ly";
+
+		\consists "Chord_tremolo_engraver";
+		\consists "Melisma_engraver";
+		\consists "Text_engraver";
+		\consists "A2_engraver";
+
+		soloADue = ##f
+
+		\consists "Piano_pedal_engraver";
+		\consists "Script_engraver";
+		\consists "Script_column_engraver";
+		\consists "Rhythmic_column_engraver";
+		\consists "Slur_engraver";
+		\consists "Tie_engraver";
+		\consists "A2_devnull_engraver";
 	}
-	\translator { 
-		\HaraKiriStaffContext 
-		\accepts "VoiceOne";
-		\accepts "VoiceTwo";
+	\translator {
+		\StaffGroupContext
+		\accepts "VoiceCombineStaff";
+		\accepts "StaffCombineStaff";
 	}
-	\translator { 
-		\OrchestralScoreContext 
+	\translator {
+		%\ScoreContext
+		%\consists "Mark_engraver";
+		\OrchestralScoreContext
+		\accepts "VoiceCombineStaff";
+		\accepts "StaffCombineStaff";
+
+		barScriptPadding = #2.0 % dimension \pt
+		markScriptPadding = #4.0
+
 		%% urg: in pt?
 		barNumberScriptPadding = #15
 		%% URG: this changes dynamics too
 		%%textStyle = #"italic"
 		timeSignatureStyle = #"C"
       		instrumentScriptPadding = #55  %% urg, this is in pt
-      		instrScriptPadding = #35 %% urg, this is in pt
+      		instrScriptPadding = #40 %% urg, this is in pt
 		marginScriptHorizontalAlignment = #1
 		maximumRestCount = #1
 	}
diff --git a/mutopia/Coriolan/coriolan-part-combine-paper.ly b/mutopia/Coriolan/coriolan-part-combine-paper.ly
index 4dcda1e47c..3aa73c157a 100644
--- a/mutopia/Coriolan/coriolan-part-combine-paper.ly
+++ b/mutopia/Coriolan/coriolan-part-combine-paper.ly
@@ -2,26 +2,110 @@
 	textheight = 295.0\mm;
 	linewidth = 180.0\mm;
 
-	% slurs are never beautiful (no steep slurs)
-	slur_beautiful = 0.0;
+	\translator{ \HaraKiriStaffContext }
+	%
+	% The Voice combine hierarchy
+	%
+	\translator{
+		\ThreadContext
+		\name "VoiceCombineThread";
+		\consists "Rest_engraver";
+	}
+	\translator{
+		\VoiceContext
+		\name "VoiceCombineVoice";
+		soloText = #"I."
+		soloIIText = #"II."
+		\remove "Rest_engraver";
+		\accepts "VoiceCombineThread";
+		\consists "A2_devnull_engraver";
+	}
+	\translator{
+		\HaraKiriStaffContext
+		\consists "Mark_engraver";
+		\name "VoiceCombineStaff";
+		\accepts "VoiceCombineVoice";
+	}
 
-	\translator {
+	%
+	% The Staff combine hierarchy
+	%
+	\translator{
 		\ThreadContext
-		\consists Rest_engraver;
+		\name "StaffCombineThread";
+%%
+			\remove "A2_devnull_engraver";
+%%			\remove "Note_heads_engraver";
 	}
-	\translator {
+	\translator{
 		\VoiceContext
-		\remove Rest_engraver;
-		\remove Slur_engraver;
-		\remove Tie_engraver;
+		\name "StaffCombineVoice";
+		\accepts "StaffCombineThread";
+
+		\remove "Rest_engraver";
+		\remove "Dot_column_engraver";
+		\remove "Stem_engraver";
+		\remove "Beam_engraver";
+		\remove "Auto_beam_engraver";
+		%\include "auto-beam-settings.ly";
+
+		\remove "Chord_tremolo_engraver";
+		\remove "Melisma_engraver";
+		\remove "Text_engraver";
+		\remove "A2_engraver";
+
+		\remove "Piano_pedal_engraver";
+		\remove "Script_engraver";
+		\remove "Script_column_engraver";
+		\remove "Rhythmic_column_engraver";
+		\remove "Slur_engraver";
+		\remove "Tie_engraver";
+
+		\consists "A2_devnull_engraver";
 	}
 	\translator {
-		\StaffContext
-%		\consists Slur_engraver;
-		\consists Tie_engraver;
+		\HaraKiriStaffContext
+		\name "StaffCombineStaff";
+		\accepts "StaffCombineVoice";
+
+		\consists "Rest_engraver";
+		\consists "Dot_column_engraver";
+		\consists "Stem_engraver";
+		\consists "Beam_engraver";
+		\consists "Auto_beam_engraver";
+		\include "auto-beam-settings.ly";
+
+		\consists "Chord_tremolo_engraver";
+		\consists "Melisma_engraver";
+		\consists "Text_engraver";
+		\consists "A2_engraver";
+
+		soloADue = ##f
+		%soloADue = ##t
+
+		\consists "Piano_pedal_engraver";
+		\consists "Script_engraver";
+		\consists "Script_column_engraver";
+		\consists "Rhythmic_column_engraver";
+		\consists "Slur_engraver";
+		\consists "Tie_engraver";
+
+		\consists "A2_devnull_engraver";
 	}
-	\translator { 
-		\ScoreContext skipBars = ##t 
+	\translator {
+		\StaffGroupContext
+		\accepts "VoiceCombineStaff";
+		\accepts "StaffCombineStaff";
+	}
+	\translator {
+		\ScoreContext
+		\accepts "VoiceCombineStaff";
+		\accepts "StaffCombineStaff";
+		skipBars = ##t 
+
+		barScriptPadding = #2.0 % dimension \pt
+		markScriptPadding = #4.0
+
 		%% urg: in pt?
 		barNumberScriptPadding = #15
 		%% URG: this changes dynamics too
diff --git a/mutopia/Coriolan/coriolan-part-paper.ly b/mutopia/Coriolan/coriolan-part-paper.ly
index a4d113f51d..da6d84ab9a 100644
--- a/mutopia/Coriolan/coriolan-part-paper.ly
+++ b/mutopia/Coriolan/coriolan-part-paper.ly
@@ -2,48 +2,14 @@
 	textheight = 295.0\mm;
 	linewidth = 180.0\mm;
 
-	% slurs are never beautiful (no steep slurs)
-	slur_beautiful = 0.0;
+	\translator{ \HaraKiriStaffContext }
 
 	\translator {
-		\VoiceContext
-		%dynamicPadding = #5  % urg, in \pt
-		%dynamicMinimumSpace = #10  % urg, in \pt
-		\remove Rest_engraver;
-		\remove Slur_engraver;
-		\remove Tie_engraver;
-	}
-	\translator {
-		\StaffContext
-%		\consists Slur_engraver;
-		\consists Tie_engraver;
-	}
-	\translator {
-		\VoiceContext
-		\name "VoiceOne";
-		%%\consists "Line_number_engraver";
-		verticalDirection = #1
-		stemVerticalDirection = #1
-		%dynamicDirection = #-1
-		dynamicDirection = #1
-	}
-	\translator {
-		\VoiceContext
-		\name "VoiceTwo";
-		%%\consists "Line_number_engraver";
-		verticalDirection = #-1
-		stemVerticalDirection = #-1
-		\remove "Dynamic_engraver";
-		%% Aargh: absulute dynamics:
-		\remove "Text_engraver";
-	}
-	\translator { 
-		\OrchestralPartStaffContext 
-		\accepts "VoiceOne";
-		\accepts "VoiceTwo";
-	}
-	\translator { 
-		\ScoreContext skipBars = ##t 
+		\ScoreContext
+		skipBars = ##t 
+
+		barScriptPadding = #2.0 % dimension \pt
+		markScriptPadding = #4.0
 		%% urg: in pt?
 		barNumberScriptPadding = #15
 		%% URG: this changes dynamics too
diff --git a/mutopia/Coriolan/coriolan.ly b/mutopia/Coriolan/coriolan.ly
index 06cff3bac7..05aebee900 100644
--- a/mutopia/Coriolan/coriolan.ly
+++ b/mutopia/Coriolan/coriolan.ly
@@ -51,46 +51,41 @@ violiniGroup = \context GrandStaff = violini_group <
 	\violinoIIStaff
 >
 
-violiGroup = \context GrandStaff = violi_group <
-	\context Staff=one { 
+violiGroup = \context PianoStaff = violi_group <
+	\context StaffCombineStaff=one {
 		\clef "alto"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=two { 
+	\context StaffCombineStaff=two {
 		\clef "alto"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=one \partcombine Staff
-		\context Thread=one \violaI
-		\context Thread=two \violaII
+
+	\context StaffCombineStaff=one \partcombine StaffCombineStaff
+		\context StaffCombineThread=one \violaI
+		\context StaffCombineThread=two \violaII
 >
 
-bassiGroup = \context GrandStaff = bassi_group <
-	\context Staff=one { 
+bassiGroup = \context PianoStaff = bassi_group <
+	\context StaffCombineStaff=one {
 		\clef "bass"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=two { 
+	\context StaffCombineStaff=two {
 		\clef "bass"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=one \partcombine Staff
-		\context Thread=one \violoncello
-		\context Thread=two \contrabasso
+
+	\context StaffCombineStaff=one \partcombine StaffCombineStaff
+		\context StaffCombineThread=one \violoncello
+		\context StaffCombineThread=two \contrabasso
 >
 
+
 archiGroup = \context StaffGroup = archi_group <
 	\violiniGroup
 	\violiGroup
diff --git a/mutopia/Coriolan/viola-1.ly b/mutopia/Coriolan/viola-1.ly
index cfa67d6dcb..3649bdd732 100644
--- a/mutopia/Coriolan/viola-1.ly
+++ b/mutopia/Coriolan/viola-1.ly
@@ -413,7 +413,6 @@ violaI = \notes \relative c {
 	c4\pp r r2 |
 	c4 r r2 |
 	c4 r r2 |
-	\skip 1*10;
 }
 
 %%% urg
diff --git a/mutopia/Coriolan/viola-2.ly b/mutopia/Coriolan/viola-2.ly
index 88dc525e14..05b75c0f8e 100644
--- a/mutopia/Coriolan/viola-2.ly
+++ b/mutopia/Coriolan/viola-2.ly
@@ -413,5 +413,4 @@ violaII = \notes \relative c {
 	c4\pp r r2 |
 	c4 r r2 |
 	c4 r r2 |
-	\skip 1*10;
 }
diff --git a/mutopia/Coriolan/violi-part.ly b/mutopia/Coriolan/violi-part.ly
index 3ebf7f8591..ae9ac83b2b 100644
--- a/mutopia/Coriolan/violi-part.ly
+++ b/mutopia/Coriolan/violi-part.ly
@@ -13,47 +13,26 @@ copyright =	 "public domain";
 \include "viola-1.ly"
 \include "viola-2.ly"
 
-violiGroup = \context GrandStaff = violi_group <
-	\context Staff=one { 
+violiGroup = \context PianoStaff = violi_group <
+	\context StaffCombineStaff=one {
 		\clef "alto"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=two { 
+	\context StaffCombineStaff=two {
 		\clef "alto"; 
-		\context Voice
-		\property Voice.soloADue = ##f 
 		\skip 1*314; 
 		\bar "|."; 
 	}
-	\context Staff=one \partcombine Staff
-		\context Thread=one \violaI
-		\context Thread=two \violaII
->
 
-%\include "coriolan-part-paper.ly"
-\include "coriolan-part-combine-paper.ly"
+	\context StaffCombineStaff=one \partcombine StaffCombineStaff
+		\context StaffCombineThread=one \violaI
+		\context StaffCombineThread=two \violaII
+>
 
 \score{
 	\violiGroup
-	\paper{
-		\translator { \HaraKiriStaffContext }
-		\translator {
-			\StaffContext
-			\consists "Slur_engraver";
-			\consists "Rest_engraver";
-			\consists "Tie_engraver";
-		}
-		\translator{
-			\VoiceContext
-			soloADue = ##f 
-			\remove "Rest_engraver";
-			\remove "Slur_engraver";
-			\remove "Tie_engraver";
-		}
-	}
+	\include "coriolan-part-combine-paper.ly"
 	\include "coriolan-midi.ly"
 }
 
diff --git a/scm/slur.scm b/scm/slur.scm
index 1f4d9132e0..2574afd619 100644
--- a/scm/slur.scm
+++ b/scm/slur.scm
@@ -95,4 +95,6 @@
 
     ((loose-end -1 1) . (-4 . 0))
     ((loose-end -1 -1) . (-4 . 0))
+    ((loose-end 1 1) . (-0.4 . 0))
+    ((loose-end 1 -1) . (-0.4 . 0))
     ))