63 |
import javax.swing.JSeparator; |
import javax.swing.JSeparator; |
64 |
import javax.swing.JSlider; |
import javax.swing.JSlider; |
65 |
import javax.swing.JToggleButton; |
import javax.swing.JToggleButton; |
66 |
|
import javax.swing.JToolBar; |
67 |
import javax.swing.TransferHandler; |
import javax.swing.TransferHandler; |
68 |
|
|
69 |
import javax.swing.border.Border; |
import javax.swing.border.Border; |
87 |
|
|
88 |
import org.jsampler.event.ListEvent; |
import org.jsampler.event.ListEvent; |
89 |
import org.jsampler.event.ListListener; |
import org.jsampler.event.ListListener; |
90 |
|
import org.jsampler.event.MidiDeviceEvent; |
91 |
import org.jsampler.event.MidiDeviceListEvent; |
import org.jsampler.event.MidiDeviceListEvent; |
92 |
import org.jsampler.event.MidiDeviceListListener; |
import org.jsampler.event.MidiDeviceListListener; |
93 |
|
import org.jsampler.event.MidiDeviceListener; |
94 |
import org.jsampler.event.SamplerAdapter; |
import org.jsampler.event.SamplerAdapter; |
95 |
import org.jsampler.event.SamplerChannelAdapter; |
import org.jsampler.event.SamplerChannelAdapter; |
96 |
import org.jsampler.event.SamplerChannelEvent; |
import org.jsampler.event.SamplerChannelEvent; |
98 |
import org.jsampler.event.SamplerChannelListListener; |
import org.jsampler.event.SamplerChannelListListener; |
99 |
import org.jsampler.event.SamplerChannelListener; |
import org.jsampler.event.SamplerChannelListener; |
100 |
import org.jsampler.event.SamplerEvent; |
import org.jsampler.event.SamplerEvent; |
101 |
|
import org.jsampler.event.SamplerListener; |
102 |
|
|
103 |
|
import org.jsampler.view.std.JSChannelOutputRoutingDlg; |
104 |
|
import org.jsampler.view.std.JSFxSendsPane; |
105 |
|
import org.jsampler.view.std.JSInstrumentChooser; |
106 |
|
|
107 |
import org.linuxsampler.lscp.AudioOutputDevice; |
import org.linuxsampler.lscp.AudioOutputDevice; |
108 |
import org.linuxsampler.lscp.MidiInputDevice; |
import org.linuxsampler.lscp.MidiInputDevice; |
118 |
* @author Grigor Iliev |
* @author Grigor Iliev |
119 |
*/ |
*/ |
120 |
public class Channel extends org.jsampler.view.JSChannel { |
public class Channel extends org.jsampler.view.JSChannel { |
121 |
|
private final static ImageIcon iconEdit; |
122 |
|
|
123 |
private final static ImageIcon iconMuteOn; |
private final static ImageIcon iconMuteOn; |
124 |
private final static ImageIcon iconMuteOff; |
private final static ImageIcon iconMuteOff; |
125 |
private final static ImageIcon iconMutedBySolo; |
private final static ImageIcon iconMutedBySolo; |
144 |
= new Vector<PropertyChangeListener>(); |
= new Vector<PropertyChangeListener>(); |
145 |
|
|
146 |
static { |
static { |
147 |
|
iconEdit = new ImageIcon(Channel.class.getResource("res/icons/edit.png")); |
148 |
|
|
149 |
String path = "org/jsampler/view/classic/res/icons/"; |
String path = "org/jsampler/view/classic/res/icons/"; |
150 |
URL url = ClassLoader.getSystemClassLoader().getResource(path + "mute_on.png"); |
URL url = ClassLoader.getSystemClassLoader().getResource(path + "mute_on.png"); |
151 |
iconMuteOn = new ImageIcon(url); |
iconMuteOn = new ImageIcon(url); |
311 |
private final ChannelProperties propertiesPane; |
private final ChannelProperties propertiesPane; |
312 |
private final JButton btnInstr = new InstrumentButton(i18n.getLabel("Channel.btnInstr")); |
private final JButton btnInstr = new InstrumentButton(i18n.getLabel("Channel.btnInstr")); |
313 |
private final Action actInstr; |
private final Action actInstr; |
314 |
|
private final JButton btnEdit = new JButton(iconEdit); |
315 |
private final JButton btnMute = new JButton(); |
private final JButton btnMute = new JButton(); |
316 |
private final JButton btnSolo = new JButton(); |
private final JButton btnSolo = new JButton(); |
317 |
private final JSlider slVolume = new JSlider(0, 100); |
private final JSlider slVolume = new JSlider(0, 100); |
341 |
|
|
342 |
mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.Y_AXIS)); |
mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.Y_AXIS)); |
343 |
addMouseListener(getHandler()); |
addMouseListener(getHandler()); |
344 |
|
addHierarchyListener(getHandler()); |
345 |
|
|
346 |
JPanel p = new JPanel(); |
JPanel p = new JPanel(); |
347 |
p.setOpaque(false); |
p.setOpaque(false); |
355 |
p.add(btnInstr); |
p.add(btnInstr); |
356 |
p.add(Box.createRigidArea(new Dimension(6, 0))); |
p.add(Box.createRigidArea(new Dimension(6, 0))); |
357 |
|
|
358 |
|
btnEdit.setToolTipText(i18n.getLabel("Channel.btnEdit.tt")); |
359 |
|
btnEdit.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
360 |
|
p.add(btnEdit); |
361 |
|
p.add(Box.createRigidArea(new Dimension(6, 0))); |
362 |
|
|
363 |
lStreams.setHorizontalAlignment(JLabel.CENTER); |
lStreams.setHorizontalAlignment(JLabel.CENTER); |
364 |
lVoices.setHorizontalAlignment(JLabel.CENTER); |
lVoices.setHorizontalAlignment(JLabel.CENTER); |
365 |
|
|
439 |
|
|
440 |
btnInstr.addActionListener(actInstr); |
btnInstr.addActionListener(actInstr); |
441 |
|
|
442 |
|
btnEdit.addActionListener(new ActionListener() { |
443 |
|
public void |
444 |
|
actionPerformed(ActionEvent e) { |
445 |
|
CC.getSamplerModel().editBackendInstrument(getChannelId()); |
446 |
|
} |
447 |
|
}); |
448 |
|
|
449 |
btnMute.addActionListener(new ActionListener() { |
btnMute.addActionListener(new ActionListener() { |
450 |
public void |
public void |
451 |
actionPerformed(ActionEvent e) { changeMute(); } |
actionPerformed(ActionEvent e) { changeMute(); } |
838 |
|
|
839 |
private void |
private void |
840 |
loadInstrument() { |
loadInstrument() { |
841 |
InstrumentChooser dlg = new InstrumentChooser(CC.getMainFrame()); |
JSInstrumentChooser dlg = new JSInstrumentChooser(CC.getMainFrame()); |
842 |
dlg.setVisible(true); |
dlg.setVisible(true); |
843 |
|
|
844 |
if(!dlg.isCancelled()) { |
if(dlg.isCancelled()) return; |
845 |
int idx = dlg.getInstrumentIndex(); |
|
846 |
getModel().loadBackendInstrument(dlg.getFileName(), idx); |
SamplerEngine engine = getChannelInfo().getEngine(); |
847 |
|
if(dlg.getEngine() != null) { |
848 |
|
if(engine == null || !dlg.getEngine().equals(engine.getName())); |
849 |
|
getModel().setBackendEngineType(dlg.getEngine()); |
850 |
} |
} |
851 |
|
|
852 |
|
int idx = dlg.getInstrumentIndex(); |
853 |
|
getModel().loadBackendInstrument(dlg.getInstrumentFile(), idx); |
854 |
|
|
855 |
} |
} |
856 |
} |
} |
857 |
|
|
882 |
private InformationDialog fxSendsDlg = null; |
private InformationDialog fxSendsDlg = null; |
883 |
|
|
884 |
private SamplerChannelModel channelModel = null; |
private SamplerChannelModel channelModel = null; |
885 |
|
private MidiDeviceModel midiDevice = null; |
886 |
|
|
887 |
private boolean update = false; |
private boolean update = false; |
888 |
|
|
889 |
|
private final SamplerListener samplerListener; |
890 |
|
private final MapListListener mapListListener = new MapListListener(); |
891 |
|
|
892 |
private class NoMap { |
private class NoMap { |
893 |
public String |
public String |
894 |
toString() { return "[None]"; } |
toString() { return "[None]"; } |
977 |
channelChanged(SamplerChannelEvent e) { updateChannelProperties(); } |
channelChanged(SamplerChannelEvent e) { updateChannelProperties(); } |
978 |
}); |
}); |
979 |
|
|
980 |
CC.getSamplerModel().addSamplerListener(new SamplerAdapter() { |
samplerListener = new SamplerAdapter() { |
981 |
/** Invoked when the default MIDI instrument map is changed. */ |
/** Invoked when the default MIDI instrument map is changed. */ |
982 |
public void |
public void |
983 |
defaultMapChanged(SamplerEvent e) { |
defaultMapChanged(SamplerEvent e) { |
984 |
updateCbInstrumentMapToolTipText(); |
updateCbInstrumentMapToolTipText(); |
|
|
|
985 |
} |
} |
986 |
}); |
}; |
987 |
|
|
988 |
|
CC.getSamplerModel().addSamplerListener(samplerListener); |
989 |
|
|
990 |
cbInstrumentMap.addItem(noMap); |
cbInstrumentMap.addItem(noMap); |
991 |
cbInstrumentMap.addItem(defaultMap); |
cbInstrumentMap.addItem(defaultMap); |
1016 |
CC.getSamplerModel().addMidiDeviceListListener(getHandler()); |
CC.getSamplerModel().addMidiDeviceListListener(getHandler()); |
1017 |
CC.getSamplerModel().addAudioDeviceListListener(getHandler()); |
CC.getSamplerModel().addAudioDeviceListListener(getHandler()); |
1018 |
CC.getSamplerModel().addSamplerChannelListListener(getHandler()); |
CC.getSamplerModel().addSamplerChannelListListener(getHandler()); |
1019 |
|
CC.getSamplerModel().addMidiInstrumentMapListListener(mapListListener); |
|
CC.getSamplerModel().addMidiInstrumentMapListListener(new MapListListener()); |
|
1020 |
|
|
1021 |
btnAudioProps.setToolTipText(i18n.getLabel("ChannelProperties.routing")); |
btnAudioProps.setToolTipText(i18n.getLabel("ChannelProperties.routing")); |
1022 |
|
btnAudioProps.setEnabled(false); |
1023 |
btnAudioProps.addActionListener(new ActionListener() { |
btnAudioProps.addActionListener(new ActionListener() { |
1024 |
public void |
public void |
1025 |
actionPerformed(ActionEvent e) { |
actionPerformed(ActionEvent e) { |
1026 |
SamplerChannel c = getModel().getChannelInfo(); |
SamplerChannel c = getModel().getChannelInfo(); |
1027 |
new ChannelOutputRoutingDlg(CC.getMainFrame(), c).setVisible(true); |
new JSChannelOutputRoutingDlg(CC.getMainFrame(), c).setVisible(true); |
1028 |
|
|
1029 |
} |
} |
1030 |
}); |
}); |
1041 |
FxSendsPane p = new FxSendsPane(getModel()); |
FxSendsPane p = new FxSendsPane(getModel()); |
1042 |
int id = getModel().getChannelId(); |
int id = getModel().getChannelId(); |
1043 |
fxSendsDlg = new InformationDialog(CC.getMainFrame(), p); |
fxSendsDlg = new InformationDialog(CC.getMainFrame(), p); |
1044 |
fxSendsDlg.setTitle(i18n.getLabel("FxSendsPane.title", id)); |
fxSendsDlg.setTitle(i18n.getLabel("FxSendsDlg.title", id)); |
1045 |
fxSendsDlg.setModal(false); |
fxSendsDlg.setModal(false); |
1046 |
fxSendsDlg.showCloseButton(false); |
fxSendsDlg.showCloseButton(false); |
1047 |
fxSendsDlg.setVisible(true); |
fxSendsDlg.setVisible(true); |
1053 |
updateChannelProperties(); |
updateChannelProperties(); |
1054 |
} |
} |
1055 |
|
|
1056 |
|
class FxSendsPane extends JSFxSendsPane { |
1057 |
|
FxSendsPane(SamplerChannelModel model) { |
1058 |
|
super(model); |
1059 |
|
|
1060 |
|
actionAddFxSend.putValue(Action.SMALL_ICON, Res.iconNew16); |
1061 |
|
actionRemoveFxSend.putValue(Action.SMALL_ICON, Res.iconDelete16); |
1062 |
|
} |
1063 |
|
|
1064 |
|
protected JToolBar |
1065 |
|
createToolBar() { |
1066 |
|
JToolBar tb = new JToolBar(); |
1067 |
|
Dimension d = new Dimension(Short.MAX_VALUE, tb.getPreferredSize().height); |
1068 |
|
tb.setMaximumSize(d); |
1069 |
|
tb.setFloatable(false); |
1070 |
|
tb.setAlignmentX(JPanel.RIGHT_ALIGNMENT); |
1071 |
|
|
1072 |
|
tb.add(new ToolbarButton(actionAddFxSend)); |
1073 |
|
tb.add(new ToolbarButton(actionRemoveFxSend)); |
1074 |
|
|
1075 |
|
return tb; |
1076 |
|
} |
1077 |
|
} |
1078 |
|
|
1079 |
private JPanel |
private JPanel |
1080 |
createEnginePane() { |
createEnginePane() { |
1081 |
for(SamplerEngine e : CC.getSamplerModel().getEngines()) cbEngines.addItem(e); |
for(SamplerEngine e : CC.getSamplerModel().getEngines()) cbEngines.addItem(e); |
1262 |
SamplerModel sm = CC.getSamplerModel(); |
SamplerModel sm = CC.getSamplerModel(); |
1263 |
SamplerChannel sc = getModel().getChannelInfo(); |
SamplerChannel sc = getModel().getChannelInfo(); |
1264 |
|
|
1265 |
MidiDeviceModel mm = sm.getMidiDeviceModel(sc.getMidiInputDevice()); |
MidiDeviceModel mm = sm.getMidiDeviceById(sc.getMidiInputDevice()); |
1266 |
AudioDeviceModel am = sm.getAudioDeviceModel(sc.getAudioOutputDevice()); |
AudioDeviceModel am = sm.getAudioDeviceById(sc.getAudioOutputDevice()); |
1267 |
|
|
1268 |
if(isUpdate()) CC.getLogger().warning("Unexpected update state!"); |
if(isUpdate()) CC.getLogger().warning("Unexpected update state!"); |
1269 |
|
|
1275 |
cbEngines.setSelectedItem(sc.getEngine()); |
cbEngines.setSelectedItem(sc.getEngine()); |
1276 |
|
|
1277 |
cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo()); |
cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo()); |
1278 |
|
btnAudioProps.setEnabled(am != null); |
1279 |
} catch(Exception x) { |
} catch(Exception x) { |
1280 |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
1281 |
} |
} |
1282 |
|
|
1283 |
if(sc.getEngine() != null) { |
if(sc.getEngine() != null) { |
1284 |
if(cbInstrumentMap.getItemCount() > 0) cbInstrumentMap.setEnabled(true); |
cbInstrumentMap.setEnabled(true); |
1285 |
|
int id = sc.getMidiInstrumentMapId(); |
1286 |
|
Object o; |
1287 |
|
if(id == -2) o = defaultMap; |
1288 |
|
else if(id == -1) o = noMap; |
1289 |
|
else o = CC.getSamplerModel().getMidiInstrumentMapById(id); |
1290 |
|
|
1291 |
|
if(cbInstrumentMap.getSelectedItem() != o) { |
1292 |
|
cbInstrumentMap.setSelectedItem(o); |
1293 |
|
} |
1294 |
} else { |
} else { |
1295 |
cbInstrumentMap.setSelectedItem(noMap); |
cbInstrumentMap.setSelectedItem(noMap); |
1296 |
cbInstrumentMap.setEnabled(false); |
cbInstrumentMap.setEnabled(false); |
1312 |
try { |
try { |
1313 |
cbMidiDevice.removeAllItems(); |
cbMidiDevice.removeAllItems(); |
1314 |
|
|
1315 |
for(MidiDeviceModel m : sm.getMidiDeviceModels()) |
for(MidiDeviceModel m : sm.getMidiDevices()) |
1316 |
cbMidiDevice.addItem(m.getDeviceInfo()); |
cbMidiDevice.addItem(m.getDeviceInfo()); |
1317 |
|
|
1318 |
MidiDeviceModel mm = sm.getMidiDeviceModel(sc.getMidiInputDevice()); |
MidiDeviceModel mm = sm.getMidiDeviceById(sc.getMidiInputDevice()); |
1319 |
cbMidiDevice.setSelectedItem(mm == null ? null : mm.getDeviceInfo()); |
cbMidiDevice.setSelectedItem(mm == null ? null : mm.getDeviceInfo()); |
1320 |
} catch(Exception x) { |
} catch(Exception x) { |
1321 |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
1337 |
try { |
try { |
1338 |
cbAudioDevice.removeAllItems(); |
cbAudioDevice.removeAllItems(); |
1339 |
|
|
1340 |
for(AudioDeviceModel m : sm.getAudioDeviceModels()) |
for(AudioDeviceModel m : sm.getAudioDevices()) |
1341 |
cbAudioDevice.addItem(m.getDeviceInfo()); |
cbAudioDevice.addItem(m.getDeviceInfo()); |
1342 |
|
|
1343 |
AudioDeviceModel am = sm.getAudioDeviceModel(sc.getAudioOutputDevice()); |
AudioDeviceModel am = sm.getAudioDeviceById(sc.getAudioOutputDevice()); |
1344 |
cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo()); |
cbAudioDevice.setSelectedItem(am == null ? null : am.getDeviceInfo()); |
1345 |
} catch(Exception x) { |
} catch(Exception x) { |
1346 |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
CC.getLogger().log(Level.WARNING, "Unkown error", x); |
1358 |
return; |
return; |
1359 |
} |
} |
1360 |
|
|
1361 |
|
if(midiDevice != null) midiDevice.removeMidiDeviceListener(getHandler()); |
1362 |
|
|
1363 |
cbMidiPort.removeAllItems(); |
cbMidiPort.removeAllItems(); |
1364 |
|
|
1365 |
if(mid == null) { |
if(mid == null) { |
1366 |
|
midiDevice = null; |
1367 |
cbMidiPort.setEnabled(false); |
cbMidiPort.setEnabled(false); |
1368 |
|
|
1369 |
cbMidiChannel.setSelectedItem(null); |
cbMidiChannel.setSelectedItem(null); |
1370 |
cbMidiChannel.setEnabled(false); |
cbMidiChannel.setEnabled(false); |
1371 |
} else { |
} else { |
1372 |
|
midiDevice = CC.getSamplerModel().getMidiDeviceById(mid.getDeviceId()); |
1373 |
|
if(midiDevice != null) midiDevice.addMidiDeviceListener(getHandler()); |
1374 |
|
|
1375 |
cbMidiPort.setEnabled(true); |
cbMidiPort.setEnabled(true); |
1376 |
|
|
1377 |
MidiPort[] ports = mid.getMidiPorts(); |
MidiPort[] ports = mid.getMidiPorts(); |
1449 |
private Handler |
private Handler |
1450 |
getHandler() { return handler; } |
getHandler() { return handler; } |
1451 |
|
|
1452 |
private class Handler implements MidiDeviceListListener, |
private class Handler implements MidiDeviceListListener, ListListener<AudioDeviceModel>, |
1453 |
ListListener<AudioDeviceModel>, SamplerChannelListListener { |
SamplerChannelListListener, MidiDeviceListener { |
1454 |
|
|
1455 |
/** |
/** |
1456 |
* Invoked when a new MIDI device is created. |
* Invoked when a new MIDI device is created. |
1509 |
channelRemoved(SamplerChannelListEvent e) { |
channelRemoved(SamplerChannelListEvent e) { |
1510 |
// Some cleanup when the channel is removed. |
// Some cleanup when the channel is removed. |
1511 |
if(e.getChannelModel().getChannelId() == channelModel.getChannelId()) { |
if(e.getChannelModel().getChannelId() == channelModel.getChannelId()) { |
1512 |
CC.getSamplerModel().removeMidiDeviceListListener(getHandler()); |
SamplerModel sm = CC.getSamplerModel(); |
1513 |
CC.getSamplerModel().removeAudioDeviceListListener(getHandler()); |
|
1514 |
|
sm.removeMidiDeviceListListener(getHandler()); |
1515 |
|
sm.removeAudioDeviceListListener(getHandler()); |
1516 |
|
sm.removeMidiInstrumentMapListListener(mapListListener); |
1517 |
|
sm.removeSamplerListener(samplerListener); |
1518 |
|
sm.removeSamplerChannelListListener(getHandler()); |
1519 |
|
|
1520 |
|
if(midiDevice != null) { |
1521 |
|
midiDevice.removeMidiDeviceListener(getHandler()); |
1522 |
|
} |
1523 |
|
} |
1524 |
|
} |
1525 |
|
|
1526 |
|
public void |
1527 |
|
settingsChanged(MidiDeviceEvent e) { |
1528 |
|
if(isUpdate()) { |
1529 |
|
CC.getLogger().warning("Invalid update state"); |
1530 |
|
return; |
1531 |
} |
} |
1532 |
|
|
1533 |
|
setUpdate(true); |
1534 |
|
int idx = cbMidiPort.getSelectedIndex(); |
1535 |
|
MidiInputDevice d = e.getMidiDeviceModel().getDeviceInfo(); |
1536 |
|
|
1537 |
|
cbMidiPort.removeAllItems(); |
1538 |
|
for(MidiPort port : d.getMidiPorts()) cbMidiPort.addItem(port); |
1539 |
|
|
1540 |
|
if(idx >= cbMidiPort.getModel().getSize()) idx = 0; |
1541 |
|
|
1542 |
|
setUpdate(false); |
1543 |
|
|
1544 |
|
if(cbMidiPort.getModel().getSize() > 0) cbMidiPort.setSelectedIndex(idx); |
1545 |
} |
} |
1546 |
} |
} |
1547 |
|
|
1549 |
/** Invoked when a new MIDI instrument map is added to a list. */ |
/** Invoked when a new MIDI instrument map is added to a list. */ |
1550 |
public void |
public void |
1551 |
entryAdded(ListEvent<MidiInstrumentMap> e) { |
entryAdded(ListEvent<MidiInstrumentMap> e) { |
|
//cbInstrumentMap.addItem(e.getEntry()); |
|
1552 |
cbInstrumentMap.insertItemAt(e.getEntry(), cbInstrumentMap.getItemCount()); |
cbInstrumentMap.insertItemAt(e.getEntry(), cbInstrumentMap.getItemCount()); |
1553 |
boolean b = getModel().getChannelInfo().getEngine() != null; |
boolean b = getModel().getChannelInfo().getEngine() != null; |
1554 |
if(b && !cbInstrumentMap.isEnabled()) cbInstrumentMap.setEnabled(true); |
if(b && !cbInstrumentMap.isEnabled()) cbInstrumentMap.setEnabled(true); |