]> ruin.nu Git - moosique.git/commitdiff
*** empty log message ***
authorEinar Pehrson <einarp@itstud.chalmers.se>
Wed, 14 May 2003 11:15:08 +0000 (11:15 +0000)
committerEinar Pehrson <einarp@itstud.chalmers.se>
Wed, 14 May 2003 11:15:08 +0000 (11:15 +0000)
Methods of Key Classes.txt
MooDialog.java
MooNote.java
MooNoteElement.java
MooNoteProp.java [deleted file]
MooTrackTitle.java
MooTrackView.java
Moosique.java

index a2dd9416552365ab0212854d7b707dba71b3de7a..289943e3e541cf604a2e1d065eac2c46a522ad49 100644 (file)
@@ -139,7 +139,7 @@ int getPitchBend()
 int getPolyPressure(int noteNumber)
        Obtains the pressure with which the specified key is being depressed. 
 int getProgram()
-       Obtains the current program number for this channel. 
+       Obtains the current program number for this channel.
 boolean getSolo()
        Obtains the current solo state for this channel. 
 boolean localControl(boolean on)
index ee95f09eebb8a2c7fa6d95ece10275368f3ffb23..9769c508fd533ec4b0ef62f33fb684fd40b1fdf6 100644 (file)
@@ -1,6 +1,8 @@
 import javax.swing.*;
 import java.awt.*;
+import java.awt.event.*;
 import javax.sound.midi.*;
+import java.beans.*;
 
 /*
  * The add dialog that pops up if the user clicks on the add track menuitem
@@ -14,7 +16,10 @@ public class MooDialog extends JDialog {
        private JTextField textfield;
        private JComboBox trackList, trackLust; 
        private JButton okbutton, cancelbutton;
-       public static final int ADD_TRACK = 1, DELETE_TRACK = 2, COPY_TRACK = 3, MOVE_TRACK = 4;
+       public static final int ADD_TRACK = 1,
+                               DELETE_TRACK = 2,
+                               COPY_TRACK = 3,
+                               MOVE_TRACK = 4;
        
        /*
         * Creates the add dialog
@@ -148,11 +153,106 @@ public class MooDialog extends JDialog {
                                setVisible(true);
                                break;
                }
-                               
-               
-               
-               
-                        
         }
 
+       private MooNote note;
+       private JOptionPane optionPane;
+       private JTextField pitch;
+       private JTextField velocity;
+       private JTextField length;
+
+       /** 
+        * Creates a new note preference dialog.
+        * @param mn    the note that will be graphically represented
+        */
+       public MooDialog(MooNote mn) {
+               super(Moosique.getGUI(), "Note properties", false);
+               note = mn;
+               pitch = new JTextField(new Integer(note.getPitch()).toString(),3);
+               JPanel pitchpanel = new JPanel();
+               pitchpanel.add(new Label("Pitch: "));
+               pitchpanel.add(pitch);
+
+
+               velocity = new JTextField(new Integer(note.getVelocity()).toString(),3);
+               JPanel velocitypanel = new JPanel();
+               velocitypanel.add(new Label("Velocity: "));
+               velocitypanel.add(velocity);
+
+               length = new JTextField(new Integer(note.getDuration()).toString(),5);
+               JPanel lengthpanel = new JPanel();
+               lengthpanel.add(new Label("Length: "));
+               lengthpanel.add(length);
+
+               Object[] array = {"Set the note properties",
+                               pitchpanel,
+                               velocitypanel,
+                               lengthpanel};
+       
+               final String btnString1 = "Enter";
+               final String btnString2 = "Cancel";
+               Object[] options = {btnString1, btnString2};
+       
+               optionPane = new JOptionPane(array, 
+                                           JOptionPane.QUESTION_MESSAGE,
+                                           JOptionPane.YES_NO_OPTION,
+                                           null,
+                                           options,
+                                           options[0]);
+               setContentPane(optionPane);
+               setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+       
+               ActionListener intValidator = new ActionListener() {
+                   public void actionPerformed(ActionEvent e) {
+                                       if (e.getSource() instanceof JTextField){
+                                               JTextField s = (JTextField)e.getSource();
+                                               int num = Integer.parseInt(s.getText());
+                                               if (num < 0)
+                                                       num = 0;
+                                               else if (num > 127 && s != length)
+                                                       num = 127;
+                                               s.setText(new Integer(num).toString());
+                                       }
+                   }
+               };
+               pitch.addActionListener(intValidator);
+               velocity.addActionListener(intValidator);
+               length.addActionListener(intValidator);
+
+               optionPane.addPropertyChangeListener(new PropertyChangeListener() {
+                   public void propertyChange(PropertyChangeEvent e) {
+                       String prop = e.getPropertyName();
+       
+                       if (isVisible() 
+                        && (e.getSource() == optionPane)
+                        && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
+                            prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
+                           Object value = optionPane.getValue();
+       
+                           if (value == JOptionPane.UNINITIALIZED_VALUE) {
+                               //ignore reset
+                               return;
+                           }
+       
+                           // Reset the JOptionPane's value.
+                           // If you don't do this, then if the user
+                           // presses the same button next time, no
+                           // property change event will be fired.
+                           optionPane.setValue(
+                                   JOptionPane.UNINITIALIZED_VALUE);
+       
+                           if (value.equals(btnString1)) {
+                                                       note.setPitch(Integer.parseInt(pitch.getText()));
+                                                       note.setVelocity(Integer.parseInt(velocity.getText()));
+                                                       note.setDuration(Integer.parseInt(length.getText()));
+       
+                               setVisible(false);
+                           } else { // user closed dialog or clicked cancel
+                               setVisible(false);
+                           }
+                       }
+                   }
+               });
+               pack();
+       }
 }
