package MusicApp;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
class TworzGui implements MetaEventListener{
public JPanel panelGlowny;
public ArrayList<JCheckBox> listaWyboru;
public Sequencer sekwenser;
public Sequence sekwencja;
public Track sciezka;
public JFrame ramkaGlowna;
String[] nazwyInstrumentow = {"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[] instrumenty = {45,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
public void tworzGui(){
ramkaGlowna = new JFrame("MusicApp");
ramkaGlowna.setDefaultCloseOperation(3);
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(15 ,15,15 ,15));
listaWyboru = new ArrayList<JCheckBox>();
Box obszarPrzyciskow = new Box(BoxLayout.Y_AXIS);
JButton start = new JButton("Start");
start.addActionListener(new MojStartListener());
obszarPrzyciskow.add(start);
JButton stop = new JButton("stop");
stop.addActionListener(new MojStopListener());
obszarPrzyciskow.add(stop);
JButton tempoG = new JButton("Szybciej");
tempoG.addActionListener(new MojTempoGListener());
obszarPrzyciskow.add(tempoG);
JButton tempoD = new JButton("Wolniej");
tempoD.addActionListener(new MojTempoDlistener());
obszarPrzyciskow.add(tempoD);
Box obszarNazw = new Box(BoxLayout.Y_AXIS);
for(int i=0;i<16;i++){
obszarNazw.add(new Label(nazwyInstrumentow[i]));
}
panel.add(BorderLayout.EAST, obszarPrzyciskow);
panel.add(BorderLayout.WEST, obszarNazw);
ramkaGlowna.getContentPane().add(panel);
GridLayout siatkaPolWyboru = new GridLayout(16,16);
siatkaPolWyboru.setVgap(1);
siatkaPolWyboru.setHgap(2);
panelGlowny = new JPanel(siatkaPolWyboru);
panel.add(BorderLayout.CENTER, panelGlowny);
for(int w=0;w<256;w++){
JCheckBox c = new JCheckBox();
c.setSelected(false);
listaWyboru.add(c);
panelGlowny.add(c);
ramkaGlowna.setBounds(50,50,300,300);
ramkaGlowna.pack();
ramkaGlowna.setVisible(true);
}
public void utworzSciezkeiOdtworz() throws Exception {
midiInit();
int[] listaSciezki = new int[16];
sekwencja.deleteTrack(sciezka);
sciezka = sekwencja.createTrack();
for(int i=0;i<16;i++){
int klucz = instrumenty[i];
for(int j=0;j<16;j++){
JCheckBox jc = listaWyboru.get(j+(16*i));
if(jc.isSelected()){
listaSciezki[j] = klucz;
}else{
listaSciezki[j] = 0;
}
}
utworzSciezke(listaSciezki);
sciezka.add(tworzZdarzenie(176,1,127,0,16));
}
sciezka.add(tworzZdarzenie(176,1,127,0,16));
try{
sekwenser.setSequence(sekwencja);
sekwenser.setLoopCount(sekwenser.LOOP_CONTINUOUSLY);
sekwenser.start();
sekwenser.setTempoInBPM(120);
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
}
public void utworzSciezke(int[] lista){
for(int i=0;i<16;i++){
int klucz = lista[i];
if(klucz!=0){
sciezka.add(tworzZdarzenie(144,9,klucz,100,i));
sciezka.add(tworzZdarzenie(128,9,klucz,100,i+1));
}
}
}
public MidiEvent tworzZdarzenie(int plc , int kanal, int jeden, int dwa, int takt) {
MidiEvent zdarzenie = null;
try{
ShortMessage sMessage = new ShortMessage();
sMessage.setMessage(plc, kanal, jeden, dwa);
zdarzenie = new MidiEvent(sMessage, takt);
}catch (Exception e) {e.printStackTrace();}
return zdarzenie;
}
@Override
public void meta(MetaMessage meta) {
}
void midiInit() {
try {
sekwenser = MidiSystem.getSequencer();
sekwenser.open();
sekwencja = new Sequence(Sequence.PPQ, 4);
sciezka = sekwencja.createTrack();
sekwenser.setTempoInBPM(120);
} catch (Exception e) {
e.printStackTrace();
}
}
package MusicApp;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MojStartListener implements ActionListener {
TworzGui gui = new TworzGui();
@Override
public void actionPerformed(ActionEvent e) {
try {
gui.utworzSciezkeiOdtworz();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
package MusicApp;
public class MusicApp {
public static void main(String[] args) {
TworzGui Gui = new TworzGui();
Gui.tworzGui();
}
}
Kiedy mam klasę słuchacza w tej samej klasie to wszystko działa lecz chciałem klasę słuchacza umieścić po prostu w osobnej klasie. I tu pojawił mi się problem.
Action Listener po kliknięciu przycisku się wywołuje i wyskakuje wyjątek. Pe po zdebugowaniu programu mam puste listy (listaWyboru) i wyskakują wyjątki NullPointerException.
Naprawiłem listę wyboru tak że w klasie MusicApp dodałem deklarację domyślnego konstruktora i zadeklarowałem w niej listaWyboru
public TworzGui() {
listaWyboru = new ArrayList<JCheckBox>();
for(int w=0;w<256;w++){
JCheckBox c = new JCheckBox();
c.setSelected(false);
listaWyboru.add(c);
panelGlowny.add(c);
}
Potem aplikacja niby przebiegła bez wyjątków ale nie mam żadnego dźwięku.
Jakby znowu problem z sequencerem był