Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can not read audio from file. #57

Open
ailias opened this issue Jan 29, 2018 · 4 comments
Open

Can not read audio from file. #57

ailias opened this issue Jan 29, 2018 · 4 comments

Comments

@ailias
Copy link

ailias commented Jan 29, 2018

When I specify the url variable to Config object, it will call OutputSignalTracker.start()function, but it can not enter this function and exit the program:
audioEngine.outputNode.installTap(onBus: bus, bufferSize: bufferSize, format: nil) { (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
DispatchQueue.main.async {
self.delegate?.signalTracker(self, didReceiveBuffer: buffer, atTime: time)
}}

@kocharyanvahe
Copy link

Also, I have the same problem.

@hepiyellow
Copy link

Yeah, Can you give an example of how to analyze an audio file and get the Pitch array or something?
And, how would I know the timing info (offset in milliseconds) of each Pitch sample?

@jhristov
Copy link

jhristov commented Jan 26, 2022

What I found is a couple of issues in OutputSignalTracker which prevent the pitch output. First, installTap() has no effect on audioEngine - one has to substitute with audioPlayer. Second, the delegate in the closure was always nil so self.delegate?.signalTracker() was never called. Here is my replacement code which should give you an idea how to get some readings. It goes in the start() method of OutputSignalTracker. One must import Pitchy too.

      let factory = EstimationFactory()
      let estimator = factory.create(.yin) // Choose pitch method here!
      let queue = DispatchQueue(label: "BeethovenQueue", attributes: [])

      self.audioPlayer.installTap(onBus: 0, bufferSize: self.bufferSize, format: nil) { (buffer, time) in
          
          queue.async { [weak self] in
            guard let `self` = self else { return }

            do {
              let transformedBuffer = try estimator.transformer.transform(buffer: buffer)
              let frequency = try estimator.estimateFrequency(
                sampleRate: Float(time.sampleRate),
                buffer: transformedBuffer)
              let pitch = try Pitch(frequency: Double(frequency))
            print(time,pitch)

              DispatchQueue.main.async { [weak self] in
                guard let `self` = self else { return }
                //self.delegate?.pitchEngine(self, didReceivePitch: pitch)
              }
            } catch {
              DispatchQueue.main.async { [weak self] in
                guard let `self` = self else { return }
                //self.delegate?.pitchEngine(self, didReceiveError: error)
              }
            }
        }
          
    }

One would then start the tracking with:

        let config = Config(
          bufferSize: 4096,
          estimationStrategy: .yin, // has no effect, has to be set in the estimator, see above
          audioUrl: Bundle.main.url(forResource: "sound_file", withExtension: "wav")!
        )
        
        let pitchEngine = PitchEngine(config: config)
        pitchEngine.start()

@mannyvw
Copy link

mannyvw commented Apr 4, 2023

@jhristov perfect. Yep i replaced the following line in OutputSignalTracker::start

audioEngine.outputNode.installTap(onBus: bus, bufferSize: bufferSize, format: nil)

With

audioPlayer.installTap(onBus: bus, bufferSize: bufferSize, format: nil)

and everything else works. Good work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants