Skip to content

Commit

Permalink
[fix] MidiBindingEditor: initialization of proprietary definitions br…
Browse files Browse the repository at this point in the history
…oke in last changeset.

Added feature to apply a range of Midi notes for generic Midi bindings. If more than one mapping entry is selected, the first is taken as basis for subsequent increase of CC values / keys.
Added corresponding option "Apply Midi Range" to "Advanced Options" menu.
  • Loading branch information
TakTraum committed Aug 11, 2016
1 parent 877e57a commit f3a2c2f
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 5 deletions.
25 changes: 23 additions & 2 deletions cmdr/cmdr.Editor/ViewModels/MappingEditorViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,15 @@ public ObservableCollection<MenuItemViewModel> AdvancedOptions
set { _advancedOptions = value; raisePropertyChanged("AdvancedOptions"); }
}

private MenuItemViewModel _changeAssignmentOption;

private ICommand _advancedOptionsCommand;
public ICommand AdvancedOptionsCommand
{
get { return _advancedOptionsCommand ?? (_advancedOptionsCommand = new CommandHandler<MenuItemViewModel>(mi => {}, () => AdvancedOptions.Any())); }
}

private MenuItemViewModel _changeAssignmentOption;
private MenuItemViewModel _applyMidiRangeOption;

#endregion


Expand Down Expand Up @@ -101,6 +102,7 @@ private void buildAdvancedOptionsMenu()
return;

updateChangeAssignmentOption();
updateApplyMidiRangeOption();
}

private void updateChangeAssignmentOption()
Expand Down Expand Up @@ -147,6 +149,25 @@ private void changeAssignment(MappingTargetDeck assignment)
ConditionsEditor.Refresh();
}

private void updateApplyMidiRangeOption()
{
if (_mappings.Count() > 1 && MidiBindingEditor.ApplyMidiRangeCommand.CanExecute(null))
{
if (_applyMidiRangeOption == null)
_applyMidiRangeOption = new MenuItemViewModel();

if (!AdvancedOptions.Contains(_applyMidiRangeOption))
AdvancedOptions.Add(_applyMidiRangeOption);

_applyMidiRangeOption.Text = "Apply Midi Range";
_applyMidiRangeOption.Command = MidiBindingEditor.ApplyMidiRangeCommand;

return;
}

if (AdvancedOptions.Contains(_applyMidiRangeOption))
AdvancedOptions.Remove(_applyMidiRangeOption);
}

#region Events

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,13 +170,20 @@ public ICommand IncDecCommand
get { return _incDecCommand ?? (_incDecCommand = new CommandHandler<MenuItemViewModel>(item => IncDec((int)item.Tag), () => CanIncDec())); }
}

private ICommand _applyMidiRangeCommand;
public ICommand ApplyMidiRangeCommand
{
get { return _applyMidiRangeCommand ?? (_applyMidiRangeCommand = new CommandHandler(applyMidiRange, canApplyMidiRange)); }
}

#endregion


private MidiBindingEditorViewModel(DeviceViewModel device, IEnumerable<MappingViewModel> mappings, IEnumerable<AMidiDefinition> proprietaryDefinitions = null)
{
_mappings = mappings;
_device = device;
_proprietaryDefinitions = proprietaryDefinitions;

analyzeSelection();

Expand Down Expand Up @@ -204,7 +211,6 @@ private MidiBindingEditorViewModel(DeviceViewModel device, IEnumerable<MappingVi
else
{
_canOverrideFactoryMap = _mappings.Any(m => m.CanOverrideFactoryMap);
_proprietaryDefinitions = proprietaryDefinitions;
NotesMenu = new ObservableCollection<MenuItemViewModel>(NotesMenuBuilder.Instance.BuildProprietaryMenu(_proprietaryDefinitions.DistinctBy(d => d.Note)));
}

Expand Down Expand Up @@ -314,6 +320,11 @@ private void setNote(string note)
raisePropertyChanged("NoteString");
}

private void updateGenericMidiBinding(MappingViewModel mapping, string midiNote)
{
mapping.SetBinding(new GenericMidiDefinition(mapping.Command.MappingType, midiNote));
}

private void updateBinding(AMidiDefinition definition = null)
{
string expression;
Expand Down Expand Up @@ -414,7 +425,7 @@ private void incDecCC(MappingViewModel mapping, int step)
var newCC = oldCC + step;

string cc = String.Join(".", parts[0], parts[1], String.Format("{0:000}", newCC));
mapping.SetBinding(new TsiLib.MidiDefinitions.GenericMidiDefinition(mapping.MidiBinding.Type, cc));
updateGenericMidiBinding(mapping, cc);
}

private void incDecNote(MappingViewModel mapping, int step)
Expand All @@ -427,7 +438,66 @@ private void incDecNote(MappingViewModel mapping, int step)
int newKey = oldKey + step;

string note = String.Join(".", parts[0], parts[1], keyConverter.GetKeyTextIPN(newKey));
mapping.SetBinding(new TsiLib.MidiDefinitions.GenericMidiDefinition(mapping.MidiBinding.Type, note));
updateGenericMidiBinding(mapping, note);
}

private void applyMidiRange()
{
var note = _mappings.First().MidiBinding.Note;

var isCC = note.Contains("CC");

var keyConverter = new MidiLib.Utils.KeyConverter();

string suffix = note.Split('.').Last();
int number = isCC ? int.Parse(suffix) : keyConverter.ToKeyIPN(suffix);

string newSuffix;
foreach (var m in _mappings)
{
if (m.MidiBinding != null && m.MidiBinding.Equals(_mappings.First().MidiBinding))
continue;
number++;
newSuffix = isCC ? String.Format("{0:000}", number) : keyConverter.GetKeyTextIPN(number);
updateGenericMidiBinding(m, note.Replace(suffix, newSuffix));
}

analyzeSelection();
updateMenus();
}

private bool canApplyMidiRange()
{
if (!IsGenericMidi)
return false;

var firstBinding = _mappings.First().MidiBinding;
if (firstBinding == null || string.IsNullOrEmpty(firstBinding.Note))
return false;

var note = firstBinding.Note;

var isCC = note.Contains("CC");
var isNote = note.Contains("Note");
var isCombo = note.Contains("+");

if (isCombo || !(isCC || isNote))
return false;

var keyConverter = new MidiLib.Utils.KeyConverter();

int number = 127;
string suffix = note.Split('.').Last();
if (isCC)
number = int.Parse(suffix);
else if (isNote)
number = keyConverter.ToKeyIPN(suffix);

int count = _mappings.Count();
if (number + count > 127)
return false;

return true;
}


Expand Down

0 comments on commit f3a2c2f

Please sign in to comment.