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
def variants(self): ''' To be deprecated soon... Adds a ClassFilter for Variant ''' self.addFilter(filters.ClassFilter('Variant')) return self
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
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
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
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
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
def voices(self): self.addFilter(filters.ClassFilter('Voice')) return self
def variants(self): self.addFilter(filters.ClassFilter('Variant')) return self
def spanners(self): self.addFilter(filters.ClassFilter('Spanner')) return self
def parts(self): self.addFilter(filters.ClassFilter('Part')) return self
def voices(self): ''' Adds a ClassFilter for Voice objects ''' self.addFilter(filters.ClassFilter('Voice')) return self
def spanners(self): ''' Adds a ClassFilter for Variant objects ''' self.addFilter(filters.ClassFilter('Spanner')) return self
def parts(self): ''' Adds a ClassFilter for Part objects ''' self.addFilter(filters.ClassFilter('Part')) return self