On Sat, 22 Jan 2011 12:09:26 +0000 Bernard Hurley <bern...@marcade.biz> wrote:
> On Sat, Jan 22, 2011 at 10:34:29AM +0000, c.m.bryan wrote: > > Hi, I have an interesting question. I know lilypond is not really > > meant for playback. HOWEVER :) > > > Personally I would like lily to have much more sophisicated midi > capabilities. Me too. > For instance It would be nice if markup could be tied to program > change events so, for instance, markup like "pizz" could not only be > printed in the score but also change the midi instrument. It would > also be nice if things like staccatto were renereabl in midi, and, > perhaps "tunable". This isn't as hard as it seems from a programming standpoint. Although I am still learning the internals of lilypond (and haven't had much time of late), I did write a skeleton Expression_performer (MIDI CC 11) that handles expression spanner events for kicks (not committed or committable but was a great learning experience). It takes a bit of digging but the programmers' reference and previous threads[1][2] and of course, hours of source-code study were invaluable to me. For program changes (as with expression), I'm pretty sure you would need to get into c++ down to the Audio_Event level (doxygen documentation was also a major help in understanding class hierarchy) and then work your way back up to the scheme and lily init levels. There is also articulate[2] which is a good starting point for scheme development, but again, I think the program changes would need to be implemented at the c++ core level (I could be wrong and more knowledgeable folks should correct me). [1] http://www.mail-archive.com/lilypond-devel@gnu.org/msg32077.html [2] http://www.mail-archive.com/lilypond-devel@gnu.org/msg32380.html [3] http://www.nicta.com.au/people/chubbp/articulate David PS Although intercepting 'pizz' and 'marcato' etc are interesting, I, personally would much rather see a special MIDI syntax coupled with a special voice context (controller lane in DAW parlance). Like this: \new MidiStaff << \new Voice { c1\> f1\! } \new MidiControlVoice { \set MidiControlVoice.midiProgChange 'violin' \set MidiControlVoice.midiVolume #101 \set MidiControlVoice.midiExpression #64 % sequence of CC 11 events spanning a measure m1\midiExpressionSpanner { <start> <end> <curveType> } } >> 'm' is just a placeholder to attach stream positional information. But with most "continuous" controllers, expression, modulation, pitch-bend etc, you will want to span and each spanner would need start, end and curveType parameters, at the least -- maybe even density. Sorry for rambling / brainstorming ... _______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-devel