2017-08-14 62 views
0

我是新来的Java和声音API在Java中,我已经写了这段代码,我不能理解不同的声音来自不同的行,因为我没有改变代码中的工具。setMessage()如何工作并且每行的声音都发生了变化?

import java.awt.*; 
import javax.swing.*; 
import javax.sound.midi.*; 
import java.util.*; 
import java.awt.event.*; 

public class BeatBox { 

JPanel mainPanel; 
ArrayList<JCheckBox> checkboxList; 
Sequencer sequencer; 
Sequence sequence; 
Track track; 
JFrame theFrame; 

String[] instrumentNames = {"Bass Drum", "Closed Hi-Hat", 
    "Open Hi-Hat","Acoustic Snare", "Crash Cymbal", "Hand Clap", 
    "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Conga", 
    "Cowbell", "Vibraslap", "Low-mid Tom", "High Agogo", 
    "Open Hi Conga"}; 
int[] instruments = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63}; 


public static void main (String[] args) { 
    new BeatBox().buildGUI(); 
} 

public void buildGUI() { 
    theFrame = new JFrame("Cyber BeatBox"); 
    theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    BorderLayout layout = new BorderLayout(); 
    JPanel background = new JPanel(layout); 
    background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); 

    checkboxList = new ArrayList<JCheckBox>(); 
    Box buttonBox = new Box(BoxLayout.Y_AXIS); 

    JButton start = new JButton("Start"); 
    start.addActionListener(new MyStartListener()); 
    buttonBox.add(start);   

    JButton stop = new JButton("Stop"); 
    stop.addActionListener(new MyStopListener()); 
    buttonBox.add(stop); 

    JButton upTempo = new JButton("Tempo Up"); 
    upTempo.addActionListener(new MyUpTempoListener()); 
    buttonBox.add(upTempo); 

    JButton downTempo = new JButton("Tempo Down"); 
    downTempo.addActionListener(new MyDownTempoListener()); 
    buttonBox.add(downTempo); 

    Box nameBox = new Box(BoxLayout.Y_AXIS); 
    for (int i = 0; i < 16; i++) { 
     nameBox.add(new Label(instrumentNames[i])); 
    } 

    background.add(BorderLayout.EAST, buttonBox); 
    background.add(BorderLayout.WEST, nameBox); 

    theFrame.getContentPane().add(background); 

    GridLayout grid = new GridLayout(16,16); 
    grid.setVgap(1); 
    grid.setHgap(2); 
    mainPanel = new JPanel(grid); 
    background.add(BorderLayout.CENTER, mainPanel); 

    for (int i = 0; i < 256; i++) {      
     JCheckBox c = new JCheckBox(); 
     c.setSelected(false); 
     checkboxList.add(c); 
     mainPanel.add(c);    
    } // end loop 

    setUpMidi(); 

    theFrame.setBounds(50,50,300,300); 
    theFrame.pack(); 
    theFrame.setVisible(true); 
} // close method 


public void setUpMidi() { 
    try { 
    sequencer = MidiSystem.getSequencer(); 
    sequencer.open(); 
    sequence = new Sequence(Sequence.PPQ,4); 
    track = sequence.createTrack(); 
    sequencer.setTempoInBPM(120); 

    } catch(Exception e) {e.printStackTrace();} 
} // close method 

public void buildTrackAndStart() { 
    int[] trackList = null; 

    sequence.deleteTrack(track); 
    track = sequence.createTrack(); 

    for (int i = 0; i < 16; i++) { 
     trackList = new int[16]; 

     int key = instruments[i]; 

     for (int j = 0; j < 16; j++) {   
      JCheckBox jc = (JCheckBox) checkboxList.get(j + (16*i)); 
      if (jc.isSelected()) { 
      trackList[j] = key; 
      } else { 
      trackList[j] = 0; 
      }      
     } // close inner loop 

     makeTracks(trackList); 

    } // close outer 


    try { 
     sequencer.setSequence(sequence); 
    sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);     
     sequencer.start(); 
     sequencer.setTempoInBPM(120); 
    } catch(Exception e) {e.printStackTrace();} 
} // close buildTrackAndStart method 


public class MyStartListener implements ActionListener { 
    public void actionPerformed(ActionEvent a) { 
     buildTrackAndStart(); 
    } 
} // close inner class 

public class MyStopListener implements ActionListener { 
    public void actionPerformed(ActionEvent a) { 
     sequencer.stop(); 
    } 
} // close inner class 

public class MyUpTempoListener implements ActionListener { 
    public void actionPerformed(ActionEvent a) { 
     float tempoFactor = sequencer.getTempoFactor(); 
     sequencer.setTempoFactor((float)(tempoFactor * 1.03)); 
    } 
} // close inner class 

public class MyDownTempoListener implements ActionListener { 
    public void actionPerformed(ActionEvent a) { 
     float tempoFactor = sequencer.getTempoFactor(); 
     sequencer.setTempoFactor((float)(tempoFactor * .97)); 
    } 
} // close inner class 

public void makeTracks(int[] list) {   

    for (int i = 0; i < 16; i++) { 
     int key = list[i]; 

     if (key != 0) { 
     track.add(makeEvent(144,9,key, 100, i)); 
     track.add(makeEvent(128,9,key, 100, i+1)); 
     } 
    } 
} 

public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) { 
    MidiEvent event = null; 
    try { 
     ShortMessage a = new ShortMessage(); 
     a.setMessage(comd, chan, one, two); 
     event = new MidiEvent(a, tick); 

    } catch(Exception e) {e.printStackTrace(); } 
    return event; 
} 

} // close class 

以上是代码,如果有人能告诉我如何setMessage()的作品,并关注其论据这将是一个很大的帮助,因为我已经看到了所有的文件,我不能够理解。

回答

0

鼓乐器形成一种特殊情况,因为他们没有像钢琴或喇叭那样的特定音调。一个特定的MIDI通道用于传输鼓乐器的播放。在Midi将军,它是频道10,但你会发现合成器,可以编程,以接收任何频道的鼓。

在分配给鼓乐器(也用于特殊的声音效果通常包括在合成器)中,注记和NOTE OFF为音调消息信息的信道的情况下,实际上用于选择滚筒或声音效果会玩。

例如,为了发挥对信道10中的低音鼓乐器,给注记信息如下:使用信道10(编码9)

写35,其为用于声学低音鼓的音符数上面的GM列表。

有关更多详细信息,请参阅[1]:https://www.cs.cmu.edu/~music/cmsip/readings/MIDI%20tutorial%20for%20programmers.html

相关问题