- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一个节拍器程序,for 循环的执行次数比应有的次数多了 1 次。
public class Tempo {
String file;
int bpm;
public Tempo(int bpm, String file){
this.bpm=bpm;
this.file=file;
}
public void tempoPlay () throws InterruptedException{
new Play(file).start();
Thread.sleep(60000/bpm);
}
public static void main(String[] args) throws InterruptedException {
Tempo t = new Tempo(120, "C:\\Users\\Korisnik\\Desktop\\dome3.wav");
for(int i=0;i<20;i++){
t.tempoPlay();
}
}
}
第一个节拍很快就紧随第二个节拍,但随着时间的推移,它听起来很合规。我数过它播放了 21 节拍,但它应该播放 20 节拍。这是 Play 类:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
class Play extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position {
LEFT, RIGHT, NORMAL
};
public Play(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public Play(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
@Override
public void run() {
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT) {
pan.setValue(1.0f);
} else if (curPosition == Position.LEFT) {
pan.setValue(-1.0f);
}
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0) {
auline.write(abData, 0, nBytesRead);
}
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
最佳答案
在黑暗中拍摄:出于测试目的,可能值得将文件完全读入内存。对可能发生的情况的猜测是,读取文件的 I/O 干扰了播放时间。
您也许可以通过这个进行测试。
Tempo t = new Tempo(120, "C:\\Users\\Korisnik\\Desktop\\dome3.wav");
t.tempoPlay() // ignore this
Thread.sleep(10);
for(int i=0;i<20;i++){
t.tempoPlay();
}
或者更好的是,在播放声音之前让 Tempo 缓存读取内容。
关于java - for 循环执行的次数比应有的次数多 - 节拍器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872232/
我正在尝试使用 Typescript(和 Angular 2)构建一个节拍器。感谢 @Nitzan-Tomer ( Typescript Loop with Delay ),他帮助我完成了基础知识。
作为练习,我正在尝试使用 Thread.sleep 作为计时器并使用 JMF 作为声音来使用 Java 创建一个节拍器。它运行良好,但出于某种原因,JMF 似乎只能以每分钟最多 207 拍的速度播放声
我想用jquery制作一个节拍器,用单击声音并用一种颜色可视化速度。在这一点上,视觉部分工作正常,但声音有问题。 无法使其正常工作,它应每分钟发出哔哔声,其速度是所选速度的多少倍。 这是代码: $(f
我正在尝试通过实现苹果提供的示例代码来创建一个节拍器应用程序。一切正常,但我看到节拍视觉效果出现延迟,它与播放器时间不正确同步。这是苹果提供的示例代码 let secondsPerBeat = 60.
如标题中所述,我正在尝试创建一个基于 jQuery/JavaScript 的节拍器以及 HTML 标签来播放声音。 它工作“没问题”,但在我看来 setInterval方法不够准确。我在这里搜索了一些
我是一名优秀的程序员,十分优秀!