code: def extend_peaks(self, prop_thresh=50):
          
  
          # octave propagation of the reference peaks
          temp_peaks = [i + 1200 for i in self.peaks["peaks"][0]]
          temp_peaks.extend([i - 1200 for i in self.peaks["peaks"][0]])
          extended_peaks = []
          extended_peaks.extend(self.peaks["peaks"][0])
          for i in temp_peaks:
              # if a peak exists around, don't add this new one.
              nearest_ind = slope.find_nearest_index(self.peaks["peaks"][0], i)
              diff = abs(self.peaks["peaks"][0][nearest_ind] - i)
              diff = np.mod(diff, 1200)
              if diff > prop_thresh:
                  extended_peaks.append(i)
          return extended_peaks
docs: Each peak in the peaks of the object is checked for its presence in 
          other octaves. If it does not exist, it is created. 
          
          prop_thresh is the cent range within which the peak in the other octave 
          is expected to be present, i.e., only if there is a peak within this 
          cent range in other octaves, then the peak is considered to be present
          in that octave.
  
          Note that this does not change the peaks of the object. It just returns 
          the extended peaks.