2 key-item.cc -- implement Key_item
4 source file of the GNU LilyPond music typesetter
6 (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 keyplacement by Mats Bengtsson
11 #include "key-item.hh"
14 #include "molecule.hh"
15 #include "paper-def.hh"
17 #include "musical-pitch.hh"
19 const int FLAT_TOP_PITCH
=2; /* fes,ges,as and bes typeset in lower octave */
20 const int SHARP_TOP_PITCH
=4; /* ais and bis typeset in lower octave */
24 multi_octave_b_
= false;
25 set_elt_property (breakable_scm_sym
, SCM_BOOL_T
);
30 Key_item::get_c_position () const
32 // Find the c in the range -4 through 2
33 int from_bottom_pos
= c0_position_
+ 4;
34 from_bottom_pos
= from_bottom_pos
%7;
35 from_bottom_pos
= (from_bottom_pos
+ 7)%7; // Precaution to get positive.
36 return from_bottom_pos
- 4;
41 Key_item::set_c_position (int c0
)
48 Key_item::add (int p
, int a
)
55 Key_item::add_old (int p
, int a
)
57 old_pitch_arr_
.push (p
);
58 old_acc_arr_
.push (a
);
63 Key_item::calculate_position(int p
, int a
) const
67 return p
+ c0_position_
;
70 if ((a
<0 && ((p
>FLAT_TOP_PITCH
) || (p
+get_c_position ()>4)) && (p
+get_c_position ()>1))
72 (a
>0 && ((p
>SHARP_TOP_PITCH
) || (p
+get_c_position ()>5)) && (p
+get_c_position ()>2)))
74 p
-= 7; /* Typeset below c_position */
76 return p
+ get_c_position ();
82 - space the `natural' signs wider
86 Key_item::do_brew_molecule_p() const
88 Molecule
*output
= new Molecule
;
89 Real inter
= staff_line_leading_f ()/2.0;
92 if ((break_status_dir () == LEFT
|| break_status_dir () == CENTER
)
93 || old_pitch_arr_
.size ())
95 for (int i
=0; i
< old_pitch_arr_
.size(); i
++)
97 for (j
=0; (j
< pitch_arr_
.size())
98 && (old_pitch_arr_
[i
] != pitch_arr_
[j
]); j
++)
101 if (j
== pitch_arr_
.size()
102 || (old_pitch_arr_
[i
] == pitch_arr_
[j
]
103 && old_acc_arr_
[i
] != acc_arr_
[j
]))
105 Molecule m
=lookup_l ()->accidental (0,false);
106 m
.translate_axis (calculate_position(old_pitch_arr_
[i
], old_acc_arr_
[i
]) * inter
, Y_AXIS
);
107 output
->add_at_edge (X_AXIS
, RIGHT
, m
,0);
112 Add half a space between cancellation and key sig.
114 As suggested by [Ross], p.148.
116 Interval
x(0, inter
);
119 output
->add_at_edge (X_AXIS
, RIGHT
, lookup_l()->fill (Box(x
,y
)),0);
122 for (int i
=0; i
< pitch_arr_
.size(); i
++)
124 Molecule m
=lookup_l ()->accidental (acc_arr_
[i
],false);
125 m
.translate_axis (calculate_position(pitch_arr_
[i
], acc_arr_
[i
]) * inter
, Y_AXIS
);
126 output
->add_at_edge (X_AXIS
, RIGHT
, m
, 0);