for( SequenceListTableModel.Column c : SequenceListTableModel.Column.values() ) {\r
TableColumn tc = colModel.getColumn(c.ordinal());\r
tc.setPreferredWidth(c.preferredWidth);\r
- if( c == SequenceListTableModel.Column.SEQ_LENGTH ) {\r
+ if( c == SequenceListTableModel.Column.LENGTH ) {\r
lengthColumn = tc;\r
}\r
}\r
// タイトルに合計シーケンス長を表示\r
if( lengthColumn != null ) {\r
int sec = getModel().getTotalSeconds();\r
- String title = SequenceListTableModel.Column.SEQ_LENGTH.title;\r
+ String title = SequenceListTableModel.Column.LENGTH.title;\r
title = String.format(title+" [%02d:%02d]", sec/60, sec%60);\r
lengthColumn.setHeaderValue(title);\r
}\r
implements TableCellEditor\r
{\r
public PositionCellEditor() {\r
- int column = SequenceListTableModel.Column.SEQ_POSITION.ordinal();\r
+ int column = SequenceListTableModel.Column.POSITION.ordinal();\r
TableColumn tc = getColumnModel().getColumn(column);\r
tc.setCellEditor(this);\r
}\r
);\r
public PlayButtonCellEditor() {\r
playButton.setMargin(ZERO_INSETS);\r
- int column = SequenceListTableModel.Column.SEQ_PLAY.ordinal();\r
+ int column = SequenceListTableModel.Column.PLAY.ordinal();\r
TableColumn tc = getColumnModel().getColumn(column);\r
tc.setCellRenderer(this);\r
tc.setCellEditor(this);\r
);\r
// レイアウト\r
setTitle("MIDI Editor/Playlist - MIDI Chord Helper");\r
- setBounds( 150, 200, 850, 500 );\r
+ setBounds( 150, 200, 900, 500 );\r
setLayout(new FlowLayout());\r
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this, true);\r
JPanel playlistPanel = new JPanel() {{\r
setMargin(ZERO_INSETS);\r
}});\r
}\r
+ if(sequenceListTable.base64EncodeAction != null) {\r
+ add(Box.createRigidArea(new Dimension(5, 0)));\r
+ add(new JButton(sequenceListTable.base64EncodeAction) {{\r
+ setMargin(ZERO_INSETS);\r
+ }});\r
+ }\r
add(Box.createRigidArea(new Dimension(5, 0)));\r
SequenceListTableModel sequenceListTableModel = sequenceListTable.getModel();\r
add(new JButton(sequenceListTableModel.moveToTopAction) {{\r
add(new JButton(sequenceListTableModel.moveToBottomAction) {{\r
setMargin(ZERO_INSETS);\r
}});\r
- if(sequenceListTable.base64EncodeAction != null) {\r
- add(Box.createRigidArea(new Dimension(5, 0)));\r
- add(new JButton(sequenceListTable.base64EncodeAction) {{\r
- setMargin(ZERO_INSETS);\r
- }});\r
- }\r
if( sequenceListTable.midiFileChooser != null ) {\r
add(Box.createRigidArea(new Dimension(5, 0)));\r
add(new JButton(\r
add(new SequencerSpeedSlider(\r
sequenceListTableModel.sequencerModel.speedSliderModel\r
));\r
+ add( Box.createRigidArea(new Dimension(5, 0)) );\r
+ add(new JPanel() {{\r
+ add(new JLabel("SyncMode:"));\r
+ add(new JLabel("Master"));\r
+ add(new JComboBox<Sequencer.SyncMode>(\r
+ sequenceListTable.getModel().sequencerModel.masterSyncModeModel\r
+ ));\r
+ add(new JLabel("Slave"));\r
+ add(new JComboBox<Sequencer.SyncMode>(\r
+ sequenceListTable.getModel().sequencerModel.slaveSyncModeModel\r
+ ));\r
+ }});\r
}};\r
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));\r
add(new JScrollPane(sequenceListTable));\r
private JLabel titleLabel;\r
private JSlider slider;\r
public SequencerSpeedSlider(BoundedRangeModel model) {\r
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));\r
add(titleLabel = new JLabel("Speed:"));\r
add(slider = new JSlider(model){{\r
setPaintTicks(true);\r
// セルのレンダラーが描く再生ボタンには効かないようなので、\r
// セルを突っついて再表示させる。\r
int rowIndex = indexOfSequenceOnSequencer();\r
- int colIndex = Column.SEQ_PLAY.ordinal();\r
+ int colIndex = Column.PLAY.ordinal();\r
fireTableCellUpdated(rowIndex, colIndex);\r
}\r
}\r
if(value == newValue) return;\r
value = newValue;\r
int rowIndex = indexOfSequenceOnSequencer();\r
- fireTableCellUpdated(rowIndex, Column.SEQ_POSITION.ordinal());\r
+ fireTableCellUpdated(rowIndex, Column.POSITION.ordinal());\r
}\r
}\r
@Override\r
*/\r
public enum Column {\r
/** MIDIシーケンスの番号 */\r
- SEQ_NUMBER("No.", Integer.class, 20),\r
+ NUMBER("No.", Integer.class, 20),\r
/** 再生ボタン */\r
- SEQ_PLAY("Play/Stop", String.class, 60) {\r
+ PLAY("Play/Stop", String.class, 60) {\r
@Override\r
public boolean isCellEditable() { return true; }\r
},\r
/** 再生中の時間位置(分:秒) */\r
- SEQ_POSITION("Position", String.class, 60) {\r
+ POSITION("Position", String.class, 60) {\r
@Override\r
public boolean isCellEditable() { return true; } // ダブルクリックだけ有効\r
@Override\r
}\r
},\r
/** シーケンスの時間長(分:秒) */\r
- SEQ_LENGTH("Length", String.class, 80) {\r
+ LENGTH("Length", String.class, 80) {\r
@Override\r
public Object getValueOf(SequenceTrackListTableModel sequenceModel) {\r
long usec = sequenceModel.getSequence().getMicrosecondLength();\r
}\r
},\r
/** シーケンス名(最初のトラックの名前) */\r
- SEQ_NAME("Sequence name", String.class, 250) {\r
+ NAME("Sequence name", String.class, 250) {\r
@Override\r
public boolean isCellEditable() { return true; }\r
public Object getValueOf(SequenceTrackListTableModel sequenceModel) {\r
@Override\r
public Object getValueAt(int row, int column) {\r
Column c = Column.values()[column];\r
- return c == Column.SEQ_NUMBER ? row : c.getValueOf(sequenceList.get(row));\r
+ return c == Column.NUMBER ? row : c.getValueOf(sequenceList.get(row));\r
}\r
@Override\r
public void setValueAt(Object val, int row, int column) {\r
sequenceList.get(row).setFilename((String)val);\r
fireTableCellUpdated(row, column);\r
break;\r
- case SEQ_NAME:\r
+ case NAME:\r
// シーケンス名の設定または変更\r
if( sequenceList.get(row).setName((String)val) )\r
fireTableCellUpdated(row, Column.MODIFIED.ordinal());\r
return;\r
sequencerModel.setSequenceTrackListTableModel(newSeq);\r
int columnIndices[] = {\r
- Column.SEQ_PLAY.ordinal(),\r
- Column.SEQ_POSITION.ordinal(),\r
+ Column.PLAY.ordinal(),\r
+ Column.POSITION.ordinal(),\r
};\r
if( oldSeq != null ) {\r
int oldIndex = sequenceList.indexOf(oldSeq);\r
*/\r
public enum Column {\r
/** MIDIイベント番号 */\r
- EVENT_NUMBER("No.", Integer.class, 20),\r
+ EVENT_NUMBER("No.", Integer.class, 15) {\r
+ @Override\r
+ public boolean isCellEditable() { return false; }\r
+ },\r
/** tick位置 */\r
- TICK_POSITION("TickPos.", Long.class, 40),\r
+ TICK_POSITION("TickPos.", Long.class, 40) {\r
+ @Override\r
+ public Object getValue(MidiEvent event) {\r
+ return event.getTick();\r
+ }\r
+ },\r
/** tick位置に対応する小節 */\r
- MEASURE_POSITION("Measure", Integer.class, 40),\r
+ MEASURE_POSITION("Measure", Integer.class, 30) {\r
+ public Object getValue(SequenceTickIndex sti, MidiEvent event) {\r
+ return sti.tickToMeasure(event.getTick()) + 1;\r
+ }\r
+ },\r
/** tick位置に対応する拍 */\r
- BEAT_POSITION("Beat", Integer.class, 20),\r
+ BEAT_POSITION("Beat", Integer.class, 20) {\r
+ @Override\r
+ public Object getValue(SequenceTickIndex sti, MidiEvent event) {\r
+ sti.tickToMeasure(event.getTick());\r
+ return sti.lastBeat + 1;\r
+ }\r
+ },\r
/** tick位置に対応する余剰tick(拍に収まらずに余ったtick数) */\r
- EXTRA_TICK_POSITION("ExTick", Integer.class, 20),\r
+ EXTRA_TICK_POSITION("ExTick", Integer.class, 20) {\r
+ @Override\r
+ public Object getValue(SequenceTickIndex sti, MidiEvent event) {\r
+ sti.tickToMeasure(event.getTick());\r
+ return sti.lastExtraTick;\r
+ }\r
+ },\r
/** MIDIメッセージ */\r
- MESSAGE("MIDI Message", String.class, 200);\r
+ MESSAGE("MIDI Message", String.class, 300) {\r
+ @Override\r
+ public Object getValue(MidiEvent event) {\r
+ return msgToString(event.getMessage());\r
+ }\r
+ };\r
private String title;\r
private Class<?> columnClass;\r
int preferredWidth;\r
this.columnClass = columnClass;\r
this.preferredWidth = preferredWidth;\r
}\r
+ /**\r
+ * セルを編集できるときtrue、編集できないときfalseを返します。\r
+ */\r
+ public boolean isCellEditable() { return true; }\r
+ /**\r
+ * 列の値を返します。\r
+ * @param event 対象イベント\r
+ * @return この列の対象イベントにおける値\r
+ */\r
+ public Object getValue(MidiEvent event) { return ""; }\r
+ /**\r
+ * 列の値を返します。\r
+ * @param sti MIDIシーケンスデータのtickインデックス\r
+ * @param event 対象イベント\r
+ * @return この列の対象イベントにおける値\r
+ */\r
+ public Object getValue(SequenceTickIndex sti, MidiEvent event) {\r
+ return getValue(event);\r
+ }\r
}\r
/**\r
* ラップされているMIDIトラック\r
}\r
@Override\r
public Object getValueAt(int row, int column) {\r
- switch(Column.values()[column]) {\r
- case EVENT_NUMBER: return row;\r
- case TICK_POSITION: return track.get(row).getTick();\r
+ Column c = Column.values()[column];\r
+ if( c == Column.EVENT_NUMBER ) return row;\r
+ MidiEvent event = track.get(row);\r
+ switch(c) {\r
case MEASURE_POSITION:\r
- return sequenceTrackListTableModel.getSequenceTickIndex().tickToMeasure(track.get(row).getTick()) + 1;\r
case BEAT_POSITION:\r
- sequenceTrackListTableModel.getSequenceTickIndex().tickToMeasure(track.get(row).getTick());\r
- return sequenceTrackListTableModel.getSequenceTickIndex().lastBeat + 1;\r
case EXTRA_TICK_POSITION:\r
- sequenceTrackListTableModel.getSequenceTickIndex().tickToMeasure(track.get(row).getTick());\r
- return sequenceTrackListTableModel.getSequenceTickIndex().lastExtraTick;\r
- case MESSAGE: return msgToString(track.get(row).getMessage());\r
- default: return "";\r
+ return c.getValue(sequenceTrackListTableModel.getSequenceTickIndex(), event);\r
+ default:\r
+ return c.getValue(event);\r
}\r
}\r
/**\r
*/\r
@Override\r
public boolean isCellEditable(int row, int column) {\r
- switch(Column.values()[column]) {\r
- case TICK_POSITION:\r
- case MEASURE_POSITION:\r
- case BEAT_POSITION:\r
- case EXTRA_TICK_POSITION:\r
- case MESSAGE: return true;\r
- default: return false;\r
- }\r
+ return Column.values()[column].isCellEditable();\r
}\r
/**\r
* セルの値を変更します。\r