Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
zmx0142857
GitHub Repository: zmx0142857/mini-games
Path: blob/master/java/metronome/Metronome.java
363 views
1
import java.awt.*;
2
import java.awt.event.*;
3
import javax.swing.*;
4
import javax.sound.sampled.*;
5
6
public class Metronome extends JFrame implements ActionListener {
7
8
private JButton button = new JButton("start");
9
// JSlider(orientation, min, max, initValue);
10
private JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 40, 280, 120);
11
private MySoundThread mySoundThread = new MySoundThread(slider);
12
13
public Metronome() {
14
super("Metronome");
15
setSize(400, 200);
16
setLayout(new BorderLayout());
17
setDefaultCloseOperation(EXIT_ON_CLOSE);
18
19
slider.setPaintLabels(true);
20
slider.setMajorTickSpacing(20);
21
slider.setMinorTickSpacing(5);
22
slider.setPaintTicks(true);
23
add(slider, "Center");
24
25
button.addActionListener(this);
26
add(button, "South");
27
28
mySoundThread.start();
29
30
setVisible(true);
31
}
32
33
@Override
34
public void actionPerformed(ActionEvent event) {
35
if (event.getSource() == button) {
36
if (!mySoundThread.getPlay()) {
37
button.setText("stop");
38
mySoundThread.setPlay(true);
39
} else {
40
button.setText("start");
41
mySoundThread.setPlay(false);
42
}
43
}
44
}
45
46
public static void main(String[] args) {
47
new Metronome();
48
}
49
}
50
51
class MySoundThread extends Thread {
52
53
private Clip clip;
54
private String soundFile = "kick.wav";
55
private boolean play = false;
56
private JSlider slider;
57
58
MySoundThread(JSlider slider) {
59
this.slider = slider;
60
}
61
62
public synchronized boolean getPlay() {
63
return play;
64
}
65
66
public synchronized void setPlay(boolean flag) {
67
play = flag;
68
if (play)
69
notify();
70
}
71
72
@Override
73
public void run() {
74
while (true) {
75
synchronized (this) {
76
while (!play) {
77
try {
78
wait();
79
} catch (InterruptedException e) {}
80
}
81
}
82
try {
83
go();
84
Thread.sleep(60000/slider.getValue());
85
} catch (Exception e) {}
86
}
87
}
88
89
public void go() throws Exception {
90
AudioInputStream audioInputStream =
91
AudioSystem.getAudioInputStream(new java.io.File(soundFile));
92
DataLine.Info info =
93
new DataLine.Info(Clip.class, audioInputStream.getFormat());
94
if (clip != null)
95
clip.close();
96
clip = (Clip) AudioSystem.getLine(info);
97
clip.open(audioInputStream);
98
clip.start();
99
}
100
101
/*
102
public void go() throws Exception {
103
AudioInputStream audioInputStream =
104
AudioSystem.getAudioInputStream(
105
new java.io.File(kickSound));
106
DataLine.Info info =
107
new DataLine.Info(Clip.class, audioInputStream.getFormat());
108
clip = (Clip) AudioSystem.getLine(info);
109
clip.addLineListener(new LineListener() {
110
public void update(LineEvent e) {
111
if (e.getType() == LineEvent.Type.STOP) {
112
synchronized(clip) {
113
clip.notify();
114
}
115
}
116
}
117
});
118
clip.open(audioInputStream);
119
clip.start();
120
synchronized (clip) {
121
clip.wait();
122
}
123
clip.close();
124
}
125
*/
126
}
127
128