예제 #1
0
    def run(self):
        if 'StreamIterator' in self.streamSearch.classes:
            thisStreamIterator = self.streamSearch
        else:
            if self.recurse:
                thisStreamIterator = self.streamSearch.recurse()
            else:
                thisStreamIterator = self.streamSearch.iter

            if self.filterNotesAndRests:
                thisStreamIterator.addFilter(
                    filters.ClassFilter('GeneralNote'))
            elif self.filterNotes:
                thisStreamIterator.addFilter(
                    filters.ClassFilter(['Note', 'Chord']))

        self.activeIterator = thisStreamIterator

        streamIteratorEls = list(thisStreamIterator)
        streamLength = len(streamIteratorEls)
        searchLength = len(self.searchList)

        if searchLength == 0:
            raise SearchException('the search Stream or list cannot be empty')

        foundEls = []
        if searchLength > streamLength:
            return foundEls

        for startPosition, streamEls in enumerate(
                windowed(streamIteratorEls, searchLength)):
            result = None
            for j in range(searchLength):
                streamEl = streamEls[j]
                searchEl = self.searchList[j]
                for thisAlgorithm in self.algorithms:
                    result = thisAlgorithm(self, streamEl, searchEl)
                    if result is not None:  # break on True or False
                        break
                if result is False:
                    break
                if result is True:
                    result = None

            if result is not False:
                sm = SearchMatch(streamEls[0], streamEls, startPosition,
                                 self.activeIterator)
                foundEls.append(sm)

        return foundEls
예제 #2
0
 def variants(self):
     '''
     To be deprecated soon...
     
     Adds a ClassFilter for Variant
     '''
     self.addFilter(filters.ClassFilter('Variant'))
     return self
예제 #3
0
 def notes(self):
     '''
     >>> s = stream.Stream()
     >>> s.append(note.Note('C'))
     >>> s.append(note.Rest())
     >>> s.append(note.Note('D'))
     >>> for el in s.iter.notes:
     ...     print(el)
     <music21.note.Note C>
     <music21.note.Note D>
     '''
     self.addFilter(filters.ClassFilter('NotRest'))
     return self
예제 #4
0
 def __init__(self, 
              srcStream, 
              filterList=None, 
              restoreActiveSites=True, 
              activeInformation=None,
              streamsOnly=False, # to be removed
              includeSelf=False, # to be removed
              ): #, parentIterator=None):
     super(RecursiveIterator, self).__init__(srcStream, 
                                             filterList, 
                                             restoreActiveSites,
                                             activeInformation=activeInformation)
     self.returnSelf = includeSelf
     self.includeSelf = includeSelf
     if streamsOnly is True:
         self.filters.append(filters.ClassFilter('Stream'))
     self.recursiveIterator = None
예제 #5
0
 def notes(self):
     '''
     Returns all NotRest objects
     
     (will sometime become simply Note and Chord objects...)
     
     >>> s = stream.Stream()
     >>> s.append(note.Note('C'))
     >>> s.append(note.Rest())
     >>> s.append(note.Note('D'))
     >>> for el in s.iter.notes:
     ...     print(el)
     <music21.note.Note C>
     <music21.note.Note D>
     '''
     self.addFilter(filters.ClassFilter('NotRest'))
     return self
예제 #6
0
    def getElementsByClass(self, classFilterList):
        '''
        Add a filter to the Iterator to remove all elements
        except those that match one
        or more classes in the `classFilterList`. A single class
        can also used for the `classFilterList` parameter instead of a List.

        >>> s = stream.Stream(id="s1")
        >>> s.append(note.Note('C'))
        >>> r = note.Rest()
        >>> s.append(r)
        >>> s.append(note.Note('D'))
        >>> for el in s.iter.getElementsByClass('Rest'):
        ...     print(el)
        <music21.note.Rest rest>
                
        
        ActiveSite is restored...
        
        >>> s2 = stream.Stream(id="s2")
        >>> s2.insert(0, r)
        >>> r.activeSite.id
        's2'

        >>> for el in s.iter.getElementsByClass('Rest'):
        ...     print(el.activeSite.id)
        s1   
        
        
        Classes work in addition to strings...
        
        >>> for el in s.iter.getElementsByClass(note.Rest):
        ...     print(el)
        <music21.note.Rest rest>
        
        '''
        self.addFilter(filters.ClassFilter(classFilterList))
        return self
예제 #7
0
 def notesAndRests(self):
     '''
     >>> s = stream.Stream()
     >>> s.append(meter.TimeSignature('4/4'))
     >>> s.append(note.Note('C'))
     >>> s.append(note.Rest())
     >>> s.append(note.Note('D'))
     >>> for el in s.iter.notesAndRests:
     ...     print(el)
     <music21.note.Note C>
     <music21.note.Rest rest>
     <music21.note.Note D>
     
     
     chained filters... (this makes no sense since notes is a subset of notesAndRests
     
     
     >>> for el in s.iter.notesAndRests.notes:
     ...     print(el)
     <music21.note.Note C>
     <music21.note.Note D>        
     '''
     self.addFilter(filters.ClassFilter('GeneralNote'))
     return self
예제 #8
0
 def voices(self):
     self.addFilter(filters.ClassFilter('Voice'))
     return self
예제 #9
0
 def variants(self):
     self.addFilter(filters.ClassFilter('Variant'))
     return self
예제 #10
0
 def spanners(self):
     self.addFilter(filters.ClassFilter('Spanner'))
     return self
예제 #11
0
 def parts(self):
     self.addFilter(filters.ClassFilter('Part'))
     return self
예제 #12
0
 def voices(self):
     '''
     Adds a ClassFilter for Voice objects
     '''
     self.addFilter(filters.ClassFilter('Voice'))
     return self
예제 #13
0
 def spanners(self):
     '''
     Adds a ClassFilter for Variant objects
     '''
     self.addFilter(filters.ClassFilter('Spanner'))
     return self
예제 #14
0
 def parts(self):
     '''
     Adds a ClassFilter for Part objects
     '''
     self.addFilter(filters.ClassFilter('Part'))
     return self