index 77ecd53b3db9dbca92db36cae0f5f48853122658..6cb9f9e49d7051773ff44575df0a42074deb7479 100644 (file)
@@ -61,9 +61,8 @@ public class MooNote extends MidiEvent {
        public void setChannel(int channel) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), (byte)channel, noteOnMsg.getData1(), noteOnMsg.getData2());
-                       noteOffMsg.setMessage(noteOffMsg.getCommand(), (byte)channel, noteOffMsg.getData1(), noteOffMsg.getData2());
-               } catch (Exception e) {}
-               //} catch (InvalidMidiDataException e) {}
+                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), (byte)channel, noteOffMsg.getData1(), noteOffMsg.getData2());
+               } catch (InvalidMidiDataException e) {}
        }
 
        /** 
@@ -73,9 +72,8 @@ public class MooNote extends MidiEvent {
        public void setPitch(int pitch) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), noteOnMsg.getChannel(), (byte)pitch, noteOnMsg.getData2());
-                       noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), (byte)pitch, noteOffMsg.getData2());
-               } catch (Exception e) {}
-               //} catch (InvalidMidiDataException e) {}
+                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), (byte)pitch, noteOffMsg.getData2());
+               } catch (InvalidMidiDataException e) {}
        }
 
        /** 
@@ -85,9 +83,8 @@ public class MooNote extends MidiEvent {
        public void setVelocity(int vel) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), noteOnMsg.getChannel(), noteOnMsg.getData1(), (byte)vel);
-                       noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), noteOffMsg.getData1(), noteOffMsg.getData2());
-               } catch (Exception e) {}
-               //} catch (InvalidMidiDataException e) {}
+                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), noteOffMsg.getData1(), noteOffMsg.getData2());
+               } catch (InvalidMidiDataException e) {}
        }
 
        /** 
index 65ed0baf554dd78aab1676e1e7aa41cd6807ecd9..d5e4d2a433ece1f041b1056403b473425c75d63a 100644 (file)
@@ -11,6 +11,7 @@ import java.awt.event.*;
  
 public class MooNoteElement extends JPanel {
 
+       private MooTrackView mtv;
        private MooNote note;
        private int columns;
        private boolean selected;
@@ -18,13 +19,16 @@ public class MooNoteElement extends JPanel {
        public static final Color bgColor = new Color(160, 218, 255);
        private String notePitch;
        private String noteVelocity;
+       private JPopupMenu popup;
+       private JMenuItem popupRemove, popupProp;
 
        /** 
         * Creates a new note element.
         * @param mn    the note that will be graphically represented
         * @param rows  the number of rows that the note will occupy
         */
