+ if (Audio_key *i = dynamic_cast<Audio_key *> (a))
+ return new Midi_key (i);
+ else if (Audio_instrument *i = dynamic_cast<Audio_instrument *> (a))
+ return i->str_.length () ? new Midi_instrument (i) : 0;
+ else if (Audio_note *i = dynamic_cast<Audio_note *> (a))
+ return new Midi_note (i);
+ else if (Audio_dynamic *i = dynamic_cast<Audio_dynamic *> (a))
+ return new Midi_dynamic (i);
+ else if (Audio_piano_pedal *i = dynamic_cast<Audio_piano_pedal *> (a))
+ return new Midi_piano_pedal (i);
+ else if (Audio_tempo *i = dynamic_cast<Audio_tempo *> (a))
+ return new Midi_tempo (i);
+ else if (Audio_time_signature *i = dynamic_cast<Audio_time_signature *> (a))
+ return new Midi_time_signature (i);
+ else if (Audio_text *i = dynamic_cast<Audio_text *> (a))
+ return new Midi_text (i);
+ else
+ assert (0);
+
+ return 0;