X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=MooTrackTitle.java;h=8bec94bc2495c2a65d5f730b03b910f986cd999b;hb=f7097bc07b6688d1629e6894c1c42dc06485dc12;hp=49082670e1df277bd87e11084fddf55ce198d1ff;hpb=4e7d6f8b7dd7fbcef2282674b5442d78cf220489;p=moosique.git diff --git a/MooTrackTitle.java b/MooTrackTitle.java index 4908267..8bec94b 100644 --- a/MooTrackTitle.java +++ b/MooTrackTitle.java @@ -1,25 +1,203 @@ 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 { +public class MooTrackTitle extends JPanel { - /* + private Track track; + private MetaMessage trackNameMessage; + private ShortMessage programChangeMessage; + private MooTrackView mtv; + + private JTextField title; + private MooInstrumentList instruments; + 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 (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.setSelected(false); + Moosique.setTrackMute(track, false); + mute.setFont(Moosique.getGUI().FONT); + mute.addActionListener(tl); + checkboxes.add(mute); + + solo = new JCheckBox("Solo"); + 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 MooTrackTitle () { + 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. */ - public void () { - + 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); + 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(); + } + } + } } }