import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.sound.midi.*; public class MuzMachina implements MetaEventListener { JFrame jFrame_RamkaGlowna; JPanel jPanel_PanelCentralny; ArrayList arrLstJChBox_listaPolWyboru; Sequencer sequencer; Sequence sequence; Track track; public static void main (String[] args) { new MuzMachina().tworzGUI(); } public void tworzGUI() { //--- jFrame_RamkaGlowna = new JFrame("MuzMachina"); jFrame_RamkaGlowna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame_RamkaGlowna.setBounds(50,50,500,300); //--- JPanel jPanel_PanelTla = new JPanel( new BorderLayout() ); jPanel_PanelTla.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); jFrame_RamkaGlowna.getContentPane().add(jPanel_PanelTla); //--- jPanel_PanelCentralny = new JPanel( new GridLayout(16,16, 2, 1) ); jPanel_PanelTla.add(BorderLayout.CENTER, jPanel_PanelCentralny); //--- arrLstJChBox_listaPolWyboru = new ArrayList(); for (int i=0; i<256; i++) { JCheckBox jCheckBox = new JCheckBox(); jCheckBox.setSelected(false); arrLstJChBox_listaPolWyboru.add(jCheckBox); // !!! jPanel_PanelCentralny.add(jCheckBox); // !!! } //--- 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" }; Box box_ObszarNazw = new Box(BoxLayout.Y_AXIS); for (int i = 0; i < 16; i++) { box_ObszarNazw.add( new Label( nazwyInstrumentow[i] ) ); } jPanel_PanelTla.add(BorderLayout.WEST, box_ObszarNazw); //--- Box box_ObszarPrzyciskow = new Box(BoxLayout.Y_AXIS); { JButton start = new JButton("Start"); start.addActionListener(new MojStartListener()); box_ObszarPrzyciskow.add(start); JButton stop = new JButton("Stop"); stop.addActionListener(new MojStopListener()); box_ObszarPrzyciskow.add(stop); JButton tempoG = new JButton("Szybciej"); tempoG.addActionListener(new MojTempoGListener()); box_ObszarPrzyciskow.add(tempoG); JButton tempoD = new JButton("Wolniej"); tempoD.addActionListener(new MojTempoDListener()); box_ObszarPrzyciskow.add(tempoD); JButton zapisz = new JButton("Zapisz"); zapisz.addActionListener(new ZapiszListener()); box_ObszarPrzyciskow.add(zapisz); JButton odtworz = new JButton("Odtworz"); odtworz.addActionListener(new OdtworzListener()); box_ObszarPrzyciskow.add(odtworz); } jPanel_PanelTla.add(BorderLayout.EAST, box_ObszarPrzyciskow); //--- konfigurujMidi(); // public void konfigurujMidi() jFrame_RamkaGlowna.pack(); jFrame_RamkaGlowna.setVisible(true); } //--- end of -> twórzGUI ---------------------------------------------------------------- public void konfigurujMidi() { // deklaracja metody -> class MuzMachina try { sequencer = MidiSystem.getSequencer(); sequencer.open(); sequencer.addMetaEventListener(this); sequencer.setTempoInBPM(120); sequence = new Sequence(Sequence.PPQ,4); track = sequence.createTrack(); } catch(Exception e) {e.printStackTrace();} } // metoda pomocnicza metody twórzGUI public void utworzSciezkeIOdtworz() { // metoda wywoływana przez ActionListener int[] instrumenty = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63}; // 16 instr sequence.deleteTrack(track); track = sequence.createTrack(); //--- analizujemy wszystkie pola wyboru i dla zaznaczonych tworzymy zdarzenia MIDI for (int y=0; y<16; y++) { for (int x=0; x<16; x++) { JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get( (16*y)+x ); if ( jCheckBox.isSelected() ) { track.add( makeMidiEvent(144,9, instrumenty[y], 100, x ) ); track.add( makeMidiEvent(128,9, instrumenty[y], 100, x+1 ) ); } } // koniec for x track.add(makeMidiEvent(176,1,127,0,16)); // ?? } // koniec for y track.add(makeMidiEvent(192,9,1,0,15)); // ?? try { sequencer.setSequence(sequence); sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY); sequencer.start(); } catch(Exception e) {e.printStackTrace();} } public static MidiEvent makeMidiEvent(int plc, int kanal, int jeden, int dwa, int takt) { // metoda pomocniczna metody utworzSciezkeIOdtworz() <-- ActionListener MidiEvent midiEvent = null; try { ShortMessage shortMessage = new ShortMessage(); shortMessage.setMessage(plc, kanal, jeden, dwa); midiEvent = new MidiEvent(shortMessage, takt); } catch(Exception e) { e.printStackTrace(); } return midiEvent; } //--- seria deklaracji klas wew -> JButton-actionPerformed ---------------------------------------- public class MojStartListener implements ActionListener { public void actionPerformed(ActionEvent a) { utworzSciezkeIOdtworz(); } } public class MojStopListener implements ActionListener { public void actionPerformed(ActionEvent a) { sequencer.stop(); } } public class MojTempoGListener implements ActionListener { public void actionPerformed(ActionEvent a) { float wspTempa = sequencer.getTempoFactor(); sequencer.setTempoFactor((float)(wspTempa * 1.03)); } } public class MojTempoDListener implements ActionListener { public void actionPerformed(ActionEvent a) { float wspTempa = sequencer.getTempoFactor(); sequencer.setTempoFactor((float)(wspTempa * .97)); } } public class ZapiszListener implements ActionListener { public void actionPerformed(ActionEvent a) { boolean[] stanyPol = new boolean[256]; // tworzymy talbice ze stanami pól wyboru for (int i = 0; i < 256; i++) { JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get(i); if ( jCheckBox.isSelected() ) stanyPol[i] = true; } try { File file = new File("kompozycja.ser"); FileOutputStream fileOutStr = new FileOutputStream(file); ObjectOutputStream objOutStr = new ObjectOutputStream(fileOutStr); objOutStr.writeObject(stanyPol); } catch(Exception ex) { ex.printStackTrace(); } } } public class OdtworzListener implements ActionListener { public void actionPerformed(ActionEvent a) { boolean[] stanyPol = null; try { ObjectInputStream objInStr = new ObjectInputStream( new FileInputStream( new File("kompozycja.ser") ) ); stanyPol = (boolean[]) objInStr.readObject(); } catch(Exception ex) { ex.printStackTrace(); } // teraz odtwarzamy sekwencje for (int i = 0; i < 256; i++) { JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get(i); if ( stanyPol[i] ) jCheckBox.setSelected(true); } sequencer.stop(); utworzSciezkeIOdtworz(); } } // koniec klasy wewnętrznej public void meta(MetaMessage arg0) {} // ??? } // koniec klasy