📄 groove.java
字号:
public void close() { if (startB.getText().startsWith("Stop")) { startB.doClick(0); } if (sequencer != null) { sequencer.close(); } sequencer = null; } private JButton makeButton(String bName, Color c) { JButton b = new JButton(bName); b.setBackground(c); b.addActionListener(this); return b; } private void buildTrackThenStartSequencer() { Sequence sequence = null; try { sequence = new Sequence(Sequence.PPQ, 4); } catch (Exception ex) { ex.printStackTrace(); } track = sequence.createTrack(); createEvent(PROGRAM, 9, 1, 0); for (int i = 0; i < data.size(); i++) { Data d = (Data) data.get(i); for (int j = 0; j < d.staff.length; j++) { if (d.staff[j].equals(Color.black)) { createEvent(NOTEON, 9, d.id, j); createEvent(NOTEOFF, 9, d.id, j+1); } } } // so we always have a track from 0 to 15. createEvent(PROGRAM, 9, 1, 15); // set and start the sequencer. try { sequencer.setSequence(sequence); } catch (Exception ex) { ex.printStackTrace(); } sequencer.start(); sequencer.setTempoInBPM(tempoDial.getTempo()); } private void presetTracks(int num) { final int ACOUSTIC_BASS = 35; final int ACOUSTIC_SNARE = 38; final int HAND_CLAP = 39; final int PEDAL_HIHAT = 44; final int LO_TOM = 45; final int CLOSED_HIHAT = 42; final int CRASH_CYMBAL1 = 49; final int HI_TOM = 50; final int RIDE_BELL = 53; clearTable(); switch (num) { case 0 : for (int i = 0; i < 16; i+=2) { setCell(CLOSED_HIHAT, i); } setCell(ACOUSTIC_SNARE, 4); setCell(ACOUSTIC_SNARE, 12); int bass1[] = { 0, 3, 6, 8 }; for (int i = 0; i < bass1.length; i++) { setCell(ACOUSTIC_BASS, bass1[i]); } break; case 1 : for (int i = 0; i < 16; i+=4) { setCell(CRASH_CYMBAL1, i); } for (int i = 0; i < 16; i+=2) { setCell(PEDAL_HIHAT, i); } setCell(ACOUSTIC_SNARE, 4); setCell(ACOUSTIC_SNARE, 12); int bass2[] = { 0, 2, 3, 7, 9, 10, 15 }; for (int i = 0; i < bass2.length; i++) { setCell(ACOUSTIC_BASS, bass2[i]); } break; case 2 : for (int i = 0; i < 16; i+=4) { setCell(RIDE_BELL, i); } for (int i = 2; i < 16; i+=4) { setCell(PEDAL_HIHAT, i); } setCell(HAND_CLAP, 4); setCell(HAND_CLAP, 12); setCell(HI_TOM, 13); setCell(LO_TOM, 14); int bass3[] = { 0, 3, 6, 9, 15 }; for (int i = 0; i < bass3.length; i++) { setCell(ACOUSTIC_BASS+1, bass3[i]); } break; default : } table.tableChanged(new TableModelEvent(dataModel)); } private void setCell(int id, int tick) { for (int i = 0; i < data.size(); i++) { Data d = (Data) data.get(i); if (d.id == id) { d.staff[tick] = Color.black; break; } } } private void clearTable() { for (int i = 0; i < data.size(); i++) { Data d = (Data) data.get(i); for (int j = 0; j < d.staff.length; j++) { d.staff[j] = Color.white; } } } private void createEvent(int type, int chan, int num, long tick) { ShortMessage message = new ShortMessage(); try { message.setMessage(type, chan, num, velocity); MidiEvent event = new MidiEvent( message, tick ); track.add(event); } catch (Exception ex) { ex.printStackTrace(); } } public void meta(MetaMessage message) { if (message.getType() == 47) { // 47 is end of track if (loopB.getBackground().equals(Color.gray)) { if (sequencer != null && sequencer.isOpen()) { sequencer.start(); sequencer.setTempoInBPM(tempoDial.getTempo()); } } else { startB.setText("Start"); } } } public void actionPerformed(ActionEvent e) { Object object = e.getSource(); if (object instanceof JComboBox) { presetTracks(((JComboBox) object).getSelectedIndex()); if (startB.getText().startsWith("Stop")) { sequencer.stop(); buildTrackThenStartSequencer(); } } else if (object instanceof JButton) { JButton b = (JButton) object; if (b.equals(startB)) { if (b.getText().startsWith("Start")) { buildTrackThenStartSequencer(); b.setText("Stop"); } else { sequencer.stop(); b.setText("Start"); } } else if (b.equals(loopB)) { b.setSelected(!b.isSelected()); if (loopB.getBackground().equals(Color.gray)) { loopB.setBackground(getBackground()); } else { loopB.setBackground(Color.gray); } } else if (b.getText().startsWith("Clear")) { clearTable(); table.tableChanged(new TableModelEvent(dataModel)); } } } /** * Storage class for instrument and musical staff represented by color. */ class Data extends Object { String name; int id; Color staff[] = new Color[16]; public Data(String name, int id) { this.name = name; this.id = id; for (int i = 0; i < staff.length; i++) { staff[i] = Color.white; } } } public static void main(String args[]) { final Groove groove = new Groove(); JFrame f = new JFrame("Rhythm Groove Box"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); f.getContentPane().add("Center", groove); f.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int w = 640; int h = 440; f.setLocation(screenSize.width/2 - w/2, screenSize.height/2 - h/2); f.setSize(w, h); f.show(); groove.open(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -