slide: The extended ACOI architecture



  detector world; // finds the name of the world
  detector people; // checks name, eliminates institutes
  detector company; // looks if there are at least two persons
  
  atom str name;
  
  community: world people company;
  
  world: name;
  people: person*;
  
  person: name;
  

slide: A sample grammar



  int personDetector(tree *pt, list *tks ){
  ...
  q = query_query("kit=pl src=check.pl");
  
  while (t = next_token(tks)) {
        sprintf(buf,"person(\%s)",t);
        query_eval(q,buf);
        if (query_result(q,0)) 
put name(person) on tokenstream

putAtom(tks,"name",t); } ... }

slide: A person detector



  V0 := newoid();
  V1 := newoid();
    community_world.insert(oid(V0),oid(V1));
      world_name.insert(oid(V1),"casa");
    community_people.insert(oid(V0),oid(V1));
  V2 := newoid();
      people_person.insert(oid(V1),oid(V2));
        person_name.insert(oid(V2),"alice");
      people_person.insert(oid(V1),oid(V2));
        person_name.insert(oid(V2),"sebastiaan");
      ...
  

slide: Database updates



slide: MIDI features



  
  detector song; ## to get the filename
  detector lyrics; ## extracts lyrics
  detector melody; ## extracts melody
  
  atom str name;
  atom str text;
  atom str note;  
  
  song: file lyrics melody;
  
  file: name;
  lyrics: text*;
  melody: note*;
  
  

slide: A simple feature grammar for MIDI files


  event('kortjakje',2,time=384, note_on:[chan=2,pitch=72,vol=111]).
  event('kortjakje',2,time=768, note_off:[chan=2,pitch=72,vol=100]).
  


slide: Processing MIDI file



  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)) ) {
           printf("note: \%s",_result);
           putAtom(tks,"note",_result);
           }
    return SUCCESS;
  } 
  

slide: The melody detector


  given type AtomName, AtomValue;
  
  interface tokenstream {
  	void putAtom(in AtomName, in AtomValue);
  };
  


  V1 := newoid();
    midi_song.insert(oid(V0),oid(V1));
  V2 := newoid();
      song_file.insert(oid(V1),oid(V2));
        file_name.insert(oid(V2),"kortjakje");
      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");
  
  

slide: Update of Monet database



slide: Keyboard interface



slide: User Query Processing