package org.herac.tuxguitar.midiinput;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.herac.tuxguitar.gui.TuxGuitar;
import org.herac.tuxguitar.gui.system.config.TGConfigManager;
import org.herac.tuxguitar.gui.system.plugins.TGPluginConfigManager;
import org.herac.tuxguitar.gui.util.DialogUtils;
import org.herac.tuxguitar.gui.util.MessageDialog;
class MiConfig {
static final int CHORD_MODE_ALL = 1; // insert chord diagram and modify staff
static final int CHORD_MODE_DIAGRAM = 0; // insert chord diagram only
static final int DEF_COUNTDOWN_BARS = 2; // default value for the # of count
// down bars before recording
static final int DEF_DURATION_THRESHOLD = 25; // default value for
// f_MinDuration [msec]
static final int DEF_ECHO_TIMEOUT = 500; // default value for f_EchoTimeOut
static final int DEF_INPUT_TIMEOUT = 1000; // default value for f_InputTimeOut
static final int DEF_VELOCITY_THRESHOLD = 40; // default value for
// f_MinVelocityThreshold
static final String KEY_CHORD_MODE = "midi.input.chord.mode";
static final String KEY_ECHO_TIMEOUT = "midi.input.echo.timeout";
static final String KEY_INPUT_TIMEOUT = "midi.input.input.timeout";
static final String KEY_MIDI_BASE_CHANNEL = "midi.input.base.channel";
static final String KEY_MIDI_INPUT_PORT = "midi.input.port";
static final String KEY_MIN_DURATION = "midi.input.min.duration";
static final String KEY_MIN_VELOCITY = "midi.input.min.velocity";
static final String KEY_MODE = "midi.input.mode";
static final int MAX_COUNTDOWN_BARS = 16; // maximum allowed value for the #
// of count down bars before
// recording
static final int MAX_DURATION_THRESHOLD = 100; // maximum allowed value for
// f_MinDuration [msec]
static final int MAX_ECHO_TIMEOUT = 1500; // maximum allowed value for
// f_EchoTimeOut
static final int MAX_INPUT_TIMEOUT = 1500; // maximum allowed value for
// f_InputTimeOut
static final int MAX_VELOCITY_THRESHOLD = 50; // maximum allowed value for
// f_MinVelocityThreshold
static final int MIN_COUNTDOWN_BARS = 0; // minimum allowed value for the # of
// count down bars before recording
static final int MIN_DURATION_THRESHOLD = 0; // minimum allowed value for
// f_MinDuration [msec]
static final int MIN_ECHO_TIMEOUT = 100; // minimum allowed value for
// f_EchoTimeOut
static final int MIN_INPUT_TIMEOUT = 100; // minimum allowed value for
// f_InputTimeOut
static final int MIN_VELOCITY_THRESHOLD = 0; // minimum allowed value for
// f_MinVelocityThreshold
static final int MODE_CHORDS_RECORDING = 1; // notes are used to insert a
// chord at current position
static final int MODE_FRETBOARD_ECHO = 0; // notes are simply echoed on
// TuxGuitar's fretboard, keyboard,
// etc.
static final int MODE_SCALES_RECOGNITION = 2; // notes are used to identify a
// scale
static final int MODE_SONG_RECORDING = 3; // notes are recorded with their
// actual timing
// mancano le chiavi per le preferenze di registrazione
static private MiConfig s_Instance;
static TGConfigManager getConfig() {
return s_Instance.f_Config;
}
static MiConfig instance() {
if (s_Instance == null)
s_Instance = new MiConfig();
return s_Instance;
}
private TGConfigManager f_Config;
private MiConfig() {
this.f_Config = new TGPluginConfigManager("tuxguitar-midi-input");
this.f_Config.init();
}
int getChordMode() {
return s_Instance.f_Config.getIntConfigValue(KEY_CHORD_MODE,
CHORD_MODE_DIAGRAM);
}
int getEchoTimeOut() {
return s_Instance.f_Config.getIntConfigValue(KEY_ECHO_TIMEOUT,
DEF_INPUT_TIMEOUT);
}
int getInputTimeOut() {
return s_Instance.f_Config.getIntConfigValue(KEY_INPUT_TIMEOUT,
DEF_INPUT_TIMEOUT);
}
int getMidiBaseChannel() {
return s_Instance.f_Config.getIntConfigValue(KEY_MIDI_BASE_CHANNEL, 0);
}
String getMidiInputPortName() {
return s_Instance.f_Config.getStringConfigValue(KEY_MIDI_INPUT_PORT);
}
int getMinDuration() {
return s_Instance.f_Config.getIntConfigValue(KEY_MIN_DURATION,
DEF_DURATION_THRESHOLD);
}
int getMinVelocity() {
return s_Instance.f_Config.getIntConfigValue(KEY_MIN_VELOCITY,
DEF_VELOCITY_THRESHOLD);
}
int getMode() {
return s_Instance.f_Config.getIntConfigValue(KEY_MODE, MODE_FRETBOARD_ECHO);
}
void showDialog(Shell parent) {
try {
final List<String> portsNames = MiPortProvider.listPortsNames();
final String currPortName = getMidiInputPortName();
final int currBaseChannel = getMidiBaseChannel();
final int currMinVelocity = getMinVelocity();
final int currMinDuration = getMinDuration();
final int currEchoTimeOut = getEchoTimeOut();
final int currInputTimeOut = getInputTimeOut();
// final int currChordMode = getChordMode();
final Shell dialog = DialogUtils.newDialog(parent, SWT.DIALOG_TRIM
| SWT.APPLICATION_MODAL);
dialog.setLayout(new GridLayout());
dialog.setText(TuxGuitar.getProperty("midiinput.config.title"));
// MIDI
Group groupMidi = new Group(dialog, SWT.SHADOW_ETCHED_IN);
groupMidi.setLayout(new GridLayout(2, false));
groupMidi.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
groupMidi.setText(TuxGuitar
.getProperty("midiinput.config.label.group.midi"));
// ------------------MIDI INPUT PORT------------------
Label lblPort = new Label(groupMidi, SWT.LEFT);
lblPort.setText(TuxGuitar.getProperty("midiinput.config.label.port")
+ ":");
final Combo cmbPort = new Combo(groupMidi, SWT.DROP_DOWN | SWT.READ_ONLY);
cmbPort.setLayoutData(new GridData(130, SWT.DEFAULT));
for (int i = 0; i < portsNames.size(); i++) {
String portName = (String) portsNames.get(i);
cmbPort.add(portName);
if (portName.equals(currPortName))
cmbPort.select(i);
}
// ------------------MIDI BASE CHANNEL------------------
Label lblChannel = new Label(groupMidi, SWT.LEFT);
lblChannel.setText(TuxGuitar
.getProperty("midiinput.config.label.basechannel")
+ ":");
final Combo cmbChannel = new Combo(groupMidi, SWT.DROP_DOWN
| SWT.READ_ONLY);
cmbChannel.setLayoutData(new GridData(130, SWT.DEFAULT));
for (int i = 1; i <= 16; i++)
cmbChannel.add(Integer.toString(i));
cmbChannel.select(currBaseChannel);
// General input
Group groupInput = new Group(dialog, SWT.SHADOW_ETCHED_IN);
groupInput.setLayout(new GridLayout(2, false));
groupInput.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
groupInput.setText(TuxGuitar
.getProperty("midiinput.config.label.group.input"));
// ------------------MIN VELOCITY THRESHOLD------------------
Label lblVelocity = new Label(groupInput, SWT.LEFT);
lblVelocity.setText(TuxGuitar
.getProperty("midiinput.config.label.minvelocity")
+ ":");
final Spinner spnMinVelocity = new Spinner(groupInput, SWT.BORDER);
spnMinVelocity.setLayoutData(new GridData(130, SWT.DEFAULT));
spnMinVelocity.setMinimum(MIN_VELOCITY_THRESHOLD);
spnMinVelocity.setMaximum(MAX_VELOCITY_THRESHOLD);
spnMinVelocity.setSelection(currMinVelocity);
// ------------------MIN VELOCITY DURATION------------------
Label lblDuration = new Label(groupInput, SWT.LEFT);
lblDuration.setText(TuxGuitar
.getProperty("midiinput.config.label.minduration")
+ ":");
final Spinner spnMinDuration = new Spinner(groupInput, SWT.BORDER);
spnMinDuration.setLayoutData(new GridData(130, SWT.DEFAULT));
spnMinDuration.setMinimum(MIN_DURATION_THRESHOLD);
spnMinDuration.setMaximum(MAX_DURATION_THRESHOLD);
spnMinDuration.setSelection(currMinDuration);
// Echo/Chords/Scales
Group groupEcho = new Group(dialog, SWT.SHADOW_ETCHED_IN);
groupEcho.setLayout(new GridLayout(2, false));
groupEcho.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
groupEcho.setText(TuxGuitar
.getProperty("midiinput.config.label.group.echo"));
// ------------------ECHO TIME OUT------------------
Label lblEchoTimeOut = new Label(groupEcho, SWT.LEFT);
lblEchoTimeOut.setText(TuxGuitar
.getProperty("midiinput.config.label.echotimeout")
+ ":");
final Spinner spnEchoTimeOut = new Spinner(groupEcho, SWT.BORDER);
spnEchoTimeOut.setLayoutData(new GridData(130, SWT.DEFAULT));
spnEchoTimeOut.setMinimum(MIN_ECHO_TIMEOUT);
spnEchoTimeOut.setMaximum(MAX_ECHO_TIMEOUT);
spnEchoTimeOut.setSelection(currEchoTimeOut);
// ------------------INPUT TIME OUT------------------
Label lblInputTimeOut = new Label(groupEcho, SWT.LEFT);
lblInputTimeOut.setText(TuxGuitar
.getProperty("midiinput.config.label.inputtimeout")
+ ":");
final Spinner spnInputTimeOut = new Spinner(groupEcho, SWT.BORDER);
spnInputTimeOut.setLayoutData(new GridData(130, SWT.DEFAULT));
spnInputTimeOut.setMinimum(MIN_INPUT_TIMEOUT);
spnInputTimeOut.setMaximum(MAX_INPUT_TIMEOUT);
spnInputTimeOut.setSelection(currInputTimeOut);
// ------------------CHORD MODE------------------
Label lblMode = new Label(groupEcho, SWT.LEFT);
lblMode.setText(TuxGuitar.getProperty("midiinput.config.label.chordmode")
+ ":");
final Combo cmbChordMode = new Combo(groupEcho, SWT.DROP_DOWN
| SWT.READ_ONLY);
cmbChordMode.setLayoutData(new GridData(130, SWT.DEFAULT));
cmbChordMode.add(TuxGuitar.getProperty("midiinput.chordmode.diagram"));
cmbChordMode.add(TuxGuitar.getProperty("midiinput.chordmode.all"));
cmbChordMode.select(MiConfig.instance().getChordMode());
// /* RECORDING
// Recording
Group groupRec = new Group(dialog, SWT.SHADOW_ETCHED_IN);
groupRec.setLayout(new GridLayout(2, false));
groupRec.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
groupRec.setText(TuxGuitar
.getProperty("midiinput.config.label.group.rec"));
// ------------------REC COUNTDOWN BARS------------------
Label lblCountdownBars = new Label(groupRec, SWT.LEFT);
lblCountdownBars.setText(TuxGuitar
.getProperty("midiinput.config.label.countdown")
+ ":");
final Spinner spnCountdownBars = new Spinner(groupRec, SWT.BORDER);
spnCountdownBars.setLayoutData(new GridData(130, SWT.DEFAULT));
spnCountdownBars.setMinimum(MIN_COUNTDOWN_BARS);
spnCountdownBars.setMaximum(MAX_COUNTDOWN_BARS);
// spnCountdownBars.setSelection(currInputTimeOut);
// ------------------USE METRONOME------------------
final Button chkMetronome = new Button(groupRec, SWT.CHECK);
chkMetronome.setText(TuxGuitar
.getProperty("midiinput.config.label.metronome"));
chkMetronome.setSelection(true);
// ------------------USE PLAYBACK------------------
final Button chkPlayback = new Button(groupRec, SWT.CHECK);
chkPlayback.setText(TuxGuitar
.getProperty("midiinput.config.label.playback"));
chkPlayback.setSelection(true);
// */
// ------------------BUTTONS--------------------------
Composite buttons = new Composite(dialog, SWT.NONE);
buttons.setLayout(new GridLayout(2, false));
buttons.setLayoutData(new GridData(SWT.END, SWT.FILL, true, true));
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.minimumWidth = 80;
data.minimumHeight = 25;
final Button buttonOK = new Button(buttons, SWT.PUSH);
buttonOK.setText(TuxGuitar.getProperty("ok"));
buttonOK.setLayoutData(data);
buttonOK.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
int portSelection = cmbPort.getSelectionIndex();
if (portSelection >= 0 && portSelection < portsNames.size()) {
String portName = (String) portsNames.get(portSelection);
s_Instance.f_Config.setProperty(KEY_MIDI_INPUT_PORT, portName);
s_Instance.f_Config.save();
try {
MiPort.setNotesPort(portName);
} catch (MiException mie) {
MessageDialog.errorMessage(mie);
}
}
int baseChannel = cmbChannel.getSelectionIndex();
if (baseChannel >= 0 && baseChannel < 16) {
s_Instance.f_Config.setProperty(KEY_MIDI_BASE_CHANNEL, baseChannel);
s_Instance.f_Config.save();
MiProvider.instance().setBaseChannel(baseChannel);
}
int minVelocity = spnMinVelocity.getSelection();
if (minVelocity >= MIN_VELOCITY_THRESHOLD
&& minVelocity <= MAX_VELOCITY_THRESHOLD) {
s_Instance.f_Config.setProperty(KEY_MIN_VELOCITY, minVelocity);
s_Instance.f_Config.save();
MiProvider.instance().setMinVelocity((byte) minVelocity);
}
int minDuration = spnMinDuration.getSelection();
if (minDuration >= MIN_DURATION_THRESHOLD
&& minDuration <= MAX_DURATION_THRESHOLD) {
s_Instance.f_Config.setProperty(KEY_MIN_DURATION, minDuration);
s_Instance.f_Config.save();
MiProvider.instance().setMinDuration(minDuration);
}
int echoTimeOut = spnEchoTimeOut.getSelection();
if (echoTimeOut >= MIN_ECHO_TIMEOUT
&& echoTimeOut <= MAX_ECHO_TIMEOUT) {
s_Instance.f_Config.setProperty(KEY_ECHO_TIMEOUT, echoTimeOut);
s_Instance.f_Config.save();
MiProvider.instance().setEchoTimeOut(echoTimeOut);
}
int inputTimeOut = spnInputTimeOut.getSelection();
if (inputTimeOut >= MIN_INPUT_TIMEOUT
&& inputTimeOut <= MAX_INPUT_TIMEOUT) {
s_Instance.f_Config.setProperty(KEY_INPUT_TIMEOUT, inputTimeOut);
s_Instance.f_Config.save();
MiProvider.instance().setInputTimeOut(inputTimeOut);
}
int chordMode = cmbChordMode.getSelectionIndex();
s_Instance.f_Config.setProperty(KEY_CHORD_MODE, chordMode);
s_Instance.f_Config.save();
MiProvider.instance().setChordMode(chordMode);
dialog.dispose();
}
});
Button buttonCancel = new Button(buttons, SWT.PUSH);
buttonCancel.setText(TuxGuitar.getProperty("cancel"));
buttonCancel.setLayoutData(data);
buttonCancel.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
dialog.dispose();
}
});
dialog.setDefaultButton(buttonOK);
DialogUtils.openDialog(dialog, DialogUtils.OPEN_STYLE_CENTER
| DialogUtils.OPEN_STYLE_PACK | DialogUtils.OPEN_STYLE_WAIT);
} catch (Exception e) {
MessageDialog.errorMessage(e);
}
}
}