我正在构建一个鼓机/音序器应用程序,用户选择一个复选框模式(格式为格式:每列是不同的节拍,每行是不同的乐器),点击“播放” “音乐样本应该有希望在模式中的每个选定节拍上播放。
目前,我正在使用java.swing计时器在循环中运行note()方法。然而,这使得它在每个“节拍”上播放,而我只希望它在选定的节拍上播放。我有一种感觉,我需要在某处使用timer.stop()和timer.start(),这样note()不会在未选择的节拍上执行,但会在遇到下一个选定的节拍时再次启动。
我创建了数组int pattern[] = {1,0,1,0};
来保存我希望声音播放的模式。我想可能有一种循环遍历数组并在每次值为1时执行note()的方法,但是我真的不知道怎么做。
所以我猜主要问题是:如何让计时器触发(或不触发)模式中的事件?我的任何倾向是正确的,还是我以错误的方式接近这个? 感谢任何建议/意见:)
这是我到目前为止所拥有的:
import java.io.*;
import javax.sound.sampled.*;
import javax.swing.Timer;
import java.awt.event.*;
public class PlaySound extends JFrame {
static String folderPath = "folder/path/goes/here/";
public static String fileName = "kick_01.wav";
int pattern[] = {1,0,1,0};
int c = 0;
// Constructor
public PlaySound() {
Timer timer = new Timer(500, new ActionListener() { //500 == 120bpm
public void actionPerformed(ActionEvent e) {
note(fileName); //Play audio file
}
});
timer.start();
}
public static void note(String f) {
try {
try {
// Open an audio input stream.
File soundFile = new File(folderPath + f);
AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
// Get a soundjava clip resource.
Clip clip = AudioSystem.getClip();
// Open audio clip and load samples from the audio input stream.
clip.open(audioIn);
clip.start();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
} catch (Exception e) {}
}
}
答案 0 :(得分:1)
每次定时器触发时,都要跟踪模式中的位置。类似的东西:
if (pattern[index] == 1)
playSound();
index++;
if (index == pattern.length)
index = 0;