midi_note(This,D,C,T,V) :- 
          Self = midi(This), // cast to midi
          Self:event(D,C,note_on,T,V),
          Self:event(D,C,note_off,T,V).
  
  midi_melody(This,L) :- self(This):melody(480,1,L,64).
  
  midi_melody(_This,_,_,[],_).
  
  midi_melody(This,D,C,[X|R],V) :-
          Self = self(This),
          Self:note(D,C,X,V),  
          midi_melody(This,D,C,R,V).   // direct invocation