Facebook
From Krzysztof, 3 Years ago, written in Java.
Embed
Download Paste or View Raw
Hits: 137
  1. import java.awt.*;
  2. import java.awt.event.*;
  3.  
  4. import java.io.*;
  5. import java.util.*;
  6. import javax.swing.*;
  7. import javax.sound.midi.*;
  8.  
  9. public class MuzMachina implements MetaEventListener {
  10.  
  11.         JFrame jFrame_RamkaGlowna;
  12.         JPanel jPanel_PanelCentralny;
  13.         ArrayList<JCheckBox> arrLstJChBox_listaPolWyboru;
  14.  
  15.         Sequencer sequencer;
  16.         Sequence sequence;
  17.         Track track;
  18.  
  19.     public static void main (String[] args) {
  20.         new MuzMachina().tworzGUI();
  21.     }
  22.  
  23.     public void tworzGUI() {
  24. //---
  25.         jFrame_RamkaGlowna = new JFrame("MuzMachina");
  26.         jFrame_RamkaGlowna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  27.         jFrame_RamkaGlowna.setBounds(50,50,500,300);
  28. //---
  29.         JPanel jPanel_PanelTla = new JPanel( new BorderLayout() );
  30.                jPanel_PanelTla.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
  31.         jFrame_RamkaGlowna.getContentPane().add(jPanel_PanelTla);
  32. //---
  33.             jPanel_PanelCentralny = new JPanel( new GridLayout(16,16, 2, 1) );
  34.             jPanel_PanelTla.add(BorderLayout.CENTER, jPanel_PanelCentralny);
  35.  
  36. //---
  37.             arrLstJChBox_listaPolWyboru = new ArrayList<JCheckBox>();
  38.  
  39.                 for (int i=0; i<256; i++) {
  40.                     JCheckBox jCheckBox = new JCheckBox();
  41.                               jCheckBox.setSelected(false);
  42.                     arrLstJChBox_listaPolWyboru.add(jCheckBox);    // !!!
  43.                     jPanel_PanelCentralny.add(jCheckBox);          // !!!
  44.                 }
  45.  
  46. //---
  47.             String[] nazwyInstrumentow = { "Bass Drum", "Closed Hi-Hat", "Open Hi-Hat","Acoustic Snare",
  48.                         "Crash Cymbal", "Hand Clap", "High Tom", "Hi Bongo", "Maracas", "Whistle",
  49.                         "Low Conga", "Cowbell", "Vibraslap", "Low-mid Tom", "High Agogo", "Open Hi Conga" };
  50.  
  51.             Box box_ObszarNazw = new Box(BoxLayout.Y_AXIS);
  52.             for (int i = 0; i < 16; i++) {
  53.                 box_ObszarNazw.add( new Label( nazwyInstrumentow[i] ) );
  54.             }
  55.             jPanel_PanelTla.add(BorderLayout.WEST, box_ObszarNazw);
  56.  
  57. //---
  58.             Box box_ObszarPrzyciskow = new Box(BoxLayout.Y_AXIS);
  59.                 {
  60.                 JButton start = new JButton("Start");
  61.                 start.addActionListener(new MojStartListener());
  62.                 box_ObszarPrzyciskow.add(start);
  63.  
  64.                 JButton stop = new JButton("Stop");
  65.                 stop.addActionListener(new MojStopListener());
  66.                 box_ObszarPrzyciskow.add(stop);
  67.  
  68.                 JButton tempoG = new JButton("Szybciej");
  69.                 tempoG.addActionListener(new MojTempoGListener());
  70.                 box_ObszarPrzyciskow.add(tempoG);
  71.  
  72.                 JButton tempoD = new JButton("Wolniej");
  73.                 tempoD.addActionListener(new MojTempoDListener());
  74.                 box_ObszarPrzyciskow.add(tempoD);
  75.  
  76.                 JButton zapisz = new JButton("Zapisz");
  77.                 zapisz.addActionListener(new ZapiszListener());
  78.                 box_ObszarPrzyciskow.add(zapisz);
  79.  
  80.                 JButton odtworz = new JButton("Odtworz");
  81.                 odtworz.addActionListener(new OdtworzListener());
  82.                 box_ObszarPrzyciskow.add(odtworz);
  83.                 }
  84.             jPanel_PanelTla.add(BorderLayout.EAST, box_ObszarPrzyciskow);
  85.  
  86. //---
  87.         konfigurujMidi(); // public void konfigurujMidi()
  88.  
  89.         jFrame_RamkaGlowna.pack();
  90.         jFrame_RamkaGlowna.setVisible(true);
  91.     }
  92. //--- end of -> twórzGUI ----------------------------------------------------------------
  93.  
  94.  
  95.     public void konfigurujMidi() { // deklaracja metody -> class MuzMachina
  96.         try {
  97.             sequencer = MidiSystem.getSequencer();
  98.             sequencer.open();
  99.             sequencer.addMetaEventListener(this);
  100.             sequencer.setTempoInBPM(120);
  101.  
  102.             sequence = new Sequence(Sequence.PPQ,4);
  103.             track = sequence.createTrack();
  104.  
  105.         } catch(Exception e) {e.printStackTrace();}
  106.     } // metoda pomocnicza metody twórzGUI
  107.  
  108.  
  109.     public void utworzSciezkeIOdtworz() { // metoda wywoływana przez ActionListener
  110.  
  111.         int[] instrumenty = {35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63}; // 16 instr
  112.         sequence.deleteTrack(track);
  113.         track = sequence.createTrack();
  114.  
  115. //--- analizujemy wszystkie pola wyboru i dla zaznaczonych tworzymy zdarzenia MIDI
  116.         for (int y=0; y<16; y++) {
  117.  
  118.             for (int x=0; x<16; x++) {
  119.                 JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get( (16*y)+x );
  120.  
  121.                 if ( jCheckBox.isSelected() ) {
  122.                         track.add( makeMidiEvent(144,9, instrumenty[y], 100, x        ) );
  123.                         track.add( makeMidiEvent(128,9, instrumenty[y], 100, x+1 ) );
  124.                 }
  125.             } // koniec for x
  126.  
  127.             track.add(makeMidiEvent(176,1,127,0,16)); // ??
  128.         } // koniec for y
  129.  
  130.             track.add(makeMidiEvent(192,9,1,0,15)); // ??
  131.         try {
  132.             sequencer.setSequence(sequence);
  133.             sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
  134.             sequencer.start();
  135.         } catch(Exception e) {e.printStackTrace();}
  136.     }
  137.  
  138.  
  139.     public static MidiEvent makeMidiEvent(int plc, int kanal, int jeden, int dwa, int takt) {
  140.         // metoda pomocniczna metody utworzSciezkeIOdtworz() <-- ActionListener
  141.         MidiEvent midiEvent = null;
  142.         try {
  143.             ShortMessage shortMessage = new ShortMessage();
  144.                          shortMessage.setMessage(plc, kanal, jeden, dwa);
  145.             midiEvent = new MidiEvent(shortMessage, takt);
  146.         } catch(Exception e) { e.printStackTrace(); }
  147.         return midiEvent;
  148.     }
  149.  
  150.  
  151. //--- seria deklaracji klas wew -> JButton-actionPerformed ----------------------------------------
  152.  
  153.         public class MojStartListener implements ActionListener {
  154.             public void actionPerformed(ActionEvent a) {
  155.  
  156.                 utworzSciezkeIOdtworz();
  157.             }
  158.         }
  159.  
  160.         public class MojStopListener implements ActionListener {
  161.             public void actionPerformed(ActionEvent a) {
  162.  
  163.                 sequencer.stop();
  164.             }
  165.         }
  166.  
  167.         public class MojTempoGListener implements ActionListener {
  168.             public void actionPerformed(ActionEvent a) {
  169.                 float wspTempa = sequencer.getTempoFactor();
  170.                 sequencer.setTempoFactor((float)(wspTempa * 1.03));
  171.             }
  172.         }
  173.  
  174.         public class MojTempoDListener implements ActionListener {
  175.             public void actionPerformed(ActionEvent a) {
  176.                 float wspTempa = sequencer.getTempoFactor();
  177.                 sequencer.setTempoFactor((float)(wspTempa * .97));
  178.             }
  179.         }
  180.  
  181.         public class ZapiszListener implements ActionListener {
  182.             public void actionPerformed(ActionEvent a) {
  183.  
  184.                 boolean[] stanyPol = new boolean[256]; // tworzymy talbice ze stanami pól wyboru
  185.  
  186.                 for (int i = 0; i < 256; i++) {
  187.                     JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get(i);
  188.  
  189.                     if ( jCheckBox.isSelected() ) stanyPol[i] = true;
  190.                 }
  191.  
  192.                 try {
  193.                     File               file       = new File("kompozycja.ser");
  194.                     FileOutputStream   fileOutStr = new FileOutputStream(file);
  195.                     ObjectOutputStream objOutStr  = new ObjectOutputStream(fileOutStr);
  196.  
  197.                     objOutStr.writeObject(stanyPol);
  198.  
  199.                 } catch(Exception ex) { ex.printStackTrace(); }
  200.             }
  201.         }
  202.  
  203.         public class OdtworzListener implements ActionListener {
  204.             public void actionPerformed(ActionEvent a) {
  205.  
  206.                 boolean[] stanyPol = null;
  207.                 try {
  208.                         ObjectInputStream objInStr =
  209.                     new ObjectInputStream( new FileInputStream( new File("kompozycja.ser") ) );
  210.  
  211.                     stanyPol = (boolean[]) objInStr.readObject();
  212.  
  213.                 } catch(Exception ex) { ex.printStackTrace(); }
  214.  
  215.                 // teraz odtwarzamy sekwencje
  216.                 for (int i = 0; i < 256; i++) {
  217.                     JCheckBox jCheckBox = (JCheckBox) arrLstJChBox_listaPolWyboru.get(i);
  218.  
  219.                     if ( stanyPol[i] ) jCheckBox.setSelected(true);
  220.                 }
  221.  
  222.                 sequencer.stop();
  223.                 utworzSciezkeIOdtworz();
  224.             }
  225.         } // koniec klasy wewnętrznej
  226.  
  227.     public void meta(MetaMessage arg0) {} // ???
  228.  
  229. } // koniec klasy
  230.