import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
+import javax.sound.midi.*;
/**
- * The title bar for each track with track name, channel, instrument etc.
+ * The title bar for each track with track name, channelBox, instrument etc.
*
* @author Andersson, Andreen, Lanneskog, Pehrson
* @version 1
*/
-public class MooTrackTitle extends JPanel{
+public class MooTrackTitle extends JPanel {
+ private Track track;
+ private MetaMessage trackNameMessage;
+ private ShortMessage programChangeMessage;
+ private MooTrackView mtv;
+
+ private JTextField title;
private MooInstrumentList instruments;
- //private JSpinner channel;
+ private JComboBox channelBox;
private JCheckBox mute;
private JCheckBox solo;
+ private JButton record;
+
+ private String trackName = "";
+ private int channel = 0;
+
+ /**
+ * Creates the title bar for an empty track, and therefore an initial channel is required.
+ * @param aTrack the track that this tracktitle is operating on.
+ * @param chan the initial channel
+ */
+ public MooTrackTitle (Track aTrack, int chan) {
+ this(aTrack);
+ channel = chan;
+ }
+
/**
* Creates the title bar.
+ * @param aTrack the track that this tracktitle is operating on.
*/
- public MooTrackTitle () {
- setLayout(new GridLayout(1,3));
- instruments = new MooInstrumentList();
+ public MooTrackTitle (Track aTrack) {
+ setDoubleBuffered(true);
+ track = aTrack;
+
+ // Finds track name, program change and channel.
+ MidiMessage msg;
+ int status;
+ for (int i = 0; i < track.size(); i++) {
+ msg = track.get(i).getMessage();
+ status = msg.getStatus();
+ if (status == MetaMessage.META) {
+ if (((MetaMessage)msg).getType() == 3) {
+ trackNameMessage = (MetaMessage)msg;
+ trackName = new String(trackNameMessage.getData());
+ }
+ } else if (status >= 192 && status < 208) {
+ programChangeMessage = (ShortMessage)msg;
+ // System.out.println("Program change " + programChangeMessage.getData1());
+ channel = status - 192;
+ }
+ }
+
+ // Creates and places components.
+ setLayout(new GridLayout(4,1));
+ setBorder(BorderFactory.createLineBorder(Color.black));
+ TitleListener tl = new TitleListener();
+
+ setPreferredSize(new Dimension(MooTrackView.VIEW_WIDTH,70));
+ title = new JTextField(trackName);
+ title.setFont(Moosique.getGUI().FONT);
+ title.addFocusListener(new TitleFocusListener());
+ add(title);
+
+ int type;
+ if (channel == 9) type = MooInstrumentList.DRUMS;
+ else type = MooInstrumentList.INSTRUMENTS;
+ instruments = new MooInstrumentList(channel, type);
+ // instruments = new MooInstrumentList(channel, type, programChangeMessage);
add(instruments);
+
+ channelBox = new JComboBox();
+ channelBox.setFont(Moosique.getGUI().FONT);
+ for (int i = 1; i <= 16; i++)
+ channelBox.addItem(new Integer(i));
+
+ channelBox.setSelectedIndex(channel);
+
+ channelBox.addActionListener(tl);
+ add(channelBox);
+
+ JPanel checkboxes = new JPanel();
+ checkboxes.setLayout(new GridLayout(1,3));
+
mute = new JCheckBox("Mute");
- mute.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent event){
- //setMute
- solo.setSelected(false);
- }});
- add(mute);
+ mute.setSelected(false);
+ Moosique.setTrackMute(track, false);
+ mute.setFont(Moosique.getGUI().FONT);
+ mute.addActionListener(tl);
+ checkboxes.add(mute);
+
solo = new JCheckBox("Solo");
- solo.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent event){
- //setSolo
+ solo.setSelected(false);
+ Moosique.setTrackSolo(track, false);
+ solo.setFont(Moosique.getGUI().FONT);
+ solo.addActionListener(tl);
+ checkboxes.add(solo);
+
+ record = new JButton("Record");
+ record.setFont(Moosique.getGUI().FONT);
+ record.addActionListener(tl);
+ checkboxes.add(record);
+
+ add(checkboxes);
+ }
+
+ /**
+ * Returns the channel of the track that the view is visualising.
+ * @return the chanel of the visualised track
+ */
+ public int getChannel() {
+ return channel;
+ }
+
+ /**
+ * Sets the track view this title should update after recording.
+ * @param the track view
+ */
+ public void setTrackView(MooTrackView tv) {
+ mtv = tv;
+ }
+
+ /**
+ * Checks if the focus is lost.
+ */
+ class TitleFocusListener extends FocusAdapter {
+ public void focusLost(FocusEvent e) {
+ // Update the MidiEvent containing the title of this track
+ }
+ }
+
+ /**
+ * Takes the appropriate action when a user selects an item on the popup menu.
+ */
+ class TitleListener implements ActionListener {
+ public void actionPerformed(ActionEvent e) {
+ Object source = e.getSource();
+ if (source == channelBox) {
+ channel = channelBox.getSelectedIndex();
+ MidiEvent me;
+ MooNote mn;
+ instruments.setChannel(channel);
+ // Query the user before rechannelling???
+ for (int j = 0; j < track.size(); j++) {
+ me = track.get(j);
+ if (me instanceof MooNote){
+ mn = (MooNote)me;
+ mn.setChannel(channel);
+ }
+ }
+ } else if (source == solo) {
+ boolean selected = mute.isSelected();
+ if (selected){
+ solo.setSelected(false);
+ Moosique.setTrackSolo(track, false);
+ }
+ Moosique.setTrackMute(track, selected);
+ } else if (source == mute) {
+ boolean selected = solo.isSelected();
+ if (selected){
mute.setSelected(false);
- }});
- add(solo);
+ Moosique.setTrackMute(track, false);
+ }
+ Moosique.setTrackSolo(track, selected);
+ } else if (source == record) {
+ Sequencer sequencer = Moosique.getSequencer();
+ boolean quantize = false;
+ if (record.getText() == "Record") {
+ /* Show a dialog with:
+ "Track" combo box,
+ "Channel" combo box (disabled?,
+ "Quantize" checkbox and
+ "Start Recording" button.
+ */
+ record.setText("Stop");
+ mtv.enableKeyboardRecording();
+ sequencer.recordEnable(track, channel);
+ sequencer.startRecording();
+ Moosique.setEdited();
+ } else {
+ record.setText("Record");
+ mtv.disableKeyboardRecording();
+ sequencer.stopRecording();
+ sequencer.recordDisable(track);
+ Moosique.convertTrack(track, quantize);
+ mtv.placeNoteElements();
+ }
+ }
+ }
}
}