OLD | NEW |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 Jan Nieuwenhuizen <janneke@gnu.org> | 5 Jan Nieuwenhuizen <janneke@gnu.org> |
6 | 6 |
7 LilyPond is free software: you can redistribute it and/or modify | 7 LilyPond is free software: you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation, either version 3 of the License, or | 9 the Free Software Foundation, either version 3 of the License, or |
10 (at your option) any later version. | 10 (at your option) any later version. |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 | 329 |
330 bool | 330 bool |
331 operator <(Beam_stem_segment const &a, | 331 operator <(Beam_stem_segment const &a, |
332 Beam_stem_segment const &b) | 332 Beam_stem_segment const &b) |
333 { | 333 { |
334 return a.rank_ < b.rank_; | 334 return a.rank_ < b.rank_; |
335 } | 335 } |
336 | 336 |
337 typedef map<int, vector<Beam_stem_segment> > Position_stem_segments_map; | 337 typedef map<int, vector<Beam_stem_segment> > Position_stem_segments_map; |
338 | 338 |
339 // TODO - should store result in a property? | 339 MAKE_SCHEME_CALLBACK (Beam, calc_beam_segments, 1); |
340 vector<Beam_segment> | 340 SCM |
341 Beam::get_beam_segments (Grob *me_grob, Grob **common) | 341 Beam::calc_beam_segments (SCM smob) |
342 { | 342 { |
343 /* ugh, this has a side-effect that we need to ensure that | 343 /* ugh, this has a side-effect that we need to ensure that |
344 Stem #'beaming is correct */ | 344 Stem #'beaming is correct */ |
| 345 Grob *me_grob = unsmob_grob (smob); |
345 (void) me_grob->get_property ("beaming"); | 346 (void) me_grob->get_property ("beaming"); |
346 | 347 |
347 Spanner *me = dynamic_cast<Spanner *> (me_grob); | 348 Spanner *me = dynamic_cast<Spanner *> (me_grob); |
348 | 349 |
349 extract_grob_set (me, "stems", stems); | 350 extract_grob_set (me, "stems", stems); |
350 Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); | |
351 | 351 |
352 commonx = me->get_bound (LEFT)->common_refpoint (commonx, X_AXIS); | 352 Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS);» |
353 commonx = me->get_bound (RIGHT)->common_refpoint (commonx, X_AXIS); | 353 Direction d = LEFT; |
354 | 354 do |
355 *common = commonx; | 355 commonx = me->get_bound (d)->common_refpoint (commonx, X_AXIS); |
| 356 while (flip (&d) != LEFT); |
356 | 357 |
357 int gap_count = robust_scm2int (me->get_property ("gap-count"), 0); | 358 int gap_count = robust_scm2int (me->get_property ("gap-count"), 0); |
358 Real gap_length = robust_scm2double (me->get_property ("gap"), 0.0); | 359 Real gap_length = robust_scm2double (me->get_property ("gap"), 0.0); |
359 | 360 |
360 Position_stem_segments_map stem_segments; | 361 Position_stem_segments_map stem_segments; |
361 Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); | 362 Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); |
362 | 363 |
363 /* There are two concepts of "rank" that are used in the following code. | 364 /* There are two concepts of "rank" that are used in the following code. |
364 The beam_rank is the vertical position of the beam (larger numbers are | 365 The beam_rank is the vertical position of the beam (larger numbers are |
365 closer to the noteheads). Beam_stem_segment.rank_, on the other hand, | 366 closer to the noteheads). Beam_stem_segment.rank_, on the other hand, |
366 is the horizontal position of the segment (this is incremented by two | 367 is the horizontal position of the segment (this is incremented by two |
367 for each stem; the beam segment on the right side of the stem has | 368 for each stem; the beam segment on the right side of the stem has |
368 a higher rank (by one) than its neighbour to the left). */ | 369 a higher rank (by one) than its neighbour to the left). */ |
369 Slice ranks; | 370 Slice ranks; |
370 for (vsize i = 0; i < stems.size (); i++) | 371 for (vsize i = 0; i < stems.size (); i++) |
371 { | 372 { |
372 Grob *stem = stems[i]; | 373 Grob *stem = stems[i]; |
373 Real stem_width = robust_scm2double (stem->get_property ("thickness"), 1.0
) * lt; | 374 Real stem_width = robust_scm2double (stem->get_property ("thickness"), 1.0
) * lt; |
374 Real stem_x = stem->relative_coordinate (commonx, X_AXIS); | 375 Real stem_x = stem->relative_coordinate (commonx, X_AXIS); |
375 SCM beaming = stem->get_property ("beaming"); | 376 SCM beaming = stem->get_property ("beaming"); |
376 Direction d = LEFT; | 377 ······ |
377 do | 378 do |
378 { | 379 { |
379 // Find the maximum and minimum beam ranks. | 380 // Find the maximum and minimum beam ranks. |
380 // Given that RANKS is never reset to empty, the interval will always
be | 381 // Given that RANKS is never reset to empty, the interval will always
be |
381 // smallest for the left beamlet of the first stem, and then it might
grow. | 382 // smallest for the left beamlet of the first stem, and then it might
grow. |
382 // Do we really want this? (It only affects the tremolo gaps) --jneem | 383 // Do we really want this? (It only affects the tremolo gaps) --jneem |
383 for (SCM s = index_get_cell (beaming, d); | 384 for (SCM s = index_get_cell (beaming, d); |
384 scm_is_pair (s); s = scm_cdr (s)) | 385 scm_is_pair (s); s = scm_cdr (s)) |
385 { | 386 { |
386 if (!scm_is_integer (scm_car (s))) | 387 if (!scm_is_integer (scm_car (s))) |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 { | 536 { |
536 segments.push_back (current); | 537 segments.push_back (current); |
537 current = Beam_segment (); | 538 current = Beam_segment (); |
538 } | 539 } |
539 } | 540 } |
540 while (flip (&event_dir) != LEFT); | 541 while (flip (&event_dir) != LEFT); |
541 } | 542 } |
542 | 543 |
543 } | 544 } |
544 | 545 |
| 546 SCM segments_scm = SCM_EOL; |
| 547 SCM *tail = &segments_scm; |
| 548 |
| 549 for (vsize i = 0; i < segments.size (); i++) |
| 550 { |
| 551 *tail = scm_cons (scm_list_2 (scm_cons (ly_symbol2scm ("vertical-count"), |
| 552 scm_from_int (segments[i].vertical
_count_)), |
| 553 scm_cons (ly_symbol2scm ("horizontal"), |
| 554 ly_interval2scm (segments[i].horiz
ontal_))), |
| 555 SCM_EOL); |
| 556 tail = SCM_CDRLOC (*tail); |
| 557 } |
| 558 |
| 559 return segments_scm; |
| 560 } |
| 561 |
| 562 MAKE_SCHEME_CALLBACK (Beam, calc_x_positions, 1); |
| 563 SCM |
| 564 Beam::calc_x_positions (SCM smob) |
| 565 { |
| 566 Spanner *me = unsmob_spanner (smob); |
| 567 SCM segments = me->get_property ("beam-segments"); |
| 568 Interval x_positions; |
| 569 x_positions.set_empty (); |
| 570 for (SCM s = segments; scm_is_pair (s); s = scm_cdr (s)) |
| 571 x_positions.unite (robust_scm2interval (ly_assoc_get (ly_symbol2scm ("horizo
ntal"), |
| 572 scm_car (s), |
| 573 SCM_EOL), |
| 574 Interval (0.0, 0.0))); |
| 575 |
| 576 // Case for beams without segments (i.e. uniting two skips with a beam) |
| 577 // TODO: should issue a warning? warning likely issued downstream, but couldn
't hurt... |
| 578 if (x_positions.is_empty ()) |
| 579 { |
| 580 extract_grob_set (me, "stems", stems); |
| 581 Grob *common_x = common_refpoint_of_array (stems, me, X_AXIS); |
| 582 Direction d = LEFT; |
| 583 do |
| 584 x_positions[d] = me->relative_coordinate (common_x, X_AXIS); |
| 585 while (flip (&d) != LEFT); |
| 586 } |
| 587 return ly_interval2scm (x_positions); |
| 588 } |
| 589 |
| 590 vector<Beam_segment> |
| 591 Beam::get_beam_segments (Grob *me) |
| 592 { |
| 593 SCM segments_scm = me->get_property ("beam-segments"); |
| 594 vector<Beam_segment> segments; |
| 595 for (SCM s = segments_scm; scm_is_pair (s); s = scm_cdr (s)) |
| 596 { |
| 597 segments.push_back (Beam_segment ()); |
| 598 segments.back ().vertical_count_ = robust_scm2int (ly_assoc_get (ly_symbol
2scm ("vertical-count"), scm_car (s), SCM_EOL), 0); |
| 599 segments.back ().horizontal_ = robust_scm2interval (ly_assoc_get (ly_symbo
l2scm ("horizontal"), scm_car (s), SCM_EOL), Interval (0.0, 0.0)); |
| 600 } |
| 601 |
545 return segments; | 602 return segments; |
546 } | 603 } |
547 | 604 |
548 MAKE_SCHEME_CALLBACK (Beam, print, 1); | 605 MAKE_SCHEME_CALLBACK (Beam, print, 1); |
549 SCM | 606 SCM |
550 Beam::print (SCM grob) | 607 Beam::print (SCM grob) |
551 { | 608 { |
552 Spanner *me = unsmob_spanner (grob); | 609 Spanner *me = unsmob_spanner (grob); |
553 Grob *commonx = 0; | 610 /* |
554 vector<Beam_segment> segments = get_beam_segments (me, &commonx); | 611 TODO - mild code dup for all the commonx calls. |
| 612 Some use just common_refpoint_of_array, some (in print and |
| 613 calc_beam_segments) use this plus calls to get_bound. |
| 614 |
| 615 Figure out if there is any particular reason for this and |
| 616 consolidate in one Beam::get_common function. |
| 617 */ |
| 618 extract_grob_set (me, "stems", stems); |
| 619 Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); |
| 620 Direction d = LEFT; |
| 621 do |
| 622 commonx = me->get_bound (d)->common_refpoint (commonx, X_AXIS); |
| 623 while (flip (&d) != LEFT); |
| 624 |
| 625 vector<Beam_segment> segments = get_beam_segments (me); |
| 626 |
555 if (!segments.size ()) | 627 if (!segments.size ()) |
556 return SCM_EOL; | 628 return SCM_EOL; |
557 | 629 |
558 Interval span; | |
559 if (normal_stem_count (me)) | |
560 { | |
561 span[LEFT] = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS)
; | |
562 span[RIGHT] = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS)
; | |
563 } | |
564 else | |
565 { | |
566 extract_grob_set (me, "stems", stems); | |
567 span[LEFT] = stems[0]->relative_coordinate (commonx, X_AXIS); | |
568 span[RIGHT] = stems.back ()->relative_coordinate (commonx, X_AXIS); | |
569 } | |
570 | |
571 Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); | 630 Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); |
572 | 631 |
573 SCM posns = me->get_property ("quantized-positions"); | 632 SCM posns = me->get_property ("quantized-positions"); |
| 633 Interval span = robust_scm2interval (me->get_property ("X-positions"), Interva
l (0, 0)); |
574 Interval pos; | 634 Interval pos; |
575 if (!is_number_pair (posns)) | 635 if (!is_number_pair (posns)) |
576 { | 636 { |
577 programming_error ("no beam positions?"); | 637 programming_error ("no beam positions?"); |
578 pos = Interval (0, 0); | 638 pos = Interval (0, 0); |
579 } | 639 } |
580 else | 640 else |
581 pos = ly_scm2realdrul (posns); | 641 pos = ly_scm2realdrul (posns); |
582 | 642 |
583 scale_drul (&pos, Staff_symbol_referencer::staff_space (me)); | 643 scale_drul (&pos, Staff_symbol_referencer::staff_space (me)); |
584 | 644 |
585 Real dy = pos[RIGHT] - pos[LEFT]; | 645 Real dy = pos[RIGHT] - pos[LEFT]; |
586 Real slope = (dy && span.length ()) ? dy / span.length () : 0; | 646 Real slope = (dy && span.length ()) ? dy / span.length () : 0; |
587 | 647 |
588 Real beam_thickness = get_beam_thickness (me); | 648 Real beam_thickness = get_beam_thickness (me); |
589 Real beam_dy = get_beam_translation (me); | 649 Real beam_dy = get_beam_translation (me); |
590 | 650 |
591 Direction feather_dir = to_dir (me->get_property ("grow-direction")); | 651 Direction feather_dir = to_dir (me->get_property ("grow-direction")); |
592 | 652 |
593 Interval placements = robust_scm2interval (me->get_property ("normalized-endpo
ints"), Interval (0.0, 0.0)); | 653 Interval placements = robust_scm2interval (me->get_property ("normalized-endpo
ints"), Interval (0.0, 0.0)); |
594 | 654 |
595 Stencil the_beam; | 655 Stencil the_beam; |
596 | |
597 int extreme = (segments[0].vertical_count_ == 0 | 656 int extreme = (segments[0].vertical_count_ == 0 |
598 ? segments[0].vertical_count_ | 657 ? segments[0].vertical_count_ |
599 : segments.back ().vertical_count_); | 658 : segments.back ().vertical_count_); |
600 | 659 |
601 for (vsize i = 0; i < segments.size (); i++) | 660 for (vsize i = 0; i < segments.size (); i++) |
602 { | 661 { |
603 Real local_slope = slope; | 662 Real local_slope = slope; |
604 /* | 663 /* |
605 Makes local slope proportional to the ratio of the length of this beam | 664 Makes local slope proportional to the ratio of the length of this beam |
606 to the total length. | 665 to the total length. |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 Real shorten = scm_to_double (shorten_elt) * staff_space; | 970 Real shorten = scm_to_double (shorten_elt) * staff_space; |
912 | 971 |
913 shorten *= forced_fraction; | 972 shorten *= forced_fraction; |
914 | 973 |
915 if (shorten) | 974 if (shorten) |
916 return scm_from_double (shorten); | 975 return scm_from_double (shorten); |
917 | 976 |
918 return scm_from_double (0.0); | 977 return scm_from_double (0.0); |
919 } | 978 } |
920 | 979 |
921 MAKE_SCHEME_CALLBACK (Beam, quanting, 1); | 980 MAKE_SCHEME_CALLBACK (Beam, quanting, 3); |
922 SCM | 981 SCM |
923 Beam::quanting (SCM smob) | 982 Beam::quanting (SCM smob, SCM ys_scm, SCM align_broken_intos) |
924 { | 983 { |
925 Grob *me = unsmob_grob (smob); | 984 Grob *me = unsmob_grob (smob); |
926 Drul_array<Real> ys (0, 0); | 985 Drul_array<Real> ys = robust_scm2drul (ys_scm, Drul_array<Real> (infinity_f, -
infinity_f)); |
927 Beam_scoring_problem problem (me, ys); | 986 bool cbs = to_boolean (align_broken_intos); |
928 | 987 |
| 988 Beam_scoring_problem problem (me, ys, cbs); |
929 ys = problem.solve (); | 989 ys = problem.solve (); |
| 990 |
930 return ly_interval2scm (ys); | 991 return ly_interval2scm (ys); |
931 } | 992 } |
932 | 993 |
933 /* | 994 /* |
934 Report slice containing the numbers that are both in (car BEAMING) | 995 Report slice containing the numbers that are both in (car BEAMING) |
935 and (cdr BEAMING) | 996 and (cdr BEAMING) |
936 */ | 997 */ |
937 Slice | 998 Slice |
938 where_are_the_whole_beams (SCM beaming) | 999 where_are_the_whole_beams (SCM beaming) |
939 { | 1000 { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 Real thick = 0.0; | 1087 Real thick = 0.0; |
1027 if (robust_scm2int (me->get_property ("gap-count"), 0)) | 1088 if (robust_scm2int (me->get_property ("gap-count"), 0)) |
1028 { | 1089 { |
1029 gap = true; | 1090 gap = true; |
1030 thick = get_beam_thickness (me); | 1091 thick = get_beam_thickness (me); |
1031 } | 1092 } |
1032 | 1093 |
1033 Grob *fvs = first_normal_stem (me); | 1094 Grob *fvs = first_normal_stem (me); |
1034 Grob *lvs = last_normal_stem (me); | 1095 Grob *lvs = last_normal_stem (me); |
1035 | 1096 |
1036 Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; | 1097 Interval x_span = robust_scm2interval (me->get_property ("X-positions"), Inter
val (0,0)); |
1037 Real xr = lvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; | |
1038 Direction feather_dir = to_dir (me->get_property ("grow-direction")); | 1098 Direction feather_dir = to_dir (me->get_property ("grow-direction")); |
1039 | 1099 |
1040 for (vsize i = 0; i < stems.size (); i++) | 1100 for (vsize i = 0; i < stems.size (); i++) |
1041 { | 1101 { |
1042 Grob *s = stems[i]; | 1102 Grob *s = stems[i]; |
1043 | 1103 |
1044 bool french = to_boolean (s->get_property ("french-beaming")); | 1104 bool french = to_boolean (s->get_property ("french-beaming")); |
1045 Real stem_y = calc_stem_y (me, s, common, | 1105 Real stem_y = calc_stem_y (me, s, common, |
1046 xl, xr, feather_dir, | 1106 x_span[LEFT], x_span[RIGHT], feather_dir, |
1047 pos, french && s != lvs && s != fvs); | 1107 pos, french && s != lvs && s != fvs); |
1048 | 1108 |
1049 /* | 1109 /* |
1050 Make the stems go up to the end of the beam. This doesn't matter | 1110 Make the stems go up to the end of the beam. This doesn't matter |
1051 for normal beams, but for tremolo beams it looks silly otherwise. | 1111 for normal beams, but for tremolo beams it looks silly otherwise. |
1052 */ | 1112 */ |
1053 if (gap | 1113 if (gap |
1054 && !Stem::is_invisible (s)) | 1114 && !Stem::is_invisible (s)) |
1055 stem_y += thick * 0.5 * get_grob_direction (s); | 1115 stem_y += thick * 0.5 * get_grob_direction (s); |
1056 | 1116 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 | 1236 |
1177 Drul_array<Real> pos (robust_scm2drul (beam->get_property ("positions"), | 1237 Drul_array<Real> pos (robust_scm2drul (beam->get_property ("positions"), |
1178 Drul_array<Real> (0, 0))); | 1238 Drul_array<Real> (0, 0))); |
1179 | 1239 |
1180 Real staff_space = Staff_symbol_referencer::staff_space (rest); | 1240 Real staff_space = Staff_symbol_referencer::staff_space (rest); |
1181 | 1241 |
1182 scale_drul (&pos, staff_space); | 1242 scale_drul (&pos, staff_space); |
1183 | 1243 |
1184 Real dy = pos[RIGHT] - pos[LEFT]; | 1244 Real dy = pos[RIGHT] - pos[LEFT]; |
1185 | 1245 |
1186 Drul_array<Grob *> visible_stems (first_normal_stem (beam), | |
1187 last_normal_stem (beam)); | |
1188 extract_grob_set (beam, "stems", stems); | 1246 extract_grob_set (beam, "stems", stems); |
1189 | |
1190 Grob *common = common_refpoint_of_array (stems, beam, X_AXIS); | 1247 Grob *common = common_refpoint_of_array (stems, beam, X_AXIS); |
1191 | 1248 |
1192 Real x0 = visible_stems[LEFT]->relative_coordinate (common, X_AXIS); | 1249 Interval x_span = robust_scm2interval (beam->get_property ("X-positions"), |
1193 Real dx = visible_stems[RIGHT]->relative_coordinate (common, X_AXIS) - x0; | 1250 Interval (0.0, 0.0)); |
| 1251 Real x0 = x_span[LEFT]; |
| 1252 Real dx = x_span.length (); |
1194 Real slope = dy && dx ? dy / dx : 0; | 1253 Real slope = dy && dx ? dy / dx : 0; |
1195 | 1254 |
1196 Direction d = get_grob_direction (stem); | 1255 Direction d = get_grob_direction (stem); |
1197 Real stem_y = pos[LEFT] | 1256 Real stem_y = pos[LEFT] |
1198 + (stem->relative_coordinate (common, X_AXIS) - x0) * slope; | 1257 + (stem->relative_coordinate (common, X_AXIS) - x0) * slope; |
1199 | 1258 |
1200 Real beam_translation = get_beam_translation (beam); | 1259 Real beam_translation = get_beam_translation (beam); |
1201 Real beam_thickness = Beam::get_beam_thickness (beam); | 1260 Real beam_thickness = Beam::get_beam_thickness (beam); |
1202 | 1261 |
1203 /* | 1262 /* |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 return bc; | 1430 return bc; |
1372 } | 1431 } |
1373 | 1432 |
1374 ADD_INTERFACE (Beam, | 1433 ADD_INTERFACE (Beam, |
1375 "A beam.\n" | 1434 "A beam.\n" |
1376 "\n" | 1435 "\n" |
1377 "The @code{beam-thickness} property is the weight of beams," | 1436 "The @code{beam-thickness} property is the weight of beams," |
1378 " measured in staffspace. The @code{direction} property is" | 1437 " measured in staffspace. The @code{direction} property is" |
1379 " not user-serviceable. Use the @code{direction} property" | 1438 " not user-serviceable. Use the @code{direction} property" |
1380 " of @code{Stem} instead.\n" | 1439 " of @code{Stem} instead.\n" |
1381 "\n" | |
1382 "The following properties may be set in the @code{details}" | 1440 "The following properties may be set in the @code{details}" |
1383 " list.\n" | 1441 " list.\n" |
1384 "\n" | 1442 "\n" |
1385 "@table @code\n" | 1443 "@table @code\n" |
1386 "@item stem-length-demerit-factor\n" | 1444 "@item stem-length-demerit-factor\n" |
1387 "Demerit factor used for inappropriate stem lengths.\n" | 1445 "Demerit factor used for inappropriate stem lengths.\n" |
1388 "@item secondary-beam-demerit\n" | 1446 "@item secondary-beam-demerit\n" |
1389 "Demerit used in quanting calculations for multiple" | 1447 "Demerit used in quanting calculations for multiple" |
1390 " beams.\n" | 1448 " beams.\n" |
1391 "@item region-size\n" | 1449 "@item region-size\n" |
(...skipping 19 matching lines...) Expand all Loading... |
1411 "@item round-to-zero-slope\n" | 1469 "@item round-to-zero-slope\n" |
1412 "Damping slope which is considered zero for purposes of" | 1470 "Damping slope which is considered zero for purposes of" |
1413 " calculating direction penalties.\n" | 1471 " calculating direction penalties.\n" |
1414 "@end table\n", | 1472 "@end table\n", |
1415 | 1473 |
1416 /* properties */ | 1474 /* properties */ |
1417 "annotation " | 1475 "annotation " |
1418 "auto-knee-gap " | 1476 "auto-knee-gap " |
1419 "beamed-stem-shorten " | 1477 "beamed-stem-shorten " |
1420 "beaming " | 1478 "beaming " |
| 1479 "beam-segments " |
1421 "beam-thickness " | 1480 "beam-thickness " |
1422 "break-overshoot " | 1481 "break-overshoot " |
1423 "clip-edges " | 1482 "clip-edges " |
1424 "concaveness " | 1483 "concaveness " |
1425 "consistent-broken-slope " | |
1426 "collision-interfaces " | 1484 "collision-interfaces " |
1427 "collision-voice-only " | 1485 "collision-voice-only " |
1428 "covered-grobs " | 1486 "covered-grobs " |
1429 "damping " | 1487 "damping " |
1430 "details " | 1488 "details " |
1431 "direction " | 1489 "direction " |
1432 "gap " | 1490 "gap " |
1433 "gap-count " | 1491 "gap-count " |
1434 "grow-direction " | 1492 "grow-direction " |
1435 "inspect-quants " | 1493 "inspect-quants " |
1436 "knee " | 1494 "knee " |
1437 "length-fraction " | 1495 "length-fraction " |
1438 "least-squares-dy " | 1496 "least-squares-dy " |
1439 "neutral-direction " | 1497 "neutral-direction " |
1440 "normal-stems " | 1498 "normal-stems " |
1441 "positions " | 1499 "positions " |
1442 "quantized-positions " | 1500 "quantized-positions " |
1443 "shorten " | 1501 "shorten " |
1444 "skip-quanting " | 1502 "skip-quanting " |
1445 "stems " | 1503 "stems " |
| 1504 "X-positions " |
1446 ); | 1505 ); |
OLD | NEW |