3 import java.awt.event.*;
4 import javax.sound.midi.*;
7 * The title bar for each track with track name, channelBox, instrument etc.
9 * @author Andersson, Andreen, Lanneskog, Pehrson
13 public class MooTrackTitle extends JPanel {
16 private MetaMessage trackNameMessage;
17 private ShortMessage programChangeMessage;
18 private MooTrackView mtv;
20 private JTextField title;
21 private MooInstrumentList instruments;
22 private JComboBox channelBox;
23 private JCheckBox mute;
24 private JCheckBox solo;
25 private JButton record;
27 private String trackName = "";
28 private int channel = 0;
31 * Creates the title bar for an empty track, and therefore an initial channel is required.
32 * @param aTrack the track that this tracktitle is operating on.
33 * @param chan the initial channel
35 public MooTrackTitle (Track aTrack, int chan) {
41 * Creates the title bar.
42 * @param aTrack the track that this track title is operating on.
44 public MooTrackTitle (Track aTrack) {
45 setDoubleBuffered(true);
48 // Finds track name, program change and channel.
51 for (int i = 0; i < track.size(); i++) {
52 msg = track.get(i).getMessage();
53 status = msg.getStatus();
54 if (status == MetaMessage.META) {
55 if (((MetaMessage)msg).getType() == 3) {
56 trackNameMessage = (MetaMessage)msg;
57 trackName = new String(trackNameMessage.getData());
59 } else if (status >= 192 && status < 208) {
60 programChangeMessage = (ShortMessage)msg;
61 channel = programChangeMessage.getChannel();
65 // Creates and places components.
66 setLayout(new GridLayout(4,1));
67 setBorder(BorderFactory.createLineBorder(Color.black));
68 TitleListener tl = new TitleListener();
70 setPreferredSize(new Dimension(MooTrackView.VIEW_WIDTH,70));
71 title = new JTextField(trackName);
72 title.setFont(Moosique.getGUI().FONT);
73 title.addFocusListener(new TitleFocusListener());
77 if (channel == 9) type = MooInstrumentList.DRUMS;
78 else type = MooInstrumentList.INSTRUMENTS;
79 instruments = new MooInstrumentList(channel, type, programChangeMessage);
82 channelBox = new JComboBox();
83 channelBox.setFont(Moosique.getGUI().FONT);
84 for (int i = 1; i <= 16; i++)
85 channelBox.addItem(new Integer(i));
87 channelBox.setSelectedIndex(channel);
89 channelBox.addActionListener(tl);
92 JPanel checkboxes = new JPanel();
93 checkboxes.setLayout(new GridLayout(1,3));
95 mute = new JCheckBox("Mute");
96 mute.setSelected(false);
97 Moosique.setTrackMute(track, false);
98 mute.setFont(Moosique.getGUI().FONT);
99 mute.addActionListener(tl);
100 checkboxes.add(mute);
102 solo = new JCheckBox("Solo");
103 solo.setSelected(false);
104 Moosique.setTrackSolo(track, false);
105 solo.setFont(Moosique.getGUI().FONT);
106 solo.addActionListener(tl);
107 checkboxes.add(solo);
109 record = new JButton("Record");
110 record.setFont(Moosique.getGUI().FONT);
111 record.addActionListener(tl);
112 checkboxes.add(record);
118 * Returns the channel of the track that the view is visualising.
119 * @return the chanel of the visualised track
121 public int getChannel() {
126 * Sets the track view this title should update after recording.
127 * @param the track view
129 public void setTrackView(MooTrackView tv) {
134 * When the title field loses focus, updates the corresponding MidiEvent.
136 class TitleFocusListener extends FocusAdapter {
137 public void focusLost(FocusEvent e) {
139 trackNameMessage.setMessage(3, title.getText().getBytes(), title.getText().length());
140 } catch (InvalidMidiDataException ex) {}
145 * Takes the appropriate action when a user selects an item on the popup menu.
147 class TitleListener implements ActionListener {
148 public void actionPerformed(ActionEvent e) {
149 Object source = e.getSource();
150 if (source == channelBox) {
151 channel = channelBox.getSelectedIndex();
154 instruments.setChannel(channel);
155 // Prompt the user before rechannelling???
156 for (int j = 0; j < track.size(); j++) {
158 if (me instanceof MooNote){
160 mn.setChannel(channel);
163 } else if (source == solo) {
164 boolean selected = mute.isSelected();
166 solo.setSelected(false);
167 Moosique.setTrackSolo(track, false);
169 Moosique.setTrackMute(track, selected);
170 } else if (source == mute) {
171 boolean selected = solo.isSelected();
173 mute.setSelected(false);
174 Moosique.setTrackMute(track, false);
176 Moosique.setTrackSolo(track, selected);
177 } else if (source == record) {
178 Sequencer sequencer = Moosique.getSequencer();
179 boolean quantize = false;
180 if (record.getText() == "Record") {
181 /* Show a dialog with:
183 "Channel" combo box (disabled?,
184 "Quantize" checkbox and
185 "Start Recording" button.
187 record.setText("Stop");
188 mtv.enableKeyboardRecording();
189 sequencer.recordEnable(track, channel);
190 sequencer.startRecording();
191 Moosique.setEdited();
193 record.setText("Record");
194 mtv.disableKeyboardRecording();
195 sequencer.stopRecording();
196 sequencer.recordDisable(track);
197 java.util.List newNotes = Moosique.convertTrack(track, quantize);
198 mtv.placeNewNotes(newNotes);