2016-03-24 9 views
0

私はtarsos DSP Java APIを使用しています。誰かがフロートpitchInHzが次のコードでfreq()メソッドによって更新されない理由を教えてもらえますか? pitchInHz = result.getPitch();はあなたがpitch.getPitch()を実行時に実行されていないので、私は、なぜそのnot.Thanksメソッドが変数値を更新しないのはなぜですか?

public class trial extends JFrame{ 
File f = new File("RecordAudio.wav"); 
static JLabel lblNewLabel = new JLabel("New label"); 
float pitchInHz; 
public trial(){ 
    getContentPane().setLayout(new GridLayout(1, 0, 0, 0)); 
    getContentPane().add(lblNewLabel); 
    run(); 
    freq(); 
    float values = freq(); 
    System.out.print(values); 

} 
public void run(){ 
    AudioDispatcher dispatcher = null; 
    try { 
     dispatcher = AudioDispatcherFactory.fromFile(f, 1024, 0); 
    } catch (UnsupportedAudioFileException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    AudioProcessor p = new PitchProcessor(PitchEstimationAlgorithm.FFT_YIN, 48000, 1024, pdh); 
    dispatcher.addAudioProcessor(p); 
    new Thread(dispatcher,"Audio Dispatcher").start(); 


} 
public float freq(){ 
    return pitchInHz; 
} 

PitchDetectionHandler pdh = new PitchDetectionHandler() { 

    public void handlePitch(PitchDetectionResult result,AudioEvent e) { 

       float pitchInHz = result.getPitch(); 
       lblNewLabel.setText("" + pitchInHz); 
       //System.out.print(pitchInHz); 
    } 

}; 


public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       trial frame = new trial(); 
       frame.setVisible(true); 
       frame.setSize(500, 500); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
おそらく

}

+0

と同じである短い答えは 'handlePitch'が呼び出されていないか、それがあるとの結果が実際に0 –

答えて

0

を参照してくださいカントので、誰かがそれを動作させるために変更するために何を教えてもらえます。これは完全に可能です。そのコードは新しいスレッドで同時に実行され、そのスレッドが開始された直後にpitch.getPitch()が呼び出され、ライブラリにいつでもコールバックを実行する必要はありません。この方法は、float pitchInHz;ので、0を返さ

float pitchInHz = 0.0f;

+0

私がメソッドを呼び出してどう変化するかということですpitchInHzが値を出力する前に変更されていることを確認してください。 –

+0

@ G.Mccスレッド( 'new Thread(dispatcher、...)。start()')を作成する代わりに、直接 'dispatcher.run()'を呼び出してください。私は図書館を知らないので、それが戻ってくるかどうかはわかりませんが。あるいは、変数に渡すのではなく、コールバックで何をしたいかを指定します。 – Kiskae

+0

私はこれまでに試してみましたが、ピッチが検出されなければデフォルトである-1に値を設定するだけなので、決して実行されません。うまくいけばそれを解決します。ご協力いただきありがとうございます –

関連する問題