-       public MooNoteElement (MooNote mn) {
+       public MooNoteElement (MooTrackView parent, MooNote mn) {
+               mtv = parent;
                note = mn;
                calculateString();
                columns = mn.getDuration() / (Moosique.getSequence().getResolution() / 4);
@@ -32,8 +36,21 @@ public class MooNoteElement extends JPanel {
                setBackground(bgColor);
                addMouseListener(new MAdapter());
 
+               // Defines coordinates.
                pitchRect = new Rectangle(0, 0, 15, 10);
                veloRect = new Rectangle(20, 0, 40, 10);
+
+               // Creates pop-up menu.
+               popup = new JPopupMenu();
+               PopupListener pList = new PopupListener();
+               popupProp = new JMenuItem("Preferences...");
+               popupProp.addActionListener(pList);
+               popup.add(popupProp);
+
+               popupRemove = new JMenuItem("Remove");
+               popupRemove.addActionListener(pList);
+               popup.add(popupRemove);
+
        }
 
        /** 
@@ -99,27 +116,39 @@ public class MooNoteElement extends JPanel {
        }
 
        class MAdapter extends MouseAdapter {
-               public void mouseClicked(MouseEvent e) {
-                       if (pitchRect.contains(e.getPoint())) {
-                               if (SwingUtilities.isRightMouseButton(e)) {
-                                       note.setPitch(note.getPitch() + 1);
-                               } else if (SwingUtilities.isLeftMouseButton(e)) {
-                                       note.setPitch(note.getPitch() - 1);
+               public void mousePressed(MouseEvent e) {
+                       if (e.isControlDown()) {
+                               if (pitchRect.contains(e.getPoint())) {
+                                       if (SwingUtilities.isRightMouseButton(e)) {
+                                               note.setPitch(note.getPitch() + 1);
+                                       } else if (SwingUtilities.isLeftMouseButton(e)) {
+                                               note.setPitch(note.getPitch() - 1);
+                                       }
+                                       calculateString();
+                               } else if (veloRect.contains(e.getPoint())) {
+                                       if (SwingUtilities.isRightMouseButton(e)) {
+                                               note.setVelocity(note.getVelocity() + 1);
+                                       } else if (SwingUtilities.isLeftMouseButton(e)) {
+                                               note.setVelocity(note.getVelocity() - 1);
+                                       }
+                                       calculateString();
                                }
-                               calculateString();
-                       } else if (veloRect.contains(e.getPoint())) {
-                               if (SwingUtilities.isRightMouseButton(e)) {
-                                       note.setVelocity(note.getVelocity() + 1);
-                               } else if (SwingUtilities.isLeftMouseButton(e)) {
-                                       note.setVelocity(note.getVelocity() - 1);
-                               }
-                               calculateString();
+                               e.getComponent().repaint();
+                       }
+                       if (e.isPopupTrigger()) {
+                               popup.show(e.getComponent(), e.getX(), e.getY());
                        }
-                       e.getComponent().repaint();
                }
+       }
 
-               public void mousePressed(MouseEvent e) {}
-
-               public void mouseReleased(MouseEvent e) {}
+       class PopupListener implements ActionListener {
+               public void actionPerformed(ActionEvent e) {
+                       Object source = e.getSource();
+                       if  (source == popupProp) {
+                               new MooDialog(note);
+                       } else if  (source == popupRemove) {
+                               mtv.remove((MooNoteElement)((JComponent)e.getSource()).getParent().getParent());
+                       }
+               }
        }
 }
diff --git a/MooNoteProp.java b/MooNoteProp.java
deleted file mode 100644 (file)
index e1826e3..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.*;
-import java.beans.*;
-
-/**
- * Graphical representation of a MIDI note.
- * 
- * @author  Andersson, Andreen, Lanneskog, Pehrson
- * @version 1
- */
-
-public class MooNoteProp extends JDialog{
-
-       private MooNote note;
-    private JOptionPane optionPane;
-       private JTextField pitch;
-       private JTextField velocity;
-       private JTextField length;
-
-       /** 
-        * Creates a new note preference dialog.
-        * @param mn The note that will be graphically represented
-        */
-    public MooNoteProp(MooNote mn) {
-        super((JFrame)null, true);
-               note = mn;
-        setTitle("Note properties");
-
-               pitch = new JTextField(new Integer(note.getPitch()).toString(),3);
-               JPanel pitchpanel = new JPanel();
-               pitchpanel.add(new Label("Pitch: "));
-               pitchpanel.add(pitch);
-
-
-               velocity = new JTextField(new Integer(note.getVelocity()).toString(),3);
-               JPanel velocitypanel = new JPanel();
-               velocitypanel.add(new Label("Velocity: "));
-               velocitypanel.add(velocity);
-
-               length = new JTextField(new Integer(note.getDuration()).toString(),5);
-               JPanel lengthpanel = new JPanel();
-               lengthpanel.add(new Label("Length: "));
-               lengthpanel.add(length);
-
-        Object[] array = {"Set the note properties",
-                       pitchpanel,
-                       velocitypanel,
-                       lengthpanel};
-
-        final String btnString1 = "Enter";
-        final String btnString2 = "Cancel";
-        Object[] options = {btnString1, btnString2};
-
-        optionPane = new JOptionPane(array, 
-                                    JOptionPane.QUESTION_MESSAGE,
-                                    JOptionPane.YES_NO_OPTION,
-                                    null,
-                                    options,
-                                    options[0]);
-        setContentPane(optionPane);
-        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-
-        ActionListener intValidator = new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                               if (e.getSource() instanceof JTextField){
-                                       JTextField s = (JTextField)e.getSource();
-                                       int num = Integer.parseInt(s.getText());
-                                       if (num < 0)
-                                               num = 0;
-                                       else if (num > 127 && s != length)
-                                               num = 127;
-                                       s.setText(new Integer(num).toString());
-                               }
-            }
-        };
-               pitch.addActionListener(intValidator);
-               velocity.addActionListener(intValidator);
-               length.addActionListener(intValidator);
-
-        optionPane.addPropertyChangeListener(new PropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent e) {
-                String prop = e.getPropertyName();
-
-                if (isVisible() 
-                 && (e.getSource() == optionPane)
-                 && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
-                     prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
-                    Object value = optionPane.getValue();
-
-                    if (value == JOptionPane.UNINITIALIZED_VALUE) {
-                        //ignore reset
-                        return;
-                    }
-
-                    // Reset the JOptionPane's value.
-                    // If you don't do this, then if the user
-                    // presses the same button next time, no
-                    // property change event will be fired.
-                    optionPane.setValue(
-                            JOptionPane.UNINITIALIZED_VALUE);
-
-                    if (value.equals(btnString1)) {
-                                               note.setPitch(Integer.parseInt(pitch.getText()));
-                                               note.setVelocity(Integer.parseInt(velocity.getText()));
-                                               note.setDuration(Integer.parseInt(length.getText()));
-
-                        setVisible(false);
-                    } else { // user closed dialog or clicked cancel
-                        setVisible(false);
-                    }
-                }
-            }
-        });
-               pack();
-    }
-
-       public static void main(String[] args){
-
-               MooNote n = new MooNote(0,0,10,20,0,30);
-               MooNoteProp prop = new MooNoteProp(n);
-               prop.setVisible(true);
-               prop = new MooNoteProp(n);
-               prop.setVisible(true);
-
-       }
-}
index 412fb246f183a521d86246068ca5ec5eb99b8a3f..b921926bd8dc9527b99ebe7825fe7816ab981f23 100644 (file)
@@ -15,7 +15,7 @@ public class MooTrackTitle extends JPanel {
        private MetaMessage trackNameMessage;
        private String trackName = "";
        private ShortMessage programChangeMessage;
-       private int programChange = 0, channel = 0;
+       private int channel = 0;
        private JTextField title;
        private MooInstrumentList instruments;
        private JComboBox channelBox;
@@ -32,21 +32,24 @@ public class MooTrackTitle extends JPanel {
                track = aTrack;
                this.trackNum = aTrackNum;
 
-               // Finds track name and program change
+               // Finds track name, program change and channel.
                MidiMessage msg;
+               int status;
                for (int i = 0; i < track.size(); i++) {
                        msg = track.get(i).getMessage();
-                       if (msg.getStatus() == 255) {
+                       status = msg.getStatus();
+                       if (status == MetaMessage.META) {
                                if (((MetaMessage)msg).getType() == 3) {
                                        trackNameMessage = (MetaMessage)msg;
                                        trackName = new String(trackNameMessage.getData());
                                }
-                       } else if (msg.getStatus() == 192) {
+                       } else if (status >= 192 && status <= 207) {
                                programChangeMessage = (ShortMessage)msg;
-                               programChange = programChangeMessage.getData1();
+                               channel = status - 192;
                        }
                }
 
+/*             // Finds channel number.
                MidiEvent event;
                for (int i = 0; i < track.size(); i++) {
                        event = track.get(i);
@@ -55,7 +58,7 @@ public class MooTrackTitle extends JPanel {
                                break;
                        }
                }
-               
+*/             
                // Creates and places components.
                setLayout(new GridLayout(4,1));
                setBorder(BorderFactory.createLineBorder(Color.black));
@@ -66,6 +69,10 @@ public class MooTrackTitle extends JPanel {
                title.addFocusListener(new TitleFocusListener());
                add(title);
 
+               instruments = new MooInstrumentList(channel);
+               // instruments = new MooInstrumentList(channel, programChangeMessage);
+               add(instruments);
+
                channelBox = new JComboBox();
                channelBox.setFont(Moosique.getGUI().FONT);
                for (int i = 1; i <= 16; i++)
@@ -73,9 +80,6 @@ public class MooTrackTitle extends JPanel {
 
                channelBox.setSelectedIndex(channel);
 
-               instruments = new MooInstrumentList(channelBox.getSelectedIndex());
-               add(instruments);
-
                channelBox.addActionListener(new ActionListener(){
                                public void actionPerformed(ActionEvent e){
                                        int chan = channelBox.getSelectedIndex();
index 129b0af0e78aa91ba33f9416f8166fb32d19baec..c058cc5e01ec881e0922a5b67c951dcc47967683 100644 (file)
@@ -11,46 +11,96 @@ import java.util.*;
  * @version 1
  */
 
-public class MooTrackView extends JPanel implements ActionListener {
+public class MooTrackView extends JPanel {
 
        private Track track;
-       private NoteArea notes;
        private Rectangle box;
        private JPopupMenu popup;
-       private JPopupMenu notePopup;
        private JMenuItem menuItem;
+       private ArrayList rects;
        protected static int viewLength = 0;
        public static final int NOTE_HEIGHT = 10, NOTE_WIDTH = 40, VIEW_WIDTH = 200;
 
        public MooTrackView (Track track) {
                super(true);
                this.track = track;
-               setLayout(new BorderLayout());
 
-               notes = new NoteArea(track);    
-               notes.setBackground(Color.white);
-               notes.setBorder(BorderFactory.createLineBorder(Color.black));
+               // Configures panel
+               setBackground(Color.white);
+               setBorder(BorderFactory.createLineBorder(Color.black));
+               setLayout(null);
+               setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT));
+
+               // Creates temporary variables
+               MidiEvent note;
+               MooNoteElement elem;
+               int extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150;
+               int x, y, height;
+               int beatsPerSixteenth = Moosique.getSequence().getResolution() / 4;
+               rects = new ArrayList(track.size() / 2);
+
+               // Places note elements
+               Insets insets = getInsets();
+               for (int i = 0; i < track.size(); i++) {
+                       note = track.get(i);
+                       if (note instanceof MooNote) {
+                               // Adds the note element to the note area.
+                               MooNote mn = (MooNote)note;
+                               elem = new MooNoteElement(this, mn);
+                               add(elem);
+
+                               // Moves the note element to the appropriate place.
+                               x = insets.left;
+                               y = insets.top + (int)(mn.getTick() / beatsPerSixteenth) * NOTE_HEIGHT;
+                               height = (mn.getDuration() / beatsPerSixteenth) * NOTE_HEIGHT;
+                               if (height == 0) height = NOTE_HEIGHT;
+                               Rectangle r = new Rectangle(x, y, NOTE_WIDTH, height);
+                               while(isOccupied(r)) r.translate(NOTE_WIDTH, 0);
+                               elem.setBounds(r);
+                               rects.add(r);
+                               if (viewLength < (y + height)) viewLength = y + height;
+                       }
+                       setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight));
+               }
+               validate();
 
+               // Creates pop-up menu.
                popup = new JPopupMenu();
                menuItem = new JMenuItem("Add...");
-               menuItem.addActionListener(this);
+               // menuItem.addActionListener();
                popup.add(menuItem);
 
-               notePopup = new JPopupMenu();
-               menuItem = new JMenuItem("Preferences...");
-               menuItem.addActionListener(this);
-               notePopup.add(menuItem);
-
-//             notes.addMouseListener(new PopupListener());
-               add(notes, BorderLayout.CENTER);
+               addMouseListener(new PopupListener());
        }
 
-       public void actionPerformed(ActionEvent e) {}
-
        public Track getTrack() {
                return track;
        }
 
+       private boolean isOccupied(Rectangle r) {
+               Iterator it = rects.iterator();
+               while (it.hasNext()) {
+                       if(r.intersects((Rectangle)it.next())) return true;
+               }
+               return false;
+       }
+       
+       public void remove(MooNoteElement elem) {
+               remove((Component)elem);
+               validate();
+       }
+
+       public void paintComponent(Graphics g) {
+               super.paintComponent(g);
+               Graphics2D g2 = (Graphics2D)g;
+               for (int c = 0; c < viewLength || c < getHeight(); c += NOTE_HEIGHT) {
+                       for (int r = 0; r < (10 * NOTE_WIDTH); r += NOTE_WIDTH) {
+                               box = new Rectangle(r, c, NOTE_WIDTH, NOTE_HEIGHT);
+                               g2.setColor(Color.gray);
+                               g2.draw(box);
+                       }
+               }
+       }
 
        /** 
         * Updates the track view.
@@ -59,86 +109,11 @@ public class MooTrackView extends JPanel implements ActionListener {
                repaint();
        }
 
-       class NoteArea extends JPanel {
-               public static final int NOTE_HEIGHT = 10, NOTE_WIDTH = 40, VIEW_WIDTH = 200;
-               private ArrayList rects;
-
-               public NoteArea(Track track) {
-                       // Configuring panel
-                       super(true);
-                       setLayout(null);
-                       setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT));
-
-                       // Creating temporary variables
-                       MidiEvent note;
-                       MooNoteElement elem;
-                       int x, y, height;
-                       int beatsPerSixteenth = Moosique.getSequence().getResolution() / 4;
-                       rects = new ArrayList(track.size() / 2);
-
-                       // Placing note elements
-                       Insets insets = getInsets();
-                       for (int i = 0; i < track.size(); i++) {
-                               note = track.get(i);
-                               if (note instanceof MooNote) {
-                                       // Adds the note element to the note area.
-                                       MooNote mn = (MooNote)note;
-                                       elem = new MooNoteElement(mn);
-                                       add(elem);
-
-                                       // Moves the note element to the appropriate place.
-                                       x = insets.left;
-                                       y = insets.top + (int)(mn.getTick() / beatsPerSixteenth) * NOTE_HEIGHT;
-                                       height = (mn.getDuration() / beatsPerSixteenth) * NOTE_HEIGHT;
-                                       if (height == 0) height = NOTE_HEIGHT;
-                                       Rectangle r = new Rectangle(x, y, NOTE_WIDTH, height);
-                                       while(isOccupied(r)) r.translate(NOTE_WIDTH, 0);
-                                       elem.setBounds(r);
-                                       rects.add(r);
-                                       if (viewLength < (y + height)) viewLength = y + height;
-                               }
-                               setPreferredSize(new Dimension(VIEW_WIDTH, viewLength));
-                       }
-                       validate();
-               }
-               
-               private boolean isOccupied(Rectangle r) {
-                       Iterator it = rects.iterator();
-                       while (it.hasNext()) {
-                               if(r.intersects((Rectangle)it.next())) return true;
-                       }
-                       return false;
-               }
-
-               public void paintComponent(Graphics g) {
-                       super.paintComponent(g);
-                       Graphics2D g2 = (Graphics2D)g;
-                       for (int c = 0; c < viewLength || c < getHeight(); c += NOTE_HEIGHT) {
-                               for (int r = 0; r < (10 * NOTE_WIDTH); r += NOTE_WIDTH) {
-                                       box = new Rectangle(r, c, NOTE_WIDTH, NOTE_HEIGHT);
-                                       g2.setColor(Color.gray);
-                                       g2.draw(box);
-                               }
-                       }
-               }
-       }
-
        class PopupListener extends MouseAdapter {
                public void mousePressed(MouseEvent e) {
-                       maybeShowPopup(e);
-               }
-
-               public void mouseReleased(MouseEvent e) {
-                       maybeShowPopup(e);
-               }
-
-               private void maybeShowPopup(MouseEvent e) {
                        if (e.isPopupTrigger()) {
-                               if (findComponentAt(e.getX(), e.getY()) instanceof MooNoteElement)
-                                       notePopup.show(e.getComponent(), e.getX(), e.getY());
-                               else
-                                       popup.show(e.getComponent(), e.getX(), e.getY());
+                               popup.show(e.getComponent(), e.getX(), e.getY());
                        }
                }
        }
-}
+}
\ No newline at end of file
index df94b478e464f79277871e4d95d80265b03da463..e72cdf560d3df1e1b2e55dbdefb6ae0aecaad323 100644 (file)
@@ -274,7 +274,9 @@ public class Moosique {
                MidiEvent noteOn, noteOff = null, nextEvent;
                MidiMessage nextMsg;
                ShortMessage shortMsg;
+               ArrayList noteOns, noteOffs;
                for (int i = 0; i < tracks.length; i++) {
+                        noteOns = new ArrayList(tracks.length);
        /*
                        Collections.sort(track[i].events, new Comparator() {
                                public int compare(Object o1, Object o2) {
@@ -284,28 +286,26 @@ public class Moosique {
        */
                        for (int j = 0; j < tracks[i].size(); j++) {
                                noteOn = tracks[i].get(j);
-                               if (noteOn.getMessage() instanceof ShortMessage) {
-                                       if (((ShortMessage)noteOn.getMessage()).getCommand() == ShortMessage.NOTE_ON) {
-                                               // Finds the corresponding NoteOff event
-                                               for (int k = j + 1; k < tracks[i].size(); k++) {
-                                                       nextEvent = tracks[i].get(k);
-                                                       nextMsg = nextEvent.getMessage();
-                                                       if (nextMsg instanceof ShortMessage) {
-                                                               shortMsg = (ShortMessage) nextMsg;
-                                                               if (shortMsg.getCommand() == ShortMessage.NOTE_OFF && shortMsg.getChannel() == ((ShortMessage)noteOn.getMessage()).getChannel() && shortMsg.getData1() == ((ShortMessage)noteOn.getMessage()).getData1()) {
-                                                                       noteOff = nextEvent;
-                                                                       break;
-                                                               }
+                               if (noteOn.getMessage().getStatus() == ShortMessage.NOTE_ON) {
+                                       // Finds the corresponding NoteOff event
+                                       for (int k = j + 1; k < tracks[i].size(); k++) {
+                                               nextEvent = tracks[i].get(k);
+                                               nextMsg = nextEvent.getMessage();
+                                               if (nextMsg instanceof ShortMessage) {
+                                                       shortMsg = (ShortMessage) nextMsg;
+                                                       if (shortMsg.getCommand() == ShortMessage.NOTE_OFF && shortMsg.getChannel() == ((ShortMessage)noteOn.getMessage()).getChannel() && shortMsg.getData1() == ((ShortMessage)noteOn.getMessage()).getData1()) {
+                                                               noteOff = nextEvent;
+                                                               break;
                                                        }
-                                               }
-                                               // Replaces the NoteOn event with a MooNote, if possible with the corresponding NoteOff event
-                                               tracks[i].remove(noteOn);
-                                               if (noteOff != null) {
-                                                       tracks[i].add(new MooNote(noteOn, noteOff));
-                                               } else {
-                                                       tracks[i].add(new MooNote(noteOn));
                                                }
                                        }
+                                       // Replaces the NoteOn event with a MooNote, if possible with the corresponding NoteOff event
+                                       tracks[i].remove(noteOn);
+                                       if (noteOff != null) {
+                                               tracks[i].add(new MooNote(noteOn, noteOff));
+                                       } else {
+                                               tracks[i].add(new MooNote(noteOn));
+                                       }
                                }
                        }
                }