The grammar given below corresponds in an obvious way with the structure depicted in slide midi-structure.
To extract relevant fragments of the melody we use the melody detector, of which a partial listing is given below.
int melodyDetector(tree *pt, list *tks ){ char buf[1024]; char* _result; void* q = _query; int idq = 0; idq = query_eval(q,"X:melody(X)"); while ((_result = query_result(q,idq)) ) { putAtom(tks,"note",_result); } return SUCCESS; }
Parsing a given MIDI file, for example twinkle.mid, results in updating the Monet database as indicated below.
V1 := newoid(); midi_song.insert(oid(V0),oid(V1)); V2 := newoid(); song_file.insert(oid(V1),oid(V2)); file_name.insert(oid(V2),"twinkle"); song_lyrics.insert(oid(V1),oid(V2)); lyrics_text.insert(oid(V2),"e"); lyrics_text.insert(oid(V2),"per-"); lyrics_text.insert(oid(V2),"sonne"); lyrics_text.insert(oid(V2),"Moi"); lyrics_text.insert(oid(V2),"je"); lyrics_text.insert(oid(V2),"dis"); lyrics_text.insert(oid(V2),"que"); lyrics_text.insert(oid(V2),"les"); lyrics_text.insert(oid(V2),"bon-"); lyrics_text.insert(oid(V2),"bons"); lyrics_text.insert(oid(V2),"Val-"); lyrics_text.insert(oid(V2),"ent"); song_melody.insert(oid(V1),oid(V2)); melody_note.insert(oid(V2),"a-2"); melody_note.insert(oid(V2),"a-2"); melody_note.insert(oid(V2),"g-2"); melody_note.insert(oid(V2),"g-2"); melody_note.insert(oid(V2),"f-2"); melody_note.insert(oid(V2),"f-2"); melody_note.insert(oid(V2),"e-2"); melody_note.insert(oid(V2),"e-2"); melody_note.insert(oid(V2),"d-2"); melody_note.insert(oid(V2),"d-2"); melody_note.insert(oid(V2),"e-2"); melody_note.insert(oid(V2),"c-2");