--- /dev/null
+\header{
+texidoc="
+In InnerStaffGroup and InnerChoirStaff, the brackets should be shiftet leftwards.
+";
+filename = "nested-groups.ly";
+description = "Test of nested staff groups and choirstaffs";
+enteredby = "RZ";
+copyright = "public domain";
+Tested = "Nested StaffGroups";
+}
+
+\version "1.3.140" % rz1
+
+\score { \notes
+<
+ \context StaffGroup = ga <
+ \context Staff = sb {c' d' e' f'}
+ \context InnerStaffGroup = isga <
+ \context Staff = sd {c' d' e' f'}
+ \context GrandStaff=gs <
+ \context Staff = sgsa {c' d' e' f'}
+ \context Staff = sgsb {c' d' e' f'}
+ >
+ \context Staff = sc {c' d' e' f'}
+ >
+ \context ChoirStaff = csa <
+ \context Staff = sd {c' d' e' f'}
+ \context InnerStaffGroup=gc <
+ \context Staff = sq {c' d' e' f'}
+ >
+ \context Staff = se {c' d' e' f'}
+ >
+ >
+ \context ChoirStaff = csb <
+ \context Staff = sg {c' d' e' f'}
+ \context InnerStaffGroup = isgb <
+ \context Staff = sh {c' d' e' f'}
+ \context Staff = si {c' d' e' f'}
+ >
+ \context Staff = sj {c' d' e' f'}
+ >
+
+>
+
+ \paper { linewidth = -1; }
+}
\include "german-chords.ly"
+
% #(set! german-Bb #t)
ch = \chords { beses1/+beses bes/+bes b/+b bis/+bis ases/+ases as/+as a/+a ais/+ais fisis/+fisis}
-
\score {
<
- \context ChordNames=ch {\ch}
- \context Staff=st \chords {\ch}
+ \context ChordNames=chn {\ch}
+ \context Staff=stf \chords {\ch}
>
\paper {}
}
--- /dev/null
+% tests drum notation and midi-drums.
+% see ly/drumpitch.ly for list of instruments and paper-kits.
+% scm/midi.scm for list of midi-drumkits.
+
+\include "drumpitch.ly";
+
+\version "1.3.142"
+
+drh = \notes { cymc4.^"crash" hhc16^"h.h." hh \repeat "unfold" 5 {hhc8 hho hhc8 hh16 hh} hhc4 r4 r2 }
+drl = \notes {\repeat "unfold" 3 {bd4 sn8 bd bd4 <bd ss>} bd8 tommh tommh bd toml toml bd tomfh16 tomfh }
+timb = \notes \repeat "unfold" 2 {timh4 ssh timl8 ssh r timh r4 ssh8 timl r4 cb8 cb}
+
+\score { \repeat "volta" 2
+ <
+ \context TwoLineStaff=timbst \notes <
+ \property Staff.instrument="timbales"
+ \clef "percussion";
+ \apply #(drums->paper 'timbales) \timb
+ >
+ \context Staff=drumst \notes <
+ \property Staff.instrument="drums"
+ \clef "percussion";
+ \apply #(drums->paper 'drums) <
+ \context Voice=voa {\stemUp \drh }
+ \context Voice=vob {\stemDown \drl }
+ >
+ >
+ >
+ \paper {
+ \translator {
+ \StaffContext
+ \consists Instrument_name_engraver;
+ Script \override #'padding = #0.5
+ }
+ \translator {
+ \StaffContext
+ \name TwoLineStaff;
+ \alias Staff;
+ \consists Instrument_name_engraver;
+ StaffSymbol \override #'line-count = #2;
+ BarLine \override #'bar-size = #2;
+ }
+ \translator {
+ \ScoreContext
+ \accepts TwoLineStaff;
+ }
+ }
+}
+
+\score { \repeat "unfold" 2
+ \context Staff \notes <
+ \property Staff.instrument="drums"
+ \timb
+ \drh
+ \drl
+ >
+ \midi{ \tempo 4=120; }
+}
+
property @code{followVoice}.
";
}
-% followThread: connect note heads with line when thread switches staff
+
+\version "1.3.139"
+% followVoice: connect note heads with line when thread switches staff
fragment = \notes {
\context PianoStaff <
\property PianoStaff.followVoice = ##t
+ \property Voice.VoiceFollower \set #'type = #'dashed-line
\context Staff \context Voice {
c'1
\translator Staff=two
{
Midi_track midi_track;
midi_track.number_i_ = track_i;
+ midi_track.channel_i_ = channel_i_;
for (Midi_walker i (this, &midi_track); i.ok (); i++)
i.process ();
midi_stream_r << midi_track;
void output (Midi_stream& midi_stream_r, int track_i);
Link_array<Audio_item> audio_item_l_arr_;
+ int channel_i_;
};
#endif // AUDIO_STAFF_HH
/// Scale the music in time by #factor#.
virtual void compress (Moment factor);
VIRTUAL_COPY_CONS (Music);
+ Music ();
Music (Music const &m);
Music (SCM);
protected:
set ("MThd", str, "");
}
-
-/* why doesn't this start at 0 ?
-
- TODO: -> IN GUILE!
- */
-char const* const instrument_name_sz_a_[ ] = {
- /* default is usually piano */
- /* 0 "piano", */
-
- /* (1-8 piano) */
- /* 1 */ "acoustic grand",
- /* 2 */ "bright acoustic",
- /* 3 */ "electric grand",
- /* 4 */ "honky-tonk",
- /* 5 */ "electric piano 1",
- /* 6 */ "electric piano 2",
- /* 7 */ "harpsichord",
- /* 8 */ "clav",
-
- /* (9-16 chrom percussion) */
- /* 9 */ "celesta",
- /* 10 */ "glockenspiel",
- /* 11 */ "music box",
- /* 12 */ "vibraphone",
- /* 13 */ "marimba",
- /* 14 */ "xylophone",
- /* 15 */ "tubular bells",
- /* 16 */ "dulcimer",
-
- /* (17-24 organ) */
- /* 17 */ "drawbar organ",
- /* 18 */ "percussive organ",
- /* 19 */ "rock organ",
- /* 20 */ "church organ",
- /* 21 */ "reed organ",
- /* 22 */ "accordion",
- /* 23 */ "harmonica",
- /* 24 */ "concertina",
-
- /* (25-32 guitar) */
- /* 25 */ "acoustic guitar (nylon)",
- /* 26 */ "acoustic guitar (steel)",
- /* 27 */ "electric guitar (jazz)",
- /* 28 */ "electric guitar (clean)",
- /* 29 */ "electric guitar (muted)",
- /* 30 */ "overdriven guitar",
- /* 31 */ "distorted guitar",
- /* 32 */ "guitar harmonics",
-
- /* (33-40 bass) */
- /* 33 */ "acoustic bass",
- /* 34 */ "electric bass (finger)",
- /* 35 */ "electric bass (pick)",
- /* 36 */ "fretless bass",
- /* 37 */ "slap bass 1",
- /* 38 */ "slap bass 2",
- /* 39 */ "synth bass 1",
- /* 40 */ "synth bass 2",
-
- /* (41-48 strings) */
- /* 41 */ "violin",
- /* 42 */ "viola",
- /* 43 */ "cello",
- /* 44 */ "contrabass",
- /* 45 */ "tremolo strings",
- /* 46 */ "pizzicato strings",
- /* 47 */ "orchestral strings",
- /* 48 */ "timpani",
-
- /* (49-56 ensemble) */
- /* 49 */ "string ensemble 1",
- /* 50 */ "string ensemble 2",
- /* 51 */ "synthstrings 1",
- /* 52 */ "synthstrings 2",
- /* 53 */ "choir aahs",
- /* 54 */ "voice oohs",
- /* 55 */ "synth voice",
- /* 56 */ "orchestra hit",
-
- /* (57-64 brass) */
- /* 57 */ "trumpet",
- /* 58 */ "trombone",
- /* 59 */ "tuba",
- /* 60 */ "muted trumpet",
- /* 61 */ "french horn",
- /* 62 */ "brass section",
- /* 63 */ "synthbrass 1",
- /* 64 */ "synthbrass 2",
-
- /* (65-72 reed) */
- /* 65 */ "soprano sax",
- /* 66 */ "alto sax",
- /* 67 */ "tenor sax",
- /* 68 */ "baritone sax",
- /* 69 */ "oboe",
- /* 70 */ "english horn",
- /* 71 */ "bassoon",
- /* 72 */ "clarinet",
-
- /* (73-80 pipe) */
- /* 73 */ "piccolo",
- /* 74 */ "flute",
- /* 75 */ "recorder",
- /* 76 */ "pan flute",
- /* 77 */ "blown bottle",
- /* 78 */ "skakuhachi",
- /* 79 */ "whistle",
- /* 80 */ "ocarina",
-
- /* (81-88 synth lead) */
- /* 81 */ "lead 1 (square)",
- /* 82 */ "lead 2 (sawtooth)",
- /* 83 */ "lead 3 (calliope)",
- /* 84 */ "lead 4 (chiff)",
- /* 85 */ "lead 5 (charang)",
- /* 86 */ "lead 6 (voice)",
- /* 87 */ "lead 7 (fifths)",
- /* 88 */ "lead 8 (bass+lead)",
-
- /* (89-96 synth pad) */
- /* 89 */ "pad 1 (new age)",
- /* 90 */ "pad 2 (warm)",
- /* 91 */ "pad 3 (polysynth)",
- /* 92 */ "pad 4 (choir)",
- /* 93 */ "pad 5 (bowed)",
- /* 94 */ "pad 6 (metallic)",
- /* 95 */ "pad 7 (halo)",
- /* 96 */ "pad 8 (sweep)",
-
- /* (97-104 synth effects) */
- /* 97 */ "fx 1 (rain)",
- /* 98 */ "fx 2 (soundtrack)",
- /* 99 */ "fx 3 (crystal)",
- /* 100 */ "fx 4 (atmosphere)",
- /* 101 */ "fx 5 (brightness)",
- /* 102 */ "fx 6 (goblins)",
- /* 103 */ "fx 7 (echoes)",
- /* 104 */ "fx 8 (sci-fi)",
-
- /* (105-112 ethnic) */
- /* 105 */ "sitar",
- /* 106 */ "banjo",
- /* 107 */ "shamisen",
- /* 108 */ "koto",
- /* 109 */ "kalimba",
- /* 110 */ "bagpipe",
- /* 111 */ "fiddle",
- /* 112 */ "shanai",
-
- /* (113-120 percussive) */
- /* 113 */ "tinkle bell",
- /* 114 */ "agogo",
- /* 115 */ "steel drums",
- /* 116 */ "woodblock",
- /* 117 */ "taiko drum",
- /* 118 */ "melodic tom",
- /* 119 */ "synth drum",
- /* 120 */ "reverse cymbal",
-
- /* (121-128 sound effects) */
- /* 121 */ "guitar fret noise",
- /* 122 */ "breath noise",
- /* 123 */ "seashore",
- /* 124 */ "bird tweet",
- /* 125 */ "telephone ring",
- /* 126 */ "helicopter",
- /* 127 */ "applause",
- /* 128 */ "gunshot",
- 0
-};
-
Midi_instrument::Midi_instrument (Audio_instrument* a)
{
audio_l_ = a;
}
String
-Midi_instrument::str () const
+Midi_instrument::str() const
{
Byte program_byte = 0;
bool found = false;
- for (int i = 0; !found && instrument_name_sz_a_[i]; i++)
- if (audio_l_->str_ == String (instrument_name_sz_a_[ i ]))
- {
- program_byte = (Byte)i;
- found = true;
- }
-
- if (!found)
- {
+ SCM proc = scm_eval2 (ly_symbol2scm ("midi-program"), SCM_EOL);
+ SCM program = gh_call1 (proc, ly_symbol2scm (audio_l_->str_.ch_C()));
+ found = (program != SCM_BOOL_F);
+ if (found)
+ program_byte = gh_scm2int(program);
+ else
warning (_f ("no such instrument: `%s'", audio_l_->str_.ch_C ()));
- }
-
- String str = to_str ((char) (0xc0 + channel_i_));
+
+ String str = to_str ((char) (0xc0 + channel_i_)); //YIKES! FIXME: Should be track. -rz
str += to_str ((char)program_byte);
return str;
}
Midi_track::data_str () const
{
String str = Midi_chunk::data_str ();
-
if (midi_debug_global_b)
str += "\n";
for (Cons<Midi_event> *i=event_p_list_.head_; i; i = i->next_)
*/
if (Midi_item* midi_p = Midi_item::midi_p (audio_p))
{
- midi_p->channel_i_ = track_l_->number_i_;
+ midi_p->channel_i_ = track_l_->channel_i_;
+ //midi_p->channel_i_ = track_l_->number_i_;
if (Midi_note* note_p = dynamic_cast<Midi_note*> (midi_p))
{
if (note_p->length_mom ())
}
+Music::Music ()
+{
+ immutable_property_alist_ = SCM_EOL;
+ mutable_property_alist_ = SCM_EOL;
+ smobify_self ();
+}
+
Music::Music (Music const &m)
{
immutable_property_alist_ = m.immutable_property_alist_;
smobify_self ();
}
+
SCM
Music::mark_smob (SCM m)
{
scm_make_gsubr ("ly-music-name", 1, 0, 0, (Scheme_function_unknown)ly_music_name);
}
ADD_SCM_INIT_FUNC (musicscm,init_functions);
+ADD_MUSIC(Music);
output_header_track (midi_stream);
progress_indication ("\n");
progress_indication (_ ("Track ... "));
- int channel = 1;
+ int channel = 0;
for (int i =0; i < audio_staff_l_arr_.size (); i++)
{
Audio_staff *s = audio_staff_l_arr_[i];
channel 10, the percussion channel by default.
*/
if (channel == 9)
- channel++;
+ channel++;
+ if (s->channel_i_ < 0)
+ s->channel_i_ = channel;
s->output (midi_stream, channel++);
if (verbose_global_b)
progress_indication ("]");
{
Midi_track midi_track;
+ midi_track.channel_i_ = 9;
+
// perhaps multiple text events?
String id_str;
String str = String (_ ("Creator: "));
void
Staff_performer::stop_translation_timestep ()
{
+ SCM proc = scm_eval2 (ly_symbol2scm ("percussion-p"), SCM_EOL);
+ SCM drums_p = gh_call1 (proc, ly_symbol2scm (instrument_str_.ch_C()));
+ audio_staff_p_->channel_i_ = (drums_p == SCM_BOOL_T ? 9 : -1 );
if (name_p_)
{
play_element (name_p_);
*/
if (gh_symbol_p (gl) && gl == ly_symbol2scm ("brace")
&& gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
- inf.elem_l_->translate_axis (-1.0, X_AXIS); // ugh
+ inf.elem_l_->translate_axis (-0.8, X_AXIS); // ugh
else if (gh_symbol_p (gl) && gl == ly_symbol2scm ("bracket")
- && gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
- {
- inf.elem_l_->translate_axis ( -0.8, X_AXIS); // ugh
- inf.elem_l_->set_grob_property ("arch-height",
- gh_double2scm(gh_scm2double(inf.elem_l_->get_grob_property
- ("arch-height"))+0.5));
- }
+ && gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
+ {
+ inf.elem_l_->translate_axis ( -0.8, X_AXIS); // ugh
+ inf.elem_l_->set_grob_property ("arch-height",
+ gh_double2scm(gh_scm2double(inf.elem_l_->get_grob_property
+ ("arch-height"))+0.5));
+ }
}
-
}
System_start_delimiter_engraver::System_start_delimiter_engraver ()
--- /dev/null
+% GM drum pitches.
+% I use different accidentals to distinguish drums at the same GM pitch.
+% Always accidental 0 (white keys) or 1 (black keys) to get the "correct" gm name.
+% i.e. fis, for closed highat ; ges, for highat.
+
+% 2001/03/25 Rune Zedeler <rune@zedeler.dk>
+
+
+#(define drum-pitch-names `(
+ (acousticbassdrum bda ,(make-pitch -3 6 0 ))
+ (bassdrum bd ,(make-pitch -2 0 0 ))
+ (hisidestick ssh ,(make-pitch -3 6 2))
+ (sidestick ss ,(make-pitch -2 0 1))
+ (losidestick ssl ,(make-pitch -2 1 -1))
+ (acousticsnare sna ,(make-pitch -2 1 0))
+ (snare sn ,(make-pitch -2 2 -2))
+ (handclap hc ,(make-pitch -2 1 1))
+ (electricsnare sne ,(make-pitch -2 2 0))
+ (lowfloortom tomfl ,(make-pitch -2 3 0))
+ (closedhihat hhc ,(make-pitch -2 3 1))
+ (hihat hh ,(make-pitch -2 4 -1))
+ (highfloortom tomfh ,(make-pitch -2 4 0))
+ (pedalhihat hhp ,(make-pitch -2 4 1))
+ (lowtom toml ,(make-pitch -2 5 0))
+ (openhihat hho ,(make-pitch -2 5 1))
+ (halfopenhihat hhho ,(make-pitch -2 5 1))
+ (lowmidtom tomml ,(make-pitch -2 6 0))
+ (himidtom tommh ,(make-pitch -1 0 0))
+ (crashcymbala cymca ,(make-pitch -1 0 1))
+ (crashcymbal cymc ,(make-pitch -1 1 -1))
+ (hightom tomh ,(make-pitch -1 1 0))
+ (ridecymbala cymra ,(make-pitch -1 1 1))
+ (ridecymbal cymr ,(make-pitch -1 2 -1))
+ (chinesecymbal cymch ,(make-pitch -1 2 0))
+ (ridebell rb ,(make-pitch -1 3 0))
+ (tambourine tamb ,(make-pitch -1 3 1))
+ (splashcymbal cyms ,(make-pitch -1 4 0))
+ (cowbell cb ,(make-pitch -1 4 1))
+ (crashcymbalb cymcb ,(make-pitch -1 5 0))
+ (vibraslap vibs ,(make-pitch -1 5 1))
+ (ridecymbalb cymrb ,(make-pitch -1 6 0))
+ (hibongo boh ,(make-pitch 0 0 0))
+ (lobongo bol ,(make-pitch 0 0 1))
+ (mutehiconga cghm ,(make-pitch 0 1 0))
+ (openhiconga cgho ,(make-pitch 0 1 1))
+ (hiconga cgh ,(make-pitch 0 2 -1))
+ (loconga cgl ,(make-pitch 0 2 0))
+ (hitimbale timh ,(make-pitch 0 3 0))
+ (lotimbale timl ,(make-pitch 0 3 1))
+ (hiagogo agh ,(make-pitch 0 4 0))
+ (loagogo agl ,(make-pitch 0 4 1))
+ (cabasa cab ,(make-pitch 0 5 0))
+ (maracas mar ,(make-pitch 0 5 1))
+ (shortwhistle whs ,(make-pitch 0 6 0))
+ (longwhistle whl ,(make-pitch 1 0 0))
+ (shortguiro guis ,(make-pitch 1 0 1))
+ (longguiro guil ,(make-pitch 1 1 0))
+ (guiro gui ,(make-pitch 1 0 2))
+ (claves cl ,(make-pitch 1 1 1))
+ (hiwoodblock wbh ,(make-pitch 1 2 0))
+ (lowoodblock wbl ,(make-pitch 1 3 0))
+ (mutecuica cuim ,(make-pitch 1 3 1))
+ (opencuica cuio ,(make-pitch 1 4 0))
+ (mutetriangle trim ,(make-pitch 1 4 1))
+ (triangle tri ,(make-pitch 1 4 2))
+ (opentriangle trio ,(make-pitch 1 5 0))
+ ; "transposing" pitches:
+ (oneup ua ,(make-pitch 0 1 0))
+ (twoup ub ,(make-pitch 0 2 0))
+ (threeup uc ,(make-pitch 0 3 0))
+ (fourup ud ,(make-pitch 0 4 0))
+ (fiveup ue ,(make-pitch 0 5 0))
+ (onedown da ,(make-pitch -1 6 0))
+ (twodown db ,(make-pitch -1 5 0))
+ (threedown dc ,(make-pitch -1 4 0))
+ (fourdown dd ,(make-pitch -1 3 0))
+ (fivedown de ,(make-pitch -1 2 0))
+))
+
+#(define drums `(
+ (acousticbassdrum default ,#f ,(make-pitch -1 4 0))
+ (bassdrum default ,#f ,(make-pitch -1 4 0))
+ (sidestick cross ,#f ,(make-pitch 0 1 0))
+ (acousticsnare default ,#f ,(make-pitch 0 1 0))
+ (snare default ,#f ,(make-pitch 0 1 0))
+ (handclap triangle ,#f ,(make-pitch 0 1 0))
+ (electricsnare default ,#f ,(make-pitch 0 1 0))
+ (lowfloortom default ,#f ,(make-pitch -1 3 0))
+ (closedhihat cross "stopped" ,(make-pitch 0 3 0))
+ (hihat cross ,#f ,(make-pitch 0 3 0))
+ (highfloortom default ,#f ,(make-pitch -1 5 0))
+ (pedalhihat cross ,#f ,(make-pitch -1 2 0))
+ (lowtom default ,#f ,(make-pitch 0 0 0))
+ (openhihat cross "open" ,(make-pitch 0 3 0))
+ (halfopenhihat xcircle ,#f ,(make-pitch 0 3 0))
+ (lowmidtom default ,#f ,(make-pitch 0 1 0))
+ (himidtom default ,#f ,(make-pitch 0 2 0))
+ (crashcymbala xcircle ,#f ,(make-pitch 0 5 0))
+ (crashcymbal xcircle ,#f ,(make-pitch 0 5 0))
+ (hightom default ,#f ,(make-pitch 0 4 0))
+ (ridecymbala cross ,#f ,(make-pitch 0 5 0))
+ (ridecymbal cross ,#f ,(make-pitch 0 5 0))
+ (chinesecymbal mensural ,#f ,(make-pitch 0 5 0))
+ (ridebell default ,#f ,(make-pitch 0 5 0))
+ (splashcymbal diamond ,#f ,(make-pitch 0 5 0))
+ (cowbell triangle ,#f ,(make-pitch 0 5 0))
+ (crashcymbalb cross ,#f ,(make-pitch 0 5 0))
+ (vibraslap diamond ,#f ,(make-pitch 0 4 0))
+ (ridecymbalb cross ,#f ,(make-pitch 0 5 0))
+ ))
+
+#(define timbales `(
+ (losidestick cross ,#f ,(make-pitch -1 6 0))
+ (lotimbale default ,#f ,(make-pitch -1 6 0))
+ (cowbell triangle ,#f ,(make-pitch 0 0 0))
+ (hisidestick cross ,#f ,(make-pitch 0 1 0))
+ (hitimbale default ,#f ,(make-pitch 0 1 0))
+ ))
+
+#(define congas `(
+ (losidestick cross ,#f ,(make-pitch -1 6 0))
+ (loconga default ,#f ,(make-pitch -1 6 0))
+ (hisidestick cross ,#f ,(make-pitch 0 1 0))
+ (hiconga default ,#f ,(make-pitch 0 1 0))
+ (openhiconga default open" ,(make-pitch 0 1 0))
+ (mutehiconga default stopped" ,(make-pitch 0 1 0))
+ ))
+
+#(define bongos `(
+ (lobongo default ,#f ,(make-pitch -1 6 0))
+ (hibongo default ,#f ,(make-pitch 0 1 0))
+ ))
+
+#(define guiro `(
+ (shortguiro default "staccato",(make-pitch 0 0 0))
+ (longguiro default "tenuto" ,(make-pitch 0 0 0))
+ (guiro default ,#f ,(make-pitch 0 0 0))
+ ))
+
+#(define triangle `(
+ (opentriangle cross "open" ,(make-pitch 0 0 0))
+ (mutetriangle cross "stopped" ,(make-pitch 0 0 0))
+ (triangle cross ,#f ,(make-pitch 0 0 0))
+ ))
+
+
+
+\pitchnames
+#(append (map (lambda (x) (cons (car x) (caddr x))) drum-pitch-names)
+ (map (lambda (x) (cons (cadr x) (caddr x))) drum-pitch-names)
+ )
+
+
+\version "1.3.142";
\translator { \NoteNamesContext }
\translator { \ScoreContext }
\translator { \ChoirStaffContext}
+\translator { \InnerChoirStaffContext}
\translator { \GraceContext}
\translator { \RhythmicStaffContext}
\translator { \StaffContext }
\translator { \VoiceContext}
\translator { \StaffGroupContext }
+\translator { \InnerStaffGroupContext }
\translator { \ChordNamesContext }
\translator { \GrandStaffContext}
\translator { \LyricsContext }
--- /dev/null
+; drum-"hack". See input/tricks/drums.ly and ly/drumpitch.ly
+; 2001/03/25 Rune Zedeler <rune@zedeler.dk>
+
+(define (seq-music-list elts)
+ (let* ( (ml (ly-make-music "Sequential_music")) )
+ (ly-set-mus-property ml 'elements elts)
+ ml
+))
+
+(define (make-art-script x)
+ (let* ( (m (ly-make-music "Articulation_req"))
+ )
+ (ly-set-mus-property m 'articulation-type x)
+ m
+ )
+ )
+
+;; adds the articulation script x to m if x is not #f.
+(define (add-art-script m x)
+ (if x
+ (if (and x (equal? (ly-music-name m) "Request_chord"))
+ (ly-set-mus-property m 'elements
+ (cons (make-art-script x) (ly-get-mus-property m 'elements))
+ )
+ (let* ( (es (ly-get-mus-property m 'elements))
+ (e (ly-get-mus-property m 'element)) )
+ (map (lambda (y) (add-art-script y x)) es)
+ (if (music? e)
+ (add-art-script e x))
+ )
+ )
+ )
+ m
+ )
+
+(define (make-head-type-elem t)
+ (let* ( (m (ly-make-music "Music"))
+ )
+ (ly-set-mus-property m 'iterator-ctor Push_property_iterator::constructor)
+ (ly-set-mus-property m 'symbols 'NoteHead)
+ (ly-set-mus-property m 'grob-property 'style)
+ (ly-set-mus-property m 'grob-value t)
+ m
+ )
+ )
+
+(define (make-head-type t)
+ (let* ( (m (ly-make-music "Context_specced_music"))
+ (e (make-head-type-elem t))
+ )
+ (ly-set-mus-property m 'element e)
+ (ly-set-mus-property m 'context-type "Thread")
+ m
+ )
+ )
+
+(define (make-thread-context thread-name element)
+ (let* ( (m (ly-make-music "Context_specced_music")))
+ (ly-set-mus-property m 'element element)
+ (ly-set-mus-property m 'context-type "Thread")
+ (ly-set-mus-property m 'context-id (symbol->string thread-name))
+ m
+ )
+ )
+
+;; makes a sequential-music of thread-context, head-change and note
+(define (make-drum-head kit req-ch )
+ (let ((es (ly-get-mus-property req-ch 'elements)))
+ (if (equal? es '())
+ req-ch
+ (let* ((fe (car es))
+ (oldp (ly-get-mus-property fe 'pitch))
+ )
+ (if (not (pitch? oldp))
+ req-ch
+ (let* ((pap ((pitch->paper kit) oldp ))
+ (style (car pap))
+ (script (cadr pap))
+ (pitch (caddr pap))
+ (ht (make-head-type style))
+ (seq (seq-music-list (list ht req-ch)))
+ )
+ (add-art-script req-ch script)
+ (ly-set-mus-property fe 'pitch pitch)
+ (set! req-ch (make-thread-context style seq))
+ req-ch
+ )
+ )
+ )
+ )
+ )
+ )
+
+;; whoa, hadn't head of "assoc" when I made this :)
+(define ((pitch->paper kit) p)
+ (let p2p ((pitches drum-pitch-names))
+ (cond ((eq? pitches '())
+ (begin
+ (display p) ;; UGH. FIXME. pitch->string ???
+ (ly-warn " unknown drumpitch.")
+ (cdar (eval kit))
+ ))
+ ((eq? p (caddr (car pitches))) ((name->paper kit) (caar pitches)) )
+ (else (p2p (cdr pitches) ) )
+ )
+ )
+ )
+(define ((name->paper kit) n)
+ (let n2p ((pitches (eval kit)))
+ (cond ((eq? pitches '())
+ (begin
+ (ly-warn (string-append "Kit `" (symbol->string kit) "' doesn't contain drum `" n
+ "'\nSee lily/drumpitch.ly for supported drums."))
+ (cdar (eval kit))
+ ))
+ ((eq? n (caar pitches)) (cdar pitches) )
+ (else (n2p (cdr pitches) ) )
+ )
+ )
+ )
+
+
+;; converts a midi-pitched (ly/drumpitch.ly) file to paper output.
+(define ((drums->paper kit) music)
+ (begin
+ (if (equal? (ly-music-name music) "Request_chord")
+ (set! music (make-drum-head kit music))
+ (let* ((es (ly-get-mus-property music 'elements))
+ (e (ly-get-mus-property music 'element))
+ (p (ly-get-mus-property music 'pitch))
+ (body (ly-get-mus-property music 'body))
+ (alts (ly-get-mus-property music 'alternatives)))
+
+ (if (pair? es)
+ (ly-set-mus-property music 'elements (map (drums->paper kit) es) )
+ )
+
+ (if (music? alts)
+ (ly-set-mus-property
+ music 'alternatives
+ ((drums->paper kit) alts)))
+
+ (if (music? body)
+ (ly-set-mus-property
+ music 'body
+ ((drums->paper kit) body)))
+
+ (if (music? e)
+ (begin
+ (ly-set-mus-property
+ music 'element
+ ((drums->paper kit) e))
+ )
+ )
+ )
+ )
+ music
+ )
+ )
"chord-name.scm"
"grob-description.scm"
"script.scm"
+ "drums.scm"
"midi.scm"
)))